curl --request POST \
--url https://omnicommerce.sg/api/v1/products/bulk-import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form 'targetMarketplaces=<string>' \
--form 'targetCountries=<string>'const form = new FormData();
form.append('file', '<string>');
form.append('targetMarketplaces', '<string>');
form.append('targetCountries', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://omnicommerce.sg/api/v1/products/bulk-import', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/products/bulk-import"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"targetMarketplaces": "<string>",
"targetCountries": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "developer_v1",
"operationId": "<string>",
"status": "<string>",
"jobId": "<string>",
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"data": {
"rowCount": 123,
"fileName": "<string>",
"targetMarketplaces": [
"<string>"
],
"targetCountries": [
"<string>"
],
"fieldMapping": {},
"counts": {}
}
}Bulk Import Products from JSON or CSV
Queue a bulk product import for the authenticated organization.
Input options
- Upload a CSV (2 MiB) or JSON products file (8 MiB) using
multipart/form-data. - Send JSON with a
productsarray of 1–1,000 flat product objects (8 MiB request maximum). - Send JSON with inline
csvText. - Send JSON referencing a stored
documentId.
Asynchronous result
The API creates import rows, then queues draft creation and AI Review through Inngest. Completed import jobs expose reviewBatchIds, reviewUrls, and reviewWarnings; generated changes require Review approval. Poll the returned bulk_... job with GET /api/v1/jobs/{jobId}.
Cancel an in-flight import with POST /api/v1/jobs/{jobId}/cancel.
curl --request POST \
--url https://omnicommerce.sg/api/v1/products/bulk-import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form 'targetMarketplaces=<string>' \
--form 'targetCountries=<string>'const form = new FormData();
form.append('file', '<string>');
form.append('targetMarketplaces', '<string>');
form.append('targetCountries', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://omnicommerce.sg/api/v1/products/bulk-import', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://omnicommerce.sg/api/v1/products/bulk-import"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"targetMarketplaces": "<string>",
"targetCountries": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text){
"ok": true,
"apiVersion": "developer_v1",
"operationId": "<string>",
"status": "<string>",
"jobId": "<string>",
"warnings": [
"<string>"
],
"recommendations": [
"<string>"
],
"links": {},
"data": {
"rowCount": 123,
"fileName": "<string>",
"targetMarketplaces": [
"<string>"
],
"targetCountries": [
"<string>"
],
"fieldMapping": {},
"counts": {}
}
}Authorizations
Bearer API key for server-to-server access. Session auth is also supported in first-party UI flows.
Body
CSV file or JSON array containing product rows. JSON object files may wrap the array as products.
Comma-separated marketplace list, e.g. shopee,lazada.
Comma-separated country list, e.g. sg,my.
Optional for API-key requests; required for session-authenticated requests across multiple organizations.
Optional display name override. Defaults to the uploaded file name.
JSON object mapping CSV headers to import fields, e.g. {"sku":"SKU","title":"Product Name"}.
JSON object mapping marketplace keys to connected store IDs.
JSON array of zero-based CSV row indexes to import.
standard, enterprise keep_first, keep_last, merge_fields_prefer_non_empty, fail_job Optional confidence threshold between 0 and 1, or the string null.
Optional enrichment model override.
primary, all_gallery JSON object with enrichment workflow options such as sourceImagesAutomatically, enableRichDescription, and autoAssignMarketplaceTaxonomy.