Recursos
Publicar productos
El endpoint principal. Crea un job asíncrono que la API procesa en segundo plano. Cada job puede tener hasta 10.000 items.
Crear un job de publicación
/v1/productsPor cada item indicás el SKU y la categoría — o le pedís a Automeli que la infiera con auto_categorize: true. Ambas opciones son excluyentes.
curl -X POST "https://api.automeli.com/api/v1/products" \
-H "X-API-Key: automeli_live_..." \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "sku": "B003H03SDQ", "category_id": "MCO420674" },
{ "sku": "B07JHNJLYH", "auto_categorize": true }
],
"listing_type_id": "gold_pro",
"tax_category_id": 0
}'Si todo está bien recibís un 202 Accepted con el id del job para hacer seguimiento:
{
"job_id": "8a3f2b10-4c9d-4e21-9f8a-1b2c3d4e5f60",
"status": "queued",
"accepted": 2,
"rejected": 0,
"total_items": 2
}automeli_test_* el job no consume créditos.itemssku + (category_id o auto_categorize).items[].skuitems[].category_idMCO420674. Excluyente con auto_categorize.items[].auto_categorizecategory_id.listing_type_idgold_pro (premium con cuotas), gold_special (clásica), más legacy gold_premium / gold / silver / bronze aceptados por compatibilidad. ¿Cuál elijo? →tax_category_id0 (primera). Para ver los índices → GET /v1/account/tax-categories.scheduled_forYYYY-MM-DDTHH:MM en UTC, sin segundos ni offset. Entre 5 minutos y 30 días en el futuro. Ver sección de programación abajo.Errores posibles de este endpoint (13)
E_AUTH_MISSING_KEYFalta el header X-API-Key
401E_AUTH_INVALID_KEYKey con formato inválido o no reconocida
401E_AUTH_FORBIDDEN_SCOPETu key no tiene el permiso requerido (ver scopes)
403E_RATE_LIMITEDExcediste el rate limit. Ver Retry-After
429E_IDEMPOTENCY_CONFLICTMisma Idempotency-Key con body distinto
409E_PRODUCT_INVALID_BODYBody malformado o campos faltantes
422E_PRODUCT_INVALID_SKUSKU no cumple regex (10 alfanum)
422E_PRODUCT_CREDIT_EXHAUSTEDSin créditos disponibles
400E_PRODUCT_MAX_CONCURRENT_JOBSYa tenés 6 jobs activos
429E_CATEGORY_INVALIDcategory_id no cumple formato Meli
422E_CATEGORY_AND_AUTO_CONFLICTcategory_id y auto_categorize juntos
422E_ACCOUNT_NOT_FOUNDCuenta Meli no encontrada
404E_INTERNALError inesperado. Reintentá con backoff
503Mismo flujo que el botón “Programar publicación” del dashboard, vía API: en lugar de publicar al toque, el job queda en estado scheduled y se dispara a la hora indicada.
El campo scheduled_for va en el body del POST /v1/products (o del atajo POST /v1/products/test/promote). El formato es estricto:
{
"items": [{ "sku": "B003H03SDQ", "auto_categorize": true }],
"scheduled_for": "2026-06-10T15:00"
}"2026-06-10T15:00" significa "10 de junio a las 15:00 UTC" — que en hora Colombia (UTC-5) son las 10:00 AM. Si tu sistema trabaja en hora local, convertilo a UTC antes de mandar. No le pongas Z ni offset al string, la API ya sabe que es UTC.Formatos rechazados
Todos devuelven 422 E_PRODUCT_INVALID_BODY:
"2026-06-10T15:00:00"Tiene segundos. El formato es sin segundos."2026-06-10T15:00Z"No le pongas la Z, ya es UTC implícito."2026-06-10T15:00-05:00"No le pongas offset, todo es UTC."2026-06-10 15:00"Tiene espacio en vez de T."2026-06-10"Falta la hora (date-only no se acepta).1717000000Tiene que ser string, no número.Restricciones
- →Mínimo 5 minutos en el futuro respecto al UTC actual del servidor.
- →Máximo 30 días en el futuro.
¿Cómo convierto mi hora local a UTC del lado cliente?
Snippets de los lenguajes más comunes (convertir "10 jun 10:00 AM Colombia" → string UTC para la API):
// JavaScript / Node
const local = new Date('2026-06-10T10:00:00-05:00');
const scheduled_for = local.toISOString().slice(0, 16);
// → "2026-06-10T15:00"# Python
from datetime import datetime, timezone, timedelta
local = datetime(2026, 6, 10, 10, 0, tzinfo=timezone(timedelta(hours=-5)))
scheduled_for = local.astimezone(timezone.utc).strftime('%Y-%m-%dT%H:%M')
# → "2026-06-10T15:00"Si tu sistema reintenta requests por timeouts de red, evitá duplicar jobs con un Idempotency-Key.
Enviá un UUID en el header Idempotency-Key y Automeli recuerda la respuesta durante 24h. Reintentos posteriores con el mismo body devuelven la respuesta cacheada, sin volver a crear el job.
Idempotency-Key: 2c4e2f7a-8b1d-4e7c-9c4f-1d2e3f4a5b6c- →Misma key + mismo body: devuelve la respuesta original. Header
Idempotent-Replay: true. - →Misma key + body distinto:
409 E_IDEMPOTENCY_CONFLICT. - →Key nueva: procesa normal y cachea.