Apply a previewed change
confirm_and_applyExecute a previously previewed change.
Instructions
Execute a previously previewed change.
IMPORTANT: Defaults to dry_run=True (validate only). Only an explicit dry_run=false applies the change to the ad account (Google Ads or Reddit Ads — the plan knows which platform it targets).
Forced dry runs: when real changes are switched off (live changes off for the workspace in AdLoop Cloud, or safety.require_dry_run in a self-hosted config), dry_run=false is IGNORED and the result is still DRY_RUN_SUCCESS, with 'dry_run_forced_by' and 'remediation' fields. 'remediation' says how the user switches that setting; until it is changed, repeated calls with dry_run=false change nothing.
Two-phase apply: if 'safety.two_phase_apply: true' is set (always on for AdLoop Cloud tenants), dry_run=false is REFUSED with status DRY_RUN_REQUIRED until this plan_id has completed one dry_run=true pass. The sequence is: dry run, review of its result, then the real apply.
Google Ads plans: the dry run sends the exact mutates to Google with
validate_only=True, so Google checks the change and executes nothing
(checks counts the validated calls). Steps that build on an object an
earlier step would create cannot be validated and are counted as skipped.
Reddit plans: Reddit has no validate-only mode, so the dry run re-reads
the target entity and re-checks the safety caps (returned as checks).
A DRY_RUN_FAILED result means the change does not go through as previewed. The real apply fails the same way, unless Google rejected only part of the request: then it carries out the rest and reports those operations again.
Returns a status with the plan_id and operation: DRY_RUN_SUCCESS, DRY_RUN_FAILED, DRY_RUN_REQUIRED, APPLIED, PARTIAL_UPLOAD or APPLY_IN_PROGRESS. APPLIED results carry the created or changed resource names under 'result'. PARTIAL_UPLOAD belongs to the upload tools: the batches it lists are already in the account, so the plan is retired. 'sent_total', 'accepted_total', 'rejected_total' and 'resume_from_line' say how far the upload got and at which CSV line a new draft continues; when a batch's fate is unknown, 'unknown_status', 'uncertain_lines' and 'row_errors' name the rows whose outcome has to be checked first. APPLY_IN_PROGRESS means an earlier call claimed this plan first, so this call executed nothing.
Approval cards: in AI apps that show AdLoop's approval card with the preview, dry_run=false is REFUSED with status APPROVE_ON_CARD, because only the user's click on the card applies the change. Dry runs still work. The workspace owner can allow approval in chat as well.
Confirmation dialogs: in apps that show dialogs instead, dry_run=false first asks the user in a dialog. A declined dialog returns NOT_CONFIRMED; an app that receives the dialog but never answers it gets CONFIRMATION_UNANSWERED on the next call, with the ways out.
Google Ads API: https://developers.google.com/google-ads/api/docs/start, Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Reddit Ads API: https://ads-api.reddit.com/docs/v3/
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | True (default) validates without changing anything; false applies the change for real. | |
| plan_id | Yes | The plan_id returned by a prior draft_*, update_*, add_*, pause/enable/remove or other preview tool call. An unknown or expired plan_id returns an error. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||