- Extensions
- 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éthode | Chemin | Ce qu'il fait |
|---|---|---|
GET | /api/v1/moi | Compte, statut, commission, boutique reliée |
GET | /api/v1/produits | Vos pièces chez PieceMotoOccasion |
PUT | /api/v1/produits | Création ou mise à jour par référence : {"produits": [ … ]}, 200 fiches par appel |
PATCH | /api/v1/produits/<reference>/stock | Le 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-JJ | Commandes payées, lignes et adresse de livraison |
POST | /api/v1/commandes/<id>/expedier | Transporteur 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.
| Champ | Type | Requis | Détail |
|---|---|---|---|
reference | texte, 80 | oui | Votre identifiant, unique chez vous. C'est la clé : un second envoi avec la même référence met la pièce à jour. |
titre | texte, 62 | oui | Sert aussi de titre de page. |
prix_ttc | décimal | oui | En euros, supérieur à zéro. Le prix hors taxes est calculé à 20 %. |
categorie | texte, 60 | oui | Texte libre : Carénage, Selle, Jante, Carter… |
stock | entier | non | 1 par défaut. Zéro affiche la pièce en « Vendu » et la sort des flux. |
description | texte, 160 | non | Méta description de la page. Le titre est repris si vous ne la donnez pas. |
information | texte, 2160 | non | Le texte de la fiche. |
marque | texte, 80 | non | Yamaha, Honda… |
modele | texte, 120 | non | XJ 600 Diversion… |
annee_min, annee_max | entiers | non | Les deux ensemble produisent la liste des années de production. |
cylindree | entier | non | En centimètres cubes. |
poids | entier | non | En grammes. Sert au calcul des frais de port. |
etat_achat | Occasion ou Neuf | non | Occasion par défaut. |
reference_oem | texte, 40 | non | Référence constructeur. |
url_boutique | texte, 250 | non | La fiche chez vous. |
images | liste, 6 max | non | Adresses 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": "…"}.
| Code | Quand | Que faire |
|---|---|---|
200 | Appel accepté, même si certaines fiches sont refusées | Lire erreurs |
400 | JSON invalide, aucune fiche valide, date mal formée | Corriger l'appel, ne pas réessayer tel quel |
401 | Jeton absent, mal formé ou révoqué | Regénérer le jeton dans l'espace vendeur |
404 | Référence ou commande inconnue chez vous | Vérifier la référence : elle n'est cherchée que dans votre catalogue |
405 | Méthode non autorisée sur ce chemin | Voir le tableau des points d'entrée |
429 | Plus de 600 requêtes en dix minutes | Attendre, puis grouper : 200 fiches par appel PUT |
Limites
- 600 requêtes par jeton et par tranche de dix minutes, tous chemins confondus.
- 200 fiches par appel
PUT /produits. Un catalogue de mille pièces tient en cinq appels. GET /commandesrend les 500 dernières commandes payées, de la plus récente à la plus ancienne. Utilisezdepuispour les synchronisations régulières.- Six images par pièce, 8 Mo chacune. Une adresse injoignable ou qui ne renvoie pas une image est ignorée, la pièce est créée sans elle.
- Un seul jeton par vendeur. En regénérer un coupe immédiatement l'ancien.
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
- Générez le jeton dans votre espace vendeur, page « Ma boutique en ligne », et appelez
GET /moipour le vérifier. - Envoyez votre catalogue par lots de 200 en
PUT /produits, et corrigez les fiches listées danserreurs. - À 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é. - Recevez les commandes par webhook ou par
GET /commandes?depuis=…, expédiez, puis déclarez le suivi parPOST /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.