Routing API for bikes, scooters, motorcycles and wheelchairs
The routing engine of the « On va où ? » navigation and safety app, for your own products. One request returns up to three variants, safe, balanced and fast, billed as a single request, with what makes a two-wheel route good or bad: cycle lanes, surfaces, main roads, elevation.
Why this API
- Three variants, one request.
safefavours cycle lanes and quiet streets (for motorcycles, it avoids motorways),fastminimises travel time,balancedsits in between. - Route quality indicators in every response: cycleway share, unpaved share, main-road share, motorway share, ascent and descent.
- A profile per vehicle: bike, e-bike, kick scooter, motorcycle (toll and motorway avoidance), wheelchair (slope, surface and kerb aware), walking.
- Ready to display: GeoJSON or encoded polyline, elevation profile, turn-by-turn steps in 7 languages.
- Self-service: account, keys, usage and subscription at console.onvaou.app. Free plan without a credit card.
- All of Europe on every plan, free plan included. EU-hosted, OpenStreetMap data.
Quick start
Create an account and a key at console.onvaou.app, then send the key in the x-api-key header. Call the API from your server, never from a web page or a mobile app.
curl -X POST https://n3di1oyh9d.execute-api.eu-west-1.amazonaws.com/v1/routes \
-H "x-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"origin":[2.3522,48.8566],"destination":[2.4392,48.8474],"mode":"bike"}'
Request: POST /v1/routes
| Field | Type | Description |
|---|---|---|
origin, destination | [lon, lat] | Required, WGS 84. |
waypoints | [[lon, lat]] | Up to 8 intermediate points. |
mode | string | bike (default), ebike, scooter (kick scooter), moto (motorcycle), wheelchair, foot. |
variants | string[] | Any of safe, balanced, fast. Default: all three. |
avoid | string[] | ferries, steps; tolls, highways (motorcycle); unpaved, steep (wheelchair). |
elevation | boolean | Elevation profile, default true. |
instructions | boolean | Turn-by-turn steps, default true. |
language | string | fr (default), en, de, es, it, nl, pt. |
geometry | string | geojson (default) or polyline (Google algorithm, precision 5). |
Response
{
"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": "Head east", "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"
}
When the engine finds a single sensible route, it is returned once with all the requested labels. Variants are never invented. Display the attribution next to the route you show.
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_*, too_long | Invalid request (message explains the field). |
| 401 | invalid_key | Missing, unknown or revoked key. |
| 422 | no_route, out_of_coverage | No route between these points for this vehicle, or a point outside Europe. |
| 429 | quota_exceeded | Free plan quota reached for the month. |
| 503 | engine_capacity, engine_unavailable | Temporary, retry later. |
Pricing
Monthly subscription, no commitment, prices in euros excluding VAT. Every plan includes every feature; only volume, rate and commercial use change. One request = one route calculation returning up to three variants.
| Plan | Price / month | Requests / month | Rate | Overage / 1,000 |
|---|---|---|---|---|
| Découverte | 0 € | 10,000 | 1 req/s | blocked (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 € |
| Custom | quote | above 750,000 | dedicated | coverage outside Europe, SLA |
Subscribe and manage your plan at console.onvaou.app. Card payment by Stripe.
FAQ
Is there a free plan?
Yes: 10,000 requests per month for development and non-commercial use, without a credit card.
Can I use it in a commercial app?
Yes, from the Solo plan (19 € per month). Show the attribution next to the displayed route (OpenStreetMap data).
Which area is covered?
All of Europe, on every plan. For other regions, contact us (Custom plan). Points outside the coverage return 422 out_of_coverage.
Which vehicles are supported?
Bike, e-bike, kick scooter, motorcycle, wheelchair and walking, each with its own profile.
How is the safe variant chosen?
For bikes and scooters, it is the route with the highest share of cycle lanes and the fewest main roads among the alternatives. For motorcycles, it is computed avoiding motorways.
