Importación de productos
Sube un archivo de productos, sigue la operación y corrige las filas rechazadas.
Sube un CSV con tu catálogo y recibe al instante una operación. El archivo se procesa en segundo plano; consulta la operación hasta que termine y descarga el reporte si hubo filas rechazadas.
Requisitos
- Un token de Admin en
ECOMIQ_TOKEN. Ver Inicio rápido. - Los permisos
catalog:createycatalog:updatepara importar, yoperation:readpara seguir la operación.
Arma el archivo
Cada fila es una variante. Las filas con el mismo Código producto forman un
producto.
Código producto,Producto,SKU,Precio,Opción 1 nombre,Opción 1 valor,Opción 2 nombre,Opción 2 valor,Categoría
POL-001,Polo de algodón,POL-001-AZ-S,79.00,Talla,S,Color,Azul,Ropa > Polos
POL-001,Polo de algodón,POL-001-AZ-M,79.00,Talla,M,Color,Azul,Ropa > Polos
BOT-001,Botella,BOT-001-500,39.00,Capacidad,500 ml,,,Hogar > Botellas| Columna | Obligatoria | Qué lleva |
|---|---|---|
Código producto | Para crear | Tu código. Crea el producto o actualiza el que ya lo tiene. |
Producto | Sí | Nombre del producto. |
SKU | Sí | SKU de la variante. |
Precio | Sí | Precio de la variante, con punto decimal. Si la columna está, no va vacía. |
Opción N nombre, Opción N valor | No | Nombre y valor de una opción de la variante, como Talla y S. |
Atributo: <nombre> | No | Característica del producto, como Atributo: Material. |
Categoría | No | Nombre o ruta, como Ropa > Polos. Si no existe, se crea. |
Marca | No | Nombre de la marca. Si no existe, se crea. |
Etiquetas | No | Separadas por coma. |
Imágenes, Imagen variante | No | URLs separadas por coma. La imagen de la variante debe estar en Imágenes. |
Peso (kg), Largo (cm), Ancho (cm), Alto (cm) | No | Medidas del paquete. |
ID interno | Para actualizar por id | id de un producto de Ecomiq. La fila actualiza ese producto. |
Los encabezados en inglés, como Product code o Price, también sirven.
Cada fila necesita Código producto o ID interno. Si importas como vendedor,
Categoría y Marca deben existir.
Para cargar stock, agrega Stock inicial (entero, desde 0) y Ubicación de stock, con el permiso inventory:update. La ubicación debe coincidir con una
sola ubicación activa; sin ella, se usa la predeterminada. Una cantidad vacía
conserva el stock actual.
Opciones de variante
Cada par lleva el nombre y el valor en la misma fila, así un archivo mezcla
productos con Talla y Color y otros con Capacidad.
- La plantilla trae tres pares. Agrega
Opción 4 nombreyOpción 4 valory sigue la numeración si necesitas más. - Un par con ambas celdas vacías no cambia nada. Al actualizar, cada par
completo cambia esa opción y conserva las demás: enviar solo
Color=Negromantiene laTalla. - La fila se rechaza si un par tiene solo nombre o solo valor, o si un nombre se repite en la fila (sin distinguir mayúsculas).
- Todas las variantes de un producto usan los mismos nombres de opción, en cualquier orden.
Plantilla y exportación
Pide la plantilla con POST / y
{ "format": "xlsx", "template": true }. Trae las columnas obligatorias
primero, listas con tus categorías, marcas y perfiles de envío, y ayuda en cada
columna.
Sin template, la exportación trae tus productos con ID interno,
ID interno variante y una columna ID en {canal} por cada canal con
publicaciones. Súbela de nuevo para editar; las columnas de canal son de solo lectura.
Ambas son operaciones: al terminar, descarga su resultUrl.
En XLSX, Productos debe ser la primera hoja y los encabezados, la primera fila
con datos.
Formatos
| Formato | Content-Type | Máximo |
|---|---|---|
| CSV | text/ | 50 MiB |
| TSV | text/ | 50 MiB |
| XLSX | application/ | 10 MiB |
| JSONL | application/ | 50 MiB |
Todos admiten hasta 100 000 filas. En JSONL, cada línea es un objeto con los mismos nombres de columna:
{"Código producto":"POL-001","Producto":"Polo de algodón","SKU":"POL-001-AZ-S","Precio":79,"Opción 1 nombre":"Talla","Opción 1 valor":"S"}Sube el archivo
Envía el archivo en bruto en el cuerpo, con su Content-Type.
curl -X POST https://api.ecomiq.pe/api/v1/catalog/products/imports \
-H "Authorization: Bearer $ECOMIQ_TOKEN" \
-H "Content-Type: text/csv" \
-H "Idempotency-Key: catalogo-2026-10-04" \
--data-binary @productos.csvLa API revisa los encabezados del archivo y responde 202 con la operación.
Location apunta a /.
{
"id": "7204558912004325401",
"status": "pending",
"resource": "products",
"format": "csv",
"createdOn": "2026-10-04T15:30:00Z"
}Guarda el id para seguir la operación; los productos se crean después.
Idempotency-Key es opcional. Si se perdió la respuesta, reintenta con la misma
clave y el mismo archivo: recibes el mismo 202 sin crear otra operación. La
clave vale 24 horas.
Valida sin escribir
Agrega ?validateOnly=true a la URL. La operación revisa todas las filas y
reporta los errores, pero no cambia el catálogo.
Si el archivo no se puede leer, la API responde con un error y no crea la operación:
{
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"Import.InvalidFile": [
"The import source is missing required headers: sku."
]
},
"code": "Import.InvalidFile"
}| Respuesta | Cuándo | Qué hacer |
|---|---|---|
400 Import.InvalidFile | Faltan columnas obligatorias o el archivo no se puede leer. | Corrige la cabecera. |
400 Import.ContentType | El Content-Type no es de un formato admitido. | Envía el tipo que corresponde al archivo. |
400 Import.SizeLimitExceeded | El archivo supera el máximo de su formato. | Divide el archivo. |
409 Operation.ResourceBusy | Ya hay una importación de productos en curso. | Espera a que termine o cancélala. |
422 | Usaste la misma Idempotency-Key con otro archivo u otras opciones. | Usa una clave nueva. |
429 | Superaste el límite de cargas. | Espera lo que indique Retry-After. |
Sigue la operación
Consulta la operación cada pocos segundos mientras status sea pending o
running.
curl https://api.ecomiq.pe/api/v1/operations/7204558912004325401 \
-H "Authorization: Bearer $ECOMIQ_TOKEN"En este ejemplo el archivo tenía 4 filas y una no traía Código producto:
{
"id": "7204558912004325401",
"type": "import",
"resource": "products",
"format": "csv",
"status": "completed",
"fileName": "product-import-errors.csv",
"resultUrl": null,
"errorsUrl": "https://…/product-import-errors.csv?X-Amz-Expires=300&X-Amz-Signature=…",
"error": null,
"totalRows": 4,
"processedRows": 4,
"succeededRows": 3,
"failedRows": 1,
"startedOn": "2026-10-04T15:30:02Z",
"completedOn": "2026-10-04T15:30:05Z",
"createdOn": "2026-10-04T15:30:00Z"
}status | Qué significa |
|---|---|
pending | En cola. |
running | Procesando. processedRows avanza. |
completed | Terminó. Las filas válidas se aplicaron, aunque otras fallaran. |
failed | No se pudo procesar el archivo. Lee error. |
cancelled | Se canceló. Lo ya aplicado se mantiene. |
En lugar de consultar en bucle, puedes recibir el webhook
operation.finished,
que trae el id y los contadores. Para cancelar, usa
POST /.
Revisa las filas rechazadas
Si failedRows es mayor que cero, errorsUrl trae un CSV con cada fila
rechazada. Es un enlace firmado que vence a los 5 minutos y se descarga sin
token; vuelve a pedir la operación para obtener uno nuevo.
curl -o errores.csv "$ERRORS_URL"sheet,row,column,code,message
,5,,Products.ImportExternalProductIdRequired,Source row 5 requires product_id or product_code.| Columna | Qué lleva |
|---|---|
sheet | Hoja del XLSX. Vacía en CSV, TSV y JSONL. |
row | Fila del archivo, con la cabecera como fila 1. |
column | Columna del error, cuando se conoce. |
code, message | Qué falló. |
Corrige esas filas y súbelas en un archivo nuevo.
Siguientes pasos
- Para hasta 100 productos en JSON, usa
POST /: respondev1/ catalog/ products/ batch 200con el resultado de cada fila, sin operación. - Variantes y precios para ajustar precios después de importar.
- Inventario para cargar el stock.
Última actualización: