Beta inestable. La API está en desarrollo activo — pueden ocurrir errores o cambiar campos. Si encontrás algo raro, avisanos.
Reportar por WhatsApp

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

POST/v1/products
Probar en sandbox
scopeproducts:writeidempotent

Por 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:

json
{
  "job_id": "8a3f2b10-4c9d-4e21-9f8a-1b2c3d4e5f60",
  "status": "queued",
  "accepted": 2,
  "rejected": 0,
  "total_items": 2
}
El modo de prueba lo decide el environment de tu API Key, no el body. Si tu key es automeli_test_* el job no consume créditos.

Campos del body

items
array (1-10.000)requerido
Cada item: sku + (category_id o auto_categorize).
items[].sku
stringrequerido
10 caracteres alfanuméricos (ASIN de Amazon).
items[].category_id
stringcondicional
ID Meli, formato MCO420674. Excluyente con auto_categorize.
items[].auto_categorize
booleancondicional
Automeli infiere la categoría desde el ASIN. Excluyente con category_id.
listing_type_id
stringopcional
Tipo de publicación de MercadoLibre. Default: el configurado por el seller. Valores aceptados: gold_pro (premium con cuotas), gold_special (clásica), más legacy gold_premium / gold / silver / bronze aceptados por compatibilidad. ¿Cuál elijo? →
tax_category_id
intopcional
Índice (no nombre) de la categoría arancelaria del seller. Default 0 (primera). Para ver los índices → GET /v1/account/tax-categories.
scheduled_for
stringopcional
Programa la publicación a una hora futura. Formato YYYY-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_KEY

Falta el header X-API-Key

401
E_AUTH_INVALID_KEY

Key con formato inválido o no reconocida

401
E_AUTH_FORBIDDEN_SCOPE

Tu key no tiene el permiso requerido (ver scopes)

403
E_RATE_LIMITED

Excediste el rate limit. Ver Retry-After

429
E_IDEMPOTENCY_CONFLICT

Misma Idempotency-Key con body distinto

409
E_PRODUCT_INVALID_BODY

Body malformado o campos faltantes

422
E_PRODUCT_INVALID_SKU

SKU no cumple regex (10 alfanum)

422
E_PRODUCT_CREDIT_EXHAUSTED

Sin créditos disponibles

400
E_PRODUCT_MAX_CONCURRENT_JOBS

Ya tenés 6 jobs activos

429
E_CATEGORY_INVALID

category_id no cumple formato Meli

422
E_CATEGORY_AND_AUTO_CONFLICT

category_id y auto_categorize juntos

422
E_ACCOUNT_NOT_FOUND

Cuenta Meli no encontrada

404
E_INTERNAL

Error inesperado. Reintentá con backoff

503

Programación de publicaciones (UTC)

Mismo 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:

json
{
  "items": [{ "sku": "B003H03SDQ", "auto_categorize": true }],
  "scheduled_for": "2026-06-10T15:00"
}
🕒 Toda la programación es UTC. "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:

Lo que mandanPor qué falla
"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
// 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
# 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"

Idempotencia

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.

header
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.