Documentation API OptiRoad
Introduction
L'API OptiRoad vous permet d'optimiser des tournées, de géocoder des adresses et de gérer vos contacts par programme. L'accès nécessite un plan Business et une clé API.
URL de base :
https://optiroad.io/api/v1Toutes les requêtes doivent inclure l'en-tête Authorization . Les réponses sont en JSON. Les dates sont au format ISO 8601. Les distances sont en kilomètres, les durées en minutes.
Authentification
Authentifiez-vous avec votre clé API dans l'en-tête Authorization :
curl https://optiroad.io/api/v1/usage \
-H "Authorization: Bearer or_live_YOUR_KEY"Les clés API sont créées dans Paramètres → Clés API. Chaque clé est affichée une seule fois à la création. Maximum 5 clés par compte.
Exemple JavaScript
const BASE = "https://optiroad.io/api/v1";
const KEY = process.env.OPTIROAD_API_KEY;
const res = await fetch(`${BASE}/usage`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const data = await res.json();Exemple Python
import os, requests
BASE = "https://optiroad.io/api/v1"
KEY = os.environ["OPTIROAD_API_KEY"]
resp = requests.get(
f"{BASE}/usage",
headers={"Authorization": f"Bearer {KEY}"}
)
data = resp.json()Optimiser un itinéraire
/api/v1/optimizeCalcule l'ordre de visite optimal pour un ensemble d'adresses.Corps de la requête
{
"addresses": [
{ "label": "Dépôt", "lat": 48.8566, "lng": 2.3522 },
{ "label": "Client A", "lat": 48.8737, "lng": 2.2950 },
{ "label": "Client B", "lat": 48.8416, "lng": 2.3224 }
],
"options": {
"mode": "driving",
"startAddress": 0,
"roundTrip": true
}
}Paramètres
| Champ | Type | Description |
|---|---|---|
| addresses | array | Obligatoire. Liste des étapes (min 2, max 150). Chaque élément : { label, lat, lng }. |
| options.mode | string | Profil de routage : driving (défaut), walking, cycling. |
| options.startAddress | number | Index de l'adresse de départ/dépôt dans le tableau (défaut : 0). |
| options.roundTrip | boolean | Retour au départ après la dernière étape (défaut : true). |
Réponse
{
"optimizedOrder": [0, 2, 1],
"totalDistanceKm": 12.4,
"totalDurationMin": 22,
"legs": [
{ "from": 0, "to": 2, "distanceKm": 5.1, "durationMin": 9 },
{ "from": 2, "to": 1, "distanceKm": 4.2, "durationMin": 8 },
{ "from": 1, "to": 0, "distanceKm": 3.1, "durationMin": 5 }
],
"googleMapsUrl": "https://www.google.com/maps/dir/...",
"usageRemaining": 487
}Géocoder une adresse
/api/v1/geocodeConvertit une adresse en texte libre en coordonnées lat/lng.// Request
{ "address": "10 Downing Street, London" }
// Response
{
"lat": 51.5034,
"lng": -0.1276,
"label": "10 Downing Street, Westminster, London, UK"
}Contacts
Gérez votre carnet d'adresses. Toutes les opérations sont limitées à votre compte.
/api/v1/contactsLister les contacts (paginé).GET /api/v1/contacts?page=1&limit=20&search=Paris{
"contacts": [
{
"id": "clx...",
"name": "Entrepôt Paris",
"address": "12 rue de Rivoli, 75001 Paris",
"lat": 48.856,
"lng": 2.352,
"phone": "+33 1 23 45 67 89",
"createdAt": "2026-03-01T10:00:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 20
}/api/v1/contactsCréer un contact.// Request
{
"name": "Entrepôt Paris",
"address": "12 rue de Rivoli, 75001 Paris",
"lat": 48.856,
"lng": 2.352,
"phone": "+33 1 23 45 67 89"
}
// Response — 201 Created
{ "id": "clx...", "name": "...", ... }/api/v1/contacts/:idMettre à jour un contact./api/v1/contacts/:idSupprimer un contact.// Response — 204 No ContentVéhicules
/api/v1/vehiclesLister les véhicules.GET /api/v1/vehicles?status=active&type=van{
"vehicles": [
{
"id": "clx...",
"name": "Camion 1",
"type": "truck",
"status": "active",
"depotAddress": "ZI Nord, 59000 Lille",
"depotLat": 50.651,
"depotLng": 3.074
}
]
}Historique des optimisations
/api/v1/historyLister les optimisations passées (paginé).GET /api/v1/history?page=1&limit=20&from=2026-01-01&to=2026-04-01{
"items": [
{
"id": "clx...",
"addressCount": 8,
"totalDistanceKm": 34.2,
"totalDurationMin": 61,
"createdAt": "2026-03-15T08:30:00.000Z"
}
],
"total": 42
}Utilisation de l'API
/api/v1/usageCompteurs de requêtes pour la clé courante.{
"keyPrefix": "or_live_ab12",
"today": { "optimize": 3, "geocode": 12 },
"thisMonth": { "optimize": 47, "geocode": 203 },
"allTime": { "optimize": 312, "geocode": 1024 }
}Limites de débit
Les limites s'appliquent par clé API. Les en-têtes de réponse indiquent toujours l'état de la fenêtre courante.
| Type d'endpoint | Par minute | Par heure | Par jour |
|---|---|---|---|
| Léger (geocode, contacts, vehicles) | 100 | 1 000 | — |
| Lourd (optimize) | 10 | 100 | 500 |
Quand une limite est atteinte, l'API retourne 429 Too Many Requests avec un en-tête Retry-After (secondes).
En-têtes de limite de débit
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1744012800 # Unix timestamp (UTC)
Retry-After: 38 # Présent uniquement en cas de 429Codes d'erreur
| HTTP | error | Signification |
|---|---|---|
| 401 | UNAUTHORIZED | En-tête Authorization manquant ou malformé. |
| 401 | INVALID_API_KEY | Clé introuvable ou révoquée. |
| 402 | QUOTA_EXCEEDED | Quota mensuel d'optimisations atteint. Passez à un plan supérieur. |
| 403 | PLAN_REQUIRED | Cet endpoint nécessite un plan Business. |
| 422 | VALIDATION_ERROR | Corps de la requête invalide (voir message pour les détails). |
| 422 | MAX_KEYS_REACHED | Vous avez déjà 5 clés API. Révoquez-en une d'abord. |
| 429 | RATE_LIMIT_EXCEEDED | Trop de requêtes. Vérifiez l'en-tête Retry-After. |
| 500 | INTERNAL_ERROR | Erreur serveur inattendue. Réessayez. |
Format de réponse d'erreur
{
"error": "QUOTA_EXCEEDED",
"message": "Monthly quota reached (5/5). Upgrade to Pro for unlimited optimizations.",
"statusCode": 402
}Des questions ? Contactez support@optiroad.io
OptiRoad API v1 · 2026