---
title: line_item_get
description: 'Read one Line Item with its readiness: if AdCrunch can build it now, and why not when it cannot.'
---

Ask the agent to look at one Line Item, and to check that AdCrunch can build it before the agent 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_get`. You see the Line Item with its name, its money in the currency of the Campaign Plan, its dates and what it created. You also see its 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 agent names one reason and tells you what to do: for example, choose an ad account in the currency of the Campaign Plan. AdCrunch never converts a currency.

When a person must validate the Line Item, the agent gives you the link to the page of the Line Item in the AdCrunch console. The readiness 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

Fetch one Line Item of a Campaign Plan, by the slug of the Campaign Plan and the id of the Line Item. line_item_list lists the Line Items and gives their ids. The answer has the fields of the Line Item as line_item_list returns it, with what it already created, and beside them consoleUrl, currency and readiness. status is the status of the Line Item, and readiness.status is the verdict. currency is the currency of the Campaign Plan, and each amount of the Line Item is in whole units of it. readiness answers whether AdCrunch can build the Line Item now, and why not when it cannot. Call it before you build a Line Item with a provider write tool, such as meta_create_campaign. It reads the Context store and the ad account that AdCrunch stores, and it calls no provider. readiness.status is `ready`, or it names the first reason: a person has not validated the Line Item in the AdCrunch console (`not_validated`), AdCrunch cannot write to the channel (`channel_not_executable`), the Line Item names no ad account (`no_advertiser`), the ad account is not connected (`advertiser_not_owned`), the ad account belongs to another provider (`provider_mismatch`), AdCrunch does not know the currency of the ad account (`account_currency_unknown`), the currencies differ (`currency_mismatch`), the dates are missing (`no_window`), or the dates are in the wrong order (`window_inverted`). For `no_advertiser`, `advertiser_not_owned`, `provider_mismatch` and `currency_mismatch`, set advertiser_id with line_item_update: list_advertisers gives the ad accounts. For `no_window` and `window_inverted`, give dates with line_item_update or campaign_plan_update. For `not_validated`, a person validates the Line Item, or approves the Campaign Plan, in the AdCrunch console: give consoleUrl, the page of the Line Item, to the user. For `account_currency_unknown`, a person refreshes the provider connection in the AdCrunch console. For `channel_not_executable`, tell the user that AdCrunch cannot build the Line Item. When the status is `ready`, readiness 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. readiness is advice: the provider write tools do not read it. AdCrunch never converts a currency. Echo revision back as base_revision when you write to the Line Item.

### 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 line_item_list. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `advertiserId` | string or null | yes | The ad account that the Line Item runs through, `acc_…`, or `null`. |
| `ageMax` | number or null | yes | The highest age, or `null` for no upper bound. |
| `ageMin` | number or null | yes | The lowest age, or `null` for no lower bound. |
| `budget` | number or null | yes | The amount in whole units of the currency of the Campaign Plan, or `null` when it is not set. `unit` tells how to read it. |
| `campaignPlanId` | string | yes | The id of the Campaign Plan that holds the Line Item, `cpl_…`. |
| `channel` | one of `meta`, `tiktok`, `snapchat`, `google_search`, `google_pmax`, `google_display`, `youtube`, `programmatic_display`, `linkedin`, `x` | yes | What the Line Item buys, in planning words. A channel is not a provider. |
| `countries` | array of string | yes | ISO 3166-1 alpha-2 codes. An empty list means that the geography is not decided. |
| `createdAt` | number | yes | Milliseconds since the Unix epoch, UTC. |
| `createdBy` | string | yes | The user who added the Line Item, `usr_…`. |
| `effectiveEndDate` | string or null | yes | The end that applies: the end date of the Line Item, else the end date of the Campaign Plan. `null` when neither has one. |
| `effectiveStartDate` | string or null | yes | The start that applies: the start date of the Line Item, else the start date of the Campaign Plan. `null` when neither has one. |
| `endDate` | string or null | yes | The end date of the Line Item itself, or `null` when the Line Item uses the end date of the Campaign Plan. |
| `executable` | boolean | yes | `true` when AdCrunch can create objects for this channel today. It is not a promise that a create succeeds. |
| `executions` | array of object | yes | The provider objects that the Line Item created, as `line_item_record_execution` recorded them. The list does not tell whether the Line Item is complete. |
| `executions[].advertiserId` | string | yes | The ad account that holds the object, `acc_…`. |
| `executions[].createdAt` | number | yes | When AdCrunch recorded the object, in milliseconds since the Unix epoch, UTC. |
| `executions[].entityId` | string | yes | The id of the object on the provider, with no prefix. The entity tools, such as `list_campaigns` and `get_ad`, use the same id. |
| `executions[].entityType` | string | yes | The word of the provider for the level of the object, such as `campaign`, `adset` or `ad`. |
| `executions[].id` | string | yes | The id of the record, `exe_…`. |
| `executions[].mutationId` | string or null | yes | The `mutationId` of the change that created the object, or `null` when the record names none. |
| `executions[].provider` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` | yes | The provider of the object. |
| `gender` | one of `all`, `men`, `women` or null | yes | The gender of the audience, or `null` when it is not decided. `null` executes as `all`. |
| `id` | string | yes | The id of the Line Item, `lni_…`. |
| `name` | string or null | yes | A short label of the Line Item, at most 60 characters, or `null` for no name. It is not unique, and it is not a handle: nothing looks a Line Item up by it. |
| `objective` | one of `awareness`, `engagement`, `leads`, `sales`, `traffic`, `app_promotion` | yes | What the Line Item is for. |
| `personaId` | string or null | yes | The Persona that explains the audience, `psn_…`, or `null`. The countries, the ages and the gender are what execute. |
| `provider` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` or null | yes | The provider that sells the channel, or `null` when AdCrunch has no integration for it. |
| `revision` | number | yes | The revision of the Line Item. It increments when the Line Item changes. Send it as `base_revision` to `line_item_update` or `line_item_delete`. |
| `startDate` | string or null | yes | The start date of the Line Item itself, or `null` when the Line Item uses the start date of the Campaign Plan. |
| `status` | one of `draft`, `validated` | yes | `validated` when a person validated the Line Item in the AdCrunch console, alone or with the approval of the Campaign Plan. It is a record, not a gate: the provider write tools do not check it. A real change to the Line Item returns it to `draft`. |
| `targetMetric` | one of `cpa`, `cpc`, `cpm`, `roas` or null | yes | The metric of the target, or `null` for no target. `cpa`, `cpc` and `cpm` are costs: lower is better. `roas` is a return: higher is better. A target blocks nothing: approval and readiness do not read it. |
| `targetValue` | number or null | yes | The value of the target: whole units of the currency of the Campaign Plan for `cpa`, `cpc` and `cpm`, a ratio for `roas`. `null` for no target. |
| `unit` | one of `total`, `daily` | yes | How to read `budget`. `total` when the Line Item has an effective end date: the budget is for the whole period. `daily` when it has none: the budget is for each day. |
| `updatedAt` | number or null | yes | When the Line Item last changed, or `null` when it never changed. |
| `consoleUrl` | string | yes | The page of the Line Item in the AdCrunch console. A person validates the Line Item there. Give it to the user when a person must act. |
| `currency` | string | yes | The currency of the Campaign Plan, ISO 4217. Each amount of the Line Item is in whole units of it. |
| `readiness` | object | yes | Whether AdCrunch can build the Line Item now, and if it cannot, why. AdCrunch derives it on each read and stores it nowhere. It 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/line-items/lni_2d9e77",
  "advertiserId": "acc_1203456789012345",
  "ageMax": 44,
  "ageMin": 25,
  "budget": 2500,
  "campaignPlanId": "cpl_4e1a08",
  "channel": "meta",
  "countries": [
    "FR",
    "BE"
  ],
  "createdAt": 1768435200000,
  "createdBy": "usr_5d2b71",
  "effectiveEndDate": "2026-05-31",
  "effectiveStartDate": "2026-03-01",
  "endDate": null,
  "executable": true,
  "executions": [
    {
      "advertiserId": "acc_1203456789012345",
      "createdAt": 1772409600000,
      "entityId": "120210000000000",
      "entityType": "campaign",
      "id": "exe_7a4c12",
      "mutationId": "mut_k3x9q2v7m4n8p1r5t6w0y2z4",
      "provider": "meta"
    }
  ],
  "gender": "all",
  "id": "lni_2d9e77",
  "name": "France and Belgium, parents",
  "objective": "sales",
  "personaId": "psn_8c4a20",
  "provider": "meta",
  "revision": 2,
  "startDate": null,
  "status": "validated",
  "targetMetric": "cpa",
  "targetValue": 24.5,
  "unit": "total",
  "updatedAt": 1769040000000,
  "currency": "EUR",
  "readiness": {
    "advertiserId": "acc_1203456789012345",
    "budget": 2500,
    "currency": "EUR",
    "endDate": "2026-05-31",
    "provider": "meta",
    "startDate": "2026-03-01",
    "status": "ready",
    "unit": "total"
  }
}
```
