Skip to main content
POST
Record a decision on a pending creative review

Authorizations

Authorization
string
header
required

API key or access token

Path Parameters

creativeId
string
required

Creative review identifier. Use the reviewRef value returned by the queue to select one immutable review. A bare value always selects the AdCP creative-id namespace, including when numeric; creative:<id> is the explicit equivalent.

Minimum string length: 1
Example:

"review:42"

Body

application/json

Request body for the operator decide endpoint. Records a terminal decision only when the pending creative and its frozen work item still match; revised content additionally requires expected_content_digest.

status
enum<string>
required

Decision to record. Must be approved or rejectedrevoked is a separate gesture and is not allowed here.

Available options:
approved,
rejected
expected_content_digest
string

SHA-256 contentDigest from the exact review version shown to the operator. Rolling-upgrade clients may omit it only while the review content has never advanced; revised content requires this field and otherwise returns a conflict.

Pattern: ^[a-f0-9]{64}$
Example:

"0db36cf6c4bfb43123aee1c3eaf5ee965e1c34c9df606b02a56c72a226ad097a"

expected_review_version_digest
string

Opaque immutable review-version identity returned with the review. It binds source-trust evidence to the submitted content; clients should send it when available.

Pattern: ^[a-f0-9]{64}$
reviewer_notes
string

Optional free-text note from the reviewer (e.g. reason for rejection). Visible to the buyer in their sync_creatives follow-up.

Maximum string length: 2000

Response

Record a decision on a pending creative review

A single creative review queue row — one buyer-submitted creative awaiting (or having received) an operator decision.

id
string
required

Legacy surrogate review row id (BIGINT serialized as a string). Preserved for response compatibility; prefer reviewRef for follow-up actions.

Pattern: ^[1-9]\d*$
Example:

"42"

reviewRef
string
required

Collision-free opaque review reference. Pass this exact value to get, evaluate, or decide this review.

Pattern: ^review:[1-9]\d*$
Example:

"review:42"

storefrontId
string
required

Storefront the submission was made against.

Example:

"1234"

creativeId
string
required

AdCP creative id as submitted by the buyer.

Example:

"cr_abc123"

contentDigest
string
required

Immutable SHA-256 identity of the exact creative object forwarded downstream. Request-level account and correlation fields are excluded.

Pattern: ^[a-f0-9]{64}$
sourceTrust
object | null
required

Receipt-bound source classification and review concurrency identity when observed. Null means provenance was not observed or cannot be proven; clients must fail closed and never use this projection to load network resources.

mediaBuyId
string | null
required

AdCP media_buy_id this creative was associated with at submit time, if any. Null when the buyer attaches creatives independently of a buy.

buyerCustomerId
integer
required

customer_id of the buyer that submitted the creative — the tenancy boundary on buyer-side reads.

Required range: -9007199254740991 <= x <= 9007199254740991
submittedPayload
any
required

Credential-stripped snapshot of the buyer submission used for review and delivery. It contains the creative fields and may also contain request-level account, buyer_ref, and context used for downstream account selection and callback correlation. Only push_notification_config and pushNotificationConfig are removed from this operator-facing response and stored separately.

previewContexts
object[]
required

Current exact preview targets. Empty for legacy, standalone, defaulted, ambiguous, stale, or superseded routes.

interactivePreviewAvailable
boolean
required

Server-issued availability for the explicit third-party interactive-preview request. False disables that action only; source inspection and approval decisions remain available.

status
enum<string>
required

Lifecycle state of a buyer-submitted creative awaiting storefront review. pending until an operator decides; approved or rejected after a decision; revoked if an operator pulls a previously-approved creative.

Available options:
pending,
approved,
rejected,
revoked
reviewedBy
string | null
required

User id of the operator who decided this review (BIGINT serialized as string). Null while pending.

reviewedAt
string<date-time> | null
required

Decision timestamp (ISO 8601). Null while pending.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
reviewerNotes
string | null
required

Free-text reviewer note attached at decide time. Null when the operator did not supply one.

createdAt
string<date-time>
required

Submission timestamp (ISO 8601).

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
updatedAt
string<date-time>
required

Last-modified timestamp (ISO 8601). Equal to created_at while pending; bumped when the row transitions to a decided state.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
renderPreview
object | null

Live sandboxed preview of the submitted creative, when the render origin is enabled for this environment and the seller. Null or absent means only source inspection is available.

observation
object | null

What this exact creative version did when Interchange ran it once, headlessly, on the render origin (domains contacted, pixel-shaped requests, redirects, popups, navigation attempts, bytes). Null or absent means it has not been observed; status says whether a run is queued, running, or ended without a result. Evidence from one run, never a safety verdict.

thumbnailUrl
string | null

App-relative, authenticated path to a PNG of the creative frame from the observation run, e.g. /api/v2/storefront/creative-reviews/review:42/thumbnail. Null or absent when no screenshot exists. Never a public URL.