PreviewThis is a preview. The API is not open yet, the addresses in these examples do not serve traffic, and nothing here is a commitment.

WayMatrix
Sign in (not available yet)Get an API key (not available yet)

Matrix · Directions · Isochrones

Distance and duration matrices, on real road travel times.

Travel-time matrices, directions and isochrones across North America — request and response compatible with the openrouteservice API. Change the base URL, add a key, keep your code.

10% of Google's entry price per element, 5% of its traffic-aware tier, and matrices big enough to ask for in one call.

Get a free API key (not available yet)Try it on your own coordinates

250,000 matrix elements a month on the free tier, up to 50 × 50 per request. No card, no sales call.

matrix.shup to 300 × 300 in one call
curl -X POST \
  https://api.waymatrix.io/v2/matrix/driving-car \
  -H "Authorization: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [
      [-87.6298, 41.8781],
      [-87.6244, 41.8796],
      [-87.6722, 41.9227]
    ],
    "metrics": ["duration", "distance"],
    "units": "km"
  }'
response.jsondurations, distances, and the graph build date
{
  "durations": [
    [0, 421.3, 782.6],
    [402.9, 0, 897.4],
    [768.1, 881.5, 0]
  ],
  "distances": [
    [0, 2.61, 6.42],
    [2.68, 0, 8.13],
    [6.35, 8.21, 0]
  ],
  "sources": [
    {
      "location": [-87.6298, 41.8781],
      "snapped_distance": 4.31
    },
    {
      "location": [-87.6244, 41.8796],
      "snapped_distance": 11.82
    },
    {
      "location": [-87.6722, 41.9227],
      "snapped_distance": 6.09
    }
  ],
  "destinations": [
    {
      "location": [-87.6298, 41.8781],
      "snapped_distance": 4.31
    },
    {
      "location": [-87.6244, 41.8796],
      "snapped_distance": 11.82
    },
    {
      "location": [-87.6722, 41.9227],
      "snapped_distance": 6.09
    }
  ],
  "metadata": {
    "attribution": "© openrouteservice by HeiGIT | Data from OpenStreetMap",
    "service": "matrix",
    "timestamp": 1788412800000,
    "query": {
      "locations": [
        [-87.6298, 41.8781],
        [-87.6244, 41.8796],
        [-87.6722, 41.9227]
      ],
      "metrics": ["duration", "distance"],
      "units": "km",
      "profile": "driving-car"
    },
    "engine": {
      "version": "9.10.0",
      "build_date": "2026-07-28T00:00:00Z",
      "graph_date": "2026-07-31T00:00:00Z",
      "osm_date": "2026-07-30T00:00:00Z"
    },
    "element_count": 9
  }
}
  • No surprise bill

    every plan on sale stops at its allowance

  • ORS-compatible

    same paths, bodies and response shapes

  • North America

    driving profile, OpenStreetMap data

Wiring this up

Wire it up with one block of text.

The endpoints, the limits, the error shapes to write retry logic against, and what this API deliberately does not have. Paste it into a coding agent, or read it as a reference.

Get the block

Three endpoints. That's the whole product.

Narrow on purpose. Each one is the same shape openrouteservice returns, so your parsing code doesn't change either.

Matrix

Hero

POST /v2/matrix/{profile}

priced by origins × destinations

Every origin to every destination, duration and distance, in one request. This is the call Google charges five dollars a thousand for and caps at 625 elements — a 25 by 25 matrix.

Directions

POST /v2/directions/{profile}

10 elements per call

Geometry, turn-by-turn instructions, and alternative routes. Encoded polyline or GeoJSON, whichever your map wants.

Isochrones

POST /v2/isochrones/{profile}

priced by how far it reaches

Everywhere reachable in fifteen minutes, as a polygon. Site selection, service-area maps, “commute time” filters on a listings site.

Before you switch

What the price buys, and what it doesn't.

We would rather lose the sale than the customer. Three things you are trading away, stated plainly:

No live traffic

Durations come from speed profiles on the road network, not from cars on it right now. If your product hinges on a minute-accurate ETA in rush hour, buy Google. If you are planning a day’s work, comparing options, or ranking by travel time, you will not miss it.

OpenStreetMap data

Excellent in metros, where most routing happens and where OpenStreetMap is often better than commercial data. More variable on rural roads and brand-new subdivisions. Every response carries the date of the map data behind it, so how fresh your answer is stays something you can read rather than something you have to take on trust.

Bring your own coordinates

There is no geocoder and no places database here. You send longitude and latitude, we send back numbers. Most teams already have coordinates from the system that created the address — if you don’t, geocode once and cache.

Measured, not asserted

Ninety thousand pairs in two and a half seconds.

One call, three hundred origins against three hundred destinations. The numbers below were measured against production and the workflow that produced them can be re-run by anyone; if they drift, they are meant to be caught.

MatrixElementsTypicalSlowest in twenty
10 × 10 100 204 ms 374 ms
50 × 50 2,500 240 ms 582 ms
100 × 100 10,000 489 ms 539 ms
300 × 300 90,000 2,557 ms 2,604 ms

Measured against production — Benchmark run 34079297787.

What the numbers mean, and what they do not cover

  • 900× the work at 12× the time. Cost grows far more slowly than size, right across the range — and the effect holds at every step of it, not just the ends: the step from the second-largest matrix here to the largest is nine times the work for five times the time. That is the argument for asking in one call rather than chunking.
  • The big matrices are the predictable ones. A 300 × 300 request varies by two percent between its typical and its slowest run. A 10 × 10 varies by eighty. At small sizes you are measuring the network, because the routing is trivial; at large sizes the routing dominates and the number settles down.
  • What these numbers are not. They are one caller sending requests one after another, ten samples per size, timed from the client so they include everything between your code and ours. They say nothing about behaviour under concurrent load, which has not been measured. They were taken on the shared machine the beta runs on and will change when it moves.

Already on openrouteservice?

The migration is one line.

The hosted free tier allows 500 matrix requests a day, and there is no paid plan above it to move up to. That is a generous place to prototype and nowhere to launch from. We speak the same protocol with a far higher ceiling.

Your existing client library, your existing request bodies, your existing parsing. Point it somewhere else — and note that this really is only the base URL. Worth knowing: openrouteservice is retiring its own old host on 28 September, so staying put is a base URL change too.

Works unchanged with:

  • openrouteservice-py
  • openrouteservice-js
  • plain HTTP

client.py

Removed: - base_url = "https://api.openrouteservice.org"
Added: + base_url = "https://api.waymatrix.io"  headers   = {"Authorization": API_KEY}

That is the entire diff. Everything below the base URL is unchanged.

Priced on elements.

An element is one origin paired with one destination. A 200 × 150 matrix is 30,000 of them, whether you ask in one request or thirty.

Full pricing

Beta

By invitation

$0

while the beta runs

  • No monthly element ceiling
  • 60 requests / minute

Free

$0

no card required

  • 250,000 elements / month
  • 5 requests / minute

Starter

$29 per month

per month

  • 5,000,000 elements / month
  • 120 requests / minute

Growth

Proposed

$99 per month

per month

  • 25,000,000 elements / month
  • 300 requests / minute

Scale

Proposed

$299 per month

per month

  • 100,000,000 elements / month
  • 600 requests / minute

Same engine, different job

Need the routes, not just the numbers?

This API is the routing layer underneath Optimiciti, a route planner for dispatchers and small fleets. If what you actually need is "assign these 400 stops to these 12 vans," that problem is already solved over there — and an optimization endpoint is on the way here.

Visit Optimiciti

no optimization endpoint here yet