Scan Duplicate Products
curl --request POST \
--url https://omnicommerce.ai/api/v1/products/duplicates/scan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://omnicommerce.ai/api/v1/products/duplicates/scan', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.ai/api/v1/products/duplicates/scan"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "<string>",
"operationId": "<string>",
"status": "accepted",
"data": {
"status": "idle",
"productCount": 4503599627370495,
"computedAt": "<string>",
"requestedAt": "<string>",
"errorMessage": "<string>"
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"error": "<string>"
}{
"ok": true,
"apiVersion": "<string>",
"operationId": "<string>",
"status": "accepted",
"data": {
"status": "idle",
"productCount": 4503599627370495,
"computedAt": "<string>",
"requestedAt": "<string>",
"errorMessage": "<string>"
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"error": "<string>"
}Products
Scan Duplicate Products
Start the existing durable organization duplicate scan, equivalent to Products → Check duplicates. Requires catalog:write. An already queued/running scan is reused. This only refreshes duplicate evidence; it does not merge, publish or delist products. Read completion with products.getDuplicateScan, then list status=duplicates, duplicateType=sku, detail=full and page all matching results before previewing a merge. Uses the same 5,000-candidate scan limit as the UI.
POST
/
api
/
v1
/
products
/
duplicates
/
scan
Scan Duplicate Products
curl --request POST \
--url https://omnicommerce.ai/api/v1/products/duplicates/scan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://omnicommerce.ai/api/v1/products/duplicates/scan', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.ai/api/v1/products/duplicates/scan"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "<string>",
"operationId": "<string>",
"status": "accepted",
"data": {
"status": "idle",
"productCount": 4503599627370495,
"computedAt": "<string>",
"requestedAt": "<string>",
"errorMessage": "<string>"
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"error": "<string>"
}{
"ok": true,
"apiVersion": "<string>",
"operationId": "<string>",
"status": "accepted",
"data": {
"status": "idle",
"productCount": 4503599627370495,
"computedAt": "<string>",
"requestedAt": "<string>",
"errorMessage": "<string>"
},
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"error": "<string>"
}Authorizations
Bearer API key for server-to-server access. Session auth is also supported in first-party UI flows.
Body
application/json
Required for session authentication; API credentials use their own organization.
Response
Scan status.