campaign_plan_update
Edit a campaign plan. Any real change returns an approved plan to draft.
Updates a Campaign Plan’s own fields. Its Line Items are edited with line_item_update.
Input
Omit a field to leave it alone; send null to clear it. The two are deliberately different — “I only moved the end date” must not erase the rationale.
| Field | Type | Required | Description |
|---|---|---|---|
campaign_plan_name |
string |
yes | The plan slug. |
base_revision |
integer |
yes | The revision you last read via campaign_plan_get. |
name, description |
string |
no | |
slug |
string |
no | A new handle — a deliberate rename. |
brand_name |
string | null |
no | Re-point the plan; null unlinks it. |
currency |
string |
no | Refused once any Line Item carries a budget. |
total_budget |
number | null |
no | In whole units of currency: 40000 is €40,000. Never negative. null means “no declared constraint”, not zero. |
start_date / end_date |
YYYY-MM-DD | null |
no | |
rationale, measurement |
string | null |
no |
Requires the campaign_plan:write scope.
Reference
Update a Campaign Plan. Omit a field to leave it alone; send null to clear it. Pass base_revision from campaign_plan_get. Any real change returns an approved plan to draft — an approval refers to particular content and cannot outlive it; a write that changes nothing leaves the approval standing. The currency is refused once any Line Item carries a budget, because re-denominating a costed plan would silently reinterpret every number in it. A Campaign Plan is AdCrunch’s own planning document — it is not a campaign on Meta or Google. For those, use list_entities and get_entity.
Input
| Argument | Type | Required | Description |
|---|---|---|---|
base_revision |
integer | yes | The revision you last read via campaign_plan_get. Guards against writing over a change somebody else made since. |
brand_name |
string or null | no | Re-point the plan at another brand by slug; null unlinks it. Refused while a Line Item still names a persona of the current brand. |
campaign_plan_name |
string | yes | The Campaign Plan slug — its stable per-organization handle. |
currency |
string, 3 characters | no | ISO 4217. Refused once any Line Item carries a budget — nothing is ever converted. |
description |
string | no | |
end_date |
string or null | no | null makes the plan always-on, which also flips every inheriting line from a total to a daily rate. |
measurement |
string or null | no | |
name |
string | no | |
rationale |
string or null | no | |
slug |
string | no | A new slug handle — a deliberate rename. |
start_date |
string or null | no | |
total_budget |
number, at least 0 or null | no | null means “no declared constraint”, not zero. |
Failure codes
A failed call has isError set, and structuredContent.error holds one of these codes. Errors describes the shape of a failed call.
not_foundinvalid_sluginvalid_currencyinvalid_amountinvalid_windowpersona_not_in_brandcurrency_frozenrevision_mismatchslug_conflictforbiddeninvalid_requestinternal_error
Scope
The token must hold campaign_plan:write. Auth & scopes lists each scope.
Annotations
A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.
- Writes. The tool can change data.
- Destructive. The tool can make a change that you cannot undo. A client can ask you to confirm before it calls the tool.
- Not idempotent. A second call with the same arguments can change more.
- Closed world. The tool reads and writes the data of AdCrunch only.