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

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

ChampTypeDescription
origin, destination[lon, lat]Obligatoires, WGS 84.
waypoints[[lon, lat]]Jusqu’à 8 étapes intermédiaires.
modetextebike (par défaut), ebike, scooter (trottinette), moto, wheelchair (fauteuil roulant), foot (marche).
variantslisteParmi safe, balanced, fast. Par défaut : les trois.
avoidlisteferries, steps ; tolls, highways (moto) ; unpaved, steep (fauteuil).
elevationbooléenProfil d’altitude, true par défaut.
instructionsbooléenGuidage pas à pas, true par défaut.
languagetextefr (par défaut), en, de, es, it, nl, pt.
geometrytextegeojson (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}'
ChampTypeDescription
querytexteObligatoire, 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.
countrytexteCode pays ISO 3166-1 alpha-2 en majuscules (FR, BE, DE…). FR passe par la Géoplateforme de l’IGN.
limitentierDe 1 à 5, 5 par défaut.
languagetexteen (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

StatutCodeSignification
400bad_*, too_longRequête invalide (le message désigne le champ). Pour /v1/geocode : bad_query, bad_near, bad_country, bad_limit, bad_language.
401invalid_keyClé absente, inconnue ou révoquée.
422no_route, out_of_coverageAucun itinéraire entre ces points pour ce véhicule, ou point hors d’Europe.
429rate_limitedDébit du palier dépassé (requêtes par seconde, tout le compte) : réessayer après l’en-tête Retry-After.
429quota_exceededQuota du palier gratuit atteint pour le mois.
429geocode_daily_limitPlafond de recherches d’adresse du jour atteint (500 par compte) : il se remet à zéro à minuit UTC.
404not_foundPoint d’accès inconnu : POST /v1/routes, POST /v1/geocode, GET /v1/status.
503engine_capacity, engine_unavailableTemporaire, 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.

Guides

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.

PalierPrix / moisRequêtes / moisDébitDépassement / 1 000
Découverte0 €10 0001 req/sbloqué (non commercial)
Solo19 €20 0002 req/s1,00 €
Starter59 €75 0003 req/s0,90 €
Pro169 €225 00010 req/s0,80 €
Business449 €750 00025 req/s0,65 €
Sur mesuredevisau-delà de 750 000dé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.

Liens