curl --request POST \
--url https://api.interchange.io/api/v2/storefront/buyer-instructions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"operatorDomain": "nike.com",
"brandDomain": "nike.com",
"discountPercent": 15,
"notes": "<string>",
"countries": [
"US",
"CA"
]
}
'import requests
url = "https://api.interchange.io/api/v2/storefront/buyer-instructions"
payload = {
"operatorDomain": "nike.com",
"brandDomain": "nike.com",
"discountPercent": 15,
"notes": "<string>",
"countries": ["US", "CA"]
}
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({
operatorDomain: 'nike.com',
brandDomain: 'nike.com',
discountPercent: 15,
notes: '<string>',
countries: ['US', 'CA']
})
};
fetch('https://api.interchange.io/api/v2/storefront/buyer-instructions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "17",
"storefrontId": "1234",
"operatorDomain": "<string>",
"brandDomain": "<string>",
"discountPercent": 123,
"notes": "<string>",
"countries": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>"
}{
"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": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Create a buyer-instructions row
Create a new buyer-instructions row. The (operatorDomain, brandDomain) tuple is unique per storefront — duplicate scopes return 409; use PATCH to update an existing row.
curl --request POST \
--url https://api.interchange.io/api/v2/storefront/buyer-instructions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"operatorDomain": "nike.com",
"brandDomain": "nike.com",
"discountPercent": 15,
"notes": "<string>",
"countries": [
"US",
"CA"
]
}
'import requests
url = "https://api.interchange.io/api/v2/storefront/buyer-instructions"
payload = {
"operatorDomain": "nike.com",
"brandDomain": "nike.com",
"discountPercent": 15,
"notes": "<string>",
"countries": ["US", "CA"]
}
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({
operatorDomain: 'nike.com',
brandDomain: 'nike.com',
discountPercent: 15,
notes: '<string>',
countries: ['US', 'CA']
})
};
fetch('https://api.interchange.io/api/v2/storefront/buyer-instructions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "17",
"storefrontId": "1234",
"operatorDomain": "<string>",
"brandDomain": "<string>",
"discountPercent": 123,
"notes": "<string>",
"countries": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>"
}{
"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": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Authorizations
API key or access token
Body
Request body for creating a buyer-instructions row. (operatorDomain, brandDomain) is unique per storefront — duplicate scopes fail with a validation error; use PATCH instead.
Operator (e.g. agency/DSP) the row applies to, or null to match any operator. (operatorDomain, brandDomain) form the scope — one of the four shapes: house (both null), house+brand (brand only), operator (operator only), operator+brand (both).
1 - 253"nike.com"
Advertiser brand the row applies to, or null to match any brand. See operatorDomain for the four scope shapes.
1 - 253"nike.com"
Discount percent off the storefront base price for buys that match this scope. Null = no discount contribution.
0 <= x <= 10015
Freeform notes the Merchandising Agent applies to compositions for matching buyers (e.g. "Brand requires GroupM viewability ≥ 70%"). Null = no notes contribution.
2000Optional country filter. Null = row applies regardless of country.
1^[A-Z]{2}$["US", "CA"]
Response
Create a buyer-instructions row
A single buyer-instructions row.
Surrogate id (BIGINT serialized as string).
"17"
Storefront the row belongs to (BIGINT serialized as string).
"1234"
^(?:(?:\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))$^(?:(?:\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))$