POST /api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide
Records your decision on a pending media buy. Only valid on entries still in pending state — a double-decide is rejected. Approved entries are forwarded upstream to the underlying sales agent by the storefront’s MCP layer; watch forwardedAt on a subsequent read to confirm the forward landed.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
mediaBuyId | string | Yes | Path param — buyer-supplied media buy identifier (AdCP media_buy_id) |
status | enum | Yes | Decision to record. approved or rejected |
reviewerNotes | string | No | Note surfaced back to the buyer alongside the status. Keep it actionable when rejecting. Max 2000 chars |
Response
PendingMediaBuyResponse. reviewedBy, reviewedAt, and updatedAt are stamped at decision time.
Approval responses include two extra fields stamped by the forwarder:
| Field | Type | Notes |
|---|---|---|
forwardOutcome | enum | all_completed, partial, all_failed, or precondition_failed |
forwardResult | array | Per-source forwarding result (sourceId, status, upstreamMediaBuyId?, packages?, error?) |
forwardError | object | Present only on non-all_completed outcomes: { code, message, productIds?, productId? } |
forwardedAt is null when forwardOutcome is not all_completed; populated once every source accepts. Rejection responses contain only the base PendingMediaBuyResponse fields.
Errors
400 VALIDATION_ERROR— missingstatus, invalidstatus, or the entry is no longerpending(double-decide).404 NOT_FOUND— no approval entry with that media buy id exists for your storefront.
Related
Get an approval
Inspect the entry before deciding
List approvals
See the pending queue
Media-buy approval tasks
All media-buy approval operations
Media-buy approvals overview
Queue lifecycle and concepts