Security & Approval
Opus Growth is built to protect your ad budget. No change is ever applied silently.
Preview (dry-run)
Every tool that makes a change runs in two stages. The first call returns a preview only
— it shows what will happen but does not apply it. To apply it, the same call is
repeated with confirm=true. In practice, your assistant shows you the plan first and applies it once you say “approve.”
# 1) Preview
{"dry_run": true, "preview": {"action": "set_campaign_budget", "proposed_daily": 500}}
# 2) After approval
{"ok": true, "new_daily": 500}
The preview payload is deliberately explicit. applied is false and
status reads confirmation_required, because an assistant that only sees a
200 response can otherwise report the job as done while nothing changed.
Budget guardrails
Budget is where an automated mistake gets expensive, so five separate limits apply to every platform. A blocked call returns the reason in plain language rather than failing silently.
| Rule | Limit | Why |
|---|---|---|
| Single increase | +50% | Stops a typo turning 500 into 5,000 |
| Cumulative increase, rolling 24h | +100% of the budget at the start of the window | Closes the loophole of chaining small increases |
| Single cut | -80% | A deep cut stops delivery without looking like it |
| Floor | Roughly the equivalent of 5 USD, scaled to the account currency | A near-zero budget is an invisible pause |
| Ceiling | Roughly the equivalent of 100,000 USD, scaled to the account currency | Absolute backstop against a runaway value |
The floor and the cut limit exist for the same reason: dropping a budget to almost nothing halts a campaign while the platform still shows it as active, which is an invisible action. Pausing is visible and reversible, so pausing is what you are pointed to instead.
The 24-hour window is derived from the audit log, and only applied changes are counted, so previews never eat into it. There is no exemption for anyone, including our own accounts: this is a safety limit, not a commercial one.
Audit log
Every write operation (who, what, when) is recorded. Access tokens are stripped from stored results before they are written, so an error message from a platform SDK cannot leak a token into the log. On most platforms, deletions perform a reversible flag rather than a “permanent delete,” so your reporting data is preserved.
Data isolation
Your access tokens are stored encrypted, and every request runs only in the context of your own account. One user's token is never used in another user's request. Disconnecting a platform deletes the stored token rather than hiding it.
Common questions
Why was my budget increase blocked?
Either the single change was more than 50%, or the total for the last 24 hours would have gone past double the budget that the window started at. The error tells you which one it was and what the current value is, so a smaller increase usually goes straight through.
Can I get around the cap by chaining small increases?
No, and that is exactly what the rolling window is for. Before the window existed, going 100 to 150 to 225 and onward reached the absolute ceiling in about seventeen calls with nothing stopping it. Now the window measures against where the budget stood 24 hours ago.
Can I stop a campaign by setting its budget to zero?
No, and you would not want to. A near-zero budget stops delivery while the platform still shows the campaign as active, so nobody notices for days. Pausing does the same job visibly and is undone in one step.
Do previews cost credits?
No. A preview returns before billing runs, so an unconfirmed call is free. If a confirmed call is charged and then fails on the platform side, the credit is returned automatically with a refund row written to your ledger.
Could my assistant change something without asking me?
Not through us. Every write tool needs a second call carrying explicit confirmation, and the first call cannot mutate anything. If an assistant is set to auto-approve tool calls, that confirmation step is still a separate decision it has to make with the preview in front of it.