Skip to main content
Every get(kind: "campaign") response on the V3 surface includes a readiness object that tells an agent whether the campaign can actually deliver. Use readiness.status and readiness.reasons — not phase — to answer “is this campaign ready to deliver?” questions.

Why phase alone is not enough

A campaign with phase: active is launched, but that does not mean it is delivering. A launched campaign can be blocked by missing configuration (no budget, no staged media buys), media buys that cannot deliver, an inactive lifecycle state (paused, archived, completed, or canceled), or flight dates that are outside the current window. readiness.status captures all of these; phase does not.

Fields

Reason codes

A media buy that cannot deliver

Once the flight has started, a campaign whose media buy is still not delivering reads readiness.status: "not_ready" with readiness.attention: ["blocked"]. Each such buy adds one entry to readiness.blockers, with the code not_delivering_after_flight_start. The message names the buy, says why it is waiting, and says whose move it is: you, the seller, or Apostra. This is the same signal get_media_buy_status reports on the buy itself (see When a buy has not started delivering): a booked buy still not delivering more than 24 hours after its flight started. The buy’s pendingReason supplies the why and the who, for example no_creatives_attached means you need to attach creatives. The blocker clears by itself when the seller reports the buy delivering, or when you pause or cancel the buy, or its flight ends. A buy the seller reports paused that you did not ask to pause adds an entry with the code seller_paused_not_requested instead. Its message names the buy and since when the seller has reported it paused, and the seller is the one to ask. A pause you asked for, on the buy or on the campaign, adds nothing. readiness.reasons stays empty for this blocker, so not_ready with no reasons means either an inactive lifecycle state or a blocker in readiness.blockers. A paused, completed, canceled or archived campaign reports no such blocker, because its buys are not meant to be delivering. A provider may hold a buy that cannot deliver as paused: Meta, for example, keeps a campaign paused until it has ads. Apostra reports the setup blocker instead, such as pending_creatives with pending_reason: no_creatives_attached, because the buyer’s pause is not what stops delivery and resuming the buy would not start it. Read the buy’s pending_reason, not the provider’s raw paused.

Creatives are not a readiness reason

readiness.reasons never includes a creative-related code. A campaign with zero creatives can still be readiness.status: "ready" and launch successfully — many channels, including Meta, support launching a campaign’s structure first and attaching creative afterward. Creative attachment is a separate prerequisite for a media buy to actually serve impressions once active; it is not part of launch readiness. Do not tell a buyer that a creative is required before launch, or treat a missing creative as a launch blocker, unless a tool response says so explicitly.

Agent guidance

  • Check readiness.status before telling the buyer whether a campaign is delivering. phase: active is not sufficient evidence.
  • When readiness.status is not_ready, surface every entry in readiness.reasons as a concrete next step — never just say “the campaign isn’t ready.”
  • When readiness.reasons is empty but readiness.status is not_ready, read readiness.blockers: a not_delivering_after_flight_start or seller_paused_not_requested entry says which media buy is stuck and who must act. With no blockers, the campaign is in an inactive lifecycle state (paused, archived, completed, or canceled); tell the buyer the campaign’s current lifecycle state instead.
  • Multiple reasons can be present at once. Address them all.