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 readsreadiness.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.statusbefore telling the buyer whether a campaign is delivering.phase: activeis not sufficient evidence. - When
readiness.statusisnot_ready, surface every entry inreadiness.reasonsas a concrete next step — never just say “the campaign isn’t ready.” - When
readiness.reasonsis empty butreadiness.statusisnot_ready, readreadiness.blockers: anot_delivering_after_flight_startorseller_paused_not_requestedentry 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.