> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get media buy status

> Refresh or read current ADCP media buy status and persist changes

`GET /api/v2/buyer/campaigns/:id/media-buy-status`

Refreshes the campaign's non-terminal media buys and returns the current status Interchange has for each buy. Direct sales-agent and delegated-adapter buys are polled during this request. Storefront-routed buys are checked from persisted upstream-leg state, because one buyer-facing storefront buy can fan out to multiple upstream sources rather than one pollable storefront agent. Useful right after [execute](/v2/buyer/campaigns/tasks/execute-campaign) while waiting on publisher approvals.

<Tip>
  Webhooks from sales agents are the preferred, near-real-time path. Polling this endpoint is the fallback when you can't receive webhooks.
</Tip>

## Request

```bash theme={null}
curl https://api.interchange.io/api/v2/buyer/campaigns/cmp_987654321/media-buy-status \
  -H "Authorization: Bearer $SCOPE3_API_KEY"
```

No request body.

## Parameters

| Field | Type   | Required | Notes                         |
| ----- | ------ | -------- | ----------------------------- |
| `id`  | string | Yes      | Campaign ID (path parameter). |

## Response

```json theme={null}
{
  "campaign_id": "cmp_987654321",
  "campaign_status": "ACTIVE",
  "operational_status": "active",
  "media_buys": [
    {
      "media_buy_id": "mb_abc123",
      "adcp_media_buy_id": "adcp_mb_001",
      "internal_status": "ACTIVE",
      "adcp_status": "active",
      "operational_status": "active",
      "previous_internal_status": "PENDING_APPROVAL",
      "previous_adcp_status": "pending_start",
      "updated": true,
      "status_refresh_source": "direct_agent",
      "blockers": []
    }
  ],
  "agents_queried": 1,
  "errors": [],
  "blockers": [],
  "pending_creative_reviews": 0,
  "has_upstream_media_buy": true,
  "has_delivery": true
}
```

Returns a status result for every current PRIMARY media buy in the campaign. Non-terminal buys are refreshed when eligible; terminal buys are returned from authoritative persisted state without being re-polled. Each element in `media_buys` reflects one media buy returned during the request:

* `campaign_status` — the stored campaign lifecycle status.
* `operational_status` — the rolled-up delivery status to present to users (`draft`, `pending_creatives`, `pending_start`, `active`, `paused`, `completed`, `attention_required`, or `no_media_buys`).
* `internal_status` — the Interchange status after this poll (one of `DRAFT`, `PENDING_APPROVAL`, `INPUT_REQUIRED`, `ACTIVE`, `PAUSED`, `COMPLETED`, `CANCELED`, `FAILED`, `REJECTED`, `ARCHIVED`).
* `adcp_status` — the raw AdCP media-buy status string currently stored or returned by the status check.
* `media_buys[].operational_status` — the per-buy delivery status behind the campaign rollup.
* `previous_internal_status` / `previous_adcp_status` — values before this poll.
* `updated` — `true` only when this request changed Interchange's stored status. `false` does not mean the status is stale; it can also mean the buy was already current.
* `status_refresh_source` — where this media buy's status signal came from:
  * `direct_agent` — this request called the sales agent's `get_media_buys`.
  * `delegated_adapter` — this request called the delegated adapter's `get_media_buys`.
  * `storefront_route_rollup` — this request read persisted upstream-leg statuses for a storefront-routed buy. This can confirm active delivery without incrementing `agents_queried`.
  * `not_submitted` — the buy has no upstream media-buy ID yet.
  * `persisted_terminal` — the buy is terminal (`COMPLETED`, `CANCELED`, `FAILED`, or `REJECTED`) and was read from persisted PRIMARY state without contacting the seller again.
  * `refresh_failed` — the refresh failed before a per-buy status signal was available; see `errors` and `blockers`.
* `agents_queried` — number of direct sales-agent or delegated-adapter status calls made during this request. It can be `0` for a current storefront-routed buy when `status_refresh_source` is `storefront_route_rollup`.
* `errors` — per-media-buy errors from agents that failed to respond; `media_buy_id` and `error` message are included for each failure. A partial error does not prevent successful entries from being returned.
* `blockers` / `media_buys[].blockers` — campaign-level and per-buy reasons delivery is not ready, such as pending creative review or missing upstream IDs.
* `pending_creative_reviews` — count of creative reviews still waiting.
* `has_upstream_media_buy` — whether any media buy has an upstream ADCP media-buy ID.
* `has_delivery` — whether the campaign has an active or completed delivery signal.

Treat `has_delivery`, `has_upstream_media_buy`, `operational_status`, and each buy's `status_refresh_source` as the delivery signal. Do not use `agents_queried: 0` or `updated: false` alone as a stale-status or dispatch-failure signal.

Only non-terminal PRIMARY media buys (`PENDING_APPROVAL`, `ACTIVE`, `PAUSED`) are polled. Terminal PRIMARY buys remain in the response but are never re-polled, so stale seller state cannot reactivate them.

## Errors

| Code        | When                                                      |
| ----------- | --------------------------------------------------------- |
| `NOT_FOUND` | Campaign ID does not exist for the authenticated account. |

See [Errors](/v2/reference/errors) for the full error shape and recovery semantics.

## Related

<CardGroup cols={2}>
  <Card title="Media buys" href="/v2/buyer/campaigns/media-buys" icon="layer-group">
    Media buy structure and the status enum
  </Card>

  <Card title="Execute campaign" href="/v2/buyer/campaigns/tasks/execute-campaign" icon="rocket">
    Launch the campaign into media buys
  </Card>

  <Card title="Pause campaign" href="/v2/buyer/campaigns/tasks/pause-campaign" icon="pause">
    Halt spend across all media buys
  </Card>

  <Card title="Campaign overview" href="/v2/object-guides/campaign" icon="rocket">
    The campaign object and lifecycle
  </Card>
</CardGroup>
