Skip to content
AdCrunch
Esc
↑↓navigate↵open⌘Jpreview

Get the delivery of a Campaign Plan

Reads what each Line Item of a Campaign Plan delivered. AdCrunch calculates the answer on each read, and it stores nothing.

For each Line Item, the answer gives:

  • The sums of the spend, the impressions, the clicks, the conversions and the conversion value of the objects that the Line Item recorded, from the start that applies to today, or to the end that applies when it is in the past. cpa, cpc, cpm and roas come from the sums.
  • The pacing: the spend against the spend that the budget expects by today, as a ratio. It is never a verdict.
  • The target against the same metric, delivered.
  • asOf, the most recent day that the sums include.

A campaign holds the spend of its ad sets, so an object with a recorded ancestor is not counted again. A Line Item with no recorded object is nothing_recorded, which is not a spend of 0. AdCrunch never converts a currency: an object in another currency makes the money comparable: false.

The total reads the objects of all the Line Items again, over the window of the Campaign Plan, and counts each object once. So it can be less than the sum of the Line Items.

The MCP tool campaign_plan_delivery gives the same answer to an agent.

GET/context/campaign-plans/{slug}/delivery
Authorization
AuthorizationBearer token · headerrequired

Send Authorization: Bearer <credential>.

Use an API key (acr_…), from the AdCrunch console under Settings → API keys.

The credential names the organization, and no operation takes an organization parameter.

See https://docs.adcrunch.dev/api/authentication.

Path parameters
slugstringrequired
Responses
200

The delivery of each Line Item, and the total of the Campaign Plan.

campaignPlanIdstringrequired
currencystringrequired
lineItemsobject[]required
Show properties
Array of object
advertiserNotOwnedobject[]required

The recorded objects in an ad account that the organization no longer owns. AdCrunch reads no insight of them.

Show properties
Array of object
entityIdstringrequired

The native provider id.

entityTypestringrequired
providerstringrequired
asOfstring | nullrequired

The most recent day that the sums include. AdCrunch reads the insights once a day.

budgetnumber | nullrequired
channelstringrequired
Allowed:metatiktoksnapchatgoogle_searchgoogle_pmaxgoogle_displayyoutubeprogrammatic_displaylinkedinx
countedobject[]required

The recorded objects that the sums count: each one with no recorded ancestor.

Show properties
Array of object
entityIdstringrequired

The native provider id.

entityTypestringrequired
providerstringrequired
deliveredobject | nullrequired

The sums of the counted objects. Each metric comes from the sums, never from a mean of the days. null unless status is delivered.

Show properties
clicksnumberrequired
comparablebooleanrequired

Whether the money is in the currency of the Campaign Plan. false when an object spent in another currency.

conversionValuenumber | nullrequired

The sum of the conversion value, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

conversionsnumberrequired
cpanumber | nullrequired

spend / conversions, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

cpcnumber | nullrequired

spend / clicks, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

cpmnumber | nullrequired

spend × 1000 / impressions, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

currenciesstring[]required

The account currencies of the counted objects. null is a currency that AdCrunch does not know.

impressionsnumberrequired
roasnumber | nullrequired

conversionValue / spend, from the sums, with two decimals. It needs one account currency, not the currency of the Campaign Plan.

spendnumber | nullrequired

The sum of the spend, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

lineItemIdstringrequired
noDataYetobject[]required

The recorded objects with no insight in the window yet. Not a spend of 0.

Show properties
Array of object
entityIdstringrequired

The native provider id.

entityTypestringrequired
providerstringrequired
pacingobject | nullrequired

The spend against the spend that the budget expects to date. null with no budget, or with no start that applies.

Show properties
elapsedDaysnumberrequired

The days of the window up to today. 0 before the start.

expectedSpendnumberrequired

Whole units of the Campaign Plan currency. A total budget: budget × elapsed days / window days. A daily budget: budget × elapsed days.

rationumber | nullrequired

spend / expectedSpend, with two decimals. null when the expected spend is 0, or when the spend is not known or not comparable. A ratio, never a verdict.

windowDaysnumber | nullrequired

The days of a total window. null for a daily budget.

sincestring | nullrequired

The first day that the sums read: the start that applies.

statusstringrequired

nothing_recorded: no recorded object, which is not a spend of 0. no_data_yet: no insight of the objects yet. delivered: the sums of the counted objects.

Allowed:nothing_recordedno_data_yetdelivered
targetobject | nullrequired

The target of the Line Item. null when it has none.

Show properties
deliverednumber | nullrequired
directionstringrequired

ceiling meets at or below the value (a cost). floor meets at or above it (a return).

Allowed:ceilingfloor
metboolean | nullrequired

null when the delivered value is null.

metricstringrequired
Allowed:cpacpccpmroas
valuenumberrequired

Whole units of the Campaign Plan currency for cpa, cpc and cpm, a ratio for roas.

unitstringrequired
Allowed:totaldaily
untilstringrequired

The last day that the sums read: today, or the end that applies when it is in the past.

slugstringrequired
todaystringrequired

The day that the pacing counts to, UTC.

totalobject | nullrequired

The objects of the Line Items that delivered, read again over the window of the Campaign Plan. Each object counts once, so the total can be less than the sum of the Line Items. null when no Line Item delivered.

Show properties
One of:
object
asOfstringrequired

A calendar date, YYYY-MM-DD.

countedobject[]required

The objects that the total counts: across all the Line Items, each one once.

Show properties
Array of object
entityIdstringrequired

The native provider id.

entityTypestringrequired
providerstringrequired
sincestring | nullrequired

The first day that the total reads: the start of the plan.

untilstringrequired

The last day: today, or the end of the plan when it is in the past.

comparablebooleanrequired
Allowed:true
deliveredobjectrequired

The sums of the counted objects. Each metric comes from the sums, never from a mean of the days. null unless status is delivered.

Show properties
clicksnumberrequired
comparablebooleanrequired

Whether the money is in the currency of the Campaign Plan. false when an object spent in another currency.

conversionValuenumber | nullrequired

The sum of the conversion value, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

conversionsnumberrequired
cpanumber | nullrequired

spend / conversions, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

cpcnumber | nullrequired

spend / clicks, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

cpmnumber | nullrequired

spend × 1000 / impressions, from the sums, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

currenciesstring[]required

The account currencies of the counted objects. null is a currency that AdCrunch does not know.

impressionsnumberrequired
roasnumber | nullrequired

conversionValue / spend, from the sums, with two decimals. It needs one account currency, not the currency of the Campaign Plan.

spendnumber | nullrequired

The sum of the spend, in whole units of the Campaign Plan currency. null when comparable is false: AdCrunch never converts a currency.

object
asOfstringrequired

A calendar date, YYYY-MM-DD.

countedobject[]required

The objects that the total counts: across all the Line Items, each one once.

Show properties
Array of object
entityIdstringrequired

The native provider id.

entityTypestringrequired
providerstringrequired
sincestring | nullrequired

The first day that the total reads: the start of the plan.

untilstringrequired

The last day: today, or the end of the plan when it is in the past.

comparablebooleanrequired

The Line Items do not share one unit, or an object spent in another currency. Show "not comparable", never a total.

Allowed:false
deliveredstring | nullrequired
Allowed:null
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.

issuesobject[]required

One entry for each field that does not match.

Show properties
Array of object
instringrequired

The part of the request that holds the field.

Allowed:bodycookieheadersparamsquery
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

pathstringrequired

A JSON Pointer into that part of the request, such as /filename. An empty string is the whole part.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:invalid_request
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

401

No API key, or one that does not resolve. See the security scheme. error is unauthorized.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:unauthorized
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

402

The organization has no active subscription. An owner subscribes at paywallUrl. error is organization_unentitled.

paywallUrlstring<uri>required

The page where an owner of the organization subscribes. Show it to the person.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:organization_unentitled
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

403

The caller does not hold campaign_plan:read and observe:read. error is forbidden.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:forbidden
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

404

No Campaign Plan with that slug. error is not_found.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

Request
curl -X GET 'https://api.pr-1267.adcrunch.dev/context/campaign-plans/string/delivery' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Response
{
  "campaignPlanId": "cpl_8f2k1m",
  "currency": "EUR",
  "lineItems": [
    {
      "advertiserNotOwned": [],
      "asOf": "2026-03-09",
      "budget": 3100,
      "channel": "meta",
      "counted": [
        {
          "entityId": "120210000000000",
          "entityType": "campaign",
          "provider": "meta"
        }
      ],
      "delivered": {
        "clicks": 1600,
        "comparable": true,
        "conversionValue": 2400,
        "conversions": 40,
        "cpa": 20,
        "cpc": 0.5,
        "cpm": 10,
        "currencies": [
          "EUR"
        ],
        "impressions": 80000,
        "roas": 3,
        "spend": 800
      },
      "lineItemId": "lni_2d9e77",
      "noDataYet": [],
      "pacing": {
        "elapsedDays": 10,
        "expectedSpend": 1000,
        "ratio": 0.8,
        "windowDays": 31
      },
      "since": "2026-03-01",
      "status": "delivered",
      "target": {
        "delivered": 20,
        "direction": "ceiling",
        "met": true,
        "metric": "cpa",
        "value": 25
      },
      "unit": "total",
      "until": "2026-03-10"
    }
  ],
  "slug": "spring-sale",
  "today": "2026-03-10",
  "total": {
    "asOf": "2026-03-09",
    "comparable": true,
    "counted": [
      {
        "entityId": "120210000000000",
        "entityType": "campaign",
        "provider": "meta"
      }
    ],
    "delivered": {
      "clicks": 1600,
      "comparable": true,
      "conversionValue": 2400,
      "conversions": 40,
      "cpa": 20,
      "cpc": 0.5,
      "cpm": 10,
      "currencies": [
        "EUR"
      ],
      "impressions": 80000,
      "roas": 3,
      "spend": 800
    },
    "since": "2026-03-01",
    "until": "2026-03-10"
  }
}