Routing, matrix, optimization, isochrones and map matching on OSRM, Valhalla and VROOM — from $10/month.
One request is one request. No credit formulas to work out before you know what a matrix costs.
✅ No credit card required 🇪🇺 Hosted in the EU
Get Free API Key| Plan | Price per month | Daily volume | Locations per request | Commercial use |
|---|---|---|---|---|
| GraphHopper Free | €0 | 500 credits | 5 | No |
| GraphHopper Basic | €69 | 5,000 credits | 30 | Yes |
| GraphHopper Standard | €199 | 15,000 credits | 80 | Yes |
| Simple Routing Free | $0 | 100 requests | 500 | Yes |
| Simple Routing Hobby | $10 | 10,000 requests | 500 | Yes |
| Simple Routing Scale | $100 | 200,000 requests | 500 | Yes |
GraphHopper figures as of October 9, 2026 from graphhopper.com/pricing (monthly billing, excluding VAT; "The Free Plan is for non-commercial use only"). Simple Routing's 500 is the maximum matrix size.
The daily numbers above aren't the same unit. GraphHopper meters in credits, and a request can cost more than one. Per its credit cost article (as of October 9, 2026): a route with up to 10 locations is 1 credit; a matrix is the smaller of origins × destinations ÷ 2 and max(origins, destinations) × 10; an isochrone is 2 credits per minute explored, with a minimum of 10.
1 request against your daily allowance.
500 credits by the formula above — the whole daily allowance of the free plan.
| Feature | GraphHopper Directions API | Simple Routing |
|---|---|---|
| Routing / directions | Yes | Yes — OSRM and Valhalla |
| Distance matrix | Yes | Yes — OSRM table, Valhalla sources-to-targets |
| Route optimization | Yes | Yes — VROOM |
| Isochrones | Yes | Yes — Valhalla |
| Map matching | Yes | Yes — OSRM match, Valhalla trace |
| Geocoding | Yes | Not yet (waitlist) |
| Uptime SLA | Yes, on paid plans | No |
GraphHopper column as of October 9, 2026, from graphhopper.com/pricing. These are different engines, so request and response formats differ — a feature being on both sides doesn't make it a drop-in swap.
If you call GraphHopper through routingpy, the library already normalizes the response, so switching provider is a change to the client and the profile name.
# Before from routingpy.routers import Graphhopper client = Graphhopper(api_key="GRAPHHOPPER_API_KEY") route = client.directions( locations=[[-73.9935, 40.7506], [-73.7781, 40.6413]], profile="car", ) # After from routingpy.routers import OSRM client = OSRM( base_url="https://api.simplerouting.io/osrm", headers={"Authorization": "Bearer YOUR_API_KEY"}, ) route = client.directions( locations=[[-73.9935, 40.7506], [-73.7781, 40.6413]], profile="driving", ) # Same either way print(route.duration, route.distance, route.geometry)
client.matrix(...) works the same way. Calling the HTTP API directly instead? The API docs have the request and response shapes for each engine.
# Get directions from Penn Station to JFK Airport
curl "https://api.simplerouting.io/osrm/route/v1/driving/-73.9935,40.7506;-73.7781,40.6413?overview=full" \
-H "Authorization: Bearer 988b35cc-6183-4922-bbc0-857e1a1d318d"
This is a live demo with a real API key (feel free to steal it).
No overages — your plan is your bill.
Hitting the limits, want more countries, or need a bespoke solution? Email [email protected] — we'll figure it out.
100 requests a day, free, no credit card required.
Get Free API Key