phase: "ending" until every buy has
ended. Most of the time that is only waiting. Sometimes a buy’s cancel did not
reach its seller, or the seller refused it, and the campaign stays ending
until someone sends the cancel again.
While the phase is ending, reading the campaign returns stalledCancels: the
buys that will not finish ending without a new request, each with the reason.
An empty list
An emptystalledCancels means every open buy is waiting normally: ending at
its seller, waiting for an operator to approve the cancel, or being sent or
retried by Apostra. There is nothing to do but wait. The list is a statement
about the buys that need a new request, so it is not a progress report.
The three states
To send it again, use
save_campaign with desiredPhase: "canceled" and the
campaign’s current expectedRevision. That call sends the cancel only for the
buys that are pending or failed, and never cancels a confirmed buy twice. To
cancel one buy, use save_media_buy with mediaBuyId and isCanceled: true.
What error holds
error uses AdCP’s own error shape, with only two fields:
codeis present only when it is one of AdCP’s standard error codes. A seller may send a code of its own; it is left out.recoveryis present when the seller senttransient,correctableorterminal.
error is absent when the seller sent neither a standard code nor a
recovery, and for a rejected approval. The state, not error, says the
seller refused. The seller’s own message, suggestion, details and
buyer_reason are never returned.
When the list is absent
The field is absent in every phase exceptending. It is also absent for a
campaign whose cancel was requested before Apostra began recording each cancel
it sends: for those, a buy with no cancel on record does not prove that none
was sent. Such a campaign reads as it did before, with the phase ending and
no list. Send the cancel again if it has stayed ending.
Related: cancel a campaign and its media buys, and the
limits of v3 cancellation.