Documentation API

Comment ça marche

  1. Inscrivez-vous et copiez la clé. Elle ne s’affiche qu’une fois.
  2. Attendez que EJS approuve l’entreprise.
  3. Appelez le catalogue depuis votre serveur avec cette clé.

Le catalogue se consulte en lecture seule, depuis le serveur du revendeur. Chaque requête envoie la clé de l’entreprise dans l’en-tête X-Api-Key. Tant que le compte est en attente, la clé répond 403 pending_approval.

Base : https://n8n.ejscomputers.com/webhook/v1. Méthode autorisée : GET.

Points d’accès

  • GET /products — liste du catalogue
  • GET /products/{sku} — un produit
  • GET /categories — catégories

Paramètres de /products

Paramètre Rôle
category Slug de catégorie
sku Jusqu’à 50 SKU, séparés par des virgules
include_out_of_stock Inclure les ruptures. Défaut : false
updated_since Date ISO 8601. Produits modifiés depuis cette date
limit 1 à 200. Défaut : 50
cursor Page suivante, reprise de next_cursor

Réponse

data contient les produits. pagination donne limit, next_cursor et total. meta donne api_version, request_id et generated_at. Une erreur a la forme { "error": { "code", "message", "parameter?" }, "meta" }.

Produit

Champs : sku, title, condition (new ou used), category (slug, name_fr, name_en), brand, mpn, upc, quantity, in_stock, price, discount_price, discount_ends_at, currency (CAD), weight_kg, images (url, alt, position), image_missing, attributes (value, unit, label_fr, label_en), updated_at, variants.

Le price du premier niveau est celui du produit seul.

Variante câble

variants est une liste d’objets { variant, sku, price, discount_price, in_stock, quantity, includes? }. variant vaut base ou cable. Les HDD et SSD SATA ont une variante cable : le SKU se termine par -CABLE et un câble SATA est inclus.

Synchronisation

  1. Faire un passage complet avec include_out_of_stock=true.
  2. Retenir le plus grand updated_at reçu.
  3. Suivre next_cursor jusqu’à null.
  4. Aux passages suivants, appeler updated_since avec ce updated_at, encore jusqu’à next_cursor nul.

Codes d’erreur

  • 400 — paramètre invalide
  • 401 — clé absente ou refusée
  • 403 — forbidden ou pending_approval
  • 404 — introuvable
  • 405 — méthode autre que GET
  • 429 — limite atteinte. L’en-tête Retry-After indique le délai
  • 502 — erreur en amont

Exemple curl

curl -s "https://n8n.ejscomputers.com/webhook/v1/products?limit=50&include_out_of_stock=true" \
  -H "Accept: application/json" \
  -H "X-Api-Key: ejs_VOTRE_CLE"
curl -s "https://n8n.ejscomputers.com/webhook/v1/products/HDD-EXEMPLE-2TO" \
  -H "X-Api-Key: ejs_VOTRE_CLE"
curl -s "https://n8n.ejscomputers.com/webhook/v1/categories" \
  -H "X-Api-Key: ejs_VOTRE_CLE"

Exemple de réponse

{
  "data": [
    {
      "sku": "HDD-EXEMPLE-2TO",
      "title": "Disque dur 2 To",
      "condition": "used",
      "category": { "slug": "hdd", "name_fr": "Disques durs", "name_en": "Hard drives" },
      "brand": "Exemple",
      "mpn": "EX-2TB",
      "upc": "000000000000",
      "quantity": 4,
      "in_stock": true,
      "price": "49.00",
      "discount_price": null,
      "discount_ends_at": null,
      "currency": "CAD",
      "weight_kg": 0.42,
      "images": [{ "url": "https://exemple.invalid/hdd.jpg", "alt": "Disque dur", "position": 1 }],
      "image_missing": false,
      "attributes": {
        "capacity": { "value": "2", "unit": "TB", "label_fr": "Capacité", "label_en": "Capacity" }
      },
      "updated_at": "2026-10-08T12:00:00Z",
      "variants": [
        {
          "variant": "base",
          "sku": "HDD-EXEMPLE-2TO",
          "price": "49.00",
          "discount_price": null,
          "in_stock": true,
          "quantity": 4
        },
        {
          "variant": "cable",
          "sku": "HDD-EXEMPLE-2TO-CABLE",
          "price": "54.00",
          "discount_price": null,
          "in_stock": true,
          "quantity": 4,
          "includes": "Câble SATA"
        }
      ]
    }
  ],
  "pagination": { "limit": 50, "next_cursor": null, "total": 1 },
  "meta": {
    "api_version": "v1",
    "request_id": "req_exemple",
    "generated_at": "2026-10-08T12:00:01Z"
  }
}

Exemple d’erreur

{
  "error": {
    "code": "invalid_parameter",
    "message": "limit must be between 1 and 200",
    "parameter": "limit"
  },
  "meta": {
    "api_version": "v1",
    "request_id": "req_exemple",
    "generated_at": "2026-10-08T12:00:01Z"
  }
}