POST HTTPS signé dès qu’un
événement se produit.
Cette page liste tous les types d’événements émis par l’API, leur déclencheur et un
exemple complet de payload. Pour configurer un endpoint et valider l’authenticité d’une
livraison, voir la page Vérification de signature.
{ id, type, created_at, data }.
Seul le contenu de data change selon le type. Branchez votre routage sur le champ
type (ou l’en-tête X-MED-Event-Type), jamais sur la structure de data.L’enveloppe d’événement
Chaque livraison transporte une enveloppe identique. C’est le contrat stable sur lequel construire votre traitement.X-MED-Delivery-Id.transport.created). Voir le catalogue ci-dessous.date-time).En-têtes de livraison
ChaquePOST sortant vers votre endpoint porte quatre en-têtes X-MED-*.
transport.created). Pratique pour router sans
désérialiser le corps.sha256=<hex>, calculée sur
"{X-MED-Timestamp}.{rawBody}" avec votre signing secret. Voir
Vérification de signature.Vue d’ensemble du catalogue
Cycle de vie de la mission
transport.created, transport.status_changed, transport.assigned,
transport.collected, transport.completed, transport.cancelled,
transport.incident, transport.duplicatedModifications
transport.dates_updated, transport.price_adjustedDocuments / PV
document.added, document.accepted, document.rejectedDiagnostic
webhook.test*) ou à une liste explicite de
types. Le tableau ci-dessous résume chaque type ; les sections suivantes détaillent le
payload.
inspection.report_ready,
inspection.completed, phases…) sont décrits sur leur propre page :
Webhooks — Inspection / PV.Événements de cycle de vie
Ces événements suivent la progression d’une mission. La transition typique est :incident peut survenir à tout moment ; cancelled, tant que le véhicule n’est pas
parti (scheduled, ou assigned une fois l’attribution du convoyeur confirmée).
transport.created — Mission créée
transport.created — Mission créée
POST /transports. La mission est
alors au statut public scheduled.priceest le prix HT de l’aller, en chaîne décimale (ex."407.44") — convertissez-le en nombre ;transport_idvautnull: la référence métier (M-xxxxx) est attribuée juste après la création. Lisez-la viaGET /transports/{id}.
Idempotency-Key après un timeout) n’émet pas de second
transport.created pour la même mission.Quand la mission est née d’une duplication, data.duplicated_from référence la
source : { "id": "-O9xSourceKey", "transport_id": "M-54300" }. Dans ce cas,
price est un objet { "amount_ht": 412 } (prix HT de l’aller, en nombre)
et non une chaîne : testez le type de price avant de le lire.transport.duplicated — Mission dupliquée
transport.duplicated — Mission dupliquée
POST /transports/{id}/duplicate. Une source ne se duplique qu’une fois : cet
événement n’est donc émis qu’une seule fois par mission. La mission créée émet,
elle, un transport.created classique portant duplicated_from.transport.status_changed — Changement de statut
transport.status_changed — Changement de statut
from et to utilisent le
vocabulaire public stable (jamais les statuts internes).scheduled, assigned, in_transit, in_transit_return,
awaiting_documents, under_review, completed, incident, cancelled.transport.assigned — Convoyeur attribué
transport.assigned — Convoyeur attribué
transport.collected — Véhicule enlevé
transport.collected — Véhicule enlevé
in_transit).transport.completed — Mission terminée
transport.completed — Mission terminée
completed).transport.cancelled — Mission annulée
transport.cancelled — Mission annulée
POST /transports/{id}/cancel, votre espace client ou
les équipes MED. La mission reste lisible au statut public cancelled ; un
transport.status_changed vers cancelled l’accompagne, et une annulation
n’émet jamais transport.completed.La charge se limite à { id, transport_id, cancelled_at }. Elle ne contient ni
le motif ni les frais d’annulation. Les frais figurent dans la réponse 200 de
POST /transports/{id}/cancel (penalty, return_included) — conservez-la ;
l’état de la mission se lit via GET /transports/{id}. Le motif n’est renvoyé
nulle part : gardez-le de votre côté.transport.incident — Anomalie signalée
transport.incident — Anomalie signalée
incident).Événements de modification
transport.dates_updated — Dates modifiées
transport.dates_updated — Dates modifiées
PATCH /transports/{id}/dates). Le champ updated_legs liste uniquement les jambes
réellement modifiées.updated_legs : enlevement-aller, livraison-aller,
enlevement-retour, livraison-retour.transport.price_adjusted — Refacturation ou option
transport.price_adjusted — Refacturation ou option
POST /transports/{id}/price-adjustments) ou un
ajout/retrait d’option (POST/DELETE /transports/{id}/options/...). Le contenu
de data dépend de l’origine de l’ajustement — seul le prix HT facturé au client
est exposé, jamais la rémunération convoyeur.Refacturation d’une jambe :Événements de documents
Ces événements suivent le cycle de vie des documents et PV de la mission. Le champdocument_key identifie le document concerné.
document.added — Document ajouté
document.added — Document ajouté
POST /transports/{id}/documents ou en interne).document.accepted — Document accepté
document.accepted — Document accepté
accepted.document.rejected — Document refusé
document.rejected — Document refusé
refused.waiting, accepted ou refused.Événement de diagnostic
webhook.test — Test de configuration
webhook.test — Test de configuration
2xx correctement. Le contenu de data est libre et ne reflète aucune mission
réelle.Souscription et réconciliation
Choisir les types à recevoir
* (tous les événements) ou à une
liste explicite de types (ex. transport.created, transport.completed).Vérifier chaque livraison
X-MED-Signature et l’horodatage X-MED-Timestamp avant de
traiter le corps. Voir Vérification de signature.Dédupliquer et acquitter
X-MED-Delivery-Id, puis répondez 2xx rapidement. Effectuez le
traitement lourd en asynchrone.Combler les trous
GET /events?since=<ISO8601> et inspectez l’état des livraisons avec
GET /webhooks/deliveries?status=failed.Étapes suivantes
Vérification de signature
Réconciliation des événements
GET /events.