---
title: "Check a Line Item’s execution readiness"
method: GET
path: "/context/campaign-plans/{slug}/line-items/{lineItemId}/readiness"
tags: ["Line Items"]
---

# Check a Line Item’s execution readiness

`GET /context/campaign-plans/{slug}/line-items/{lineItemId}/readiness`

## Request

- Base URL: `https://api.adcrunch.dev`
- URL: `https://api.adcrunch.dev/context/campaign-plans/{slug}/line-items/{lineItemId}/readiness`
- Auth: HTTP bearer

Tells you whether AdCrunch can execute a Line Item now, and if it cannot, why. Ask this **before** any provider call.

This call reads. It changes nothing, and it calls no provider. It answers for every channel, including a channel AdCrunch cannot write to.

A line is not ready in these conditions:

- Nobody validated the line.
- AdCrunch cannot write to the channel. The answer names the provider that sells it, or `null` when nobody we integrate with sells it.
- The line has no ad account.
- The ad account is not connected to this organization.
- The ad account belongs to a different provider than the channel.
- The currency of the ad account is different from the Campaign Plan currency, or AdCrunch does not know that currency yet. To make it known, refresh the provider connection.
- The line and the Campaign Plan give no date at all.
- The resolved start follows the resolved end. Each row is ordered on its own, and only the pair shows this.

AdCrunch never converts a currency. A converted budget is a different plan.

When the line is `ready`, the answer also gives the resolved window, and it tells you whether the budget goes to the provider as a lifetime total or as a daily rate.

## Path parameters

- `lineItemId` string, required
- `slug` string, required

## Response `200`

The verdict, discriminated on `status`. **Every outcome is a 200**, `ready` included: "this cannot run, and here is why" is an answer rather than a failed request. The example shows `ready`; the schema lists the nine refusals and what each one carries.

- union: Asked before any provider call. This never mutates.
  - object
    - `advertiserId` string, required
    - `budget` number, nullable, required
    - `currency` string, required: The plan’s currency, confirmed equal to the account’s.
    - `endDate` string, nullable, required: A calendar date, `YYYY-MM-DD`.
    - `provider` string, required
    - `startDate` string, nullable, required: A calendar date, `YYYY-MM-DD`.
    - `status` 'ready', required
    - `unit` 'total' | 'daily', required
  - object
    - `status` 'not_validated', required: The gate. Approving the plan, or validating the line, opens it.
  - object
    - `channel` 'meta' | 'tiktok' | 'snapchat' | 'google_search' | 'google_pmax' | 'google_display' | 'youtube' | 'programmatic_display' | 'linkedin' | 'x', required
    - `provider` string, nullable, required: Who sells it, when someone does but we cannot write there yet.
    - `status` 'channel_not_executable', required
  - object
    - `status` 'no_advertiser', required
  - object
    - `status` 'advertiser_not_owned', required
  - object
    - `actual` string, required
    - `expected` string, required
    - `status` 'provider_mismatch', required
  - object
    - `advertiserId` string, required
    - `status` 'account_currency_unknown', required: Refresh the provider connection.
  - object
    - `accountCurrency` string, required
    - `planCurrency` string, required
    - `status` 'currency_mismatch', required: Never converted. A converted budget is a different plan, and the planner allocated what they allocated.
  - object
    - `status` 'no_window', required
  - object
    - `endDate` string, required: A calendar date, `YYYY-MM-DD`.
    - `startDate` string, required: A calendar date, `YYYY-MM-DD`.
    - `status` 'window_inverted', required

## Other responses

- `400`: The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. `error` is `invalid_request`, and `issues` names each field. Nothing was changed.
- `401`: No API key, or one that does not resolve. See the security scheme. `error` is `unauthorized`.
- `402`: The organization has no active subscription. An owner subscribes at `paywallUrl`. `error` is `organization_unentitled`.
- `403`: The caller does not hold `campaign_plan:read`. `error` is `forbidden`.
- `404`: No such plan, or no Line Item with that id on it. `error` is `not_found`. This is the one readiness outcome that is not a 200, because the question itself has no subject.

---

[API](https://skmtc.dev/adcrunch/apis/adcrunch-api.md) · [All operations](https://skmtc.dev/adcrunch/apis/adcrunch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adcrunch/apis/adcrunch-api/revisions/a420ba80914f?raw)
