curl --request POST \
--url https://omnicommerce.sg/api/v1/products/compare-prices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"productIds": [
"cc87d195-097a-4a5a-8229-cd989ce98d0f"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({productIds: ['cc87d195-097a-4a5a-8229-cd989ce98d0f']})
};
fetch('https://omnicommerce.sg/api/v1/products/compare-prices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/products/compare-prices"
payload = { "productIds": ["cc87d195-097a-4a5a-8229-cd989ce98d0f"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "<string>",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted",
"jobId": "<string>",
"data": {
"jobId": "<string>",
"productIds": [
"<string>"
]
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {}
}Compare Product Market Prices
Research market offers for a batch of OmniCommerce simple product or variant UUIDs using the same BigGo API and Serper Shopping fallback as pricing strategy. Read-only; no prices are changed.
Authorization
Requires catalog:read. API keys resolve organizationId from the credential; session callers must provide an authorized organizationId.
Durable batches
Accepts 1–50 input entries, trimmed and deduplicated in first-requested order. Returns HTTP 202 and a durable jobId. Retrieve progress and results from GET /api/v1/products/compare-prices/jobs/ or await jobs.wait in the SDK with a suitable timeout. A client timeout does not cancel the job. Use variant IDs for products with variants. Each listing market has its own durable search step; searches use bounded concurrency and retry failed providers once. Final result.success is true only when every requested product and listing market succeeds. Partial failures remain explicit.
Omit country/gl to compare every recorded listing market. Global Zalora compares its exact country prices in SG, MY, ID, PH, HK, and TW as present on the listing; variant offers use exact SKU/variant identity. An India Shopify store selling in SGD is researched in Singapore because market selection follows selling currency, not the store address. gl overrides country and restricts research to that market. Unsupported currencies and missing country prices are reported without silently skipping listings or converting currencies.
results[].markets contains separate platform/store/country prices and shopping statistics. Prices come from persisted marketplace snapshots or acknowledged marketplace writes; priceSource and priceAsOf identify the evidence. Published listings without exact price evidence may return catalog research but success is false, with an explicit verification error. Unlisted products use their catalog price/currency. Research does not refresh the connected marketplace listing; refresh stale listing data before comparing.
Market comparison measures recorded listing list price minus market median (p50), with percentage relative to the median. Catalog fallback comparisons use the explicitly named catalog_price_vs_market_median metric. The product-level currentPrice/currency remain catalog fields; product-level research/comparison are available only for a single market with compatible currency. For multiple markets, consume markets[]. These differences are not recommended selling prices; monetary values are never combined across currencies.
Shopping search coverage depends on the provider index; individual marketplaces and listings are not verified.
Offers may refer to different variants, pack sizes, bundles, or similar products. Verify the offer before using its price.
Pricing strategy excludes offers from ebay and walmart.
curl --request POST \
--url https://omnicommerce.sg/api/v1/products/compare-prices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"productIds": [
"cc87d195-097a-4a5a-8229-cd989ce98d0f"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({productIds: ['cc87d195-097a-4a5a-8229-cd989ce98d0f']})
};
fetch('https://omnicommerce.sg/api/v1/products/compare-prices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/products/compare-prices"
payload = { "productIds": ["cc87d195-097a-4a5a-8229-cd989ce98d0f"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "<string>",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted",
"jobId": "<string>",
"data": {
"jobId": "<string>",
"productIds": [
"<string>"
]
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {}
}Authorizations
Bearer API key for server-to-server access. Session auth is also supported in first-party UI flows.
Body
OmniCommerce simple product or variant UUIDs. Deduplicated in first-requested order; maximum 50 input entries.
1 - 50 elements^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$1 - 120Singapore, Indonesia, Malaysia, Vietnam, Thailand, Philippines Optional shopping market restriction; overrides country. Omit to compare every listing market using its currency, or the catalog currency for unlisted products.
sg, id, my, vn, th, ph, us, hk, tw 1 <= x <= 15Response
Batch accepted. jobId tracks durable progress; acceptance does not mean comparisons succeeded.