Developers · API

Une plateforme, pas une boîte noire

Clés API scopées, webhooks signés HMAC, idempotence. Branchez ShipAndCheap à n'importe quel site, ERP ou outil maison. Vos commandes entrent, votre tracking ressort — en temps réel.

POST /v1/orders
POST /v1/orders
Authorization: Bearer sk_live_••••••••••

{
  "orderNumber": "CMD-2026-1551",
  "source": "mon-site.com",
  "customer": {
    "name": "Jean Dupont",
    "email": "jean@exemple.fr",
    "address": { "city": "Lyon", "postalCode": "69001", "country": "FR" }
  },
  "items": [{ "sku": "REF-123", "quantity": 1, "price": 49.9 }]
}

→ 201 Created  ·  { "orderId": "...", "status": "pending" }

Clés API scopées

Format sk_live_…, scopes par ressource (orders, shipments…), IP allowlist et rate limit. Le secret n'est affiché qu'une seule fois.

Webhooks signés

Signature HMAC (style Stripe : t=…,v1=…) + anti-rejeu. Vérifiez chaque événement, en toute confiance.

Idempotence

Pas de doublon, livraison fiable, rejeu possible. Vos intégrations restent cohérentes même en cas de retry.

Démarrage rapide

Poussez votre stock en trois requêtes

Le cas le plus fréquent : votre catalogue vit dans votre propre système et doit alimenter le stock central ShipAndCheap. Créez une clé avec les portées products:read et products:write, puis :

1 · Importer / mettre à jour (idempotent par SKU)

curl -X POST https://api.shipandcheap.com/products/import \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "products": [
      { "sku": "REF-001", "name": "Casque modulable",
        "price": "89,90", "costPrice": "41,20",
        "stock": "14", "ean": "4006381333931",
        "brand": "Nova", "supplierName": "Motea" }
    ]
  }'

→ { "imported": 1, "skipped": 0, "errors": [] }

Lots de 200 max par appel. Renvoyer le même SKU met à jour la fiche — jamais de doublon. Un envoi partiel (SKU + stock) ne touche que le stock. La virgule décimale française est acceptée.

2 · Lire le catalogue

curl https://api.shipandcheap.com/products?limit=100 \
  -H "Authorization: Bearer sk_live_..."

→ { "products": [...], "nextKey": "..." }

3 · Mettre à jour un produit précis

curl -X PUT https://api.shipandcheap.com/products/REF-001 \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "stock": 9 }'
Portées (scopes)

Une clé n'a que les droits que vous lui donnez

Chaque ressource a une portée lecture et une portée écriture. La règle est mécanique : GET exige ressource:read, les écritures exigent ressource:write. Une clé limitée au stock ne peut jamais lire vos commandes — vérifié requête par requête, même en cache.

orders:read · orders:writeproducts:read · products:writeshipments:read · shipments:writecustomers:read · customers:writesuppliers:read · suppliers:writewarehouses:read · warehouses:writeinventory:read · inventory:writeinvoices:read · invoices:writequotes:read · quotes:writereturns:read · returns:writeintegrations:read · integrations:write

Secret affiché une seule fois

La clé complète n'apparaît qu'à la création. Ensuite, seul un aperçu (sk_live_••••1234) est visible — le secret est haché, personne ne peut le relire, pas même nous.

Révocation en moins de 10 s

Révoquez une clé depuis l'application : elle cesse de fonctionner en 10 secondes maximum, partout. Utile si une clé fuite dans un dépôt ou un log.

Allowlist IP & expiration

Optionnel : restreignez une clé à vos adresses IP serveur (CIDR) et donnez-lui une date d'expiration. Une clé de test qui traîne ne devient pas une porte d'entrée.

Référence

Endpoints principaux

Base : https://api.shipandcheap.com · Auth : Authorization: Bearer sk_live_…

EndpointPortéeRôle
GET /productsproducts:readLister le catalogue (paginé par nextKey)
POST /products/importproducts:writeImporter / mettre à jour en masse (200 max/appel, idempotent par SKU)
PUT /products/{sku}products:writeMettre à jour un produit (champs partiels acceptés)
GET /ordersorders:readLister les commandes du compte
POST /ordersorders:writeCréer une commande (votre site → SACP, expédition prise en charge)
GET /shipmentsshipments:readSuivre les expéditions et leur tracking
GET /returnsreturns:readLister les retours (RMA)

Codes d'erreur : 401 clé absente ou invalide · 403 portée insuffisante ou clé révoquée · 400 corps invalide (le message précise le champ) · 429 limite de débit atteinte.

Événements

Votre site, notifié en temps réel

Abonnez vos endpoints aux événements de la chaîne. À chaque étape — commande, expédition, retour — votre système reçoit un webhook signé.

  • Couplage faible : votre site reste maître, ShipAndCheap pousse les mises à jour.
  • Reprise sur erreur : retries avec backoff, journal de livraison, rejeu manuel.
order.createdorder.shippedorder.deliveredorder.cancelledshipment.createdshipment.in_transitshipment.deliveredshipment.exceptionreturn.createdreturn.received

Branchez votre stack en quelques minutes

Créez une clé, abonnez vos webhooks, envoyez votre première commande.