---
title: campaign_plan_get
description: 'Fetch one campaign plan with its line items in full, the money figures, and whatever each line has already created.'
---

Fetches a single **Campaign Plan** and everything on it.

:::warning[A Campaign Plan is not a provider campaign]

It is AdCrunch's own planning document — written before anything is bought, and possibly executed into several campaigns, or none. For campaigns that exist on Meta or Google, use [`list_entities`](/mcp/tools/list-entities) and [`get_entity`](/mcp/tools/get-entity).

:::

## Input

| Field                | Type     | Required | Description    |
| -------------------- | -------- | -------- | -------------- |
| `campaign_plan_name` | `string` | yes      | The plan slug. |

## Output

The plan, its three money figures, and its **Line Items in full** — there is no `line_item_get`, because there would be nothing left to fetch.

Each line carries four facts that are derived rather than stored:

| Field | What it tells you |
| --- | --- |
| `provider` | Which provider sells this channel, or `null` when none we integrate with does. |
| `executable` | Whether it could be executed at all today. Only `meta` can. |
| `effectiveStartDate` / `effectiveEndDate` | The window that actually applies, after inheriting the plan's. |
| `unit` | `total` or `daily` — how to read `budget`. |

`executions` lists what the line has already created: one row per provider object, each with its native id.

Money is in **whole units** of `currency`: `100000` is €100,000.

## Example

```ts
campaign_plan_get({ campaign_plan_name: 'q4-acquisition' });
// → { campaignPlan: {
//      currency: 'EUR', totalBudget: 100000, status: 'approved',
//      allocation: { allocated: 60000, unallocated: 40000, unit: 'total', comparable: true },
//      lineItems: [{ id: 'lni_…', channel: 'meta', unit: 'total', executions: [] }],
//      revision: 4,
//    } }
```

:::info[Echo `revision` back when you write]

Every write takes `base_revision`. A write to the plan sends the `revision` of the plan. A write to a Line Item sends the `revision` of that Line Item. If it moved since you read it, the write is refused and tells you the current revision — read again, check the change is compatible with yours, and retry.

:::

Requires the `campaign_plan:read` scope.

## Reference

Fetch one Campaign Plan by its slug, with its Line Items in full and whatever each has already created. Every line carries four derived facts: which provider sells its channel, whether we can execute it at all today, the window it resolves to after inheriting the plan's, and whether its amount reads as a total or a daily rate. The plan 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 lines do not share a unit, so there is no total to state: say "not comparable" rather than adding them. Echo revision back as base_revision when writing. 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 |
| --- | --- | --- | --- |
| `campaign_plan_name` | string | yes | The Campaign Plan slug — its stable per-organization handle. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `campaign_plan:read`. [Auth & scopes](/mcp/auth) 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.
