curl --request POST \
--url https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "42",
"kind": "create",
"storefrontId": "1234",
"mediaBuyId": "<string>",
"buyerCustomerId": 0,
"submittedPayload": "<unknown>",
"status": "pending",
"reviewedBy": "<string>",
"reviewedAt": "2023-11-07T05:31:56Z",
"reviewerNotes": "<string>",
"forwardedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"readiness": {
"packages": [
{
"mediaProductId": "<string>",
"buyerRef": "<string>",
"assignedCreativeIds": [
"<string>"
],
"unusableCreatives": [
{
"creativeId": "<string>",
"reason": "<string>"
}
],
"unusableCreativeCount": 4503599627370495,
"compatibleUnattachedCreativeIds": [
"<string>"
],
"compatibleUnattachedCreativeCount": 4503599627370495
}
],
"packageCount": 4503599627370495,
"creativelessPackageCount": 4503599627370495,
"creativeSyncFailures": [
{
"creativeId": "<string>",
"status": "<string>",
"detail": "<string>"
}
],
"creativeSyncFailureCount": 4503599627370495
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Approve or reject a pending media buy
Record the operator decision for a pending media buy. Only valid on entries still in pending state — double-decide is rejected. Approved entries are forwarded upstream by the storefront’s MCP layer. If the buyer’s original create_media_buy request included AdCP push_notification_config (or camelCase pushNotificationConfig), approval completion or rejection is delivered back to the buyer as a signed ADCP task webhook.
curl --request POST \
--url https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.interchange.io/api/v2/storefront/media-buy-approvals/{mediaBuyId}/decide', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "42",
"kind": "create",
"storefrontId": "1234",
"mediaBuyId": "<string>",
"buyerCustomerId": 0,
"submittedPayload": "<unknown>",
"status": "pending",
"reviewedBy": "<string>",
"reviewedAt": "2023-11-07T05:31:56Z",
"reviewerNotes": "<string>",
"forwardedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"readiness": {
"packages": [
{
"mediaProductId": "<string>",
"buyerRef": "<string>",
"assignedCreativeIds": [
"<string>"
],
"unusableCreatives": [
{
"creativeId": "<string>",
"reason": "<string>"
}
],
"unusableCreativeCount": 4503599627370495,
"compatibleUnattachedCreativeIds": [
"<string>"
],
"compatibleUnattachedCreativeCount": 4503599627370495
}
],
"packageCount": 4503599627370495,
"creativelessPackageCount": 4503599627370495,
"creativeSyncFailures": [
{
"creativeId": "<string>",
"status": "<string>",
"detail": "<string>"
}
],
"creativeSyncFailureCount": 4503599627370495
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Authorizations
API key or access token
Path Parameters
Buyer-supplied media buy identifier (AdCP media_buy_id).
1Body
Request body for recording an operator decision on a pending media buy.
Decision the operator is recording for this media buy.
approved, rejected Buyer customer id that disambiguates a buyer-scoped media-buy id. Omit only when the id is known to be unique for this storefront.
0 < x <= 9007199254740991Operator note about the decision. Surfaced back to the buyer alongside the status — keep it actionable when rejecting (e.g. 'targeting outside coverage area').
2000Response
Approve or reject a pending media buy
A single pending media-buy entry on a storefront approval queue.
Surrogate id of the approval row (BIGINT serialized as string).
"42"
Approval workstream kind. create is an initial create_media_buy approval; update is a material update_media_buy approval for an already-created buy.
create, update Storefront the pending buy was submitted to (BIGINT serialized as string).
"1234"
Buyer-supplied media buy identifier (AdCP media_buy_id). Unique per storefront — re-submitting the same id is idempotent.
Customer id of the buyer who submitted the media buy.
-9007199254740991 <= x <= 9007199254740991Raw AdCP create_media_buy payload as the buyer submitted it, with buyer webhook credentials (push_notification_config / pushNotificationConfig) removed before it reaches operator-facing responses. Not normalized — the operator UI renders a summary directly from this object.
Lifecycle state. pending until the operator decides; approved once the operator accepts (forwarding upstream happens out-of-band and is reflected by forwardedAt); rejected when the operator declines; revoked when a buyer withdraws a pending create or when forwarding detects that its buyer-side buy was already canceled or archived.
pending, approved, rejected, revoked User id of the operator who recorded the decision (BIGINT serialized as string). Null while pending.
When the operator decision was recorded (ISO 8601). Null while pending.
^(?:(?:\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))$Operator note attached to the decision. Null while pending.
When forwarding to the underlying sales agent settled (ISO 8601) — stamped both when every source accepted the buy and when the forward was terminalized, because the stamp is also what stops the background worker re-attempting a dead forward. Null means the forward has not been attempted or is still in flight. Read it with the per-source legs to tell a delivered buy from a refused one: a delivered buy carries an upstreamMediaBuyId.
^(?:(?:\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))$When the buyer submitted the media buy (ISO 8601).
^(?:(?:\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))$When the row was last modified — submission, decision, or forwarding stamp (ISO 8601).
^(?:(?:\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))$Structural fillability of the buy. Present on pending create entries; null when the buy has already been decided, when it is an update approval, or when the projection could not be computed — never as a way of saying "nothing is wrong".
Show child attributes
Show child attributes