---
title: line_item_delete
description: 'Remove a Line Item from a Campaign Plan. What it created stays live.'
---

Ask the agent to remove one Line Item from a Campaign Plan.

> "Remove the LinkedIn Line Item from the spring sale Campaign Plan."

The agent reads the Campaign Plan to get the id and the revision of the Line Item. Then it calls `line_item_delete`. You see that the Line Item is gone, and that the Campaign Plan is a draft: a removed Line Item cancels an approval. A campaign that the Line Item created stays live on Meta, and its record stays.

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

## Reference

Delete a Line Item. Pass base_revision from campaign_plan_get. Removing a line returns an approved plan to draft, for the same reason adding one does. What the line already created is kept — those objects are live in an ad account and this does not retract them.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `base_revision` | integer | yes | The revision of the Line Item, as you last read it: the `revision` of that Line Item in `lineItems` of campaign_plan_get. It is not the revision of the Campaign Plan. It guards against a write over a change that another person made after your read. |
| `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 |
| --- | --- | --- | --- |
| `campaignPlanStatus` | one of `draft`, `approved` | yes | The status of the Campaign Plan after the write. It is always `draft`, because a Line Item that is added or deleted returns an approved Campaign Plan to draft. |
| `deleted` | `true` | yes |  |
| `lineItemId` | string | yes | The id of the deleted Line Item, `lni_…`. |

### 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.
- **Not idempotent.** A second call with the same arguments can change more.
- **Closed world.** The tool reads and writes the data of AdCrunch only.

### Example

The arguments:

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

The result, in `structuredContent`:

```json
{
  "campaignPlanStatus": "draft",
  "deleted": true,
  "lineItemId": "lni_2d9e77"
}
```
