Estos endpoints publican (exportan) productos hacia un canal de venta conectado — Shopify, MercadoLibre, Amazon, Walmart, T1/Sears/Sanborns, entre otros — y exponen el estado de esa publicación. También cubren un flujo específico del canal T1: consultar cómo está enriquecida y vinculada tu vitrina de productos frente a lo que existe en T1.
Úsalos cuando necesites:
Publicar (o republicar) uno, varios o todos tus productos en un canal.
Saber si una publicación masiva terminó, sigue en curso o falló parcialmente.
Validar qué productos están listos para publicarse antes de lanzar la operación.
Revisar feeds pendientes de un producto específico hacia un canal.
Auditar la vinculación de tu catálogo con T1/Sears/Sanborns.
Publicación síncrona o asíncrona, según el volumen
POST /products/export responde de forma síncrona (201) cuando la operación es pequeña, o de forma asíncrona (202 + jobId) cuando el volumen lo justifica. Nunca asumas cuál vas a recibir: revisa el status HTTP de la respuesta y, si es 202, consulta GET /products/export/{jobId} hasta que el trabajo termine. Este es el mismo patrón asíncrono que usan la importación y exportación CSV.
El nombre de la clave de nivel superior (results en la respuesta síncrona, jobId + metadata.async en la asíncrona) está confirmado en el código. Los campos exactos dentro de cada elemento de results[] más allá de sku/success/error no fueron verificados línea por línea — trátalos como orientativos y confirma contra la respuesta real de tu canal.
Camino directo para Shopify de un solo producto
Cuando mode es single y el canal destino es Shopify, el orquestador invoca directo la integración de Shopify (saltándose el servicio de canales intermedio) para reducir latencia. El contrato de respuesta que ves como consumidor de la API no cambia — sigue siendo un 201 síncrono — es un detalle de implementación interno.
{ "code": "not-found", "message": "Export job not found" }
Permiso requerido:products:export
Shape del objeto de estado no confirmado más allá de jobId y status
El reporte de auditoría de esta API confirma que este endpoint devuelve "los datos del job", pero no confirma línea por línea el resto de las claves (por ejemplo, si existe un percent o un desglose por producto). No inventes campos adicionales sobre este endpoint — haz polling y confirma la forma exacta contra tu propio job antes de depender de un campo específico más allá de jobId/status.
Tip
Este es el mismo patrón de polling que usan los trabajos de CSV (ver Importación y exportación masiva (CSV)): encola con el endpoint POST, y haz polling sobre GET .../{jobId} hasta que el estado deje de ser transitorio.
Devuelve las publicaciones más recientes hacia canales (últimas 20).
200
{ "jobs": []}
Permiso requerido:products:export
Solo las últimas 20, sin paginación
Este endpoint no acepta parámetros de paginación — siempre devuelve como máximo las 20 publicaciones más recientes del tenant. Si necesitas el detalle completo de una en particular, usa GET /products/export/{jobId}.
A diferencia del resto de los endpoints bajo /products/export*, este solo exige products:read. Si tu API key únicamente tiene permiso de lectura sobre productos, este endpoint SÍ te va a funcionar aunque los demás de esta página te devuelvan 403.
Forma exacta de cada grupo no confirmada
Se confirmaron las cuatro claves de agrupación (published, ready, needs_review, rejected) pero no el shape exacto de cada elemento dentro de esos arreglos — trátalos como listas de productos/SKUs con su motivo, y confírmalo contra tu propia respuesta.
Estos tres endpoints comparten el mismo propósito: dejarte auditar cómo está vinculado tu catálogo Fenicia contra el catálogo real del canal T1 (que también opera Sears y Sanborns). Fenicia invoca directo la integración de T1 para obtener estos datos — el mismo patrón de orquestador legítimo que el bypass de Shopify descrito arriba.
Productos del catálogo T1 enriquecidos con su estado de sincronización frente a Fenicia.
channelIdstringrequired
ID del canal T1/Sears/Sanborns (path).
pagenumber
Número de página. Default: 0.
limitnumber
Elementos por página. Default: 20.
searchstring
Término de búsqueda.
200Cada producto trae un campo syncStatus indicando su estado de vinculación.
{ "products": []}
404
{ "code": "channel-not-found", "message": "Channel not found" }
Permiso requerido:products:read
Productos de Fenicia que ya tienen un binding con T1.
channelIdstringrequired
ID del canal T1/Sears/Sanborns (path).
pagenumber
Número de página. Default: 0.
limitnumber
Elementos por página. Default: 20.
searchstring
Término de búsqueda.
200
{ "products": []}
Permiso requerido:products:read
Todos los productos de Fenicia elegibles para T1, indicando si ya tienen binding (hasBinding).
channelIdstringrequired
ID del canal T1/Sears/Sanborns (path).
pagenumber
Número de página. Default: 0.
limitnumber
Elementos por página. Default: 20.
searchstring
Término de búsqueda.
inStockboolean
Filtra solo productos con existencia.
200Cada producto trae hasBinding indicando si ya está vinculado a T1.
{ "products": []}
Permiso requerido:products:read
Wrapper de lista no confirmado línea por línea
Se muestra { "products": [...] } como forma orientativa consistente con otros listados paginados de este dominio (ver Consultar el catálogo); el reporte de auditoría no confirmó el nombre exacto de esta clave para los tres endpoints de T1 — verifícalo contra tu propia respuesta antes de depender de él.
Formato de código de error no unificado en este dominio
A diferencia del dominio de Pedidos (que usa siempre namespace:snake_case), Productos mezcla convenciones heredadas: verás códigos SCREAMING_SNAKE_CASE (CHANNEL_NOT_FOUND), kebab-case (cancel-failed) y, en otras páginas de este dominio, bad-request/sub-code. Rama tu lógica por el valor exacto del campo code, no por su formato.