campaign_plan_get
Get one Campaign Plan with its money figures and its number of Line Items.
Ask for one Campaign Plan. The agent gets the Campaign Plan with its money figures and its number of Line Items. It does not get the Line Items.
“Show me the spring sale Campaign Plan.”
The agent calls campaign_plan_get. You see the envelope, the sum that the Line Items hold, and what is left. You also see the number of Line Items. When the Line Items mix totals and daily rates, the agent tells you that no sum exists. You also see the Assignees of the Campaign Plan: the members who are accountable for it. An Assignee has no extra access. A member who left the organization is not shown. To see the Line Items, the agent calls line_item_list. To check that AdCrunch can build one Line Item, the agent calls line_item_get. Only that call carries the readiness.
Plan a campaign walks the whole job.
Reference
Fetch one Campaign Plan by its slug, with its markdown body. The Campaign Plan carries lineItemCount, the number of its Line Items, and it does not list them: line_item_list gives the Line Items, with the id and the revision that each write needs. The readiness of a Line Item is not in this answer: line_item_get gives it for one Line Item. The Campaign Plan carries commentCount, the number of its Comments: campaign_plan_comment_list reads them. It also carries three money figures — the envelope (what you have), the allocated sum (what you have placed) and the remainder. When allocation.comparable is false the Line Items do not share a unit, so there is no total to state: say “not comparable” rather than adding them. A person approves a Campaign Plan and validates a Line Item in the AdCrunch console. No tool approves or validates. The provider write tools do not check either status. Echo revision back as base_revision when you write to the Campaign Plan. The Campaign Plan carries its assignees. An Assignee is a current member of the organization who is accountable for the record. An Assignee has no extra access: every role with the write scope can still edit the record. A Campaign Plan is AdCrunch’s own planning document — it is not a campaign on Meta or Google. For those, use list_campaigns and get_campaign.
Input
| Argument | Type | Required | Description |
|---|---|---|---|
campaign_plan_name |
string | yes | The Campaign Plan slug — its stable per-organization handle. |
Output
A successful call returns this object in structuredContent.
| Field | Type | Always present | Description |
|---|---|---|---|
campaignPlan |
object | yes | The Campaign Plan as it is now, with the number of its Line Items. line_item_list gives the Line Items. |
campaignPlan.allocation |
object | yes | The money of the Campaign Plan. AdCrunch calculates it on each read and does not store it. |
campaignPlan.allocation.allocated |
number or null | yes | The sum of the Line Item budgets, in whole units of the currency. null when the Line Items with a budget do not share a unit. |
campaignPlan.allocation.comparable |
boolean | yes | false when the Line Items with a budget mix totals and daily rates. Then no sum exists: say “not comparable”, and do not add the budgets. |
campaignPlan.allocation.unallocated |
number or null | yes | The envelope less the allocated sum. It can be negative. null when the envelope is not set, when the Line Items do not share a unit, or when the unit is daily. |
campaignPlan.allocation.unit |
one of total, daily or null |
yes | The unit that the Line Items with a budget share. null when no Line Item has a budget, or when the Line Items do not share a unit. |
campaignPlan.assignees |
array of object | yes | The current members who are accountable for the record, oldest first, at most 10. An Assignee grants no access. |
campaignPlan.assignees[].id |
string | yes | The usr_… id of the member. |
campaignPlan.assignees[].name |
string | yes | The name of the member. |
campaignPlan.body |
string or null | yes | The long markdown document of the Campaign Plan: the argument for the split, how the result is judged, and anything else a reviewer reads. null when nobody wrote it. |
campaignPlan.brand |
object or null | yes | The Brand that the Campaign Plan is for, or null when it has no Brand or its Brand was deleted. |
campaignPlan.brand.name |
string | yes | The display name of the Brand. |
campaignPlan.brand.slug |
string | yes | The slug of the Brand. Each tool takes it as brand_name. |
campaignPlan.brandId |
string or null | yes | The Brand that the Campaign Plan is for, brd_…, or null. |
campaignPlan.commentCount |
number | yes | The number of live Comments on the Campaign Plan, replies included. List them with campaign_plan_comment_list. |
campaignPlan.createdAt |
number | yes | Milliseconds since the Unix epoch, UTC. |
campaignPlan.createdBy |
string | yes | The user who created the Campaign Plan, usr_…. |
campaignPlan.currency |
string | yes | ISO 4217. Each amount of the Campaign Plan and of its Line Items is in whole units of this currency. It cannot change after a Line Item has a budget. |
campaignPlan.description |
string | yes | One sentence that tells the Campaign Plan apart in a list. |
campaignPlan.endDate |
string or null | yes | The last day of the Campaign Plan, or null. With no end date, the Campaign Plan is always on, and the budget of a Line Item with no end date of its own is a daily rate. |
campaignPlan.id |
string | yes | The id of the Campaign Plan, cpl_…. |
campaignPlan.lineItemCount |
number | yes | The number of live Line Items of the Campaign Plan. List them with line_item_list. |
campaignPlan.name |
string | yes | The display name. |
campaignPlan.revision |
number | yes | The revision of the Campaign Plan. It increments when the Campaign Plan changes. Send it as base_revision to campaign_plan_update or campaign_plan_delete. A Line Item has a revision of its own. |
campaignPlan.slug |
string | yes | The slug of the Campaign Plan. Each tool takes it as campaign_plan_name. |
campaignPlan.startDate |
string or null | yes | The first day of the Campaign Plan, or null. |
campaignPlan.status |
one of draft, approved |
yes | approved when a person approved the content at this revision in the AdCrunch console. It is a record, not a gate: the provider write tools do not check it. A real change to the Campaign Plan, or a Line Item that is added or deleted, returns it to draft. |
campaignPlan.totalBudget |
number or null | yes | The envelope: the money that you have, in whole units of currency. null means no declared limit, not zero. |
campaignPlan.updatedAt |
number or null | yes | When the Campaign Plan last changed, or null when it never changed. |
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_foundorganization_unentitledforbiddeninvalid_requestinternal_error
Scope
The token must hold campaign_plan:read. 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.
- Read-only. The tool changes nothing.
- Closed world. The tool reads and writes the data of AdCrunch only.
Example
The arguments:
{
"campaign_plan_name": "spring-sale"
}
The result, in structuredContent:
{
"campaignPlan": {
"allocation": {
"allocated": 2500,
"comparable": true,
"unallocated": 2500,
"unit": "total"
},
"assignees": [
{
"id": "usr_4d8b12",
"name": "Maya Lindqvist"
}
],
"body": "## Why this split\n\nMeta carries the reach. One Line Item keeps the budget in one place.\n\n## How it will be judged\n\nRevenue in the window, against the spring of 2025.",
"brand": {
"name": "Acme",
"slug": "acme"
},
"brandId": "brd_6a9c33",
"commentCount": 2,
"createdAt": 1768435200000,
"createdBy": "usr_5d2b71",
"currency": "EUR",
"description": "The spring sale of Acme, on Meta, in France and Belgium.",
"endDate": "2026-05-31",
"id": "cpl_4e1a08",
"lineItemCount": 1,
"name": "Spring Sale 2026",
"revision": 3,
"slug": "spring-sale",
"startDate": "2026-03-01",
"status": "approved",
"totalBudget": 5000,
"updatedAt": 1769040000000
}
}