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

# Campaign readiness

> How to tell whether a campaign can launch and whether it is delivering: launch blockers, operational status and per-buy blockers.

A campaign's `status` (`DRAFT`, `ACTIVE`, `PAUSED`, …) says where it is in its lifecycle. It doesn't
say whether it can launch, or whether a launched campaign is actually delivering. Semicola answers those
two questions separately.

| Question                          | Where to read it                                                                                          |
| --------------------------------- | --------------------------------------------------------------------------------------------------------- |
| Can this draft launch?            | The **launch blockers** on **Review & go live** (`open_campaign_receipt`, `GET /campaigns/{id}/receipt`). |
| Is this live campaign delivering? | The **operational status** and per-buy **blockers** (`GET /campaigns/{id}/media-buy-status`).             |

## Launch blockers

**Review & go live** lists every blocker with a plain-language label and, where there is one, a fix
Semi can do for you. `canGoLive` is `true` only for a draft with no blockers. The campaign workspace
carries the same answer as `actions.canGoLive`.

| `code`                | Label                                               | Next step                                          |
| --------------------- | --------------------------------------------------- | -------------------------------------------------- |
| `ADVERTISER_ARCHIVED` | "… is archived."                                    | Restore the advertiser.                            |
| `NO_FLIGHT`           | "Set flight dates."                                 | **Set dates** with `save_campaign`.                |
| `NO_BUDGET`           | "Set a budget."                                     | **Set budget** with `save_campaign`.               |
| `CURRENCY_MISMATCH`   | "Campaign currency … does not match …."             | Use the advertiser's primary currency.             |
| `NO_MEDIA_BUYS`       | "Stage at least one media buy."                     | **Get proposals**, then `save_media_buy`.          |
| `OVER_ALLOCATED`      | "Staged buys exceed the budget by …."               | **Rebalance** the staged buys.                     |
| `SANDBOX_ONLY`        | "This account can only launch sandbox advertisers." | Finish billing setup, or use a sandbox advertiser. |

Launching with any blocker present is refused with `CONFLICT` ("Not ready to go live: …"), and the
blockers come back in the error's `details`. A launch can also stop if a selected product is on one of
the advertiser's exclusion [property lists](/buy/property-lists).

### Creatives aren't a launch blocker

Missing creative isn't in the blocker list. The receipt reports **format coverage** (`required`,
`covered`, `missing`) so you can see which buys still need creative, but a campaign can launch without
it: sellers accept the buy and it waits in `pending_creatives` until a creative arrives. Don't tell a
buyer creative is required before launch unless a tool response says so.

## Is it delivering?

`GET /api/v2/buyer/campaigns/{id}/media-buy-status` returns the campaign's `operationalStatus`, the
most restrictive across its buys:

| `operationalStatus`  | Meaning                                                                |
| -------------------- | ---------------------------------------------------------------------- |
| `no_media_buys`      | Nothing is staged.                                                     |
| `draft`              | Buys are staged but not sent.                                          |
| `pending_creatives`  | Accepted, but a required creative is missing.                          |
| `pending_start`      | The seller is reviewing, or it accepted and the flight hasn't started. |
| `active`             | Delivering.                                                            |
| `paused`             | Paused.                                                                |
| `completed`          | Finished, canceled or archived.                                        |
| `attention_required` | A buy failed, was rejected or needs input.                             |

Each buy also lists `blockers`: `creatives_required`, `awaiting_seller_approval`, or the failure's
`errorCode` (`dispatch_failed` when there's none), plus `pendingReason` and `pendingSince`. The
response also says how many sellers were queried, whether any seller-side buy exists, whether any
delivery has been reported, and how many creative reviews are pending with sellers.

## Agent guidance

* Before saying a campaign is delivering, check `operationalStatus`. `status: ACTIVE` alone isn't
  enough.
* When a draft can't launch, surface every blocker as a concrete next step, never just "it isn't ready".
* Several blockers can be present at once. Address them all.

## Related

* [Campaigns](/buy/campaign)
* [Media buy lifecycle](/concepts/media-buy-lifecycle)
* [Diagnosing a stuck media buy](/guides/diagnosing-stuck-media-buys)
