Channels & feeds
A channel is a destination — Amazon, Noon, Flipkart, Shopify, WooCommerce, Magento, Google Merchant, Meta, Salla, Zid or your own endpoint. Each maps your product fields onto the fields that destination expects and validates the result.
Channel-mapped products
GET /channels/{id}/products returns the products in the channel's scope as the channel sees them: the mapped values keyed by the channel's own field names, readiness issues, the payload the channel's API expects, and the listing state (not_published, queued, published, outdated, error). Use it to feed a custom marketplace integration without re-implementing the mapping.
curl "https://library.retailcommerceai.com/api/v1/channels/cm1ch4nn3l/products?ready=true&updated_since=2026-09-01T00:00:00Z&limit=100" \
-H "Authorization: Bearer cl_live_YOUR_API_KEY"| Parameter | Meaning |
|---|---|
ready | true: only products without errors; false: only products that need work |
updated_since | Only products changed since (incremental sync) |
sku | Comma-separated SKUs |
page / limit | Up to 100 per page (payloads are large) |
{
"productId": "cm1…",
"sku": "FR-OUD-100",
"parentSku": null,
"type": "simple",
"name": "Oud Noir Eau de Parfum 100 ml",
"ready": false,
"score": 83,
"issues": [
{
"field": "gtin",
"severity": "error",
"message": "GTIN is required"
}
],
"values": {
"id": "FR-OUD-100",
"title": "Oud Noir Eau de Parfum 100 ml",
"price": "349.00 AED",
"link": "https://shop.example.com/p/FR-OUD-100"
},
"payload": {
"offerId": "FR-OUD-100",
"title": "Oud Noir Eau de Parfum 100 ml",
"price": {
"value": "349.00",
"currency": "AED"
}
},
"payloadError": null,
"listing": {
"status": "not_published",
"externalId": null,
"externalUrl": null,
"lastPublishedAt": null,
"lastError": null
}
}Readiness
outdated when the product changed after its last publish.Publishing
Push channels (Amazon, Noon, Shopify …) receive products through a background job. An empty body publishes the whole scope; narrow it with skus, productIds or a filter, and use onlyReady / onlyOutdated to skip what cannot or need not be sent. For feed channels the job refreshes the feed.
curl -X POST "https://library.retailcommerceai.com/api/v1/channels/cm1ch4nn3l/publish" \
-H "Authorization: Bearer cl_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"onlyOutdated": true,
"onlyReady": true
}'The answer is 202 Accepted with the job; poll GET /jobs/{jobId} (scope jobs:read) until status is completed or failed, or subscribe to the channel.publish.completed webhook.
Pull feeds
Channels such as Google Merchant, Meta and custom feeds can fetch a live file instead. Each channel with its feed enabled has URLs like https://library.retailcommerceai.com/feeds/<token>.xml — listed in feedUrls of GET /channels/{id} — and each saved export with a feed has a feedUrl in GET /export-profiles. Feeds are public (the token is the secret), cached, and honour If-None-Match. Give the URL to the marketplace; regenerate the token in the app if it leaks.
- Formats: XML, CSV, TSV, JSON and XLSX, depending on the channel.
- Feeds contain only ready products of the channel's scope; see exports for full catalog files.