curl --request POST \
--url https://omnicommerce.sg/api/v1/promotions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Christmas",
"discountType": "fixed_amount",
"discountValue": 12,
"targetStores": [
{
"marketplace": "shopee",
"country": "singapore",
"storeId": "115085776"
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Christmas',
discountType: 'fixed_amount',
discountValue: 12,
targetStores: [{marketplace: 'shopee', country: 'singapore', storeId: '115085776'}]
})
};
fetch('https://omnicommerce.sg/api/v1/promotions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/promotions"
payload = {
"name": "Christmas",
"discountType": "fixed_amount",
"discountValue": 12,
"targetStores": [
{
"marketplace": "shopee",
"country": "singapore",
"storeId": "115085776"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"promotion": {}
}Create Promotion
Create a central promotion targeting connected stores. Requires promotions:write. Fixed-amount discounts resolve currency from the selected store countries.
curl --request POST \
--url https://omnicommerce.sg/api/v1/promotions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Christmas",
"discountType": "fixed_amount",
"discountValue": 12,
"targetStores": [
{
"marketplace": "shopee",
"country": "singapore",
"storeId": "115085776"
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Christmas',
discountType: 'fixed_amount',
discountValue: 12,
targetStores: [{marketplace: 'shopee', country: 'singapore', storeId: '115085776'}]
})
};
fetch('https://omnicommerce.sg/api/v1/promotions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/promotions"
payload = {
"name": "Christmas",
"discountType": "fixed_amount",
"discountValue": 12,
"targetStores": [
{
"marketplace": "shopee",
"country": "singapore",
"storeId": "115085776"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"promotion": {}
}Authorizations
Bearer API key for server-to-server access. Session auth is also supported in first-party UI flows.
Body
200percentage, fixed_amount Discount amount or percentage. Use 0 for gift/sample-only and free Buy-X-Get-Y mechanics.
x >= 0Connected stores as { marketplace, country, storeId }. Copy from existing promotion targetStores or product marketplaceDetails.
1 - 100 elementsShow child attributes
Show child attributes
Required for session auth across multiple organizations. Optional for OAuth/API keys bound to one organization.
1202000product_discount, flash_sale, voucher, gift_with_purchase, buy_x_get_y, bundle_deal, free_shipping, early_bird_price Defaults to active. Future start dates display as scheduled. Use draft to save without activation; explicit inactive lifecycle states are preserved.
draft, scheduled, active, paused, ended, archived x >= 0x >= 0Lazada voucher minimum spend. Defaults to 1 when unset.
x >= 0Total redemption/order limit, or per-SKU promotional quantity for flash sales.
x >= 1Show child attributes
Show child attributes
Patch discount overrides by exact target store key. Other stores retain their terms. Null discountValue restores shared terms for that store.
100Show child attributes
Show child attributes
Response
Promotion created.