Traducida del inglés. Si hay alguna diferencia, la página en inglés es la referencia. Leer en inglés

Sincronizar stock y precios en bloque

Envía cambios de cantidad y precio de hasta 100 SKU por llamada y consulta el resultado de cada elemento.

Para sincronizaciones periódicas desde un ERP o un almacén, POST /inventory/batch es el endpoint sobre el que construir: identifica las variantes por SKU, así que no necesitas guardar ningún id de Nembol.

curl -X POST https://api.nembol.com/rest/v1/inventory/batch \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: stock-sync-2026-07-30T22:00" \
  -d '{"items": [
    {"sku": "VDJ-M-001", "quantity": 12},
    {"sku": "VDJ-L-001", "quantity": 0, "price": "44.90"}
  ]}'

La escritura local es inmediata; la propagación a los canales es asíncrona. La respuesta es una operación. Los elementos que no se pueden asociar vuelven en rejected_items con un motivo (sku_not_found, sku_ambiguous) sin hacer fallar el resto, y además aparecen como entradas failed en results: la operación termina en partial, así que un SKU renombrado en tu sistema aparece en tus alertas en lugar de dejar de sincronizarse sin avisar. Si ningún elemento se puede aplicar, la llamada responde 422 no_items_applied (motivos en error.details.rejected_items) y no cambia nada.

results[] tiene una entrada por SKU y por canal en el que el producto está publicado, con su channel_account_id y su listing_id:

  • pending: guardado en Nembol, el canal todavía no ha respondido;
  • succeeded: ese canal ya tiene el nuevo stock o precio;
  • failed: ese canal lo rechazó, con su mensaje en error. La operación pasa a partial.

Nembol reintenta primero los rechazos temporales (por ejemplo, el "this product is currently being modified" de Shopify cuando dos escrituras llegan a la vez al mismo producto, o un límite de solicitudes): mientras reintenta, el resultado sigue en pending, y solo un envío que sigue fallando termina en failed.

Así siempre sabes si cada tienda recibió el stock, que es lo que evita la sobreventa: espera el webhook operation.completed (o consulta GET /operations/{id}) y actúa sobre las entradas fallidas. Un producto que no está publicado en ningún canal recibe una sola entrada con channel_account_id: null, ya succeeded: guardado en Nembol, nada que enviar.

Upserts del catálogo completo

Para crear o actualizar productos completos (contenido incluido), usa POST /products/batch. Tiene la misma asociación por SKU (un SKU ambiguo falla con sku_ambiguous y no se escribe nada), hasta 100 elementos, resultados por elemento, status: "partial" cuando solo fallan algunos y 422 no_items_applied cuando no se aplica ninguno. Los SKU sin coincidencia se crean (título obligatorio) y los que coinciden se actualizan.

Acciones en bloque sobre anuncios

POST /listings/batch ejecuta una action (publish, delist, resync o retry) sobre hasta 100 pares (producto, cuenta de canal), por ejemplo para copiar un catálogo en una segunda cuenta de eBay:

curl -X POST https://api.nembol.com/rest/v1/listings/batch \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: copy-to-ebay2-page-1" \
  -d '{"action": "publish",
       "items": [{"product_id": "prod_66a1f0", "channel_account_id": "chac_6aa12cab"},
                 {"product_id": "prod_66a1f1", "channel_account_id": "chac_6aa12cab"}]}'

Cada par obtiene su propio resultado en la operación: pending hasta que el canal responde, skipped cuando ya está en el estado pedido (por ejemplo, already_listed), y failed con un código en los demás casos. Los resultados vuelven en el mismo orden que tus items, y cada uno repite el product_id y el channel_account_id que enviaste, incluidos los desconocidos, así que siempre sabes a qué par se refiere cada resultado. Recorre los catálogos más grandes de 100 pares en 100, con un Idempotency-Key distinto por página.

Cambios de precio en bloque

POST /inventory/price_adjustment sube o baja todas las variantes de hasta 100 productos en un porcentaje o un importe (opcionalmente redondeado a .99) y envía los nuevos precios a los canales activos:

curl -X POST https://api.nembol.com/rest/v1/inventory/price_adjustment \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_ids": ["prod_66a1f0", "prod_66a1f1"], "mode": "percentage", "value": -15, "rounding": true}'

El resultado de cada variante incluye previous_price y price. Para deshacer, vuelve a enviar los precios anteriores:

POST /inventory/batch
{"items": [{"sku": "TEE-M", "price": "19.99"}, {"sku": "TEE-L", "price": "21.99"}]}

Puntos a tener en cuenta

  • Un Idempotency-Key por cada ejecución del lote. Reintentar un lote que agotó el tiempo con la misma clave devuelve el resultado guardado en lugar de aplicarlo dos veces.
  • Las actualizaciones en lote no aceptan imágenes. Un elemento con coincidencia que lleve images[] falla (por elemento). Actualiza las imágenes con PATCH /products/{id}.
  • quantity: 0 es un valor real. Deja la variante agotada en todas partes.
  • Escucha operation.completed en lugar de consultar periódicamente si sincronizas a menudo.
  • Los precios son strings ("44.90"), siempre en la moneda base de la tienda.
  • Un canal puede mostrar menos unidades de las que tienes (o "sin stock" en Google Merchant Center): los vendedores pueden fijar un tope de cantidad por canal (inventory en GET /channel_accounts).
  • Las reglas de precio del canal se aplican encima de los precios que fijas o ajustas (pricing en la cuenta de canal).

Última actualización el 20 de octubre de 2026

¿Necesitas ayuda?

Escríbenos y te responde una persona, normalmente en un día laborable.

En esta página