1. Extensions
  2. API

API pour relier votre logiciel à PieceMotoOccasion

Vous avez un logiciel de gestion de casse, un ERP ou un outil maison ? L'API relie n'importe quel programme à la marketplace : votre catalogue et vos stocks montent, les commandes payées redescendent, vous renseignez l'expédition. C'est la même API que parlent les extensions PrestaShop et WooCommerce.

Authentification

Un jeton, généré dans votre espace vendeur, envoyé dans l'en-tête Authorization: Bearer <jeton>. Réponses en JSON. 600 requêtes par jeton et par dix minutes ; au-delà, 429.

Points d'entrée

MéthodeCheminCe qu'il fait
GET/api/v1/moiCompte, statut, commission, boutique reliée
GET/api/v1/produitsVos pièces chez PieceMotoOccasion
PUT/api/v1/produitsCréation ou mise à jour par référence : {"produits": [ … ]}, 200 fiches par appel
PATCH/api/v1/produits/<reference>/stockLe stock d'une pièce : {"stock": 3}
DELETE/api/v1/produits/<reference>Retire de la vente, stock à zéro, sans effacer
GET/api/v1/commandes?depuis=AAAA-MM-JJCommandes payées, lignes et adresse de livraison
POST/api/v1/commandes/<id>/expedierTransporteur et suivi : {"transporteur": "Colissimo", "suivi": "6A…"}

La fiche d'une pièce

Une pièce nouvelle arrive en brouillon et passe en ligne après vérification. Une mise à jour ne change jamais le statut, ni les photos déjà en place.

ChampTypeRequisDétail
referencetexte, 80ouiVotre identifiant, unique chez vous. C'est la clé : un second envoi avec la même référence met la pièce à jour.
titretexte, 62ouiSert aussi de titre de page.
prix_ttcdécimalouiEn euros, supérieur à zéro. Le prix hors taxes est calculé à 20 %.
categorietexte, 60ouiTexte libre : Carénage, Selle, Jante, Carter…
stockentiernon1 par défaut. Zéro affiche la pièce en « Vendu » et la sort des flux.
descriptiontexte, 160nonMéta description de la page. Le titre est repris si vous ne la donnez pas.
informationtexte, 2160nonLe texte de la fiche.
marquetexte, 80nonYamaha, Honda…
modeletexte, 120nonXJ 600 Diversion…
annee_min, annee_maxentiersnonLes deux ensemble produisent la liste des années de production.
cylindreeentiernonEn centimètres cubes.
poidsentiernonEn grammes. Sert au calcul des frais de port.
etat_achatOccasion ou NeufnonOccasion par défaut.
reference_oemtexte, 40nonRéférence constructeur.
url_boutiquetexte, 250nonLa fiche chez vous.
imagesliste, 6 maxnonAdresses http publiques, 8 Mo par image. Converties en WebP et AVIF, redimensionnées, filigranées.

Les textes trop longs sont coupés, ils ne provoquent pas d'erreur. Un champ facultatif absent lors d'une mise à jour laisse la valeur existante.

curl -X PUT https://piecemotooccasion.eu/api/v1/produits \   -H "Authorization: Bearer VOTRE_JETON" -H "Content-Type: application/json" \   -d '{"produits": [{"reference": "CAR-548", "titre": "Carter embrayage XJ 600 Diversion", "prix_ttc": 29.90,         "categorie": "Carter", "marque": "Yamaha", "modele": "XJ 600 Diversion", "annee_min": 1998, "annee_max": 2003,         "stock": 1, "images": ["https://ma-casse.fr/photos/car-548.jpg"]}]}'

La réponse

Chaque fiche acceptée revient avec son identifiant, son statut et son adresse ; les fiches refusées sont listées à part, l'appel n'échoue pas pour autant. Le code est 200 dès qu'une fiche passe, 400 si aucune ne passe.

{"produits": [{"reference": "CAR-548", "id": 1287, "titre": "Carter embrayage XJ 600 Diversion",                "prix_ttc": "29.90", "stock": 1, "categorie": "Carter", "marque": "Yamaha",                "modele": "XJ 600 Diversion", "statut": "brouillon", "en_ligne": false,                "url": "https://piecemotooccasion.eu/piece/carter-embrayage-xj-600-diversion",                "image": "", "cree": true}],  "erreurs": [{"reference": "SEL-12", "erreur": "categorie est obligatoire (ex : Carenage, Selle, Jante)"}]}

Codes et erreurs

Toute erreur revient en JSON sous la forme {"erreur": "…"}.

CodeQuandQue faire
200Appel accepté, même si certaines fiches sont refuséesLire erreurs
400JSON invalide, aucune fiche valide, date mal forméeCorriger l'appel, ne pas réessayer tel quel
401Jeton absent, mal formé ou révoquéRegénérer le jeton dans l'espace vendeur
404Référence ou commande inconnue chez vousVérifier la référence : elle n'est cherchée que dans votre catalogue
405Méthode non autorisée sur ce cheminVoir le tableau des points d'entrée
429Plus de 600 requêtes en dix minutesAttendre, puis grouper : 200 fiches par appel PUT

Limites

Notification des commandes

Renseignez une URL de notification dans votre espace vendeur : chaque commande payée y est envoyée en POST JSON, signée par l'en-tête X-Pmo-Signature: sha256=<HMAC-SHA256 du corps avec votre jeton>.

Vérifiez la signature sur le corps brut, avant de lire le contenu : re-sérialiser le JSON change les octets, donc la signature. Comparez en temps constant. Répondez 200 dès réception et traitez ensuite, sans attendre la fin de votre traitement.

attendu = "sha256=" + hmac_sha256(corps_brut, votre_jeton) si attendu != entete X-Pmo-Signature : refuser (403)

Le corps porte evenement, valant commande.payee, et commande : identifiant, lignes avec référence et quantité, adresse de livraison, point relais éventuel, frais de port et total. Le courriel de notification part de toute façon, avec ou sans URL.

{"evenement": "commande.payee",  "commande": {"id": 1043, "statut": "PAYEE", "date": "2026-09-13 10:12:00+00:00",    "livraison": {"nom": "Camille Durand", "adresse": "12 rue des Lilas", "code_postal": "72300",                  "ville": "Sablé-sur-Sarthe", "pays": "France", "telephone": "0600000000",                  "email": "camille@example.com", "mode": "colissimo48", "relais": null},    "lignes": [{"reference": "CAR-548", "produit_id": 1287, "titre": "Carter embrayage XJ 600 Diversion",                "quantite": 1, "prix_ttc": "29.90", "total_ttc": "29.90",                "marque": "Yamaha", "modele": "XJ 600 Diversion"}],    "frais_port": "8.90", "total_ttc": "38.80"}}

Le même contenu est lisible à tout moment par GET /commandes : si votre serveur était hors ligne, rien n'est perdu.

Mettre en place en quatre étapes

  1. Générez le jeton dans votre espace vendeur, page « Ma boutique en ligne », et appelez GET /moi pour le vérifier.
  2. Envoyez votre catalogue par lots de 200 en PUT /produits, et corrigez les fiches listées dans erreurs.
  3. À chaque changement de stock chez vous, appelez PATCH /produits/<reference>/stock. Prévoyez aussi un envoi complet quotidien : il rattrape ce que vos évènements ont manqué.
  4. Recevez les commandes par webhook ou par GET /commandes?depuis=…, expédiez, puis déclarez le suivi par POST /commandes/<id>/expedier. L'acheteur est prévenu.

Pas encore vendeur ? Inscrivez-vous comme vendeur : gratuit, sans abonnement, une commission sur les ventes seulement. Les extensions prêtes à l'emploi : PrestaShop · WooCommerce · WordPress · Shopify · Odoo · Dolibarr · import de fichier · toutes les extensions.

Code source

Le client Python, la description OpenAPI, la collection Postman et un exemple de réception du webhook : dépôt pmo-marketplace-api sur GitHub.