Cuatro familias de endpoints relacionadas por un mismo hilo: todas operan sobre muchos productos a la vez y todas pueden terminar en éxito parcial. Cubre el registro y rollback de operaciones masivas, el editor visual de reglas (Flow Editor), las transformaciones asistidas por IA, y la categorización de productos para un marketplace.
207 Multi-Status aparece en varios de estos endpoints
POST /products/marketplace-categories, la rama síncrona de importación CSV, POST /products/bulk/flow/execute y POST /products/bulk/ai/transform pueden responder 207 Multi-Status cuando algunos elementos de la operación tuvieron éxito y otros fallaron. Si tu cliente solo distingue "2xx = todo bien", vas a tratar un resultado parcialmente fallido como éxito total — revisa siempre el detalle por elemento de la respuesta.
Toda operación masiva que modifica productos (CSV, Flow Editor, IA) queda registrada como una "bulk operation" — con eso se construye el historial y se habilita el rollback.
Lista el historial de operaciones masivas del tenant.
pagenumber
Número de página.
limitnumber
Elementos por página.
typestring
Filtra por tipo de operación (csv-import, flow, ai-transform, etc.).
Este endpoint exige dos permisos a la vez, no uno solo
A diferencia de la mayoría de los endpoints de lectura de esta API, GET /products/bulk/operations y GET /products/bulk/operations/{id} exigen tantoproducts:readcomoproducts:update simultáneamente — una API key con solo lectura no puede listar el historial de operaciones masivas. Esto es una inconsistencia de RBAC confirmada en el código, no necesariamente el diseño intencional; documentamos el comportamiento real. El endpoint de rollback (más abajo), en cambio, exige únicamente products:update.
Se confirmó que la respuesta trae la operación completa más el campo canRollback. El resto de los campos del ejemplo (id, type, status) son orientativos según el resto de la familia de bulk operations — confírmalos contra tu propia respuesta.
{ "code": "rollback-failed", "message": "This operation can no longer be rolled back" }
Permiso requerido:products:update
Tip
Revisa canRollback en GET /products/bulk/operations/{id} antes de intentar el rollback — una operación puede dejar de ser reversible (por ejemplo, si otra operación posterior ya modificó los mismos SKUs).
El Flow Editor deja definir reglas de edición masiva sin escribir código (un FlowDefinition estructurado). Los tres endpoints siguen el patrón validar → previsualizar (dry-run) → ejecutar.
Se confirmó que este endpoint puede responder 200 (éxito total) o 207 (parcial). Los nombres exactos de los campos del cuerpo (totalProcessed, succeeded, failed, errors) no se verificaron línea por línea — úsalos como guía y confírmalos contra tu propia ejecución. La operación queda registrada y es consultable/reversible vía el registro de operaciones masivas descrito arriba.
Aplica un prompt de lenguaje natural sobre un conjunto de productos para transformar campos específicos (por ejemplo, reescribir descripciones o generar bullets de marketplace).
{ "code": "budget-exceeded", "message": "Daily AI token budget exceeded for this tenant" }
Permiso requerido:products:update
Shape del resultado orientativo
El wrapper de nivel superior (200/207 según éxito parcial) está confirmado; los nombres exactos de campos como results[], changedFields no se verificaron línea por línea — trátalos como orientativos.
El presupuesto de IA es diario y por tenant
Antes de que tu prompt se procese, el servidor valida contra un presupuesto diario de tokens del tenant. Si ya lo agotaste, la petición falla con 429 budget-exceeded sin siquiera intentar la transformación — consulta GET /products/bulk/ai/budget antes de lanzar un lote grande.
Se confirmó el wrapper { history: TokenUsage[] }; los campos exactos de cada TokenUsage (aquí date, tokensUsed, requestCount) no se verificaron línea por línea.
Asigna la categoría de un marketplace específico (MercadoLibre, T1/Sears/Sanborns, Amazon, Walmart, etc.) a un lote de SKUs. El resultado se guarda como un metafield del producto — no crea un campo nuevo en el modelo de datos.
Asigna una categoría de marketplace a un lote de SKUs para un canal específico.
skusstring[]required
SKUs a categorizar. Máximo 100 por petición.
channelIdstringrequired
ID del canal/marketplace destino.
category.idstringrequired
ID de la categoría en el marketplace. Máximo 100 caracteres.
category.namestringrequired
Nombre de la categoría. Máximo 255 caracteres.
category.pathstring[]
Ruta jerárquica de la categoría. Máximo 10 niveles.
{ "code": "too-many-skus", "message": "skus exceeds the maximum of 100" }
Permiso requerido:products:update
Dónde queda guardado el resultado
La categoría asignada se persiste en product.metafields[], bajo namespace: 'mkt_category' y key: '{channelType}:{siteId}' — no es un campo de primer nivel del producto. El siteId depende del tipo de canal: MercadoLibre usa site_id (default MLM), T1/Sears/Sanborns usan salesChannel/marketplace (default SR), Amazon usa marketplace_id (default MX) y Walmart usa country (default MX).