---
title: line_item_readiness
description: 'Check whether AdCrunch can build a Line Item now, and if it cannot, why and what to do.'
---

Ask the agent to check a Line Item before it builds it on Meta. The Meta tools do not read your Campaign Plan, so this check is how the agent finds a problem before it spends.

> "Can you build the Meta Line Item of the spring sale Campaign Plan now?"

The agent calls `line_item_readiness`. When the Line Item is `ready`, the answer gives the dates that apply, the budget, and whether the budget goes to Meta as a lifetime total or as a daily rate. When it is not ready, the answer names one reason and gives the fix: for example, an ad account in a different currency. AdCrunch never converts a currency.

When a person must validate the Line Item, the agent gives you the link to the page of the Campaign Plan in the AdCrunch console. The check is advice: the Meta tools do not read it, so AdCrunch does not refuse to build a Line Item that is not ready.

[Plan a campaign](/mcp/tools/plan-a-campaign) walks the whole job.

## Reference

Check whether AdCrunch can build a Line Item now, and if it cannot, why. Call it before you build a Line Item with a provider write tool, such as meta_create_campaign. It reads, it changes nothing, and it calls no provider. readiness.status is `ready`, or it names one reason: a person has not validated the Line Item in the AdCrunch console, AdCrunch cannot write to the channel, the Line Item names no ad account, the ad account is not connected, the ad account belongs to another provider, AdCrunch does not know the currency of the ad account, the currencies differ, or the dates are missing or in the wrong order. fix tells you what to do about the reason. consoleUrl is the page of the Campaign Plan: give it to the user when a person must act there. When the Line Item is `ready`, the answer gives the dates that apply, and it tells you whether the budget goes to the provider as a lifetime total or as a daily rate. This answer is advice: the provider write tools do not read it. AdCrunch never converts a currency.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `campaign_plan_name` | string | yes | The Campaign Plan slug — its stable per-organization handle. |
| `line_item_id` | string | yes | The Line Item id, as returned by campaign_plan_get. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `consoleUrl` | string | yes | The page of the Campaign Plan in the AdCrunch console. A person validates a Line Item and approves a Campaign Plan there. |
| `fix` | string or null | yes | What to do so that the Line Item becomes ready, in one sentence. `null` when `readiness.status` is `ready`. |
| `readiness` | object | yes | Whether AdCrunch can build the Line Item now, and if it cannot, why. This is advice: the provider write tools do not read it. |
| `readiness.status` | `ready` or `not_validated` or `channel_not_executable` or `no_advertiser` or `advertiser_not_owned` or `provider_mismatch` or `account_currency_unknown` or `currency_mismatch` or `no_window` or `window_inverted` | yes | `ready`: AdCrunch can build the Line Item now. `not_validated`: A person has not validated the Line Item in the AdCrunch console. `channel_not_executable`: AdCrunch cannot write to this channel today. `no_advertiser`: The Line Item names no ad account. `advertiser_not_owned`: The ad account is not connected to this organization. `provider_mismatch`: The ad account belongs to a different provider than the channel. `account_currency_unknown`: AdCrunch does not know the currency of the ad account. `currency_mismatch`: The ad account uses a different currency than the Campaign Plan. AdCrunch never converts a currency. `no_window`: The Line Item and the Campaign Plan give no date at all. `window_inverted`: The start that applies falls after the end that applies. Each row is ordered on its own, and only the pair shows this. |
| `readiness.advertiserId` | string | yes | Only when `status` is `ready`. The ad account, `acc_…`. |
| `readiness.budget` | number or null | yes | Only when `status` is `ready`. The budget of the Line Item, in whole units of `currency`, or `null` when it has none. |
| `readiness.currency` | string | yes | Only when `status` is `ready`. The currency of the Campaign Plan. It is also the currency of the ad account. |
| `readiness.endDate` | string or null | yes | Only when `status` is `ready`. The end that applies: the end of the Line Item, else the end of the Campaign Plan. `null` when neither has one. |
| `readiness.provider` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` | yes | Only when `status` is `ready`. The provider that sells the channel. |
| `readiness.startDate` | string or null | yes | Only when `status` is `ready`. The start that applies: the start of the Line Item, else the start of the Campaign Plan. `null` when neither has one. |
| `readiness.unit` | one of `total`, `daily` | yes | Only when `status` is `ready`. How the budget goes to the provider: `total` as a lifetime budget, `daily` as a daily budget. |
| `readiness.channel` | one of `meta`, `tiktok`, `snapchat`, `google_search`, `google_pmax`, `google_display`, `youtube`, `programmatic_display`, `linkedin`, `x` | yes | Only when `status` is `channel_not_executable`. The channel of the Line Item. |
| `readiness.provider` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` or null | yes | Only when `status` is `channel_not_executable`. The provider that sells the channel, or `null` when no integration of AdCrunch sells it. |
| `readiness.actual` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` | yes | Only when `status` is `provider_mismatch`. The provider of the ad account. |
| `readiness.expected` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` | yes | Only when `status` is `provider_mismatch`. The provider that sells the channel. |
| `readiness.advertiserId` | string | yes | Only when `status` is `account_currency_unknown`. The ad account, `acc_…`. |
| `readiness.accountCurrency` | string | yes | Only when `status` is `currency_mismatch`. The currency of the ad account. |
| `readiness.planCurrency` | string | yes | Only when `status` is `currency_mismatch`. The currency of the Campaign Plan. |
| `readiness.endDate` | string | yes | Only when `status` is `window_inverted`. The end that applies. |
| `readiness.startDate` | string | yes | Only when `status` is `window_inverted`. The start that applies. |

### 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`
- `organization_unentitled`
- `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.

### Example

The arguments:

```json
{
  "campaign_plan_name": "spring-sale",
  "line_item_id": "lni_2d9e77"
}
```

The result, in `structuredContent`:

```json
{
  "consoleUrl": "https://console.adcrunch.dev/campaign-plans/spring-sale",
  "fix": null,
  "readiness": {
    "advertiserId": "acc_1203456789012345",
    "budget": 2500,
    "currency": "EUR",
    "endDate": "2026-05-31",
    "provider": "meta",
    "startDate": "2026-03-01",
    "status": "ready",
    "unit": "total"
  }
}
```
