Skip to main content
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

curl -X POST \
  "https://api.interchange.io/api/v2/storefront/media-buy-approvals/mb_2026_q2_ctv/decide" \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "approved"
  }'

Parameters

FieldTypeRequiredNotes
mediaBuyIdstringYesPath param — buyer-supplied media buy identifier (AdCP media_buy_id)
statusenumYesDecision to record. approved or rejected
reviewerNotesstringNoNote surfaced back to the buyer alongside the status. Keep it actionable when rejecting. Max 2000 chars

Response

{
  "id": "42",
  "storefrontId": "1234",
  "mediaBuyId": "mb_2026_q2_ctv",
  "buyerCustomerId": 8801,
  "submittedPayload": {
    "media_buy_id": "mb_2026_q2_ctv",
    "total_budget": 50000,
    "currency": "USD"
  },
  "status": "approved",
  "reviewedBy": "5567",
  "reviewedAt": "2026-06-02T12:30:00Z",
  "reviewerNotes": null,
  "forwardedAt": "2026-06-02T12:30:05Z",
  "createdAt": "2026-06-02T10:00:00Z",
  "updatedAt": "2026-06-02T12:30:05Z",
  "forwardOutcome": "all_completed",
  "forwardResult": [
    {
      "sourceId": "src_001",
      "upstreamMediaBuyId": "upstream_mb_xyz",
      "status": "completed"
    }
  ]
}
Returns the decided PendingMediaBuyResponse. reviewedBy, reviewedAt, and updatedAt are stamped at decision time. Approval responses include two extra fields stamped by the forwarder:
FieldTypeNotes
forwardOutcomeenumall_completed, partial, all_failed, or precondition_failed
forwardResultarrayPer-source forwarding result (sourceId, status, upstreamMediaBuyId?, packages?, error?)
forwardErrorobjectPresent 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 — missing status, invalid status, or the entry is no longer pending (double-decide).
  • 404 NOT_FOUND — no approval entry with that media buy id exists for your storefront.
See Errors for the full error contract.

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