Traduite de l'anglais. En cas de différence, la page en anglais fait foi. Lire en anglais

Synchroniser stock et prix en masse

Envoyez des modifications de quantité et de prix pour jusqu'à 100 SKU par appel, et lisez le résultat de chaque élément.

Pour des synchronisations récurrentes depuis un ERP ou un entrepôt, POST /inventory/batch est l'endpoint sur lequel s'appuyer : il identifie les variantes par SKU, vous n'avez donc pas besoin de stocker les id 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"}
  ]}'

L'écriture locale est immédiate ; la propagation vers les canaux est asynchrone. La réponse est une opération. Les éléments introuvables reviennent dans rejected_items avec un motif (sku_not_found, sku_ambiguous) sans faire échouer les autres, et ils figurent aussi comme entrées failed dans results : l'opération se termine en partial. Ainsi, un SKU renommé dans votre système apparaît dans vos alertes au lieu d'arrêter discrètement sa synchronisation. Si aucun élément ne peut être appliqué, l'appel répond 422 no_items_applied (motifs dans error.details.rejected_items) et rien ne change.

results[] contient une entrée par SKU et par canal sur lequel le produit est en ligne, avec son channel_account_id et son listing_id :

  • pending : enregistré dans Nembol, le canal n'a pas encore répondu ;
  • succeeded : ce canal a reçu le nouveau stock / prix ;
  • failed : ce canal l'a refusé, avec son message dans error. L'opération passe en partial.

Un refus temporaire (par exemple le message de Shopify « this product is currently being modified » quand deux écritures atteignent le même produit en même temps, ou une limite de débit) est d'abord retenté par Nembol : pendant les nouvelles tentatives, le résultat reste pending, et seul un envoi qui échoue encore se termine en failed.

Vous savez donc toujours si chaque boutique a reçu le stock, et c'est ce qui évite la survente : attendez le webhook operation.completed (ou interrogez GET /operations/{id}) et traitez les entrées en échec. Un produit en ligne sur aucun canal obtient une seule entrée avec channel_account_id: null, déjà succeeded : enregistré dans Nembol, rien à envoyer.

Upserts du catalogue complet

Pour créer ou mettre à jour des produits entiers (contenu compris), utilisez POST /products/batch. Il applique la même correspondance par SKU (un SKU ambigu échoue avec sku_ambiguous, rien n'est écrit), jusqu'à 100 éléments, un résultat par élément, status: "partial" quand seuls certains échouent, et 422 no_items_applied quand aucun ne s'applique. Les SKU sans correspondance sont créés (titre obligatoire), ceux qui correspondent sont mis à jour.

Actions en masse sur les annonces

POST /listings/batch exécute une action (publish, delist, resync ou retry) sur jusqu'à 100 paires (produit, compte de canal), par exemple pour copier un catalogue sur un second compte 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"}]}'

Chaque paire obtient son propre résultat dans l'opération : pending jusqu'à la réponse du canal, skipped si elle est déjà dans l'état demandé (par exemple already_listed), failed avec un code sinon. Les résultats reviennent dans le même ordre que vos items, et chacun reprend le product_id et le channel_account_id envoyés, y compris les inconnus : vous savez donc toujours à quelle paire correspond un résultat. Parcourez les catalogues plus grands par pages de 100 paires, avec une Idempotency-Key distincte par page.

Modifications de prix en masse

POST /inventory/price_adjustment augmente ou baisse toutes les variantes de jusqu'à 100 produits d'un pourcentage ou d'un montant (arrondi à .99 en option) et envoie les nouveaux prix aux canaux en ligne :

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}'

Le résultat de chaque variante contient previous_price et price. Pour annuler, renvoyez les prix précédents :

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

Pièges à éviter

  • Une Idempotency-Key par exécution de batch. Relancer un batch expiré avec la même clé rejoue le résultat enregistré au lieu de l'appliquer deux fois.
  • Les mises à jour par batch n'acceptent pas d'images. Un élément trouvé avec images[] échoue (pour cet élément). Mettez à jour les images avec PATCH /products/{id}.
  • quantity: 0 est une vraie valeur. La variante passe en rupture de stock partout.
  • Écoutez operation.completed au lieu d'interroger l'API si vous synchronisez souvent.
  • Les prix sont des chaînes ("44.90"), toujours dans la devise de base de la boutique.
  • Un canal peut afficher moins d'unités que vous n'en avez (ou « en rupture » sur Google Merchant Center) : les vendeurs peuvent définir un plafond de quantité par canal (inventory dans GET /channel_accounts).
  • Les règles de prix du canal s'appliquent en plus des prix que vous définissez ou ajustez (pricing sur le compte de canal).

Dernière mise à jour le 20 octobre 2026

Besoin d'aide ?

Écrivez-nous et une personne vous répond, généralement sous un jour ouvré.

Sur cette page