These endpoints publish (export) products to a connected sales channel — Shopify, MercadoLibre, Amazon, Walmart, T1/Sears/Sanborns, among others — and expose the status of that publication. They also cover a T1-specific flow: checking how your product catalog is enriched and linked against what exists in T1.
Use them when you need to:
Publish (or republish) one, several, or all of your products to a channel.
Know whether a bulk publication finished, is still in progress, or partially failed.
Validate which products are ready to be published before launching the operation.
Review pending feeds for a specific product toward a channel.
Audit your catalog's linkage with T1/Sears/Sanborns.
Synchronous or asynchronous publishing, depending on volume
POST /products/export responds synchronously (201) when the operation is small, or asynchronously (202 + jobId) when the volume justifies it. Never assume which one you'll get: check the HTTP status of the response, and if it's 202, poll GET /products/export/{jobId} until the job finishes. This is the same async pattern used by CSV import and export.
The name of the top-level key (results in the synchronous response, jobId + metadata.async in the asynchronous one) is confirmed in the code. The exact fields within each element of results[] beyond sku/success/error were not verified line by line — treat them as indicative and confirm against the actual response from your channel.
Direct path for single-product Shopify
When mode is single and the target channel is Shopify, the orchestrator invokes the Shopify integration directly (bypassing the intermediate channels service) to reduce latency. The response contract you see as an API consumer doesn't change — it's still a synchronous 201 — this is an internal implementation detail.
{ "code": "not-found", "message": "Export job not found" }
Required permission:products:export
Status object shape not confirmed beyond jobId and status
This API's audit report confirms that this endpoint returns "the job data," but does not confirm line by line the rest of the keys (for example, whether a percent or a per-product breakdown exists). Don't invent additional fields for this endpoint — poll and confirm the exact shape against your own job before depending on any specific field beyond jobId/status.
Tip
This is the same polling pattern used by CSV jobs (see Bulk CSV import and export): queue with the POST endpoint, then poll GET .../{jobId} until the status stops being transient.
Returns the most recent publications to channels (last 20).
200
{ "jobs": []}
Required permission:products:export
Only the last 20, no pagination
This endpoint does not accept pagination parameters — it always returns at most the 20 most recent publications for the tenant. If you need the full detail of a specific one, use GET /products/export/{jobId}.
Unlike the rest of the endpoints under /products/export*, this one only requires products:read. If your API key only has read permission on products, this endpoint WILL work for you even if the others on this page return 403.
Exact shape of each group not confirmed
The four grouping keys (published, ready, needs_review, rejected) were confirmed, but not the exact shape of each element within those arrays — treat them as lists of products/SKUs with their reason, and confirm against your own response.
These three endpoints share the same purpose: letting you audit how your Fenicia catalog is linked against the actual T1 catalog (which also operates Sears and Sanborns). Fenicia invokes the T1 integration directly to obtain this data — the same legitimate orchestrator pattern as the Shopify bypass described above.
T1 catalog products enriched with their sync status against Fenicia.
channelIdstringrequired
ID of the T1/Sears/Sanborns channel (path).
pagenumber
Page number. Default: 0.
limitnumber
Items per page. Default: 20.
searchstring
Search term.
200Each product carries a syncStatus field indicating its linkage status.
{ "products": []}
404
{ "code": "channel-not-found", "message": "Channel not found" }
Required permission:products:read
Fenicia products that already have a binding with T1.
channelIdstringrequired
ID of the T1/Sears/Sanborns channel (path).
pagenumber
Page number. Default: 0.
limitnumber
Items per page. Default: 20.
searchstring
Search term.
200
{ "products": []}
Required permission:products:read
All Fenicia products eligible for T1, indicating whether they already have a binding (hasBinding).
{ "products": [...] } is shown as an indicative shape consistent with other paginated listings in this domain (see Query the catalog); the audit report did not confirm the exact name of this key for the three T1 endpoints — verify it against your own response before depending on it.
Unlike the Orders domain (which always uses namespace:snake_case), Products mixes legacy conventions: you'll see SCREAMING_SNAKE_CASE codes (CHANNEL_NOT_FOUND), kebab-case (cancel-failed), and, on other pages in this domain, bad-request/sub-code. Branch your logic on the exact value of the code field, not on its format.