POST /api/v2/storefront/creative-reviews/{creativeId}/decide
Records a terminal decision on one pending creative review version. Only
pending → approved and pending → rejected transitions are allowed —
revoking a previously-approved creative is a separate gesture and revoked is
not a valid value here. Approval wakes the separate per-media-buy delivery
ledger; it does not itself report the creative live. Your reviewer note travels
back to the buyer in their sync_creatives result. Send the contentDigest
from the exact queue row you reviewed as expected_content_digest. If the
buyer revises that creative before your decision lands, the API returns a
conflict instead of applying your decision to the revised content. Send
sourceTrust.reviewVersionDigest as expected_review_version_digest to bind
the decision to the same source-trust classification and content version.
Request
Parameters
Response
CreativeReviewResponse. Its submittedPayload preserves
the creative fields plus any request-level account, buyer_ref, and
context; buyer webhook configuration is removed. reviewedBy, reviewedAt,
and updatedAt are stamped at decision time. Deciding a row that is already
decided is rejected — re-deciding is not a no-op.
Errors
400 VALIDATION_ERROR— missing/invalidstatus,expected_content_digest, orexpected_review_version_digest.409 CONFLICT— either expected version is stale,expected_content_digestwas omitted after the content generation advanced, the creative id matches multiple buyers, or the review content/work-item authorization changed. No decision is recorded. Reload the review and decide with its latestreviewRef,contentDigest, andsourceTrust.reviewVersionDigest.404 NOT_FOUND— no creative review row with that id exists for your storefront.
Related
Get a review
Inspect the creative before deciding
List reviews
See the pending queue
Creative review tasks
All creative-review operations
Creative reviews overview
Queue lifecycle and concepts