pending row. You inspect the submitted creative payload and record a terminal decision: approved or rejected. Approved creatives are forwarded to the underlying sales agent verbatim; rejected ones carry your reviewer note back to the buyer.
A review moves through pending → approved or pending → rejected. The revoked state — pulling a previously-approved creative — is a separate gesture and cannot be set on the decide endpoint. Each creative is identified by the AdCP creativeId the buyer supplied at submit time.
Buyer status and callbacks
Buyer agents submit creatives with AdCPsync_creatives. In manual-review mode the first response can return pending_review for each queued creative:
sync_creatives again for a creative that has already been decided, the storefront returns the current decision in the per-creative status: approved with action: "updated", or rejected with action: "failed" and the reviewer note as message when one was supplied.
Buyers can attach AdCP push-notification config to the original sync_creatives request:
push_notification_config for canonical AdCP requests. The storefront also accepts pushNotificationConfig from clients that pass camelCase JSON through a REST/MCP proxy. Callback URLs must be public HTTPS endpoints; localhost, private-network, link-local, metadata, and internal hostnames are rejected. Supported authentication schemes are Bearer and HMAC-SHA256.
When the operator approves or rejects the creative, the buyer webhook receives a signed ADCP task event with status: "completed" and a result.creatives[] entry whose status is approved or rejected. Rejected webhook results use action: "failed" and include the reviewer note as message when present.
The creative review row returned to storefront operators omits
push_notification_config and pushNotificationConfig from submittedPayload so webhook credentials are not exposed in the queue UI or REST responses.Authorization: Bearer $SCOPE3_API_KEY.
Task reference
List reviews
GET /creative-reviews — the review queue, newest firstGet a review
GET /creative-reviews/{creativeId} — one creative review rowDecide a review
POST /creative-reviews/{creativeId}/decide — approve or reject