Skip to content

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.

GET/channels
Channels with ready / published / failing counts
GET/channels/{id}
Configuration, mappings and feed URLs
GET/channels/{id}/products
Mapped values and API payload per product
POST/channels/{id}/publish
Queue a publish (background job)
GET/products/{idOrSku}/channels
One product's readiness on every channel

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
bash
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"
ParameterMeaning
readytrue: only products without errors; false: only products that need work
updated_sinceOnly products changed since (incremental sync)
skuComma-separated SKUs
page / limitUp to 100 per page (payloads are large)
One item
json
{
  "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

A product is ready for a channel when every required channel field has a valid value. Scores and issues explain what is missing — the same list the app shows. A listing is 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
bash
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.