L’API Transport vous permet de créer, tarifer et suivre des missions de transport de véhicules par programmation, et de recevoir les événements de chaque mission en temps réel via des webhooks signés. Ce guide vous fait passer de zéro à une mission suivie en quatre étapes : obtenir une clé, estimer un prix, créer une mission, puis la suivre.
Base URL : https://api.myexpressdriver.com/v1Toutes les requêtes exigent l’en-tête X-Api-Key. Les réponses de succès sont en application/json ; les erreurs suivent la RFC 9457 (application/problem+json).

Avant de commencer

Un compte client MED

Flotte, concession ou loueur. Votre clé API est rattachée à votre groupe : elle ne voit que les missions de ce groupe.

Un accès admin de groupe

Seul l’administrateur du groupe peut créer ou révoquer des clés API depuis la console.

Démarrage en 4 étapes

1

Obtenir une clé API

Les clés API se créent depuis la console client, onglet API & Intégrations. Cet onglet n’est visible que si vous êtes administrateur d’au moins un groupe.
  1. Connectez-vous à votre console client.
  2. Ouvrez l’onglet API & Intégrations (si plusieurs groupes, sélectionnez celui pour lequel vous voulez une clé).
  3. Cliquez sur Créer une clé, donnez-lui un libellé (ex. intégration ERP) et choisissez l’environnement (live ou test).
  4. Copiez la clé affichée et stockez-la dans un coffre de secrets.
La clé en clair n’est affichée qu’une seule fois, au moment de sa création. Elle n’est jamais ré-affichée ensuite. Si vous la perdez, révoquez-la et créez-en une nouvelle.
Les clés de production commencent par med_live_, les clés de test par med_test_. Chaque requête doit porter l’en-tête :
X-Api-Key: med_live_a1b2c3d4e5f6...
Exportez votre clé et la base URL dans des variables d’environnement pour les exemples ci-dessous :
export BASE="https://api.myexpressdriver.com/v1"
export MED_API_KEY="med_live_xxxxxxxxxxxxxxxxxxxx"
2

Estimer un prix

POST /pricing calcule un tarif à partir de la grille de votre groupe, sans créer de mission. Idéal pour afficher un devis avant de confirmer.
curl -s -X POST "$BASE/pricing" \
  -H "X-Api-Key: $MED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "pickup":   { "address": "10 Rue de Rivoli, 75004 Paris" },
    "delivery": { "address": "1 Place Bellecour, 69002 Lyon" },
    "vehicle":  { "type": "VP", "electric": false },
    "plateau":  false,
    "options":  []
  }'
Réponse 200 — l’estimation tarifaire de votre groupe :
{
  "price_ht": 180.5,
  "currency": "EUR",
  "distance_km": 465,
  "return_trip": null
}
price_ht
number
Prix HT du transport facturé au client.
currency
string
Devise des montants — toujours EUR.
distance_km
number
Distance estimée en kilomètres.
return_trip
object | null
Détail du trajet retour si demandé (price_ht, distance_km), sinon null.
3

Créer une mission

POST /transports crée la mission. Les champs pickup, delivery et billing sont requis. Ajoutez l’en-tête Idempotency-Key (un UUID que vous générez) pour rendre la création rejouable sans risque de doublon.
IDEM=$(uuidgen)

curl -s -X POST "$BASE/transports" \
  -H "X-Api-Key: $MED_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEM" \
  -d '{
    "vehicle": {
      "type": "VP",
      "registration": "AB-123-CD",
      "brand": "Renault",
      "model": "Clio"
    },
    "pickup": {
      "address": "10 Rue de Rivoli, 75004 Paris",
      "date": "2026-07-01",
      "start_time": "08:00",
      "end_time": "12:00",
      "contact": { "name": "Jean Dupont", "phone": "+33600000000" }
    },
    "delivery": {
      "address": "1 Place Bellecour, 69002 Lyon",
      "date": "2026-07-01",
      "start_time": "14:00",
      "end_time": "18:00",
      "contact": { "name": "Marie Martin", "phone": "+33611111111" }
    },
    "billing": {
      "company_name": "Garage Demo SARL",
      "email": "compta@garage-demo.fr",
      "address": "5 Avenue des Champs, 75008 Paris",
      "siret": "12345678901234"
    },
    "options": [],
    "plateau": false
  }'
Réponse 201 — la mission est créée et planifiée :
{
  "id": "-O9xAbCdEf",
  "transport_id": "M-54321",
  "status": "scheduled",
  "price": { "amount_ht": 180.5, "currency": "EUR" }
}
id
string
Identifiant de la mission (offer_id). À conserver : il sert à toutes les requêtes de suivi.
transport_id
string
Référence métier lisible de la mission (ex. M-54321).
status
string
Statut public à la création : toujours scheduled (planifiée, en attente d’attribution).
price
object
Prix retenu : amount_ht (montant HT facturé) et currency (par défaut EUR).
Rejouer la même Idempotency-Key avec un corps identique renvoie la réponse mise en cache (en-tête Idempotent-Replayed: true) — une seule mission est créée. La même clé avec un corps différent renvoie 409 Conflict.
4

Suivre la mission

Deux moyens complémentaires de suivre une mission : interroger son détail à la demande, et s’abonner aux webhooks pour être notifié à chaque changement.Lire le détail à la demande avec GET /transports/{id} :
TID="-O9xAbCdEf"

# Détail complet
curl -s -H "X-Api-Key: $MED_API_KEY" "$BASE/transports/$TID"

# Statut public seul
curl -s -H "X-Api-Key: $MED_API_KEY" "$BASE/transports/$TID" \
  | grep -o '"status":"[^"]*"'
Le status évolue selon le cycle de vie public :
StatutSens
scheduledMission planifiée, en attente d’attribution.
assignedConvoyeur attribué, pas encore enlevée.
in_transitVéhicule enlevé, en route.
in_transit_returnRetour en cours (aller-retour).
awaiting_documentsEn attente des PV / documents.
under_reviewDocuments en validation.
completedMission terminée.
incidentAnomalie signalée.
cancelledMission annulée.
S’abonner aux webhooks depuis l’onglet API & Intégrations : ajoutez un endpoint HTTPS et recevez un événement à chaque transition. Le corps a la forme { id, type, created_at, data } :
{
  "id": "8f2c1a9e-0b6d-4f2a-9c1e-2a3b4c5d6e7f",
  "type": "transport.status_changed",
  "created_at": "2026-07-01T10:32:00Z",
  "data": { "id": "-O9xAbCdEf", "from": "scheduled", "to": "assigned" }
}
Vérifiez toujours la signature X-MED-Signature (HMAC-SHA256) de chaque webhook avant de traiter son contenu, et dédupliquez sur X-MED-Delivery-Id. La procédure complète est détaillée dans le guide Webhooks.
Les webhooks sont livrés en at-least-once. Pour rattraper un événement manqué (endpoint indisponible), rejouez le journal avec GET /events?since=<ISO8601>.

Bien démarrer

Vous avez créé une clé, estimé un prix, créé une mission et lu son statut. Voici les réflexes à adopter pour une intégration robuste.
Stockez la clé dans un coffre de secrets, jamais en clair dans le code ni dans un dépôt. Une clé manquante, inconnue, révoquée ou expirée renvoie 401. En cas de fuite, révoquez-la depuis la console et créez-en une nouvelle.
Branchez votre logique sur le champ status (et title) de la réponse application/problem+json, pas sur le texte de detail qui peut évoluer. Les erreurs de validation détaillent le champ fautif dans errors[].
Un dépassement renvoie 429 Too Many Requests avec un en-tête Retry-After (en secondes). Implémentez un back-off et respectez ce délai.
Ajoutez une Idempotency-Key unique sur toutes les créations et mutations (POST, PATCH, DELETE). C’est indispensable sur un réseau peu fiable pour éviter les doublons.

Étapes suivantes

Authentification

Clés live / test, scopes transports:read / transports:write et isolation par groupe.

Webhooks

Vérifier la signature HMAC, dédupliquer les livraisons et réconcilier les événements manqués.

Référence API

Tous les endpoints, schémas et codes de réponse en détail.