Développeurs · API Itinéraires
L’API Itinéraires pour le vélo, la trottinette, la moto et le fauteuil roulant.
Le moteur d’itinéraire de l’application de navigation et de sécurité « On va où ? », pour vos propres produits. Une requête renvoie jusqu’à trois variantes, sécurisée, équilibrée et rapide, facturées comme une seule requête, avec ce qui fait qu’un itinéraire deux-roues est bon ou non : pistes cyclables, revêtements, grands axes, dénivelé.
Pourquoi cette API
- Trois variantes, une seule requête.
safeprivilégie les pistes cyclables et les rues calmes (à moto, elle évite les autoroutes),fastminimise la durée,balancedest entre les deux. - Des indicateurs de qualité dans chaque réponse : part de pistes cyclables, de revêtements non goudronnés, de grands axes et d’autoroutes, dénivelés positif et négatif.
- Un profil par véhicule : vélo, vélo électrique, trottinette, moto (évitement des péages et des autoroutes), fauteuil roulant (pentes, revêtements et bordures), marche.
- Prêt à afficher : GeoJSON ou polyligne encodée, profil d’altitude, guidage pas à pas en 7 langues.
- La recherche d’adresse est incluse :
POST /v1/geocodetransforme une adresse ou un nom de lieu en coordonnées, sans être décomptée du quota mensuel. - En libre-service : compte, clés, consommation et abonnement sur console.onvaou.app. Palier gratuit sans carte bancaire.
- Toute l’Europe dans chaque palier, gratuit compris. Hébergé dans l’Union européenne, données OpenStreetMap.
Démarrer
Créez un compte et une clé sur console.onvaou.app, puis envoyez la clé dans l’en-tête x-api-key. Appelez l’API depuis votre serveur, jamais depuis une page web ni une application mobile.
curl -X POST https://api.onvaou.app/v1/routes \
-H "x-api-key: VOTRE_CLÉ" \
-H "Content-Type: application/json" \
-d '{"origin":[2.3522,48.8566],"destination":[2.4392,48.8474],"mode":"bike"}'
Requête : POST /v1/routes
| Champ | Type | Description |
|---|---|---|
origin, destination | [lon, lat] | Obligatoires, WGS 84. |
waypoints | [[lon, lat]] | Jusqu’à 8 étapes intermédiaires. |
mode | texte | bike (par défaut), ebike, scooter (trottinette), moto, wheelchair (fauteuil roulant), foot (marche). |
variants | liste | Parmi safe, balanced, fast. Par défaut : les trois. |
avoid | liste | ferries, steps ; tolls, highways (moto) ; unpaved, steep (fauteuil). |
elevation | booléen | Profil d’altitude, true par défaut. |
instructions | booléen | Guidage pas à pas, true par défaut. |
language | texte | fr (par défaut), en, de, es, it, nl, pt. |
geometry | texte | geojson (par défaut) ou polyline (algorithme Google, précision 5). |
Réponse
{
"mode": "bike",
"routes": [
{
"variants": ["safe", "balanced", "fast"],
"distanceM": 7159,
"durationS": 1525,
"ascentM": 38,
"descentM": 41,
"indicators": { "cyclewayShare": 0.773, "unpavedShare": 0, "mainRoadShare": 0.036, "motorwayShare": 0 },
"geometry": { "type": "LineString", "coordinates": [[2.3522, 48.8566], "..."] },
"elevationProfile": [[0, 35], [95, 36], "..."],
"steps": [{ "instruction": "Dirigez-vous vers l’est", "name": "Quai de l'Hôtel de Ville", "distanceM": 120, "durationS": 28, "type": 11 }]
}
],
"usage": { "month": "2026-09", "requests": 1, "quota": 10000, "plan": "decouverte" },
"attribution": "© On va où ? · © openrouteservice by HeiGIT · © OpenStreetMap contributors"
}
Quand le moteur ne trouve qu’un itinéraire pertinent, il est renvoyé une seule fois avec toutes les étiquettes demandées : aucune variante n’est inventée. Affichez l’attribution près de l’itinéraire montré.
Recherche d’adresse : POST /v1/geocode
Une adresse, un nom de lieu, une gare ou un point d’intérêt deviennent des coordonnées, prêtes à partir en origin, destination ou étape de /v1/routes. Jusqu’à cinq candidats, du meilleur au moins bon ; quand rien ne correspond, la réponse est un 200 avec une liste results vide.
curl -X POST https://api.onvaou.app/v1/geocode \
-H "x-api-key: VOTRE_CLÉ" \
-H "Content-Type: application/json" \
-d '{"query":"10 rue de Rivoli, Paris","country":"FR","limit":3}'
| Champ | Type | Description |
|---|---|---|
query | texte | Obligatoire, de 2 à 200 caractères. |
near | {lon, lat} | Biais de proximité, sans restreindre la recherche. Le point doit être dans la couverture européenne, sinon 422 out_of_coverage. |
country | texte | Code pays ISO 3166-1 alpha-2 en majuscules (FR, BE, DE…). FR passe par la Géoplateforme de l’IGN. |
limit | entier | De 1 à 5, 5 par défaut. |
language | texte | en (par défaut), fr, de, it. Liste fermée : toute autre valeur est refusée (400 bad_language). it est accepté, mais Photon ne traduit pas en italien : les libellés reviennent alors dans la langue locale du lieu (« Milano », « München »). |
{
"query": "10 rue de Rivoli, Paris",
"source": "geoplateforme",
"results": [
{
"label": "10 Rue de Rivoli, 75004 Paris",
"lon": 2.35704, "lat": 48.85655,
"type": "address", "confidence": 0.96,
"country": "France", "countryCode": "FR",
"region": "Île-de-France", "locality": "Paris", "postalCode": "75004",
"street": "Rue de Rivoli", "houseNumber": "10"
}
],
"attribution": "© IGN Géoplateforme, Base Adresse Nationale (Licence Ouverte 2.0)",
"usage": { "dailyLimit": 500, "usedToday": 12, "countsTowardQuota": false }
}
Tout champ qu’une source ne donne pas vaut null : une commune n’a ni numéro ni code postal, la forme de la réponse ne change pas pour autant.
type vaut toujours l’une de ces sept valeurs, et d’aucune autre : address (un numéro de voirie), street (une voie), locality (commune, quartier), region, country, venue (un lieu nommé : gare, hôtel, monument) ou other. confidence va de 0 à 1 : c’est le score de la Géoplateforme, arrondi au millième, quand c’est elle qui répond, et une valeur calculée à partir du rang et de la précision du résultat pour Photon, qui n’en donne pas.
La recherche d’adresse n’est pas décomptée du quota mensuel, qui ne compte que les calculs d’itinéraire. Elle a son propre plafond, 500 recherches par compte et par jour (heure UTC), rappelé par les en-têtes X-Geocode-Limit et X-Geocode-Used et par le champ usage. Le débit par seconde du palier s’applique comme ailleurs, et une recherche identique à une autre des dernières 24 heures est servie depuis le cache (X-Cache: hit).
Les résultats viennent de Photon, sur les données OpenStreetMap, partout en Europe, et de la Géoplateforme de l’IGN (Base Adresse Nationale) en France. La Géoplateforme passe la main à Photon dans trois cas, et seulement ceux-là : elle est indisponible, elle ne rend aucun résultat, ou sa meilleure confidence est inférieure à 0.4 (ce qu’un nom de lieu comme « Tour Eiffel » obtient d’une base d’adresses). Photon ne prend la main que s’il trouve quelque chose : des candidats moyens valent mieux qu’une liste vide. Le champ source dit laquelle a répondu.
Erreurs
| Statut | Code | Signification |
|---|---|---|
| 400 | bad_*, too_long | Requête invalide (le message désigne le champ). Pour /v1/geocode : bad_query, bad_near, bad_country, bad_limit, bad_language. |
| 401 | invalid_key | Clé absente, inconnue ou révoquée. |
| 422 | no_route, out_of_coverage | Aucun itinéraire entre ces points pour ce véhicule, ou point hors d’Europe. |
| 429 | rate_limited | Débit du palier dépassé (requêtes par seconde, tout le compte) : réessayer après l’en-tête Retry-After. |
| 429 | quota_exceeded | Quota du palier gratuit atteint pour le mois. |
| 429 | geocode_daily_limit | Plafond de recherches d’adresse du jour atteint (500 par compte) : il se remet à zéro à minuit UTC. |
| 404 | not_found | Point d’accès inconnu : POST /v1/routes, POST /v1/geocode, GET /v1/status. |
| 503 | engine_capacity, engine_unavailable | Temporaire, réessayez plus tard. |
Attribution
Affichez le texte du champ attribution près de l’itinéraire ou des résultats montrés. C’est une condition d’utilisation de l’API, gratuite comme payante.
- Itinéraires :
© On va où ? · © openrouteservice by HeiGIT · © OpenStreetMap contributors - Recherche d’adresse, source
photon:© OpenStreetMap contributors (ODbL) · geocoding by Photon (komoot) - Recherche d’adresse, source
geoplateforme:© IGN Géoplateforme, Base Adresse Nationale (Licence Ouverte 2.0)
Guides
- Tutoriel : calculer un itinéraire vélo sécurisé avec une API
- API d’itinéraire vélo : le comparatif 2026
Exemples de code
curl, JavaScript, Python, une carte MapLibre et une collection Postman, testés sur l’API en service : github.com/onvaou-app/routing-api-examples (licence MIT).
Serveur MCP (assistants d’IA)
Claude, ChatGPT ou tout client MCP cherche une adresse et calcule directement vos itinéraires : app.onvaou/itineraires dans le registre MCP officiel, paquet npm onvaou-itineraires-mcp, deux outils en lecture seule, compute_route et geocode_address.
geocode_address trouve une adresse, compute_route calcule l’itinéraire et ses trois variantes : l’assistant lit, il ne modifie rien. Chaque calcul compte comme une requête de votre palier, palier gratuit compris ; les recherches d’adresse ne sont pas décomptées. Itinéraires vélo, trottinette, moto, fauteuil roulant et à pied, partout en Europe.
{
"mcpServers": {
"onvaou-itineraires": {
"command": "npx",
"args": ["-y", "onvaou-itineraires-mcp"],
"env": { "OVO_API_KEY": "VOTRE_CLÉ" }
}
}
}
Tarifs
Abonnement mensuel sans engagement, prix en euros hors taxes. Toutes les fonctions sont incluses dans chaque palier : seuls le volume, le débit et l’usage commercial changent. Une requête = un calcul d’itinéraire, jusqu’à trois variantes renvoyées.
| Palier | Prix / mois | Requêtes / mois | Débit | Dépassement / 1 000 |
|---|---|---|---|---|
| Découverte | 0 € | 10 000 | 1 req/s | bloqué (non commercial) |
| Solo | 19 € | 20 000 | 2 req/s | 1,00 € |
| Starter | 59 € | 75 000 | 3 req/s | 0,90 € |
| Pro | 169 € | 225 000 | 10 req/s | 0,80 € |
| Business | 449 € | 750 000 | 25 req/s | 0,65 € |
| Sur mesure | devis | au-delà de 750 000 | dédié | couverture hors d’Europe, engagement de service |
Souscription et gestion du palier sur console.onvaou.app. Paiement par carte avec Stripe.
Questions
Y a-t-il un palier gratuit ?
Oui : 10 000 requêtes par mois pour développer et pour un usage non commercial, sans carte bancaire.
Puis-je l’utiliser dans une application commerciale ?
Oui, à partir du palier Solo (19 € par mois). Affichez l’attribution près de l’itinéraire montré (données OpenStreetMap).
Quelle zone est couverte ?
Toute l’Europe, dans chaque palier. Pour d’autres régions, contactez-nous (palier Sur mesure). Un point hors couverture renvoie 422 out_of_coverage.
Quels véhicules ?
Vélo, vélo électrique, trottinette, moto, fauteuil roulant et marche, chacun avec son profil.
Comment la variante sécurisée est-elle choisie ?
À vélo et à trottinette, c’est l’itinéraire qui a la plus forte part de pistes cyclables et le moins de grands axes parmi les alternatives. À moto, elle est calculée en évitant les autoroutes.