---
title: line_item_validate
description: 'Validate one line item, which is what lets it be executed.'
---

Validates a single **Line Item** — the gate execution checks.

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `campaign_plan_name` | `string` | yes | The plan that owns the line. |
| `line_item_id` | `lni_…` | yes | From `campaign_plan_get`. |
| `base_revision` | `integer` | yes | The revision you last read. Validation is of _that_ content. |

:::tip[Use this when one line is ready and the plan is not]

[`campaign_plan_approve`](/mcp/tools/campaign-plan-approve) cascades over every draft line, which would apply your approval to somebody else's half-written row. This is the narrow gesture.

:::

:::info[Validating changes nothing on any provider]

It opens the gate; it does not walk through it. Creating the campaigns and ad sets still goes through the mutation tools and needs the `mutation:write` scope. Validating an already-validated line is a no-op, not an error.

:::

Requires the `campaign_plan:write` scope.

## Reference

Validate one Line Item, which is what lets it be executed. Use this instead of campaign_plan_approve when one line is ready and the rest of the plan is not — approving cascades over every draft line, which would apply your approval to somebody else's half-written row. This changes nothing on any provider; executing still needs the mutation tools and the mutation:write scope.

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

### 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`
- `revision_mismatch`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `campaign_plan:write`. [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.

- **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.
- **Idempotent.** A second call with the same arguments changes nothing more.
- **Closed world.** The tool reads and writes the data of AdCrunch only.
