Changelog

What we shipped and when.

improvement

Free plan: 50 premium requests a day, 5 playground queries without signing up

  • The free plan now includes 50 premium requests a day (routing, isochrones, distance matrices and the other premium endpoints), up from 10. Standard requests stay at 500 a day and map tiles at 5,000 a day.
  • The playground runs 5 queries a day without an account, up from 1. When you reach the limit, the message names what a free API key gets: 500 standard and 50 premium requests a day.
improvement

Timed-out requests are never billed

  • A request that runs past your plan's request timeout and returns a 408 is never billed, on any endpoint. That now includes POST /api/v1/query: a PlazaQL query that times out bills nothing, even when it held a geocode(addresses: [...]) batch or a route, isochrone or matrix computation. Until now a timed-out /query was billed for every computation in it.
  • Other 4xx responses (bad parameters, not found) are still billed, as before. Server errors (5xx) and 429s are still free.
  • Timeouts still count against your per-minute rate limit and, on the free plan, the daily allowance.
breaking

Batch geocoding is metered per address, plus batch reverse geocoding

  • Billing change: POST /api/v1/geocode/batch and PlazaQL geocode(addresses: [...]) now count one standard request per address, as the batch geocoding guide always said. A batch of 500 addresses is 500 requests toward your plan. Until now a batch counted as one. On the free plan a batch larger than what is left of the day's allowance is refused with a 429 before it runs.
  • The batch is still one call against your per-minute rate limit.
  • New: POST /api/v1/geocode/reverse/batch reverse geocodes up to 1,000 points in one request, one FeatureCollection per point in input order, metered the same way (one request per point). PlazaQL: reverse_geocode(points: [...]).
  • Both batch geocoders now run under one deadline, your plan's request timeout. A batch that runs past it returns a 408 with no partial results, and a POST /geocode/batch or /geocode/reverse/batch that times out is not billed. Before, a single slow address timed out on its own and came back as an empty collection.
feature

Traffic on isochrones and matrices, distance isochrones, dataset exports as NDJSON

  • POST /isochrone and POST /matrix take depart_at and traffic_model. Car, truck, motorcycle and scooter times follow the hourly traffic profile, and conditional road limits apply at that time, as on /route. PlazaQL: isochrone(..., depart_at:) and matrix(..., depart_at:).
  • POST /isochrone takes contours_meters instead of time: the area within that distance along the roads, up to 100 km. PlazaQL: isochrone(..., distance: [1000, 2000]).
  • GET /datasets/{id}/features takes format=ndjson, geojson or csv and streams the page as it is read.
  • Fix: a walking or cycling isochrone with several times no longer fails with a server error.
improvement

Hong Kong curb sides and destination streets entered mid-way

  • In Hong Kong and Macau, approaches: curb, preferred_sides and the default side of cycleway:left / cycleway:right now treat traffic as keeping left. Turn costs and junction delays already did.
  • A route that turns into a destination-only street (or a delivery or customers one) from a cross street halfway along it now pays the same penalty as one entering at its end. Before, the mid-way turn was free, so routes could cut through. This changes which route wins, not duration_s. Matrices are unchanged.
  • Traffic signals, barriers and kerbs on a node far from the rest of its way are no longer missed.
breaking

An unknown routing mode is now a 422

  • Breaking: the routing endpoints (/route, /matrix, /isochrone, /optimize, /centroid, /expansion, /map-match) used to route an unrecognised mode such as "helicopter" as auto. They now answer 422 with the modes they take: auto, foot, bicycle, truck, motorcycle, motor_scooter, plus transit on /route and /isochrone. PlazaQL already rejected these.
  • REST takes the same aliases PlazaQL does: car and drive for auto, walk for foot, bike for bicycle, motorbike for motorcycle, scooter and moped for motor_scooter.
fix

Output options on POST /features for OSM searches

POST /features without datasets now honors the same output options as dataset searches and PlazaQL.

  • output.include=distance adds distance_m, measured from the around point. A request with include=distance and no around point now returns 400, as it already did for dataset searches.
  • output.simplify, output.buffer and output.centroid now change the returned geometry. They used to be ignored on this path.
  • The legacy h3 parameter also returns ways and relations larger than the cell that cover it.
improvement

Electric motorcycles, lane splitting, UK yards and sunrise on the local clock

  • ev works with mode: "motorcycle" and "motor_scooter" on POST /route, and PlazaQL ev_route() takes those modes and their rider options. The planner uses a bike's consumption (about 80 and 40 Wh/km) and, unless you set connector_types, only stops at sockets a two-wheeler can use.
  • motorcycle.lane_splitting: true (PlazaQL lane_splitting: true) lets a route take congested urban multi-lane roads at rush hour, counting half their traffic slowdown. It's off by default because it's only legal in some places, and duration_s still reports car traffic time.
  • With units: "mi", steps in the UK, Guernsey, Jersey and the Isle of Man give short distances in yards (In 150 yd) instead of feet.
  • Conditional turn restrictions read sunrise and sunset on the junction's local clock, daylight saving included, instead of solar time.
  • Roads in Hong Kong and Macau report their own country and driving_side: left.
  • New Plaza-curated dataset natural-earth-countries-10m: the 1:10m Natural Earth countries, with the microstates and Hong Kong and Macau. Directions uses it for roads OSM gives no country.
breaking

Directions: more maneuver types, country fields and congestion

POST /route with steps: true now reads every road at each junction, so the steps say what a driver sees: forks, the end of a road, numbered motorway exits, mini-roundabouts and named roundabouts.

Breaking: three maneuver types changed. Update any client that switches on maneuver.type.

  • ramp is gone. Leaving a motorway or trunk road onto a slip road is off_ramp (with exits, the exit number, when the junction has one). Entering a slip road from any other road is on_ramp.
  • Going straight on onto a road with a different name is new_name. continue now only means carrying on along the same street.
  • A roundabout with a named ring is a rotary, with the name in rotary_name, and leaving it with roundabout_exits is exit_rotary. Unnamed rings are still roundabout.

New maneuvers: fork, end_of_road and roundabout_turn. Banners show the exit sign ("Exit 12A") as exit and exit-number components.

Each step now has driving_side, speed_limit_sign (mutcd or vienna) and speed_limit_unit, and the route lists its countries in admins. Intersections gain admin_index, is_urban, toll_collection for toll booths and gantries, and rest_stop for exits into rest and service areas.

With annotations: true, legs carry freeflow_speed_kmh, and with depart_at also current_speed_kmh, congestion_numeric and congestion from the time-of-day traffic profiles. These are modelled speeds, not live traffic.

approaches: ["curb", ...] (REST) and approaches: "curb;" (PlazaQL) keep a stop on the driving side of the road, as preferred_sides: same does.

improvement

avoid_datasets on more endpoints, OSM counts, sun offsets and steadier steps

  • avoid_datasets now works on POST /centroid, /optimize, /expansion and /map-match, and on the matching PlazaQL computations. Map matching never snaps a point to a road inside the polygons.
  • POST /optimize and /map-match take exclude (toll, cash_only_tolls, ferry, ...) like the other routing endpoints, and so do PlazaQL optimize() and map_match().
  • POST /features takes output: "count" without datasets and returns {counts: {node, way, relation}, total}, the same answer as PlazaQL .count().
  • POST /isochrone 404s now use the same wording as isochrone() on /query: "No road found near this location." and "No reachable area found from this point."
  • Conditional turn restrictions read sunrise and sunset offsets such as (sunset+00:30)-(sunrise-01:00).
  • A toll booth with no payment tags of its own takes the payment tags of its toll road, so exclude: "cash_only_tolls" catches booths mapped that way.
  • Drivers now avoid boarding a ferry (300 s), passing a gate (330 s) and turning onto a track (15 s) a little more when choosing a route. These steer the route only: duration_s is unchanged.
  • Two unnamed roads only merge into one step when they are the same kind of road and go straight on. A real turn between two unnamed roads now gets its own step.
feature

Full PlazaQL support

You can now run PlazaQL queries directly against Plaza. The syntax supports selecting OSM data by tags, spatial filters, and element relationships. Results come back as streaming GeoJSON, XML, or CSV.

Supported statements: node, way, relation, area, around, bbox, if, foreach, and all set operations.

improvement

Chunked streaming for large result sets

All API responses now stream by default. For queries returning thousands of features, you'll see the first results in milliseconds instead of waiting for the full dataset to load.

Supported formats: GeoJSON (application/geo+json), XML (application/xml), and CSV (text/csv).

feature

Plaza is live

Plaza is now publicly available. Query the full OpenStreetMap planet dataset through REST or PlazaQL. Every response streams, so you get the first result before the last one is ready.

Free tier includes 10,000 requests per month with no credit card required.