{"components":{"responses":{},"schemas":{"ReverseGeocodeResult":{"description":"GeoJSON FeatureCollection of reverse geocoding results, ordered by distance from the query point. Content-Type: `application/geo+json`.","properties":{"features":{"description":"Reverse geocoding results ordered by distance","items":{"$ref":"#/components/schemas/GeocodingFeature"},"type":"array"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"ReverseGeocodeResult","type":"object"},"ChargingStop":{"description":"A public charging station (OSM `amenity=charging_station`) inserted into an EV route. Connector and power data come from the station's `socket:*` tags.","properties":{"arrival_charge_pct":{"description":"Battery level on arrival (0-1)","type":"number"},"capacity":{"description":"Vehicles that can charge at once (OSM `capacity`)","nullable":true,"type":"integer"},"charge_duration_s":{"description":"Estimated charging time at `charge_power_kw`; null when that output is unknown","nullable":true,"type":"number"},"charge_power_kw":{"description":"Highest output among the sockets matching `connector_types` (all sockets when none were requested); `min_power_kw` is checked against this","nullable":true,"type":"number"},"connectors":{"description":"Sockets from `socket:<type>` and `socket:<type>:output` tags","items":{"properties":{"count":{"nullable":true,"type":"integer"},"power_kw":{"nullable":true,"type":"number"},"type":{"example":"type2_combo","type":"string"}},"required":["type"],"type":"object"},"type":"array"},"departure_charge_pct":{"description":"Battery level on departure (0-1); stops charge to 0.8","type":"number"},"distance_along_route_m":{"description":"Distance from the origin at which the stop is reached","type":"number"},"distance_from_route_m":{"description":"Distance from the original route line to the station","type":"number"},"lat":{"type":"number"},"lng":{"type":"number"},"max_power_kw":{"description":"Highest output among all of the station's sockets","nullable":true,"type":"number"},"name":{"nullable":true,"type":"string"},"operator":{"nullable":true,"type":"string"},"osm_id":{"description":"OSM node ID of the charging station","type":"integer"}},"required":["osm_id","lat","lng","connectors","distance_along_route_m"],"title":"ChargingStop","type":"object"},"QueryOutputs":{"description":"Response of a PlazaQL query with several named outputs (`$$.name = ...;`). Every output runs, in source order, and its result appears under its name: a FeatureCollection for searches, a Feature for single-feature computations such as `route()` or `isochrone()`, or the same JSON object the equivalent endpoint returns (counts, `matrix()`, aggregates). Always `application/json`; `format` must be `json`. A query with one output returns that result directly instead.","example":{"outputs":{"cafes":{"features":[],"type":"FeatureCollection"},"total":{"counts":{"node":0,"relation":0,"way":0},"total":0}}},"properties":{"outputs":{"additionalProperties":{"description":"One output's result (FeatureCollection, Feature or JSON object)","type":"object"},"description":"Result of each named output, keyed by output name (without `$$.`)","type":"object"}},"required":["outputs"],"title":"QueryOutputs","type":"object"},"BicycleParameters":{"description":"Rider options for `mode: bicycle`. Values out of range, and unknown options, are rejected with 422. `bicycle_type` and `cycling_speed` change the trip's duration; `use_roads`, `use_hills` and `avoid_bad_surfaces` only change which way the route goes (they are not added to `duration_s`). Bicycles keep off ways tagged `bicycle=no`, push at walking pace where `bicycle=dismount`, and avoid `smoothness=impassable`.","example":{"bicycle_type":"road","use_hills":0.1,"use_roads":0.2},"properties":{"avoid_bad_surfaces":{"default":0.25,"description":"0 to 1 (default: 0.25). Higher values avoid unpaved and rough ways (`surface`, `tracktype`, `smoothness`).","maximum":1,"minimum":0,"type":"number"},"bicycle_type":{"default":"hybrid","description":"Bike type (default: `hybrid`). Sets the cruising speed (road 21, hybrid 15, cross 17, mountain 13 km/h) and how much rough surfaces slow the bike and are avoided: most for road bikes, least for mountain bikes.","enum":["road","hybrid","cross","mountain"],"type":"string"},"cycling_speed":{"description":"Cruising speed on roads in km/h, 5 to 50 (default: the type's). Cycleway, path and track speeds scale with it.","maximum":50,"minimum":5,"nullable":true,"type":"number"},"use_hills":{"default":0.5,"description":"0 to 1 (default: 0.5). Lower values avoid climbs; 1 ignores them beyond the time they take. Needs elevation data along the route.","maximum":1,"minimum":0,"type":"number"},"use_roads":{"default":0.5,"description":"0 to 1 (default: 0.5). Lower values avoid busy roads without cycle lanes or tracks; 1 rides any road. A lane or track on one side (`cycleway:left` / `cycleway:right`) counts only for the direction it serves.","maximum":1,"minimum":0,"type":"number"}},"title":"BicycleParameters","type":"object"},"AutocompleteResult":{"description":"GeoJSON FeatureCollection of autocomplete suggestions for partial address input. Optimized for low-latency type-ahead UIs. Content-Type: `application/geo+json`.","properties":{"features":{"description":"Autocomplete suggestions ordered by relevance","items":{"$ref":"#/components/schemas/GeocodingFeature"},"type":"array"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"AutocompleteResult","type":"object"},"BatchRequest":{"description":"Fetch multiple OSM elements by their type and ID in a single request. Maximum 100 elements per batch.","example":{"elements":[{"id":21154906,"type":"node"},{"id":4589123,"type":"way"}]},"properties":{"elements":{"description":"Array of element references to fetch","items":{"description":"Reference to a single OSM element","properties":{"id":{"description":"OSM element ID","example":21154906,"type":"integer"},"type":{"description":"OSM element type","enum":["node","way","relation"],"type":"string"}},"required":["type","id"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"}},"required":["elements"],"title":"BatchRequest","type":"object"},"RouteResult":{"description":"GeoJSON Feature representing a calculated route. The geometry is a LineString or MultiLineString of the route path. When `alternatives > 0`, the response is a FeatureCollection containing multiple route Features. A `mode: transit` route is a MultiLineString (one line per leg) with `mode: transit`, `depart_at`, `arrive_at`, `transfers`, `walk_distance_m`, `feed_id`, `feed_ids` and `legs`.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Route geometry as a GeoJSON LineString or MultiLineString"},"properties":{"description":"Route metadata","properties":{"admins":{"description":"Countries the route passes through, in order (present when `steps: true`; empty when no country is known for its roads). Intersections refer to them by `admin_index`.","items":{"properties":{"iso_3166_1":{"example":"DE","type":"string"},"iso_3166_1_alpha3":{"example":"DEU","type":"string"}},"required":["iso_3166_1"],"type":"object"},"nullable":true,"type":"array"},"annotations":{"additionalProperties":true,"description":"Per-edge annotations (present when `annotations: true` in request)","nullable":true,"type":"object"},"arrive_at":{"description":"Transit routes: arrival at the destination, ISO 8601 in the feed's time zone","format":"date-time","nullable":true,"type":"string"},"charge_profile":{"description":"Battery level along the route (EV routes only): the start, the arrival and departure charge at each charging stop, each caller waypoint, and the destination.","items":{"properties":{"charge_pct":{"description":"Battery level as a fraction 0-1","type":"number"},"distance_m":{"description":"Distance from the origin","type":"number"}},"required":["distance_m","charge_pct"],"type":"object"},"nullable":true,"type":"array"},"charging_stops":{"description":"Charging stations the route stops at, in route order (EV routes only; empty when the battery covers the trip). The route geometry, distance and duration already include the detours to these stops.","items":{"$ref":"#/components/schemas/ChargingStop"},"nullable":true,"type":"array"},"curviness_avg":{"description":"Length-weighted average curviness of the route's roads: each road's length over the straight-line distance between its ends (1 is straight). Motorcycle and motor scooter routes only.","nullable":true,"type":"number"},"depart_at":{"description":"Transit routes: when to leave the origin (just in time for the first vehicle; with `arrive_by`, the latest departure that arrives in time), ISO 8601 in the feed's time zone","format":"date-time","nullable":true,"type":"string"},"distance_m":{"description":"Total route distance in meters","example":4523.7,"type":"number"},"duration_s":{"description":"Estimated travel duration in seconds","example":847.2,"type":"number"},"edges":{"description":"Edge-level route details (present when `annotations: true`)","items":{"additionalProperties":true,"type":"object"},"nullable":true,"type":"array"},"energy_used_wh":{"description":"Total energy consumed in watt-hours (EV routes only)","nullable":true,"type":"number"},"feed_id":{"description":"Transit routes: the GTFS feed of the first vehicle (null when walking the whole way); see `feed_ids`","nullable":true,"type":"string"},"feed_ids":{"description":"Transit routes: every GTFS feed ridden, in order. A journey can change between feeds over a walk between their stops.","items":{"type":"string"},"nullable":true,"type":"array"},"legs":{"description":"One per leg between stops (present when `steps: true`)","items":{"$ref":"#/components/schemas/RouteLeg"},"nullable":true,"type":"array"},"mode":{"description":"The mode for truck, motorcycle, motor scooter and transit routes (absent for other modes)","enum":["truck","motorcycle","motor_scooter","transit"],"nullable":true,"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"The rider options the route was planned with (motor scooter routes only)","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"The rider options the route was planned with, style defaults filled in (motorcycle routes only)","nullable":true,"type":"object"},"polyline":{"description":"Encoded route line when `geometries` is `polyline` or `polyline6` (`geometry` is then null)","nullable":true,"type":"string"},"recostings":{"additionalProperties":{"properties":{"cost":{"nullable":true,"type":"number"},"duration_s":{"nullable":true,"type":"number"}},"type":"object"},"description":"Present when the request has `recostings`: the route's summary under each, by name. `duration_s` is the travel time of the same path in that mode with those speed options (and the request's `depart_at`), `cost` its routing cost (seconds, or metres with `shortest`) including penalties and preference factors. Both are null when that mode may not use a road on the path or travel it in that direction.","example":{"no_tolls":{"cost":4980.0,"duration_s":1260.4}},"nullable":true,"type":"object"},"steps":{"description":"Turn-by-turn steps (present when `steps: true`), in the request's `lang` and `units`. Steps of every leg in one list; `leg_index` says which leg each is on.","items":{"$ref":"#/components/schemas/RouteStep"},"nullable":true,"type":"array"},"surface_breakdown":{"additionalProperties":{"type":"number"},"description":"Fraction of the route's length on each surface: `paved`, `compacted`, `gravel`, `dirt`, `other` (a surface tag outside those) and `unknown` (no surface tag); only the surfaces present. Motorcycle and motor scooter routes only.","example":{"gravel":0.06,"paved":0.9,"unknown":0.04},"nullable":true,"type":"object"},"transfers":{"description":"Transit routes: changes between vehicles","nullable":true,"type":"integer"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"The vehicle the route was planned for (truck routes only)","nullable":true,"type":"object"},"voice_locale":{"description":"Language of the voice instructions (with `voice_instructions: true`)","nullable":true,"type":"string"},"walk_distance_m":{"description":"Transit routes: meters walked in total","nullable":true,"type":"number"},"warnings":{"description":"Restrictions the truck exceeds on roads next to the route, at most 10 (single truck routes only; empty when there are none)","items":{"$ref":"#/components/schemas/TruckWarning"},"nullable":true,"type":"array"},"waypoints":{"description":"Origin, each stop between legs and destination as snapped (present when `steps: true`)","items":{"$ref":"#/components/schemas/RouteWaypoint"},"nullable":true,"type":"array"},"weight":{"description":"Routing cost of the route (present when `steps: true`)","nullable":true,"type":"number"},"weight_name":{"description":"What `weight` measures (present when `steps: true`)","enum":["duration"],"nullable":true,"type":"string"}},"required":["distance_m","duration_s"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"RouteResult","type":"object"},"OptimizeJobStatus":{"description":"Status of an async optimization job. When `completed`, the `result` field contains the full OptimizeCompletedResult. When `processing`, the job is still running — poll again. Failed jobs return a standard Error response (HTTP 422), not this schema.","properties":{"result":{"allOf":[{"$ref":"#/components/schemas/OptimizeCompletedResult"}],"description":"Optimization result (present only when status is `completed`)","nullable":true},"status":{"description":"Current job state","enum":["completed","processing"],"type":"string"}},"required":["status"],"title":"OptimizeJobStatus","type":"object"},"BatchGeocodeResult":{"description":"Batch geocoding result. Each entry in `results` is a FeatureCollection corresponding to the input address at the same index. Order is preserved.","properties":{"count":{"description":"Number of addresses processed (always equals length of results)","type":"integer"},"results":{"description":"Array of FeatureCollections, one per input address. Empty FeatureCollections indicate no match.","items":{"$ref":"#/components/schemas/GeocodeResult"},"type":"array"}},"required":["results","count"],"title":"BatchGeocodeResult","type":"object"},"MapMatchResult":{"description":"Map matching result as a GeoJSON FeatureCollection. Each Feature is a snapped tracepoint. The top-level `matchings` array contains the matched sub-routes connecting consecutive tracepoints.","properties":{"features":{"description":"Snapped tracepoint Features in input order","items":{"$ref":"#/components/schemas/MapMatchTracepointFeature"},"type":"array"},"matchings":{"description":"Matched sub-routes. Each matching connects a contiguous sequence of tracepoints that could be matched to roads.","items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features","matchings"],"title":"MapMatchResult","type":"object"},"DatasetFeatureUpdateRequest":{"description":"Update a feature's geometry and/or properties.","properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"properties":{"additionalProperties":true,"description":"Updated properties (replaces existing)","nullable":true,"type":"object"}},"title":"DatasetFeatureUpdateRequest","type":"object"},"DatasetResponse":{"description":"Metadata for a custom dataset. Datasets contain user-uploaded geospatial features separate from the OSM data.","properties":{"adapter":{"description":"Plaza datasets: source adapter that produces the data","nullable":true,"type":"string"},"address_count":{"description":"Number of addresses in this dataset","type":"integer"},"attribution":{"description":"Required attribution text","nullable":true,"type":"string"},"category":{"description":"Plaza datasets: catalog category","example":"boundaries","nullable":true,"type":"string"},"description":{"description":"Dataset description","nullable":true,"type":"string"},"edge_count":{"description":"Number of routing edges in this dataset","type":"integer"},"error_message":{"description":"Error message if status is 'error'","nullable":true,"type":"string"},"feature_count":{"description":"Number of features in this dataset","type":"integer"},"field_dictionary":{"additionalProperties":{"$ref":"#/components/schemas/DatasetField"},"description":"Plaza datasets: description of each feature property","nullable":true,"type":"object"},"geography_level":{"description":"Plaza datasets: geographic unit of each feature","example":"country","nullable":true,"type":"string"},"id":{"description":"Dataset UUID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp (UTC)","format":"date-time","type":"string"},"last_sync":{"description":"Plaza datasets: summary of the most recent sync","nullable":true,"properties":{"error":{"nullable":true,"type":"string"},"feature_count":{"nullable":true,"type":"integer"},"finished_at":{"format":"date-time","nullable":true,"type":"string"},"started_at":{"format":"date-time","type":"string"},"status":{"enum":["running","succeeded","skipped","failed","throttled"],"type":"string"}},"type":"object"},"license":{"description":"License identifier (e.g. CC-BY-4.0)","nullable":true,"type":"string"},"load_errors":{"description":"Up to 10 sample reasons for the skipped features, as 'feature <index>: <reason>' (index counts from 0 in the upload)","items":{"type":"string"},"type":"array"},"name":{"description":"Human-readable dataset name","example":"NYC Bike Lanes","type":"string"},"next_refresh_at":{"description":"Plaza datasets: next scheduled source check (UTC)","format":"date-time","nullable":true,"type":"string"},"refresh_cron":{"description":"Plaza datasets: cron schedule (UTC) on which the source is checked","example":"0 4 1 * *","nullable":true,"type":"string"},"refreshed_at":{"description":"Plaza datasets: when data was last loaded from the source (UTC)","format":"date-time","nullable":true,"type":"string"},"schema_definition":{"description":"Detected or user-defined property schema","nullable":true,"type":"object"},"scope":{"description":"Dataset scope: plaza (managed by Plaza) or user (user-owned)","enum":["plaza","user"],"type":"string"},"size_class":{"description":"Plaza datasets: rough size (small, medium, large)","nullable":true,"type":"string"},"skipped_count":{"description":"Invalid features the last load skipped (strict_mode off); 0 otherwise","type":"integer"},"slug":{"description":"URL-friendly identifier","example":"nyc-bike-lanes","type":"string"},"source_format":{"description":"Format of the original source data","enum":["geojson","shapefile","csv","geopackage","parquet","api"],"nullable":true,"type":"string"},"source_url":{"description":"URL of the original data source","format":"uri","nullable":true,"type":"string"},"status":{"description":"Current processing status","enum":["pending","processing","ready","error"],"type":"string"},"storage_bytes":{"description":"Total storage consumed in bytes","type":"integer"},"strict_mode":{"description":"When true (default), any invalid feature (bad geometry, missing id, over the size limit, repeated id) fails the whole load and nothing is stored. When false, invalid features are skipped and reported in skipped_count and load_errors.","type":"boolean"},"sync_status":{"description":"Plaza datasets: state of the source sync","enum":["idle","syncing","error"],"type":"string"},"updated_at":{"description":"Last update timestamp (UTC)","format":"date-time","type":"string"},"vintage":{"description":"Plaza datasets: data vintage of the loaded version (e.g. \"2024\")","example":"2024","nullable":true,"type":"string"}},"required":["id","slug","name","scope","status","inserted_at","updated_at"],"title":"DatasetResponse","type":"object"},"AutocompleteRequest":{"description":"Request body for autocomplete suggestions. Optimized for low-latency type-ahead UIs.","properties":{"boundary_gid":{"description":"Only return results inside the polygon of this way or relation (`osm:relation:{id}` or `osm:way:{id}`), such as an admin boundary from a geocoding result's `gid`. 404 when the GID has no polygon. PlazaQL: `boundary_gid:`.","example":"osm:relation:1124039","nullable":true,"type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code to restrict results","maxLength":2,"minLength":2,"nullable":true,"type":"string"},"dataset_name_field":{"description":"Dataset property matched against the query instead of the feature name (`properties.name`). Matching another property is not index-assisted, so the named datasets may hold at most 100,000 features in total (400 otherwise). PlazaQL: `dataset_name_field:`.","example":"title","nullable":true,"type":"string"},"datasets":{"description":"Also match features of these datasets: dataset slugs or ids, `plaza` (every Plaza-curated dataset) or `all` (those plus your own), as an array or a comma-separated string. Only Plaza datasets and your own can be named: any other dataset answers 404 `dataset not found`, the same as one that doesn't exist; a Plaza dataset that hasn't finished its first sync answers 400. Up to 20 explicit references. The query text (structured: the most specific component) is matched against each feature's name (`properties.name`, or the property `dataset_name_field` names), and against the full address of the datasets' addresses (features with `housenumber` and `street`, or their `addr:` forms). Matches rank alongside OSM results with `layer: \"dataset\"`, `dataset`, `dataset_id`, `feature_id`, `feature_type` and `dataset_properties`; an address has `feature_type: \"address\"` and its address fields; `bbox`, `boundary_gid`, `country_code` and `layers` filter them too. Queries shorter than 3 characters skip dataset matching; more than 50 datasets after keyword expansion is a 400. The request stays a standard request. PlazaQL: `datasets:`.","example":["census-places"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"focus":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Bias results toward this point"},"lang":{"description":"Preferred response language (ISO 639-1)","nullable":true,"type":"string"},"layer":{"description":"Alias of `layers`","nullable":true,"type":"string"},"layers":{"description":"Only return these result layers: `address` (addresses, streets, postal codes), `poi`, `admin` (neighbourhood up to country), `dataset` (matches from `datasets`), or single layers (`street`, `postalcode`, `neighbourhood`, `locality`, `county`, `region`, `country`). Comma-separated string or array. `layer` is accepted as an alias. PlazaQL: `layers:`.","example":"address,poi","oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"limit":{"default":10,"description":"Maximum number of suggestions (default: 10, max: 20). Out-of-range values are a 400.","maximum":20,"minimum":1,"nullable":true,"type":"integer"},"q":{"description":"Partial address or place name input","example":"221B Bak","type":"string"}},"required":["q"],"title":"AutocompleteRequest","type":"object"},"CentroidRequest":{"description":"Request body for the meeting point (centroid) service: 2 to 50 locations, a travel mode and the cost to minimise. Same options as PlazaQL `centroid(locations: [...], mode:, metric:, exclude:, avoid_datasets:)`, with the vehicle and rider options as keywords (`height:`, `style:`, ...).","example":{"locations":[{"coordinates":[2.294,48.858],"type":"Point"},{"coordinates":[2.35,48.87],"type":"Point"},{"coordinates":[2.34,48.845],"type":"Point"},{"coordinates":[2.37,48.86],"type":"Point"}],"metric":"time","mode":"auto"},"properties":{"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"exclude":{"description":"Road types to avoid, as a comma-separated string or an array: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. Unknown values are rejected with 400.","oneOf":[{"example":"toll,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"locations":{"description":"Locations to converge, as GeoJSON Points (2 to 50)","items":{"$ref":"#/components/schemas/PointGeometry"},"maxItems":50,"minItems":2,"type":"array"},"metric":{"default":"time","description":"Total to minimise: travel `time` (default) or road `distance`. Any other value is rejected with 400.","enum":["time","distance"],"type":"string"},"mode":{"description":"Travel mode every location travels by (default: `auto`). `truck` keeps to roads the vehicle in `truck` fits and may use, at truck speeds; `motorcycle` and `motor_scooter` keep to the roads they may use (no motorways for scooters) at their own speeds. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`; omitted values take the defaults. Rejected with 422 without `mode: foot`.","nullable":true,"type":"object"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"}},"required":["locations"],"title":"CentroidRequest","type":"object"},"GeocodeResult":{"description":"GeoJSON FeatureCollection of forward geocoding results, ordered by relevance. Content-Type: `application/geo+json`.","properties":{"features":{"description":"Geocoding results ordered by relevance score","items":{"$ref":"#/components/schemas/GeocodingFeature"},"type":"array"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"GeocodeResult","type":"object"},"DatasetFeatureCreateRequest":{"description":"Batch create request. Provide an array of GeoJSON Features with required id fields.","properties":{"features":{"description":"Array of GeoJSON Features to insert","items":{"properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"id":{"description":"User-provided feature ID (required)","type":"string"},"properties":{"additionalProperties":true,"type":"object"}},"required":["id"],"type":"object"},"type":"array"}},"required":["features"],"title":"DatasetFeatureCreateRequest","type":"object"},"MapStyle":{"description":"MapLibre style specification version 8 (https://maplibre.org/maplibre-style-spec/).","properties":{"glyphs":{"description":"Font glyph URL template","type":"string"},"layers":{"items":{"type":"object"},"type":"array"},"name":{"type":"string"},"sources":{"additionalProperties":{"type":"object"},"description":"`plaza` (basemap) and, with tag filters, `plaza-filtered`","type":"object"},"version":{"enum":[8],"type":"integer"}},"required":["version","sources","layers"],"title":"MapStyle","type":"object"},"RouteStep":{"description":"One turn-by-turn step: the maneuver that starts it and the travel to the next maneuver.","properties":{"banner_instructions":{"description":"With `banner_instructions: true` (empty on arrival steps)","items":{"$ref":"#/components/schemas/BannerInstruction"},"type":"array"},"destinations":{"description":"Signposted destinations of the road (OSM `destination:ref` and `destination`), when tagged","example":"A 7: Hamburg, Hannover","type":"string"},"distance_m":{"description":"Distance to the next maneuver, metres","type":"number"},"driving_side":{"description":"Side of the road traffic keeps to in the step's country (absent when the country is unknown). The country comes from OSM admin_level 2 boundaries, so Hong Kong and Macau get China's `right`.","enum":["left","right"],"type":"string"},"duration_s":{"description":"Duration to the next maneuver, seconds","type":"number"},"exits":{"description":"Exit numbers of an `off_ramp` (the `ref` of the OSM `highway=motorway_junction` node), `;`-separated","example":"12A","type":"string"},"geometry":{"description":"The stretch of route from this maneuver to the next, as a GeoJSON LineString or, with `geometries: polyline | polyline6`, an encoded string. A leg's steps (before its arrival) join end to end into the leg's line; an arrival step is a two-point line at the arrival point.","oneOf":[{"additionalProperties":true,"type":"object"},{"type":"string"}]},"intersections":{"description":"The maneuver's intersection, then those the step passes","items":{"$ref":"#/components/schemas/RouteIntersection"},"type":"array"},"leg_index":{"description":"Index of the step's leg in `legs`","type":"integer"},"maneuver":{"properties":{"bearing_after":{"description":"Heading after the maneuver, degrees from north","nullable":true,"type":"integer"},"bearing_before":{"description":"Heading before the maneuver, degrees from north","nullable":true,"type":"integer"},"exit":{"description":"Roundabout exit number (`roundabout` only): the exits passed on the ring that the travel mode could take, plus the one taken. Left out when the route ends on the ring.","minimum":1,"type":"integer"},"instruction":{"description":"Instruction text in the requested `lang`","example":"Tournez à gauche sur Rue de Rivoli","type":"string"},"location":{"description":"Where the maneuver happens, as [lng, lat]","items":{"type":"number"},"type":"array"},"modifier":{"description":"Turn direction, from the angle between the roads (null for depart, waypoint, charging_stop and arrive)","enum":["straight","slight_left","left","sharp_left","slight_right","right","sharp_right","uturn"],"nullable":true,"type":"string"},"type":{"description":"Maneuver kind. `continue` carries on along the same street, `new_name` straight on onto a street with another name. `on_ramp` enters a motorway or trunk link from another road, `off_ramp` leaves a motorway or trunk onto one (with `exits` when the junction is numbered), `merge` joins a motorway or trunk from a link. `fork` takes one of two or more roads ahead (within 45 degrees of straight on; modifier `slight_left`, `slight_right` or `straight`), `end_of_road` is a left or right turn where the road does not carry on. `roundabout` names the exit road and carries its `exit` number; `rotary` is the same at a named ring (with `rotary_name`); `exit_roundabout` / `exit_rotary` (with `roundabout_exits: true`) is leaving it. `roundabout_turn` is a turn at a mini-roundabout (`highway=mini_roundabout`). `waypoint` marks reaching one of the request's `waypoints` (numbered 1, 2, ... in the instruction, or named by `waypoint_names`); `charging_stop` marks reaching an EV charging stop.","enum":["depart","continue","turn","uturn","new_name","on_ramp","off_ramp","merge","fork","end_of_road","roundabout","exit_roundabout","rotary","exit_rotary","roundabout_turn","ferry","waypoint","charging_stop","arrive"],"type":"string"},"verbal_alert":{"description":"Short advance warning, without the street (`verbal: true`)","type":"string"},"verbal_post":{"description":"Spoken after the maneuver, with the distance to the next one (`verbal: true`; null on arrival)","nullable":true,"type":"string"},"verbal_pre":{"description":"Spoken just before the maneuver, with the distance to it (`verbal: true`)","example":"Dans 200 m, tournez à gauche sur Rue de Rivoli","type":"string"},"verbal_succinct":{"description":"Minimal form for tight UIs (`verbal: true`)","type":"string"}},"required":["type","instruction","location"],"type":"object"},"mode":{"description":"How the step is travelled","enum":["driving","walking","cycling","ferry"],"type":"string"},"name":{"description":"Street the step travels on","nullable":true,"type":"string"},"pronunciation":{"description":"OSM `name:pronunciation` (IPA) of the road, when tagged","type":"string"},"ref":{"description":"OSM `ref` of the road (absent when untagged)","type":"string"},"rotary_name":{"description":"Name of the ring (`rotary` and `exit_rotary`)","type":"string"},"rotary_pronunciation":{"description":"OSM `name:pronunciation` (IPA) of the ring, when tagged","type":"string"},"speed_limit_sign":{"description":"Speed limit sign style in the step's country: `mutcd` (United States, its territories, Canada) or `vienna` (absent when the country is unknown)","enum":["mutcd","vienna"],"type":"string"},"speed_limit_unit":{"description":"Unit of the road's speed limit: from its OSM `maxspeed:forward` / `maxspeed:backward` (for the direction travelled) or `maxspeed` tag when that gives one, else the country's (absent when neither is known)","enum":["km/h","mph"],"type":"string"},"voice_instructions":{"description":"With `voice_instructions: true` (empty on arrival steps)","items":{"$ref":"#/components/schemas/VoiceInstruction"},"type":"array"},"weight":{"description":"Routing cost of the step (its duration)","type":"number"}},"required":["maneuver","distance_m","duration_s","weight","mode","leg_index","geometry","intersections"],"title":"RouteStep","type":"object"},"TruckWarning":{"description":"A restriction the truck exceeds on a road within about 30 m of the route (a side or parallel road the route avoids).","properties":{"location":{"description":"`[lng, lat]` of the point on the restricted road closest to the route","items":{"type":"number"},"type":"array"},"message":{"example":"3.8 m height restriction on a nearby road","type":"string"},"osm_way_id":{"description":"OSM way with the restriction","type":"integer"},"restriction":{"enum":["maxheight","maxwidth","maxlength","maxweight","maxaxleload","hazmat"],"type":"string"},"type":{"enum":["restriction_near_route"],"type":"string"}},"required":["type","restriction","message","location","osm_way_id"],"title":"TruckWarning","type":"object"},"PolygonGeometry":{"description":"GeoJSON Polygon geometry per RFC 7946. An array of linear rings where the first ring is the exterior boundary and subsequent rings are holes. Each ring must have at least 4 positions with the first and last being identical.","properties":{"coordinates":{"description":"Array of linear rings (first = exterior, rest = holes)","items":{"items":{"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"minItems":4,"type":"array"},"minItems":1,"type":"array"},"type":{"enum":["Polygon"],"type":"string"}},"required":["type","coordinates"],"title":"PolygonGeometry","type":"object"},"MotorScooterParameters":{"description":"Rider options for `mode: motor_scooter`. Values out of range, and unknown options, are rejected with 422. They only change which way the route goes (they are not added to `duration_s`). Scooters never use motorways, keep off `motorroad=yes` expressways unless `moped` allows them, keep off ways closed by `moped`, `motor_vehicle` or `vehicle` (else `access`), and ride at most 45 km/h unless `top_speed` says otherwise.","example":{"use_hills":0.2,"use_primary":0},"properties":{"use_hills":{"default":0.5,"description":"0 to 1 (default: 0.5). Lower values avoid steep grades; 1 ignores them beyond the time they take. Needs elevation data along the route.","maximum":1,"minimum":0,"type":"number"},"use_primary":{"default":0.2,"description":"0 to 1 (default: 0.2). Lower values avoid primary and trunk roads and roads with a speed limit of 80 km/h or more; 1 rides them like any road.","maximum":1,"minimum":0,"type":"number"}},"title":"MotorScooterParameters","type":"object"},"GeocodeForwardRequest":{"description":"Request body for forward geocoding. Converts an address or place name to coordinates.","example":{"country_code":"GB","limit":5,"q":"221B Baker Street, London"},"properties":{"bbox":{"allOf":[{"$ref":"#/components/schemas/PolygonGeometry"}],"description":"Restrict results to the bounding box of this Polygon geometry"},"boundary_gid":{"description":"Only return results inside the polygon of this way or relation (`osm:relation:{id}` or `osm:way:{id}`), such as an admin boundary from a geocoding result's `gid`. 404 when the GID has no polygon. PlazaQL: `boundary_gid:`.","example":"osm:relation:1124039","nullable":true,"type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code to restrict results","maxLength":2,"minLength":2,"nullable":true,"type":"string"},"dataset_name_field":{"description":"Dataset property matched against the query instead of the feature name (`properties.name`). Matching another property is not index-assisted, so the named datasets may hold at most 100,000 features in total (400 otherwise). PlazaQL: `dataset_name_field:`.","example":"title","nullable":true,"type":"string"},"datasets":{"description":"Also match features of these datasets: dataset slugs or ids, `plaza` (every Plaza-curated dataset) or `all` (those plus your own), as an array or a comma-separated string. Only Plaza datasets and your own can be named: any other dataset answers 404 `dataset not found`, the same as one that doesn't exist; a Plaza dataset that hasn't finished its first sync answers 400. Up to 20 explicit references. The query text (structured: the most specific component) is matched against each feature's name (`properties.name`, or the property `dataset_name_field` names), and against the full address of the datasets' addresses (features with `housenumber` and `street`, or their `addr:` forms). Matches rank alongside OSM results with `layer: \"dataset\"`, `dataset`, `dataset_id`, `feature_id`, `feature_type` and `dataset_properties`; an address has `feature_type: \"address\"` and its address fields; `bbox`, `boundary_gid`, `country_code` and `layers` filter them too. Queries shorter than 3 characters skip dataset matching; more than 50 datasets after keyword expansion is a 400. The request stays a standard request. PlazaQL: `datasets:`.","example":["census-places"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"focus":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Bias results toward this point"},"lang":{"description":"Preferred response language (ISO 639-1)","nullable":true,"type":"string"},"layer":{"description":"Alias of `layers`","nullable":true,"type":"string"},"layers":{"description":"Only return these result layers: `address` (addresses, streets, postal codes), `poi`, `admin` (neighbourhood up to country), `dataset` (matches from `datasets`), or single layers (`street`, `postalcode`, `neighbourhood`, `locality`, `county`, `region`, `country`). Comma-separated string or array. `layer` is accepted as an alias. PlazaQL: `layers:`.","example":"address,poi","oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"limit":{"default":20,"description":"Maximum number of results (default: 20, max: 100). Out-of-range values are a 400.","maximum":100,"minimum":1,"nullable":true,"type":"integer"},"q":{"description":"Address or place name to geocode","example":"221B Baker Street, London","type":"string"}},"required":["q"],"title":"GeocodeForwardRequest","type":"object"},"RouteIntersection":{"description":"An intersection on a step: the step's maneuver, then every routing vertex it passes where another road meets the route. Only roads that start or end at the vertex are seen.","properties":{"admin_index":{"description":"Index in the route's `admins` of the country of the road taken (the road arrived on, at an arrival). Absent when the country is unknown.","type":"integer"},"bearings":{"description":"Heading of each road leaving the intersection, degrees from north, sorted","items":{"type":"integer"},"type":"array"},"classes":{"description":"What applies to the road taken (absent when nothing does)","items":{"enum":["toll","ferry","restricted","motorway","tunnel"],"type":"string"},"type":"array"},"entry":{"description":"Parallel to `bearings`: whether the route could take that road (one-way, access and mode rules). The road arrived on is always false (U-turns are not offered).","items":{"type":"boolean"},"type":"array"},"geometry_index":{"description":"Index of the intersection in the leg's coordinates (the full route line)","type":"integer"},"in":{"description":"Index in `bearings` of the road arrived on (absent at departure)","type":"integer"},"is_urban":{"description":"The road taken lies in an urban area (the traffic model's urban density band, which also holds roads whose density is not computed yet)","type":"boolean"},"lanes":{"description":"Lanes of the road arrived on, when it has `turn:lanes` tags","items":{"$ref":"#/components/schemas/RouteLane"},"type":"array"},"location":{"description":"[lng, lat]","items":{"type":"number"},"type":"array"},"out":{"description":"Index in `bearings` of the road taken (absent at arrival)","type":"integer"},"rest_stop":{"description":"A motorway or trunk link leaving here runs into an OSM `highway=rest_area` or `highway=services` area","properties":{"name":{"type":"string"},"type":{"enum":["rest_area","service_area"],"type":"string"}},"required":["type"],"type":"object"},"toll_collection":{"description":"A toll point: an OSM `barrier=toll_booth` or `highway=toll_gantry` node. A toll point inside a road (not at a junction) is an intersection of its own, with the road arrived on and the road taken.","properties":{"name":{"type":"string"},"type":{"enum":["toll_booth","toll_gantry"],"type":"string"}},"required":["type"],"type":"object"},"tunnel_name":{"description":"OSM `tunnel:name` of a tunnel taken","type":"string"}},"required":["location","bearings","entry","geometry_index"],"title":"RouteIntersection","type":"object"},"ElevationProfileResult":{"description":"GeoJSON LineString Feature with 3D coordinates [lng, lat, elevation] representing the elevation profile along the input path. Summary statistics are in properties.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"3D LineString: each coordinate is [longitude, latitude, elevation_meters]"},"properties":{"description":"Elevation profile summary statistics","properties":{"avg_elevation_m":{"description":"Average elevation along the profile in meters","example":67.8,"type":"number"},"max_elevation_m":{"description":"Maximum elevation along the profile in meters","example":155.3,"type":"number"},"min_elevation_m":{"description":"Minimum elevation along the profile in meters","example":28.1,"type":"number"},"total_ascent_m":{"description":"Total cumulative elevation gain in meters","example":127.4,"type":"number"},"total_descent_m":{"description":"Total cumulative elevation loss in meters","example":89.2,"type":"number"}},"required":["total_ascent_m","total_descent_m","min_elevation_m","max_elevation_m","avg_elevation_m"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"ElevationProfileResult","type":"object"},"MultiPointGeometry":{"description":"GeoJSON MultiPoint geometry per RFC 7946. An array of positions.","properties":{"coordinates":{"description":"Array of [lng, lat] or [lng, lat, alt] positions","items":{"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"type":"array"},"type":{"enum":["MultiPoint"],"type":"string"}},"required":["type","coordinates"],"title":"MultiPointGeometry","type":"object"},"Error":{"description":"Standard API error envelope. Every error response wraps a single `error` object with a machine-readable `code`, a human-readable `message`, and optional structured `details`.","example":{"error":{"code":"invalid_request","message":"Missing required parameter: q"}},"properties":{"error":{"description":"Error payload","properties":{"code":{"description":"Machine-readable error code (e.g. `invalid_request`, `not_found`, `rate_limited`, `query_error`, `daily_limit_exceeded`)","example":"invalid_request","type":"string"},"details":{"additionalProperties":true,"description":"Structured details when available (e.g. field-level validation errors, rate limit metadata, billing info)","nullable":true,"type":"object"},"message":{"description":"Human-readable explanation of what went wrong","example":"Missing required parameter: q","type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"title":"Error","type":"object"},"Geometry":{"description":"GeoJSON Geometry object per RFC 7946. Discriminated union — the `type` field determines the coordinate structure.","discriminator":{"mapping":{"LineString":"#/components/schemas/LineStringGeometry","MultiLineString":"#/components/schemas/MultiLineStringGeometry","MultiPoint":"#/components/schemas/MultiPointGeometry","MultiPolygon":"#/components/schemas/MultiPolygonGeometry","Point":"#/components/schemas/PointGeometry","Polygon":"#/components/schemas/PolygonGeometry"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/PointGeometry"},{"$ref":"#/components/schemas/LineStringGeometry"},{"$ref":"#/components/schemas/PolygonGeometry"},{"$ref":"#/components/schemas/MultiPointGeometry"},{"$ref":"#/components/schemas/MultiLineStringGeometry"},{"$ref":"#/components/schemas/MultiPolygonGeometry"}],"title":"Geometry"},"BatchReverseGeocodeResult":{"description":"Batch reverse geocoding result. Each entry in `results` is the FeatureCollection for the input point at the same index. Order is preserved.","properties":{"count":{"description":"Number of points processed (always equals length of results)","type":"integer"},"results":{"description":"Array of FeatureCollections, one per input point. An empty FeatureCollection means nothing was found within `radius`.","items":{"$ref":"#/components/schemas/GeocodeResult"},"type":"array"}},"required":["results","count"],"title":"BatchReverseGeocodeResult","type":"object"},"DatasetUploadRequest":{"description":"Multipart upload request. Requires a GeoJSON file and a mode parameter.","properties":{"file":{"description":"GeoJSON file","format":"binary","type":"string"},"mode":{"description":"How to apply the upload: replace (overwrite), merge (upsert), append (add new)","enum":["replace","merge","append"],"type":"string"}},"required":["file","mode"],"title":"DatasetUploadRequest","type":"object"},"NearestRequest":{"description":"Request body for nearest-road-segment lookup. Snaps a point to the road network.","properties":{"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"geometry":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Point to snap to the road network"},"radius":{"default":500,"description":"Maximum search radius in meters (default: 500, 1-5000). Out-of-range values are a 400.","maximum":5000,"minimum":1,"nullable":true,"type":"integer"}},"required":["geometry"],"title":"NearestRequest","type":"object"},"DatasetField":{"description":"One property in a dataset's field dictionary.","properties":{"description":{"description":"What the field means","type":"string"},"nullable":{"description":"Whether some features lack a value","type":"boolean"},"source_field":{"description":"Field name in the upstream source","type":"string"},"type":{"description":"JSON type of the values (string, number, boolean, array, object, null)","type":"string"},"unit":{"description":"Unit of measure, if any","type":"string"}},"title":"DatasetField","type":"object"},"PointGeometry":{"description":"GeoJSON Point geometry per RFC 7946. Coordinates use [longitude, latitude] order. Optional third element is altitude in meters.","properties":{"coordinates":{"description":"[longitude, latitude] or [longitude, latitude, altitude]","example":[2.3522,48.8566],"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"type":{"enum":["Point"],"type":"string"}},"required":["type","coordinates"],"title":"PointGeometry","type":"object"},"PlazaQLQuery":{"description":"PlazaQL query request. The query is executed against Plaza's OSM database and results are returned as GeoJSON.","example":{"data":"search(node, amenity: \"cafe\").around(500, point(48.8566, 2.3522)).limit(20);"},"properties":{"data":{"description":"PlazaQL query string","example":"search(node, amenity: \"cafe\").around(500, point(48.8566, 2.3522)).limit(20);","type":"string"}},"required":["data"],"title":"PlazaQLQuery","type":"object"},"IsochroneRequest":{"description":"Request body for isochrone calculation. Computes areas reachable from a point within the given travel time(s). With `mode: transit` the area is walking plus public transit: a walking circle around the point and around every stop reached in time (with the time left, both capped at `max_walk_m`); it takes `depart_at`, the transit options (`wheelchair` included) and `pedestrian` (walking speed scales the circles), and refuses `arrive_by`, `truck`, `avoid_datasets`, `datasets`, `denoise` and `generalize`. Each transit contour's properties have `time_seconds`, `mode`, `stops_reached` and `area_m2`.","properties":{"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"contours_meters":{"description":"Distance budget(s) in meters along the roads, greater than 0 and at most 100000, instead of `time`: the area reachable within that road length on the roads the mode may use (one-way streets and access rules hold; speeds and traffic do not matter). A number returns one Feature; an array (or a comma-separated string) one contour per distinct value (at most 10). Properties carry `distance_m` (and `max_cost_m` for one Feature) instead of `time_seconds`. Not with `time`, and not with `mode: transit` (422). PlazaQL: `distance:`.","oneOf":[{"example":2000,"exclusiveMinimum":true,"maximum":100000,"minimum":0,"type":"number"},{"example":[1000,2000,3000],"items":{"exclusiveMinimum":true,"maximum":100000,"minimum":0,"type":"number"},"minItems":1,"type":"array"}]},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"denoise":{"default":0,"description":"Contour denoising level, 0-100 (default: 0). Applies when `time` or `contours_meters` has more than one value; out-of-range values are a 400.","maximum":100,"minimum":0,"type":"integer"},"depart_at":{"description":"Departure time, ISO 8601 or `now`. With `mode: transit` it is when the trip leaves (default `now`). With `mode: transit`, a timestamp with an offset (`Z`, `-04:00`) is an instant placed on the feed's time zone; one without an offset (`2026-03-16T08:00:00`) is wall-clock time at the feed; `now` (the default) is the current time. With `auto`, `truck`, `motorcycle` or `motor_scooter`, road times follow the hourly traffic profile of that local hour and weekday and conditional road limits apply then, as on POST /route; `now` is read on the civil clock at the point (its time zone, daylight saving included), as on POST /route. Walking and cycling times do not change. Without it, road isochrones are free-flow. A value that cannot be parsed is rejected with a 422. PlazaQL: `depart_at:`.","example":"2026-03-16T08:00:00-04:00","nullable":true,"type":"string"},"exclude":{"description":"Road types to leave out, as a comma-separated string (e.g. `toll,motorway,ferry`) or an array of strings: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. `cash_only_tolls` leaves out roads through a toll booth that takes only cash (`payment:cash=yes` with no other `payment:*=yes` on the `barrier=toll_booth` node); a booth without payment tags is not cash-only. Unknown values are rejected with 400.","oneOf":[{"example":"toll,motorway,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"fixed_speed":{"description":"Drive every road at this speed, km/h (1-252), whatever its class, speed limit, surface, grade or the traffic at `depart_at`; intersection delays still count. Wins over `top_speed`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `fixed_speed:`.","maximum":252,"minimum":1,"nullable":true,"type":"integer"},"generalize":{"default":0,"description":"Contour generalization tolerance in meters, 0-1000 (default: 0). Applies when `time` or `contours_meters` has more than one value; out-of-range values are a 400.","maximum":1000,"minimum":0,"type":"integer"},"geometry":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Origin point for isochrone calculation"},"max_transfers":{"default":3,"description":"`mode: transit` only. Most changes between vehicles (default 3, at most 4). PlazaQL: `max_transfers:`.","maximum":4,"minimum":0,"nullable":true,"type":"integer"},"max_walk_m":{"default":1000,"description":"`mode: transit` only. Longest walk in meters for each walking leg: to the first stop, between stops when transferring, and from the last stop (default 1000, at most 3000). Walking the whole way is offered when it is at most this far. PlazaQL: `max_walk_m:`.","maximum":3000,"minimum":0,"nullable":true,"type":"number"},"mode":{"default":"auto","description":"Travel mode (default: `auto`). `transit` walks and rides public transit over the GTFS feeds Plaza has loaded. `truck` avoids roads whose posted height, width, length, weight or axle-load limits the vehicle in `truck` exceeds (hazardous-material restrictions too when `truck.hazmat` is set), keeps to roads trucks may use, follows one-way streets, and times the trip at truck speeds. `motorcycle` and `motor_scooter` follow one-way streets like cars at their own speeds (a scooter at most 45 km/h unless `top_speed` is set) and keep to the roads they may use (no motorways for scooters); see the `motorcycle` and `motor_scooter` options. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","transit","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`, and for the walking legs of `mode: transit` (`walking_speed` sets every walk's time, footpaths between stops included; `wheelchair`, `max_hiking_difficulty` and access decide the ways walked to and from stops; the preferences choose the path drawn); omitted values take the defaults. Rejected with 422 with other modes.","nullable":true,"type":"object"},"time":{"description":"Travel time budget(s) in seconds, greater than 0 and at most 7200. A single number returns one Feature. An array returns one contour polygon per distinct value (at most 10; repeated values are merged). A comma-separated string such as `\"300,600,900\"` is also accepted for backward compatibility; it is legacy, so prefer a number or an array. Required unless `contours_meters` is given; not with it.","oneOf":[{"example":600,"exclusiveMinimum":true,"maximum":7200,"minimum":0,"type":"number"},{"example":[300,600,900],"items":{"exclusiveMinimum":true,"maximum":7200,"minimum":0,"type":"number"},"minItems":1,"type":"array"}]},"top_speed":{"description":"Highest speed the vehicle drives, km/h (10-252). Caps every road's speed and so lengthens `duration_s`. A `motor_scooter` rides at most 45 km/h without it; `top_speed` replaces that cap. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `top_speed:`.","maximum":252,"minimum":10,"nullable":true,"type":"integer"},"traffic_model":{"description":"How to apply the speed profile with `depart_at`, as on POST /route: `best_guess` (default), `pessimistic` (every road at 70% of free-flow speed or lower), `optimistic` (free-flow). Ignored without `depart_at`. PlazaQL: `traffic_model:`.","enum":["best_guess","optimistic","pessimistic"],"nullable":true,"type":"string"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"},"use_bus":{"default":1,"description":"`mode: transit` only. Preference for Bus (bus, trolleybus, coach), 0 to 1 (default 1). 0 never rides it; lower values count its in-vehicle time `1 + 2 * (1 - value)` times when choosing between the journeys found (the fastest journey for each number of vehicles).","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_rail":{"default":1,"description":"`mode: transit` only. Preference for Rail (tram, subway, rail, monorail, cable car, funicular), 0 to 1 (default 1). 0 never rides it; lower values count its in-vehicle time `1 + 2 * (1 - value)` times when choosing between the journeys found (the fastest journey for each number of vehicles).","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_transfers":{"default":1,"description":"`mode: transit` only. Willingness to change vehicles, 0 to 1 (default 1). 0 allows no transfer (as `max_transfers: 0`); lower values add `600 * (1 - use_transfers)` seconds per transfer when choosing between the journeys found. PlazaQL: `use_transfers:`.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"wheelchair":{"default":false,"description":"`mode: transit` only. Ride only trips the feed marks `wheelchair_accessible` 1, boarding and leaving vehicles only at stops marked `wheelchair_boarding` 1 (a platform with no value takes its station's). Unknown counts as not accessible. Walking legs to and from stops also become step-free (`pedestrian.wheelchair`). Transfers between stops use footpaths measured at import with the default walking rules, so a transfer walk may include steps. With another mode, `true` is a 422 (walking routes take `pedestrian.wheelchair`). PlazaQL: `wheelchair:`.","nullable":true,"type":"boolean"}},"required":["geometry"],"title":"IsochroneRequest","type":"object"},"MotorcycleParameters":{"description":"Rider options for `mode: motorcycle`. Values out of range, and unknown options, are rejected with 422. `use_trails` decides whether tracks are ridden at all; `style`, `use_trails`, `use_curves` and `lane_splitting` otherwise only change which way the route goes (they are not added to `duration_s`). Motorcycles keep off ways closed by `motorcycle`, `motor_vehicle` or `vehicle` (else `access`).","example":{"style":"adventure","use_curves":1},"properties":{"lane_splitting":{"default":false,"description":"Whether the rider filters between lanes of queued traffic (default: false). Legal only in some places (California, much of Europe and Asia), so it is the rider's choice. With `depart_at`, urban motorways, trunk and primary roads with at least two lanes each way count half the slowdown the hour's traffic profile gives them, so the route may take them through rush hour; `duration_s` still reports car traffic time. Does nothing without `depart_at` or with `fixed_speed`.","type":"boolean"},"style":{"default":"touring","description":"Riding style (default: `touring`). `touring` favours paved main roads and avoids service roads, tracks and rough surfaces; `adventure` avoids motorways and trunk roads, minds gravel and dirt less, and likes unpaved tracks and curvy roads.","enum":["touring","adventure"],"type":"string"},"use_curves":{"description":"0 to 1 (default: 0.5 for `touring`, 0.8 for `adventure`). Above 0.5 curvy roads (length well above the straight-line distance between their ends) are preferred, below 0.5 avoided.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_trails":{"description":"0 to 1 (default: 0 for `touring`, 0.5 for `adventure`). 0 keeps to roads; above 0 tracks (`highway=track`) are ridden, more readily the higher the value.","maximum":1,"minimum":0,"nullable":true,"type":"number"}},"title":"MotorcycleParameters","type":"object"},"BannerText":{"properties":{"components":{"items":{"$ref":"#/components/schemas/BannerComponent"},"type":"array"},"modifier":{"description":"Maneuver modifier (primary only)","type":"string"},"text":{"description":"The whole line","type":"string"},"type":{"description":"Maneuver type (primary only)","type":"string"}},"required":["text","components"],"title":"BannerText","type":"object"},"OptimizeRequest":{"description":"Route optimization request for one vehicle. Finds the fastest order to visit 2 to 50 waypoints (traveling salesman), optionally with time windows, service times and a capacity. More than 10 waypoints are processed asynchronously.","example":{"roundtrip":false,"waypoints":{"coordinates":[[2.3522,48.8566],[2.3376,48.8606],[2.2945,48.8584]],"type":"MultiPoint"}},"properties":{"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"capacity":{"description":"Capacity of the single vehicle, with `demands`. Deliveries or pickups that add up to more than one vehicle carries are refused with 422 `infeasible`: there is one vehicle and one trip.","example":10,"exclusiveMinimum":true,"minimum":0,"type":"number"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"demands":{"description":"One number per waypoint, with `capacity`: positive is delivered at the stop (loaded at the start), negative is picked up there. Must be 0 for the first waypoint. The vehicle's load may never exceed `capacity`.","example":[0,4,-2],"items":{"type":"number"},"type":"array"},"depart_at":{"description":"Departure time, ISO 8601 with an offset, or `\"now\"`: the clock that ISO time windows are read against, and that `arrival_at` (UTC) is given in. Alone it keeps the plain traveling-salesman order and adds `arrival_at` per stop. Travel times are free-flow either way.","type":"string"},"exclude":{"description":"Road types to avoid, as a comma-separated string or an array: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. Unknown values are rejected with 400.","oneOf":[{"example":"toll,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"mode":{"description":"Travel mode of the tour (default: `auto`). `truck` keeps to roads the vehicle in `truck` fits and may use, at truck speeds; `motorcycle` and `motor_scooter` keep to the roads they may use (no motorways for scooters) at their own speeds. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`; omitted values take the defaults. Rejected with 422 without `mode: foot`.","nullable":true,"type":"object"},"roundtrip":{"default":true,"description":"Whether the route should return to the starting waypoint (default: true)","type":"boolean"},"service_s":{"description":"Seconds spent at each stop: one number for every stop, or one per waypoint. The first waypoint has none.","example":300,"oneOf":[{"maximum":86400,"minimum":0,"type":"number"},{"items":{"maximum":86400,"minimum":0,"type":"number"},"type":"array"}]},"time_windows":{"description":"One entry per waypoint: `[start, end]`, or `null` (or `\"\"`) for none. Bounds are seconds after departure, or ISO 8601 times when `depart_at` is set. Service at a stop must start inside its window; a vehicle that arrives early waits. The first waypoint's window is when the vehicle may leave it and, on a round trip, must be back. No order that meets every window is a 422 `infeasible`.","example":[null,[0,3600],[1800,5400]],"items":{"oneOf":[{"items":{"oneOf":[{"maximum":604800,"minimum":0,"type":"number"},{"format":"date-time","type":"string"}]},"maxItems":2,"minItems":2,"type":"array"},{"maxLength":0,"nullable":true,"type":"string"}]},"type":"array"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"},"waypoints":{"allOf":[{"$ref":"#/components/schemas/MultiPointGeometry"},{"properties":{"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"maxItems":50,"minItems":2,"type":"array"}},"type":"object"}],"description":"Waypoints to visit in optimized order as a GeoJSON MultiPoint (2-50 points)"}},"required":["waypoints"],"title":"OptimizeRequest","type":"object"},"OutputOptions":{"description":"Response shaping options that control geometry processing, property filtering, and result ordering.\n\n**GET requests**: Pass as `output[key]=value` query parameters (e.g. `output[precision]=5&output[fields]=name,cuisine`).\n**POST requests**: Pass as a nested `output` object in the JSON body.\n","properties":{"buffer":{"description":"Expand geometries outward by the given distance in meters","exclusiveMinimum":true,"maximum":100000,"minimum":0,"type":"number"},"centroid":{"default":false,"description":"Replace each feature's geometry with its centroid point. Useful for clustering or when only locations are needed.","type":"boolean"},"fields":{"description":"Tag fields to include in properties. Omit or pass `*` for all tags. Comma-separated string or JSON array.","oneOf":[{"example":"name,cuisine,opening_hours","type":"string"},{"example":["name","cuisine"],"items":{"type":"string"},"type":"array"}]},"geometry":{"default":true,"description":"Include geometry in responses. Set to `false` to return properties only (smaller payloads for attribute queries).","type":"boolean"},"include":{"description":"Extra computed fields to add to each feature: `bbox` (bounding box), `distance` (`distance_m` from the `around` point; without `around` the request is a 400), `center` (`center_lat`/`center_lng`). PlazaQL: `.include(\"bbox\", \"center\", \"distance\")`.","oneOf":[{"example":"bbox,distance","type":"string"},{"items":{"enum":["bbox","distance","center"],"type":"string"},"type":"array"}]},"precision":{"default":7,"description":"Round coordinates to N decimal places. 7 digits ≈ 1cm accuracy. Fewer digits = smaller payloads.","maximum":15,"minimum":1,"type":"integer"},"simplify":{"description":"Simplify geometries using Douglas-Peucker algorithm with the given tolerance in meters. Useful for reducing response size at lower zoom levels.","example":10.0,"exclusiveMinimum":true,"maximum":10000,"minimum":0,"type":"number"},"sort":{"description":"Sort results by the given field. `distance` needs an `around` point (a 400 without one). `qt` orders by quadtile (H3 cell) for spatial locality. On `POST /features` OSM searches without `datasets`, `name` and `distance` are not applied yet and results stay in `osm_id` order. PlazaQL: `.sort(by: :osm_id | :name | :distance | :qt)`.","enum":["distance","name","osm_id","qt"],"type":"string"}},"title":"OutputOptions","type":"object"},"RouteLeg":{"description":"The route between two consecutive stops (`steps: true`).","properties":{"annotations":{"description":"With `annotations: true`: one entry per pair of consecutive coordinates of the leg's line","properties":{"congestion":{"description":"`congestion_numeric` as a level: low (under 40), moderate (40-59), heavy (60-79), severe (80 and up), unknown without a profile","items":{"enum":["low","moderate","heavy","severe","unknown"],"type":"string"},"type":"array"},"congestion_numeric":{"description":"How far the traffic profile slows the road below free flow, 0 (free flow) to 100; null without a profile","items":{"maximum":100,"minimum":0,"nullable":true,"type":"integer"},"type":"array"},"current_speed_kmh":{"description":"The speed under the time-of-day traffic profile at `depart_at`, km/h (cars, motorcycles, scooters and trucks; null without `depart_at`). Modelled, not live traffic.","items":{"nullable":true,"type":"number"},"type":"array"},"distance_m":{"items":{"type":"number"},"type":"array"},"duration_s":{"items":{"type":"number"},"type":"array"},"freeflow_speed_kmh":{"description":"The mode's speed on the road without traffic or intersection delays, km/h","items":{"nullable":true,"type":"number"},"type":"array"},"maxspeed":{"items":{"description":"`{speed, unit}` from the OSM `maxspeed` tag (in mph when the tag is), or `{unknown: true}`","properties":{"speed":{"type":"number"},"unit":{"enum":["km/h","mph"],"type":"string"},"unknown":{"type":"boolean"}},"type":"object"},"type":"array"},"road_class":{"description":"OSM `highway` value","items":{"nullable":true,"type":"string"},"type":"array"},"speed_ms":{"items":{"type":"number"},"type":"array"}},"type":"object"},"distance_m":{"type":"number"},"duration_s":{"type":"number"},"summary":{"description":"The two roads used longest, in route order","example":"Main Street, Oak Avenue","type":"string"},"weight":{"description":"Routing cost of the leg (its duration)","type":"number"}},"required":["distance_m","duration_s","weight","summary"],"title":"RouteLeg","type":"object"},"DatasetCreateRequest":{"description":"Request body to create a new dataset.","properties":{"attribution":{"description":"Required attribution text","nullable":true,"type":"string"},"description":{"description":"Dataset description","nullable":true,"type":"string"},"license":{"description":"License identifier (e.g. CC-BY-4.0)","nullable":true,"type":"string"},"name":{"description":"Human-readable dataset name","example":"NYC Bike Lanes","type":"string"},"slug":{"description":"URL-friendly identifier (lowercase, hyphens, no spaces)","example":"nyc-bike-lanes","pattern":"^[a-z0-9-]+$","type":"string"},"source_url":{"description":"Source data URL","format":"uri","nullable":true,"type":"string"},"strict_mode":{"description":"Fail a load on any invalid feature (default true); false skips invalid features and reports them","nullable":true,"type":"boolean"}},"required":["name","slug"],"title":"DatasetCreateRequest","type":"object"},"MapMatchRequest":{"description":"GPS trace to snap to the road network. Provide a GeoJSON LineString geometry representing the GPS trace.","example":{"geometry":{"coordinates":[[2.3522,48.8566],[2.353,48.857],[2.354,48.8575]],"type":"LineString"}},"properties":{"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"exclude":{"description":"Road types the trace is never matched to, as a comma-separated string or an array: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. Unknown values are rejected with 400.","oneOf":[{"example":"toll,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"geometry":{"allOf":[{"$ref":"#/components/schemas/LineStringGeometry"}],"description":"GPS trace as a GeoJSON LineString"},"mode":{"description":"Match only to roads this travel mode may use. Without `mode` the trace matches any road. `truck` keeps to roads the vehicle in `truck` fits and may use, at truck speeds; `motorcycle` and `motor_scooter` keep to the roads they may use (no motorways for scooters) at their own speeds. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`; omitted values take the defaults. Rejected with 422 without `mode: foot`.","nullable":true,"type":"object"},"radiuses":{"description":"Search radius per coordinate in meters (default: 50 for every point). A shorter list is padded with 50, extra entries are ignored, and entries that are not positive numbers use 50.","items":{"minimum":0,"type":"number"},"nullable":true,"type":"array"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"}},"required":["geometry"],"title":"MapMatchRequest","type":"object"},"DatasetFeatureResponse":{"description":"A GeoJSON Feature from a custom dataset.","properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"id":{"description":"Composite ID (dataset_id/feature_id)","type":"string"},"properties":{"additionalProperties":true,"description":"Feature properties including @type, @id, @dataset metadata","type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","id","geometry","properties"],"title":"DatasetFeatureResponse","type":"object"},"MatrixResult":{"additionalProperties":true,"description":"Distance matrix result. The exact response shape depends on the routing backend. Contains duration (and optionally distance) data for all origin-destination pairs. Null values indicate unreachable pairs.","title":"MatrixResult","type":"object"},"RouteLane":{"description":"One lane of the road arriving at an intersection, from its OSM `turn:lanes` tag, left to right.","properties":{"active":{"description":"The lane is recommended (same as `valid`)","type":"boolean"},"indications":{"description":"Turn arrows painted on the lane (`none`: unmarked)","items":{"enum":["straight","left","right","slight_left","slight_right","sharp_left","sharp_right","uturn","none"],"type":"string"},"type":"array"},"valid":{"description":"The lane can be used for the route's turn","type":"boolean"},"valid_indication":{"description":"Which of `indications` the route follows (only on valid lanes)","type":"string"}},"required":["indications","valid","active"],"title":"RouteLane","type":"object"},"IsochroneResult":{"description":"GeoJSON FeatureCollection of isochrone polygons — areas reachable within the specified travel time(s) or distance(s). Each Feature is a Polygon contour with its budget (`time_seconds`, or `distance_m` for `contours_meters`) and area metadata in properties.","properties":{"features":{"description":"Array of isochrone polygon Features, one per contour","items":{"$ref":"#/components/schemas/GeoJsonFeature"},"type":"array"},"type":{"description":"Always `FeatureCollection`","enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"IsochroneResult","type":"object"},"CentroidLocationCost":{"description":"Travel from one input location to the meeting point.","properties":{"distance_m":{"description":"Travel distance in meters","type":"number"},"duration_s":{"description":"Travel time in seconds","type":"number"},"location_index":{"description":"Index of the location in the request's `locations`","type":"integer"}},"required":["location_index","duration_s","distance_m"],"title":"CentroidLocationCost","type":"object"},"GeocodeReverseRequest":{"description":"Request body for reverse geocoding. Converts coordinates to addresses or place names.","properties":{"datasets":{"description":"Datasets to look up at the point: dataset slugs or ids, `plaza` (every Plaza-curated dataset) or `all` (those plus your own), as an array or a comma-separated string. Only Plaza datasets and your own can be named: any other dataset answers 404 `dataset not found`, the same as one that doesn't exist; a Plaza dataset that hasn't finished its first sync answers 400. Up to 20 explicit references. Adds `properties.datasets` to every result: per dataset, each polygon containing the point (`match: \"contains\"`) and the nearest point or line feature within `radius` (`match: \"nearest\"`). The datasets' addresses within `radius` rank with the OSM results by distance (`layer: \"dataset\"`, `feature_type: \"address\"`), so a nearer dataset address comes first and a point with only a dataset address nearby answers 200 with it; `layer: poi` leaves them out. PlazaQL: `reverse_geocode(point, datasets: [...])`.","example":["census-tracts"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"geometry":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Point to reverse geocode"},"include":{"description":"Extra data to attach to each result. `\"census\"` adds `properties.census`: the US Census state, county, tract, block group, ZCTA, place, CBSA and congressional district containing the point. Accepts a string (comma-separated) or an array. PlazaQL: `reverse_geocode(point, include: \"census\")`.","example":"census","nullable":true,"oneOf":[{"enum":["census"],"type":"string"},{"items":{"enum":["census"],"type":"string"},"type":"array"}]},"lang":{"description":"Preferred response language (ISO 639-1)","nullable":true,"type":"string"},"layer":{"description":"Filter by result layer (e.g. `address`, `place`, `poi`)","nullable":true,"type":"string"},"limit":{"default":1,"description":"Maximum number of results (default: 1, max: 20). Out-of-range values are a 400.","maximum":20,"minimum":1,"nullable":true,"type":"integer"},"radius":{"default":200,"description":"Search radius in meters (default: 200, 1-5000). Out-of-range values are a 400.","maximum":5000,"minimum":1,"nullable":true,"type":"integer"}},"required":["geometry"],"title":"GeocodeReverseRequest","type":"object"},"DatasetUpdateRequest":{"description":"Request body to update a dataset. All fields are optional.","properties":{"description":{"description":"Dataset description","nullable":true,"type":"string"},"name":{"description":"Human-readable dataset name","nullable":true,"type":"string"},"strict_mode":{"description":"Fail a load on any invalid feature; false skips invalid features and reports them","nullable":true,"type":"boolean"}},"title":"DatasetUpdateRequest","type":"object"},"ValidationError":{"description":"Validation error with per-field details. The `details` object maps field names to arrays of error messages.","properties":{"error":{"properties":{"code":{"description":"Always `validation_failed`","enum":["validation_failed"],"type":"string"},"details":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Map of field names to error message arrays","example":{"name":["can't be blank"],"slug":["has already been taken"]},"nullable":true,"type":"object"},"message":{"description":"Human-readable summary","type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"title":"ValidationError","type":"object"},"MatrixRequest":{"description":"Request body for distance matrix calculation. Computes travel durations (and optionally distances) between every origin-destination pair. Maximum 2,500 pairs (origins × destinations), so one list can hold up to 2,500 points when the other has a single point.","example":{"destinations":[{"coordinates":[2.2945,48.8584],"type":"Point"}],"mode":"auto","origins":[{"coordinates":[2.3522,48.8566],"type":"Point"},{"coordinates":[2.3376,48.8606],"type":"Point"}]},"properties":{"annotations":{"default":"duration","description":"Comma-separated list of annotations to include: `duration` (always included), `distance`. `duration_s` is travel time in seconds on the fastest route; `distance_m` is that route's road length in meters (straight-line for pairs estimated with `fallback_speed`). Unknown names are rejected with 400. Example: `duration,distance`.","type":"string"},"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"country_crossing_cost":{"description":"Seconds added for each country border crossed (a `barrier=border_control` node, or roads of two countries meeting) (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `country_crossing_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"depart_at":{"description":"Departure time, ISO 8601 or `now`. With `auto`, `truck`, `motorcycle` or `motor_scooter`, durations follow the hourly traffic profile of that local hour and weekday and conditional road limits apply then, as on POST /route; `now` is read on the civil clock at the first origin (its time zone, daylight saving included), as on POST /route. Walking and cycling durations do not change. Without it, durations are free-flow. A value that cannot be parsed is rejected with a 422. PlazaQL: `depart_at:`.","example":"2026-03-16T08:00:00-04:00","nullable":true,"type":"string"},"destinations":{"description":"Array of destination coordinates as GeoJSON Points (at least 1; origins × destinations is capped at 2,500 pairs)","items":{"$ref":"#/components/schemas/PointGeometry"},"maxItems":2500,"minItems":1,"type":"array"},"exclude":{"description":"Road types to leave out, as a comma-separated string (e.g. `toll,motorway,ferry`) or an array of strings: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. `cash_only_tolls` leaves out roads through a toll booth that takes only cash (`payment:cash=yes` with no other `payment:*=yes` on the `barrier=toll_booth` node); a booth without payment tags is not cash-only. Unknown values are rejected with 400.","oneOf":[{"example":"toll,motorway,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"fallback_speed":{"description":"Fallback speed in km/h for pairs where no route exists. When set, unreachable pairs get estimated values instead of null.","exclusiveMinimum":true,"minimum":0,"nullable":true,"type":"number"},"fixed_speed":{"description":"Drive every road at this speed, km/h (1-252), whatever its class, speed limit, surface, grade or the traffic at `depart_at`; intersection delays still count. Wins over `top_speed`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `fixed_speed:`.","maximum":252,"minimum":1,"nullable":true,"type":"integer"},"gate_cost":{"description":"Seconds added for each gate passed (`barrier=gate`, `lift_gate`, `swing_gate`, `sliding_gate`, `hampshire_gate`, unless tagged `access=yes`, `permissive`, `designated` or `public`). Cars, trucks, motorcycles and scooters already avoid such gates with a 300 s penalty on routes; this adds to it (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `gate_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"maneuver_penalty":{"description":"Seconds added for each point where the route arrives at a junction delay recorded by the traffic model (intersections, and signals, stop signs or crossings where two roads meet), so routes with fewer of them win. It counts junctions, not road segments (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `maneuver_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"mode":{"default":"auto","description":"Travel mode (default: `auto`). `truck` avoids roads whose posted height, width, length, weight or axle-load limits the vehicle in `truck` exceeds (hazardous-material restrictions too when `truck.hazmat` is set), keeps to roads trucks may use, follows one-way streets, and times the trip at truck speeds. `motorcycle` and `motor_scooter` follow one-way streets like cars at their own speeds (a scooter at most 45 km/h unless `top_speed` is set) and keep to the roads they may use (no motorways for scooters); see the `motorcycle` and `motor_scooter` options. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"origins":{"description":"Array of origin coordinates as GeoJSON Points (at least 1)","items":{"$ref":"#/components/schemas/PointGeometry"},"maxItems":2500,"minItems":1,"type":"array"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`; omitted values take the defaults. Rejected with 422 without `mode: foot`.","nullable":true,"type":"object"},"service_penalty":{"description":"Seconds added for each service road (`highway=service`) entered from a road of another class, once however many junctions it passes (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `service_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"shortest":{"default":false,"description":"Minimise distance instead of travel time (time only breaks ties). `duration_s` is still the travel time of the route found. Turn costs (see `POST /route`) do not apply. Cannot be combined with the `use_*` or penalty options (422). Every mode. PlazaQL: `shortest:`.","nullable":true,"type":"boolean"},"toll_booth_cost":{"description":"Seconds added for each toll booth (`barrier=toll_booth`) passed. A booth's 15 s stop is already part of `duration_s` (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `toll_booth_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"top_speed":{"description":"Highest speed the vehicle drives, km/h (10-252). Caps every road's speed and so lengthens `duration_s`. A `motor_scooter` rides at most 45 km/h without it; `top_speed` replaces that cap. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `top_speed:`.","maximum":252,"minimum":10,"nullable":true,"type":"integer"},"traffic_model":{"description":"How to apply the speed profile with `depart_at`, as on POST /route: `best_guess` (default), `pessimistic` (every road at 70% of free-flow speed or lower), `optimistic` (free-flow). Ignored without `depart_at`. PlazaQL: `traffic_model:`.","enum":["best_guess","optimistic","pessimistic"],"nullable":true,"type":"string"},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"},"use_ferries":{"description":"How much to use ferries (`route=ferry`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_highways":{"description":"How much to use motorways and trunk roads with their links, 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_living_streets":{"description":"How much to use living streets (`highway=living_street`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 5.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_tolls":{"description":"How much to use toll roads (`toll=yes`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_tracks":{"description":"How much to use tracks (`highway=track`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 15.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `foot` and `bicycle`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"}},"required":["origins","destinations"],"title":"MatrixRequest","type":"object"},"MapMatchTracepointFeature":{"description":"GeoJSON Point Feature representing a GPS point snapped to the road network.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Snapped point on the road as a GeoJSON Point"},"properties":{"properties":{"distance_m":{"description":"Distance from the original GPS point to the snapped point in meters","type":"number"},"edge_id":{"description":"Road edge ID the point was snapped to","type":"integer"},"matchings_index":{"description":"Index into the `matchings` array indicating which matching sub-route this point belongs to","type":"integer"},"name":{"description":"Road name at the snapped point","nullable":true,"type":"string"},"original":{"description":"Original GPS coordinate as [lng, lat]","items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"waypoint_index":{"description":"Index of this tracepoint in the original `coordinates` array","type":"integer"}},"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"MapMatchTracepointFeature","type":"object"},"DatasetList":{"description":"List of datasets visible to the authenticated user.","properties":{"datasets":{"description":"Array of dataset metadata objects","items":{"$ref":"#/components/schemas/DatasetResponse"},"type":"array"}},"required":["datasets"],"title":"DatasetList","type":"object"},"MultiPolygonGeometry":{"description":"GeoJSON MultiPolygon geometry per RFC 7946. An array of Polygon coordinate arrays.","properties":{"coordinates":{"description":"Array of Polygon coordinate arrays","items":{"items":{"items":{"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"minItems":4,"type":"array"},"minItems":1,"type":"array"},"type":"array"},"type":{"enum":["MultiPolygon"],"type":"string"}},"required":["type","coordinates"],"title":"MultiPolygonGeometry","type":"object"},"GeocodeStructuredRequest":{"description":"Request body for structured geocoding. Each field is one pre-parsed address component; no free-text parsing happens. At least one of `address`, `locality`, `region` or `postalcode` is required.","example":{"address":"1600 Pennsylvania Avenue NW","country":"US","locality":"Washington","postalcode":"20500","region":"DC"},"properties":{"address":{"description":"House number and street (`1600 Pennsylvania Ave` or `Rue de Rivoli 99`). Without a number it is matched as a street.","example":"1600 Pennsylvania Avenue NW","nullable":true,"type":"string"},"bbox":{"allOf":[{"$ref":"#/components/schemas/PolygonGeometry"}],"description":"Restrict results to the bounding box of this Polygon geometry"},"boundary_gid":{"description":"Only return results inside the polygon of this way or relation (`osm:relation:{id}` or `osm:way:{id}`), such as an admin boundary from a geocoding result's `gid`. 404 when the GID has no polygon. PlazaQL: `boundary_gid:`.","example":"osm:relation:1124039","nullable":true,"type":"string"},"country":{"description":"Country, as an ISO 3166-1 alpha-2 code (`US`) or a name","example":"US","nullable":true,"type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 code. Only return results in this country, at every fallback step (unlike `country`, which is one of the components to match).","maxLength":2,"minLength":2,"nullable":true,"type":"string"},"county":{"description":"County or district","example":"District of Columbia","nullable":true,"type":"string"},"dataset_name_field":{"description":"Dataset property matched against the query instead of the feature name (`properties.name`). Matching another property is not index-assisted, so the named datasets may hold at most 100,000 features in total (400 otherwise). PlazaQL: `dataset_name_field:`.","example":"title","nullable":true,"type":"string"},"datasets":{"description":"Also match features of these datasets: dataset slugs or ids, `plaza` (every Plaza-curated dataset) or `all` (those plus your own), as an array or a comma-separated string. Only Plaza datasets and your own can be named: any other dataset answers 404 `dataset not found`, the same as one that doesn't exist; a Plaza dataset that hasn't finished its first sync answers 400. Up to 20 explicit references. The query text (structured: the most specific component) is matched against each feature's name (`properties.name`, or the property `dataset_name_field` names), and against the full address of the datasets' addresses (features with `housenumber` and `street`, or their `addr:` forms). Matches rank alongside OSM results with `layer: \"dataset\"`, `dataset`, `dataset_id`, `feature_id`, `feature_type` and `dataset_properties`; an address has `feature_type: \"address\"` and its address fields; `bbox`, `boundary_gid`, `country_code` and `layers` filter them too. Queries shorter than 3 characters skip dataset matching; more than 50 datasets after keyword expansion is a 400. The request stays a standard request. PlazaQL: `datasets:`.","example":["census-places"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"focus":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Bias results toward this point"},"lang":{"description":"Preferred response language (ISO 639-1)","nullable":true,"type":"string"},"layer":{"description":"Alias of `layers`","nullable":true,"type":"string"},"layers":{"description":"Only return these result layers: `address` (addresses, streets, postal codes), `poi`, `admin` (neighbourhood up to country), `dataset` (matches from `datasets`), or single layers (`street`, `postalcode`, `neighbourhood`, `locality`, `county`, `region`, `country`). Comma-separated string or array. `layer` is accepted as an alias. PlazaQL: `layers:`.","example":"address,poi","oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"limit":{"default":10,"description":"Maximum number of results (default: 10, max: 50). Out-of-range values are a 400.","maximum":50,"minimum":1,"nullable":true,"type":"integer"},"locality":{"description":"City, town or village","example":"Washington","nullable":true,"type":"string"},"neighbourhood":{"description":"Neighbourhood or suburb","example":"Downtown","nullable":true,"type":"string"},"postalcode":{"description":"Postal or ZIP code (spaces and case ignored)","example":"20500","nullable":true,"type":"string"},"region":{"description":"State, province or region","example":"DC","nullable":true,"type":"string"}},"title":"GeocodeStructuredRequest","type":"object"},"VoiceInstruction":{"description":"A spoken announcement for the maneuver at the end of the step.","properties":{"announcement":{"description":"Plain text for text-to-speech","example":"In 500 m, turn left onto Oak Avenue","type":"string"},"distance_along_geometry_m":{"description":"Announce this far before the end of the step (the maneuver), in metres. Sorted farthest first.","type":"number"},"ssml_announcement":{"description":"The same in SSML, street names marked as addresses","example":"<speak>In 500 m, turn left onto <say-as interpret-as=\"address\">Oak Avenue</say-as></speak>","type":"string"}},"required":["distance_along_geometry_m","announcement","ssml_announcement"],"title":"VoiceInstruction","type":"object"},"BannerInstruction":{"description":"What a navigation banner shows for the maneuver at the end of the step.","properties":{"distance_along_geometry_m":{"description":"Show this far before the maneuver, in metres (the whole step)","type":"number"},"primary":{"allOf":[{"$ref":"#/components/schemas/BannerText"}],"description":"The road after the maneuver (name, then its ref as an `icon`), or the instruction for an unnamed road"},"secondary":{"allOf":[{"$ref":"#/components/schemas/BannerText"}],"description":"Signposted destinations (OSM `destination:ref` / `destination`), when tagged"},"sub":{"allOf":[{"$ref":"#/components/schemas/BannerText"}],"description":"The lanes at the maneuver as `lane` components, when tagged"}},"required":["distance_along_geometry_m","primary"],"title":"BannerInstruction","type":"object"},"ElevationLookupRequest":{"description":"Request body for elevation lookup. Accepts a single Point or a MultiPoint geometry of up to 50 points.","properties":{"geometry":{"description":"Point or MultiPoint geometry to look up elevations for (a MultiPoint holds at most 50 points)","oneOf":[{"$ref":"#/components/schemas/PointGeometry"},{"$ref":"#/components/schemas/MultiPointGeometry"}]}},"required":["geometry"],"title":"ElevationLookupRequest","type":"object"},"TruckParameters":{"description":"Truck dimensions and load for `mode: truck`. Defaults match a standard US semi-trailer. Values out of range are rejected with 422. Edges whose OSM `maxheight`, `maxwidth`, `maxlength`, `maxweight` or `maxaxleload` is below the vehicle's are not used.","example":{"hazmat":true,"height":4.0,"weight":30},"properties":{"axle_count":{"description":"Number of axles, 2 to 20 (used to estimate the axle load)","maximum":20,"minimum":2,"nullable":true,"type":"integer"},"axle_load":{"description":"Heaviest axle load in metric tonnes, greater than 0 and at most 50. Without it, `weight / axle_count` is checked when `axle_count` is set; with neither, axle-load limits are not checked.","exclusiveMinimum":true,"maximum":50,"minimum":0,"nullable":true,"type":"number"},"hazmat":{"default":false,"description":"Carrying hazardous materials (default: false). Avoids roads tagged `hazmat=no` or `no` on any hazmat class (`hazmat:water`, `hazmat:explosive`, `hazmat:B`, ...; the load's class is not asked, so every class counts) and tunnels in ADR category B to E (`hazmat:adr_tunnel_cat`). A tunnel without those tags is not avoided.","type":"boolean"},"height":{"default":4.11,"description":"Vehicle height in metres, greater than 0 and at most 10 (default: 4.11)","exclusiveMinimum":true,"maximum":10,"minimum":0,"type":"number"},"length":{"default":21.64,"description":"Vehicle length in metres, greater than 0 and at most 60 (default: 21.64)","exclusiveMinimum":true,"maximum":60,"minimum":0,"type":"number"},"weight":{"default":21.77,"description":"Gross vehicle weight in metric tonnes, greater than 0 and at most 200 (default: 21.77)","exclusiveMinimum":true,"maximum":200,"minimum":0,"type":"number"},"width":{"default":2.6,"description":"Vehicle width in metres, greater than 0 and at most 10 (default: 2.6)","exclusiveMinimum":true,"maximum":10,"minimum":0,"type":"number"}},"title":"TruckParameters","type":"object"},"OptimizeProcessingResult":{"description":"Async optimization in progress. Poll `GET /api/v1/optimize/{job_id}` until the status changes to `completed` or `failed`.","properties":{"job_id":{"description":"Job ID for polling the result","example":"opt_abc123","type":"string"},"status":{"description":"Always `processing`","enum":["processing"],"type":"string"}},"required":["status","job_id"],"title":"OptimizeProcessingResult","type":"object"},"ElevationProfileRequest":{"description":"Request body for elevation profile along a path. Provide a GeoJSON LineString geometry defining the path.","example":{"geometry":{"coordinates":[[2.3522,48.8566],[2.34,48.858],[2.2945,48.8584]],"type":"LineString"}},"properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/LineStringGeometry"},{"properties":{"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"maxItems":50,"minItems":2,"type":"array"}},"type":"object"}],"description":"Path as a GeoJSON LineString (2-50 points)"}},"required":["geometry"],"title":"ElevationProfileRequest","type":"object"},"RouteWaypoint":{"description":"A stop of the route as snapped to the road network.","properties":{"distance_m":{"description":"Distance from the requested point to the snapped one (absent for EV routes, whose legs include charging stops)","type":"number"},"location":{"description":"Snapped [lng, lat]","items":{"type":"number"},"type":"array"},"name":{"description":"Street at the snapped point","nullable":true,"type":"string"}},"required":["name","location"],"title":"RouteWaypoint","type":"object"},"ExpansionResult":{"description":"GeoJSON FeatureCollection of the road edges the router settled, one LineString Feature per edge. Edges on the computed path come first, then the rest in the order they were settled. At most 50,000 edges and 10 MB of geometry are returned; `properties.truncated` is true when edges were cut.","properties":{"features":{"description":"One Feature per edge. `properties` holds the requested `expansion_properties` plus `on_path` (true for edges on the route, or on any origin-destination path for `matrix`; always false for `isochrone`).","items":{"$ref":"#/components/schemas/GeoJsonFeature"},"type":"array"},"properties":{"properties":{"action":{"enum":["route","isochrone","matrix"],"type":"string"},"algorithm":{"enum":["dijkstra"],"type":"string"},"edge_count":{"description":"Edges in this response","type":"integer"},"mode":{"enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter"],"type":"string"},"total_edges":{"description":"Edges the search settled","type":"integer"},"truncated":{"description":"Whether edges were left out to stay under the limits","type":"boolean"}},"required":["action","algorithm","mode","edge_count","total_edges","truncated"],"type":"object"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","properties","features"],"title":"ExpansionResult","type":"object"},"DatasetFeatureList":{"description":"GeoJSON FeatureCollection of dataset features.","properties":{"features":{"description":"Array of GeoJSON Features","items":{"$ref":"#/components/schemas/DatasetFeatureResponse"},"type":"array"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"DatasetFeatureList","type":"object"},"BannerComponent":{"description":"A part of a banner text.","properties":{"active":{"description":"`lane`: the lane is recommended","type":"boolean"},"active_direction":{"description":"`lane`: the direction the route takes from it","type":"string"},"directions":{"description":"`lane`: its turn arrows","items":{"type":"string"},"type":"array"},"text":{"type":"string"},"type":{"description":"`icon` is a road ref (draw a shield; no `image_base_url` is provided), `delimiter` separates name and ref, `lane` is one lane, `exit` is the word on an exit sign in `lang` and `exit-number` an exit number (an `off_ramp` at a numbered motorway exit)","enum":["text","icon","delimiter","lane","exit","exit-number"],"type":"string"}},"required":["text","type"],"title":"BannerComponent","type":"object"},"RouteRequest":{"description":"Request body for route calculation. Origin and destination are GeoJSON Point geometries. Supports optional waypoints, alternative routes, turn-by-turn steps, and EV routing parameters. `mode: transit` plans walking plus public transit (GTFS feeds) and takes `depart_at` or `arrive_by`, `wheelchair`, `pedestrian` (for its walks), `use_bus`, `use_rail`, `use_transfers`, `max_walk_m` and `max_transfers`; the other options are refused with 422 in that mode.","example":{"destination":{"coordinates":[2.2945,48.8584],"type":"Point"},"mode":"auto","origin":{"coordinates":[2.3522,48.8566],"type":"Point"}},"properties":{"preferred_sides":{"description":"Side of the road each point should be on. `same` snaps so the point is on the vehicle's driving side (right, or left in left-hand-traffic countries), `opposite` on the other side, `either` (default) does not mind. Like a heading, it fixes the direction of travel on the nearest road. One entry per point (origin, each waypoint, destination), null or empty for the default; a list, or a `;`-separated string. The count must match the points (422). Not with `ev`.","oneOf":[{"items":{"enum":["same","opposite","either"],"nullable":true,"type":"string"},"type":"array"},{"example":";;same","type":"string"}]},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"},"recostings":{"description":"Price the route found under other costing models (at most 5), without routing again: each has a unique `name` (letters, digits, `_`, `-`), an optional `mode` (`auto`, `foot`, `bicycle`, `motorcycle` or `motor_scooter`; the route's mode by default, required for truck routes; bicycle, walker and rider recostings use the request's options for that mode) and any costing options. The route reports each under `properties.recostings`. Each entry is an object, or a string `\"name: key=value, ...\"` (PlazaQL's form). Not with `ev` (422).","example":[{"name":"no_tolls","use_tolls":0},{"mode":"foot","name":"walk"}],"items":{"oneOf":[{"properties":{"country_crossing_cost":{"description":"Seconds added for each country border crossed (a `barrier=border_control` node, or roads of two countries meeting) (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `country_crossing_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"fixed_speed":{"description":"Drive every road at this speed, km/h (1-252), whatever its class, speed limit, surface, grade or the traffic at `depart_at`; intersection delays still count. Wins over `top_speed`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `fixed_speed:`.","maximum":252,"minimum":1,"nullable":true,"type":"integer"},"gate_cost":{"description":"Seconds added for each gate passed (`barrier=gate`, `lift_gate`, `swing_gate`, `sliding_gate`, `hampshire_gate`, unless tagged `access=yes`, `permissive`, `designated` or `public`). Cars, trucks, motorcycles and scooters already avoid such gates with a 300 s penalty on routes; this adds to it (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `gate_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"maneuver_penalty":{"description":"Seconds added for each point where the route arrives at a junction delay recorded by the traffic model (intersections, and signals, stop signs or crossings where two roads meet), so routes with fewer of them win. It counts junctions, not road segments (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `maneuver_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"mode":{"enum":["auto","foot","bicycle","motorcycle","motor_scooter"],"type":"string"},"name":{"example":"no_tolls","type":"string"},"service_penalty":{"description":"Seconds added for each service road (`highway=service`) entered from a road of another class, once however many junctions it passes (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `service_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"shortest":{"default":false,"description":"Minimise distance instead of travel time (time only breaks ties). `duration_s` is still the travel time of the route found. Turn costs (see `POST /route`) do not apply. Cannot be combined with the `use_*` or penalty options (422). Every mode. PlazaQL: `shortest:`.","nullable":true,"type":"boolean"},"toll_booth_cost":{"description":"Seconds added for each toll booth (`barrier=toll_booth`) passed. A booth's 15 s stop is already part of `duration_s` (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `toll_booth_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"top_speed":{"description":"Highest speed the vehicle drives, km/h (10-252). Caps every road's speed and so lengthens `duration_s`. A `motor_scooter` rides at most 45 km/h without it; `top_speed` replaces that cap. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `top_speed:`.","maximum":252,"minimum":10,"nullable":true,"type":"integer"},"use_ferries":{"description":"How much to use ferries (`route=ferry`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_highways":{"description":"How much to use motorways and trunk roads with their links, 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_living_streets":{"description":"How much to use living streets (`highway=living_street`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 5.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_tolls":{"description":"How much to use toll roads (`toll=yes`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"use_tracks":{"description":"How much to use tracks (`highway=track`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 15.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `foot` and `bicycle`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"}},"required":["name"],"type":"object"},{"example":"no_tolls: use_tolls=0","type":"string"}]},"maxItems":5,"nullable":true,"type":"array"},"waypoint_names":{"description":"A name for each point: origin, each waypoint, destination, in order. Arrival instructions use them (\"You have arrived at Home\"); null or an empty string keeps the default instruction. A list, or a `;`-separated string. The count must match the points, or the request is a 422.","oneOf":[{"items":{"nullable":true,"type":"string"},"type":"array"},{"example":";Office;Home","type":"string"}]},"mode":{"default":"auto","description":"Travel mode (default: `auto`). `transit` walks and rides public transit over the GTFS feeds Plaza has loaded, with the transit options below (premium, like every route). `truck` avoids roads whose posted height, width, length, weight or axle-load limits the vehicle in `truck` exceeds (hazardous-material restrictions too when `truck.hazmat` is set), keeps to roads trucks may use, follows one-way streets, and times the trip at truck speeds. `motorcycle` and `motor_scooter` follow one-way streets like cars at their own speeds (a scooter at most 45 km/h unless `top_speed` is set) and keep to the roads they may use (no motorways for scooters); see the `motorcycle` and `motor_scooter` options. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","transit","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"service_penalty":{"description":"Seconds added for each service road (`highway=service`) entered from a road of another class, once however many junctions it passes (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `service_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"origin":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Starting point"},"ev":{"description":"Electric vehicle parameters for EV-aware routing. A car by default; with `mode: motorcycle` or `motor_scooter` an electric motorcycle (about 80 Wh/km) or scooter (about 40 Wh/km), which charges only at sockets a two-wheeler can use (Type 1, Type 2, CCS, CHAdeMO and household or camping sockets, never Tesla-only sites) unless `connector_types` is given. With `mode: truck` an electric truck: about 300 Wh/km plus 22.5 Wh/km per tonne of the `truck` option's `weight` (default 21.77 t, so about 0.8 kWh/km; a 40 t tractor-trailer about 1.2 kWh/km), climbs priced by its mass, the truck's roads and restrictions, and only CCS and MCS (`socket:mcs`) chargers unless `connector_types` is given; the charger search does not check whether the truck fits the site.","nullable":true,"properties":{"battery_capacity_wh":{"description":"Total battery capacity in watt-hours (required for EV routing)","example":75000,"exclusiveMinimum":true,"minimum":0,"type":"number"},"connector_types":{"description":"Acceptable connectors, matched against the station's OSM `socket:<type>` tags (default: any for a car, the two-wheeler sockets for a motorcycle or scooter, CCS and MCS for a truck). Aliases: `ccs` (type2_combo, type1_combo), `ccs1` (type1_combo), `ccs2` (type2_combo), `chademo`, `type1`, `type2` (type2, type2_cable), `tesla` (tesla_supercharger, tesla_destination, tesla_standard, nacs), `nacs` (nacs, tesla_supercharger, tesla_destination). Any other value is matched as an OSM socket type, e.g. `[\"ccs\", \"chademo\"]` or `[\"type2_combo\"]`.","items":{"type":"string"},"nullable":true,"type":"array"},"initial_charge_pct":{"default":0.8,"description":"Starting charge as a fraction greater than 0 and at most 1 (default: 0.8). Out-of-range values are rejected with 422.","exclusiveMinimum":true,"maximum":1,"minimum":0,"type":"number"},"min_charge_pct":{"default":0.1,"description":"Minimum acceptable charge at destination as a fraction from 0 up to, but not including, 1 (default: 0.10). Out-of-range values are rejected with 422.","exclusiveMaximum":true,"maximum":1,"minimum":0,"type":"number"},"min_power_kw":{"description":"Minimum charger power in kilowatts (greater than 0)","exclusiveMinimum":true,"minimum":0,"nullable":true,"type":"number"}},"required":["battery_capacity_wh"],"type":"object"},"steps":{"default":false,"description":"Include turn-by-turn navigation steps in `properties.steps` (default: false). Applies to direct, waypoint, alternative and EV routes.","type":"boolean"},"voice_instructions":{"default":false,"description":"Add `voice_instructions` to each step: timed announcements (plain text and SSML) for the maneuver that ends the step, in `lang` and `voice_units` (default: false). Needs `steps: true`. The route then reports `voice_locale`.","type":"boolean"},"top_speed":{"description":"Highest speed the vehicle drives, km/h (10-252). Caps every road's speed and so lengthens `duration_s`. A `motor_scooter` rides at most 45 km/h without it; `top_speed` replaces that cap. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `top_speed:`.","maximum":252,"minimum":10,"nullable":true,"type":"integer"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"max_transfers":{"default":3,"description":"`mode: transit` only. Most changes between vehicles (default 3, at most 4). PlazaQL: `max_transfers:`.","maximum":4,"minimum":0,"nullable":true,"type":"integer"},"use_living_streets":{"description":"How much to use living streets (`highway=living_street`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 5.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"country_crossing_cost":{"description":"Seconds added for each country border crossed (a `barrier=border_control` node, or roads of two countries meeting) (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `country_crossing_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"shortest":{"default":false,"description":"Minimise distance instead of travel time (time only breaks ties). `duration_s` is still the travel time of the route found. Turn costs (see `POST /route`) do not apply. Cannot be combined with the `use_*` or penalty options (422). Every mode. PlazaQL: `shortest:`.","nullable":true,"type":"boolean"},"annotations":{"default":false,"description":"Include per-edge annotations (speed, duration) on the route (default: false). With `steps: true`, each leg in `legs` also gets per-coordinate `annotations`.","type":"boolean"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"use_rail":{"default":1,"description":"`mode: transit` only. Preference for Rail (tram, subway, rail, monorail, cable car, funicular), 0 to 1 (default 1). 0 never rides it; lower values count its in-vehicle time `1 + 2 * (1 - value)` times when choosing between the journeys found (the fastest journey for each number of vehicles).","maximum":1,"minimum":0,"nullable":true,"type":"number"},"arrive_by":{"description":"`mode: transit` only. Arrive at the destination by this time: the route is the latest departure that still arrives in time, and `depart_at` / `arrive_at` in the response say when to leave and when it gets there. ISO 8601, read like `depart_at` (with an offset an instant, without one wall-clock time at the feed); `now` is not accepted. Sending both `depart_at` and `arrive_by` is a 422, as is `arrive_by` with another mode or on an isochrone. PlazaQL: `arrive_by:`.","example":"2026-03-16T09:00:00-04:00","format":"date-time","nullable":true,"type":"string"},"banner_instructions":{"default":false,"description":"Add `banner_instructions` to each step: the road, signposted destinations and lanes for the maneuver that ends the step, for a navigation banner (default: false). Needs `steps: true`.","type":"boolean"},"use_ferries":{"description":"How much to use ferries (`route=ferry`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. every mode. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"max_walk_m":{"default":1000,"description":"`mode: transit` only. Longest walk in meters for each walking leg: to the first stop, between stops when transferring, and from the last stop (default 1000, at most 3000). Walking the whole way is offered when it is at most this far. PlazaQL: `max_walk_m:`.","maximum":3000,"minimum":0,"nullable":true,"type":"number"},"verbal":{"default":false,"description":"Add spoken instruction variants to each step's maneuver: `verbal_alert`, `verbal_pre`, `verbal_post` and `verbal_succinct` (default: false). Needs `steps: true`. A value other than true or false is a 422.","type":"boolean"},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"voice_units":{"description":"Distance units inside voice announcements: `metric` (metres, kilometres) or `imperial` (feet, miles). Defaults to `units`.","enum":["metric","imperial","km","mi"],"nullable":true,"type":"string"},"use_bus":{"default":1,"description":"`mode: transit` only. Preference for Bus (bus, trolleybus, coach), 0 to 1 (default 1). 0 never rides it; lower values count its in-vehicle time `1 + 2 * (1 - value)` times when choosing between the journeys found (the fastest journey for each number of vehicles).","maximum":1,"minimum":0,"nullable":true,"type":"number"},"destination":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Ending point"},"heading_tolerances":{"description":"Largest difference from `headings` accepted at each point, degrees (default 60). A tolerance needs a heading at the same point. One entry per point (origin, each waypoint, destination), null or empty for the default; a list, or a `;`-separated string. The count must match the points (422). Not with `ev`.","oneOf":[{"items":{"maximum":180,"minimum":0,"nullable":true,"type":"number"},"type":"array"},{"example":"45;;","type":"string"}]},"roundabout_exits":{"default":false,"description":"Give leaving a roundabout its own `exit_roundabout` step (default: false, where the `roundabout` step covers the ring and the exit road). Needs `steps: true`.","type":"boolean"},"wheelchair":{"default":false,"description":"`mode: transit` only. Ride only trips the feed marks `wheelchair_accessible` 1, boarding and leaving vehicles only at stops marked `wheelchair_boarding` 1 (a platform with no value takes its station's). Unknown counts as not accessible. Walking legs to and from stops also become step-free (`pedestrian.wheelchair`). Transfers between stops use footpaths measured at import with the default walking rules, so a transfer walk may include steps. With another mode, `true` is a 422 (walking routes take `pedestrian.wheelchair`). PlazaQL: `wheelchair:`.","nullable":true,"type":"boolean"},"gate_cost":{"description":"Seconds added for each gate passed (`barrier=gate`, `lift_gate`, `swing_gate`, `sliding_gate`, `hampshire_gate`, unless tagged `access=yes`, `permissive`, `designated` or `public`). Cars, trucks, motorcycles and scooters already avoid such gates with a 300 s penalty on routes; this adds to it (0-3600). Changes which route is chosen, not `duration_s`. Every mode. PlazaQL: `gate_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"use_tracks":{"description":"How much to use tracks (`highway=track`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 15.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `foot` and `bicycle`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"headings":{"description":"Direction of travel at each point, degrees clockwise from north. The point snaps to the nearest road (within 500 m) the vehicle can travel within `heading_tolerances` of it, in that direction: the route leaves the origin, passes a waypoint and arrives at the destination going that way, and does not turn back on that road. Without a match the point snaps to the nearest road vertex. One entry per point (origin, each waypoint, destination), null or empty for the default; a list, or a `;`-separated string. The count must match the points (422). Not with `ev`.","oneOf":[{"items":{"maximum":360,"minimum":0,"nullable":true,"type":"number"},"type":"array"},{"example":"90;;","type":"string"}]},"toll_booth_cost":{"description":"Seconds added for each toll booth (`barrier=toll_booth`) passed. A booth's 15 s stop is already part of `duration_s` (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `toll_booth_cost:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"geometries":{"default":"geojson","description":"Geometry encoding format for the route and, with `steps: true`, each step's `geometry`. Default: `geojson`. An unrecognised value falls back to `geojson`.","enum":["geojson","polyline","polyline6"],"type":"string"},"use_tolls":{"description":"How much to use toll roads (`toll=yes`), 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"approaches":{"description":"How the route reaches each point (Mapbox's form of `preferred_sides`). `curb` arrives at and leaves the point on the vehicle's driving side of the road (the curb side, as `preferred_sides: same`); `unrestricted` (default) does not mind. Cannot contradict `preferred_sides` at the same point. One entry per point (origin, each waypoint, destination), null or empty for the default; a list, or a `;`-separated string. The count must match the points (422). Not with `ev`.","oneOf":[{"items":{"enum":["unrestricted","curb"],"nullable":true,"type":"string"},"type":"array"},{"example":";;curb","type":"string"}]},"units":{"description":"Distance units inside step instructions: metres and kilometres, or feet and miles. Defaults to `mi` when the `lang` region is US, GB, LR or MM, otherwise `km`. Numeric fields (`distance_m`) are always metres.","enum":["km","mi"],"nullable":true,"type":"string"},"use_transfers":{"default":1,"description":"`mode: transit` only. Willingness to change vehicles, 0 to 1 (default 1). 0 allows no transfer (as `max_transfers: 0`); lower values add `600 * (1 - use_transfers)` seconds per transfer when choosing between the journeys found. PlazaQL: `use_transfers:`.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"overview":{"default":"full","description":"Level of geometry detail: `full` (all points), `simplified` (Douglas-Peucker), `false` (no geometry). Default: `full`. An unrecognised value falls back to `full`. Step geometries, intersection `geometry_index` and leg annotations always use the full line.","enum":["full","simplified","false"],"type":"string"},"lang":{"description":"BCP 47 language tag for step instructions. The primary subtag picks the language (`pt-BR` uses `pt`) and the region picks the default `units`. Supported: ar, da, de, en, es, fi, fr, hi, id, it, ja, ko, nb, nl, pl, pt, ru, sv, th, tr, vi, zh. Without `lang`, the first `Accept-Language` tag is used when it is supported, otherwise English. Street names use the OSM `name:<lang>` tag when the way has one. An explicit unsupported `lang` is rejected with a 422 that lists the supported codes in `details.supported`, even when `steps` is false.","example":"fr","type":"string"},"depart_at":{"description":"Departure time as an ISO 8601 timestamp, or `now`. With `mode: transit`, a timestamp with an offset (`Z`, `-04:00`) is an instant placed on the feed's time zone; one without an offset (`2026-03-16T08:00:00`) is wall-clock time at the feed; `now` (the default) is the current time. Road speeds are scaled by a fixed hourly profile for each road class and urban density band (separate weekday and weekend curves; rural roads get a quarter of the city slowdown, suburban roads 60%), and traffic-signal delays are longer in weekday rush hours and shorter at night, using the local wall-clock hour and weekday of this timestamp. `now` is read on the civil clock at the origin: its IANA time zone (from the time zone boundaries, else the country), daylight saving included; outside any known country Plaza falls back to UTC + round(longitude / 15) hours. This is not live traffic data. Conditional road limits (`access:conditional`, `motor_vehicle:conditional`, `hgv:conditional`, `maxspeed:conditional`, `maxweight:conditional`, `maxheight:conditional` and the like, with weekday, time, date, sunrise/sunset and vehicle-weight or size conditions) apply at this local time; without `depart_at` their unconditional values do. A value that cannot be parsed is rejected with a 422.","example":"2026-03-20T08:30:00-04:00","nullable":true,"type":"string"},"alternatives":{"default":0,"description":"Number of alternative routes to return (0-3, default 0). Values outside 0-3 are a 400. When > 0, response is a FeatureCollection of route Features. Cannot be combined with `waypoints`; with `ev`, each alternative gets its own charging plan.","maximum":3,"minimum":0,"type":"integer"},"traffic_model":{"description":"How to apply the speed profile; only used when `depart_at` is set. `best_guess` (default) uses the profile as is, `pessimistic` caps every road at 70% of free-flow speed or lower, `optimistic` uses free-flow speeds.","enum":["best_guess","optimistic","pessimistic"],"nullable":true,"type":"string"},"use_highways":{"description":"How much to use motorways and trunk roads with their links, 0 to 1. 0.5, or leaving it out, prices them as usual; lower values multiply their cost by up to 10.0 at 0 (avoid unless there is no reasonable alternative), higher values discount it to 0.9 at 1. Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. Rejected with 422 for other modes.","maximum":1,"minimum":0,"nullable":true,"type":"number"},"fixed_speed":{"description":"Drive every road at this speed, km/h (1-252), whatever its class, speed limit, surface, grade or the traffic at `depart_at`; intersection delays still count. Wins over `top_speed`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `fixed_speed:`.","maximum":252,"minimum":1,"nullable":true,"type":"integer"},"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"exclude":{"description":"Road types to leave out, as a comma-separated string (e.g. `toll,motorway,ferry`) or an array of strings: `toll`, `cash_only_tolls`, `ferry`, `unpaved`, `motorway`, `trunk`, `primary`, `secondary`, `tertiary`. `cash_only_tolls` leaves out roads through a toll booth that takes only cash (`payment:cash=yes` with no other `payment:*=yes` on the `barrier=toll_booth` node); a booth without payment tags is not cash-only. Unknown values are rejected with 400.","oneOf":[{"example":"toll,motorway,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"location_types":{"description":"What each point is. `break` (default; required for the origin and destination) is a stop: the route is split into legs there with a `waypoint` step. `through` passes the point's road vertex without stopping or turning back: no leg boundary, no arrival step, and the route after it may not use the edge it arrived on at all. `via` is like `through` but may turn back there. One entry per point (origin, each waypoint, destination), null or empty for the default; a list, or a `;`-separated string. The count must match the points (422). Not with `ev`.","oneOf":[{"items":{"enum":["break","through","via"],"nullable":true,"type":"string"},"type":"array"},{"example":"break;through;break","type":"string"}]},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`, and for the walking legs of `mode: transit` (`walking_speed` sets every walk's time, footpaths between stops included; `wheelchair`, `max_hiking_difficulty` and access decide the ways walked to and from stops; the preferences choose the path drawn); omitted values take the defaults. Rejected with 422 with other modes.","nullable":true,"type":"object"},"maneuver_penalty":{"description":"Seconds added for each point where the route arrives at a junction delay recorded by the traffic model (intersections, and signals, stop signs or crossings where two roads meet), so routes with fewer of them win. It counts junctions, not road segments (0-3600). Changes which route is chosen, not `duration_s`. `auto`, `truck`, `motorcycle` and `motor_scooter`. PlazaQL: `maneuver_penalty:`.","maximum":3600,"minimum":0,"nullable":true,"type":"number"},"waypoints":{"description":"Intermediate waypoints to visit in order (maximum 25). Cannot be combined with `alternatives`; with `ev`, charging stops are inserted between waypoints as needed.","items":{"$ref":"#/components/schemas/PointGeometry"},"maxItems":25,"nullable":true,"type":"array"}},"required":["origin","destination"],"title":"RouteRequest","type":"object"},"DatasetSyncList":{"description":"Sync history of a dataset, newest first.","properties":{"dataset_id":{"format":"uuid","type":"string"},"slug":{"type":"string"},"syncs":{"items":{"description":"One sync of a Plaza-curated dataset from its upstream source.","properties":{"error":{"nullable":true,"type":"string"},"feature_count":{"nullable":true,"type":"integer"},"finished_at":{"format":"date-time","nullable":true,"type":"string"},"id":{"type":"integer"},"rejected_count":{"description":"Source features rejected by validation","nullable":true,"type":"integer"},"source_version":{"description":"Upstream version token (ETag, Last-Modified, release id)","nullable":true,"type":"string"},"started_at":{"format":"date-time","type":"string"},"status":{"description":"skipped = upstream version unchanged, nothing reloaded; throttled = source answered 429/503, retried later","enum":["running","succeeded","skipped","failed","throttled"],"type":"string"},"storage_bytes":{"nullable":true,"type":"integer"},"vintage":{"nullable":true,"type":"string"}},"required":["id","status","started_at"],"type":"object"},"type":"array"}},"required":["dataset_id","slug","syncs"],"title":"DatasetSyncList","type":"object"},"OptimizeResult":{"description":"Optimization response — either a completed FeatureCollection with the optimized route, or an async job reference to poll.","oneOf":[{"$ref":"#/components/schemas/OptimizeCompletedResult"},{"$ref":"#/components/schemas/OptimizeProcessingResult"}],"title":"OptimizeResult"},"OptimizeCompletedResult":{"description":"Completed optimization result as a GeoJSON FeatureCollection. Each Feature is a waypoint in optimized visit order. Top-level fields provide summary statistics.","properties":{"duration_s":{"description":"Seconds from departure to the end of the route, waiting and service included (`constrained` only)","type":"number"},"features":{"description":"Waypoints in optimized visit order","items":{"$ref":"#/components/schemas/OptimizeWaypointFeature"},"type":"array"},"optimization":{"description":"`tsp` without constraints, `constrained` with time windows, service times or a capacity","enum":["tsp","constrained"],"type":"string"},"roundtrip":{"description":"Whether the route returns to the starting waypoint","type":"boolean"},"total_cost_s":{"description":"Total travel time for the optimized route in seconds","type":"number"},"type":{"enum":["FeatureCollection"],"type":"string"}},"required":["type","features","total_cost_s","optimization","roundtrip"],"title":"OptimizeCompletedResult","type":"object"},"OptimizeWaypointFeature":{"description":"GeoJSON Point Feature representing an optimized waypoint with cost data.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Waypoint location as a GeoJSON Point"},"properties":{"properties":{"arrival_at":{"description":"Arrival time, when `depart_at` is set","format":"date-time","type":"string"},"arrival_s":{"description":"Arrival, seconds after departure (with time windows, service times or a capacity only)","type":"number"},"cost_s":{"description":"Travel time in seconds from the previous waypoint to this one (0 for the first waypoint)","type":"number"},"cumulative_cost_s":{"description":"Cumulative travel time in seconds from the start to this waypoint","type":"number"},"departure_s":{"description":"Departure from the stop, seconds after departure from the start","type":"number"},"load":{"description":"Load on board after the stop (with `demands` and `capacity`)","type":"number"},"service_s":{"description":"Seconds spent at the stop","type":"number"},"time_window":{"description":"The stop's time window in seconds after departure, when it has one","items":{"type":"number"},"type":"array"},"wait_s":{"description":"Seconds waited for the stop's time window to open","type":"number"},"waypoint_index":{"description":"Index of this waypoint in the request's `waypoints` (0-based); features come in visiting order","type":"integer"}},"required":["waypoint_index","cost_s","cumulative_cost_s"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"OptimizeWaypointFeature","type":"object"},"LineStringGeometry":{"description":"GeoJSON LineString geometry per RFC 7946. An ordered sequence of two or more positions.","properties":{"coordinates":{"description":"Array of [lng, lat] or [lng, lat, alt] positions","items":{"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"minItems":2,"type":"array"},"type":{"enum":["LineString"],"type":"string"}},"required":["type","coordinates"],"title":"LineStringGeometry","type":"object"},"NearestResult":{"description":"GeoJSON Point Feature representing the nearest point on the road network to the input coordinate. Used for snapping GPS coordinates to roads.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Snapped point on the road network as a GeoJSON Point"},"properties":{"description":"Snap result metadata","properties":{"distance_m":{"description":"Distance from the input coordinate to the snapped point in meters","example":12.4,"type":"number"},"edge_id":{"description":"ID of the road network edge that was snapped to","type":"integer"},"edge_length_m":{"description":"Length of the matched road edge in meters","type":"number"},"highway":{"description":"OSM highway tag value (e.g. `residential`, `primary`, `motorway`)","nullable":true,"type":"string"},"osm_way_id":{"description":"OSM way ID of the matched road segment","type":"integer"},"surface":{"description":"OSM surface tag value (e.g. `asphalt`, `gravel`, `paved`)","nullable":true,"type":"string"}},"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"NearestResult","type":"object"},"TileJson":{"description":"TileJSON 3.0.0 (https://github.com/mapbox/tilejson-spec/tree/master/3.0.0) for the dynamic vector tiles.","properties":{"attribution":{"description":"HTML attribution for OpenStreetMap","type":"string"},"bounds":{"items":{"type":"number"},"maxItems":4,"minItems":4,"type":"array"},"description":{"type":"string"},"maxzoom":{"description":"Highest zoom with its own data; overzoom beyond","type":"integer"},"minzoom":{"type":"integer"},"name":{"type":"string"},"scheme":{"enum":["xyz"],"type":"string"},"tilejson":{"example":"3.0.0","type":"string"},"tiles":{"description":"Tile URL templates with `{z}`, `{x}`, `{y}` and the request's filters","example":["https://plaza.fyi/api/v1/tiles/{z}/{x}/{y}?tags%5Bamenity%5D=cafe"],"items":{"type":"string"},"type":"array"},"vector_layers":{"items":{"properties":{"description":{"type":"string"},"fields":{"additionalProperties":{"type":"string"},"description":"Property name to type (`String`, `Number`)","type":"object"},"id":{"description":"Layer name in the tile","type":"string"},"maxzoom":{"type":"integer"},"minzoom":{"type":"integer"}},"required":["id","fields"],"type":"object"},"type":"array"},"version":{"type":"string"}},"required":["tilejson","tiles","vector_layers"],"title":"TileJson","type":"object"},"GeoJsonFeature":{"description":"GeoJSON Feature representing an OSM element. Tags from the original OSM element are flattened directly into `properties` (not nested under a `tags` key). Metadata fields `@type` and `@id` identify the OSM element type and ID within properties.\n","properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"id":{"description":"Compound identifier in `type/osm_id` format","example":"node/21154906","type":"string"},"properties":{"additionalProperties":true,"description":"OSM tags flattened as key-value pairs, plus `@type` (node/way/relation) and `@id` (OSM ID) metadata fields. May include `distance_m` for proximity queries.","example":{"@id":21154906,"@type":"node","amenity":"cafe","cuisine":"coffee_shop","name":"Café de Flore"},"type":"object"},"type":{"description":"Always `Feature`","enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"GeoJsonFeature","type":"object"},"SpatialPredicate":{"description":"Spatial predicates for filtering features by geographic relationship. The parameter name is the spatial operation, the value is a GeoJSON geometry to test against. Several predicates in one request all apply (AND): `within` + `around` returns features inside the polygon and near the point. The area cap covers the request as a whole: one positive predicate within the cap (or an `around`) bounds it, so the others may be larger. `around` also takes a list of points to stay near all of them. PlazaQL: chain the methods, e.g. `.around(500, point(...)).within(...)`.\n\n| Predicate | Meaning |\n|---|---|\n| `around` | Within radius meters (`radius` defaults to 500) |\n| `intersects` | Feature overlaps the input geometry |\n| `within` | Feature is fully inside the input geometry |\n| `contains` | Feature fully contains the input geometry |\n| `crosses` | Feature crosses the input geometry |\n| `touches` | Feature shares boundary but not interior |\n| `not_intersects` | Feature does not overlap |\n| `not_within` | Feature is not fully inside |\n| `not_contains` | Feature does not fully contain |\n","example":{"around":{"coordinates":[2.3522,48.8566],"type":"Point"},"radius":500},"properties":{"around":{"description":"Geometry for proximity search (`radius` defaults to 500 meters), or a list of up to 20 geometries: features must be near every one","oneOf":[{"$ref":"#/components/schemas/Geometry"},{"items":{"$ref":"#/components/schemas/Geometry"},"maxItems":20,"minItems":1,"type":"array"}]},"contains":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must contain"},"crosses":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must cross"},"datasets":{"description":"Query datasets instead of OSM: slugs or ids of Plaza-curated datasets and your own, or the keywords `plaza` (every ready Plaza dataset) and `all` (those plus yours). Without `type`, only dataset features are returned; with `type`, those OSM element types are added. A spatial predicate is optional here. A Plaza dataset that hasn't finished its first sync is an error (`dataset not yet available`). Cursor pagination isn't available; use `limit`. PlazaQL equivalent: `search(dataset(\"slug\"))`.","example":["natural-earth-countries"],"items":{"type":"string"},"maxItems":20,"type":"array"},"enrich":{"description":"Comma-separated computed properties: `overlap_fraction` (needs `ref_polygon`), `elevation`, `distance` (needs `ref_point`).","example":"overlap_fraction","type":"string"},"expr":{"description":"Property aggregated by `output=sum|min|max|avg` (read as a number), e.g. `population`.","example":"population","type":"string"},"group_by":{"description":"Group `count`/aggregate results by this property; the response is `{groups, total}`.","example":"state_abbr","type":"string"},"intersects":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must intersect"},"not_contains":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must NOT contain"},"not_intersects":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must NOT intersect"},"not_within":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must NOT be within"},"output":{"description":"Response shaping object (precision, fields, geometry toggle, sort), or a result mode string. On OSM elements, `count` returns `{counts: {node, way, relation}, total}` over every match (PlazaQL `.count()`). With `datasets`, the modes are `count`, `ids`, `skel`, `tags`, or an aggregate `sum`/`min`/`max`/`avg` over `expr` (same as PlazaQL `.count()` / `.sum(number(t[\"expr\"]))`).","oneOf":[{"$ref":"#/components/schemas/OutputOptions"},{"enum":["count","ids","skel","tags","sum","min","max","avg"],"type":"string"}]},"radius":{"description":"Search radius in meters, greater than 0 and at most 100000. Used by `around` (default 500); with a single other predicate it is applied as a buffer. With several predicates it belongs to the `around` points: one number for all, or a list with one radius per point.","example":500,"oneOf":[{"exclusiveMinimum":true,"maximum":100000,"minimum":0,"type":"number"},{"items":{"exclusiveMinimum":true,"maximum":100000,"minimum":0,"type":"number"},"maxItems":20,"minItems":1,"type":"array"}]},"ref_polygon":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"GeoJSON Polygon or MultiPolygon for `enrich=overlap_fraction` and `weight=overlap_fraction`."},"tags":{"additionalProperties":{"type":"string"},"description":"Tag filters, all of which must match. A plain value matches exactly, `*` matches any value (key exists), and a value starting with `~` is a regular expression (at most 200 characters). Query strings can use `tags[key]=value`. With `datasets`, the filters match feature properties (e.g. `{\"state_abbr\": \"NY\"}`) and a value starting with `!` means not equal.","example":{"amenity":"cafe","name":"~^Blue"},"type":"object"},"touches":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must touch"},"weight":{"description":"Multiply `expr` by each feature's area share inside `ref_polygon` (area-weighted apportionment). Only with `output=sum`; only features intersecting `ref_polygon` are read. PlazaQL: `.sum(number(t[\"population\"]) * overlap_fraction(polygon(...)))`.","enum":["overlap_fraction"],"type":"string"},"within":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"Geometry that features must be within"}},"title":"SpatialPredicate","type":"object"},"ElevationLookupResult":{"description":"GeoJSON Point Feature with a 3D coordinate [lng, lat, elevation] per RFC 7946 §3.1.1. The elevation is also available in `properties.elevation_m` for convenience.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/Geometry"}],"description":"3D Point geometry: [longitude, latitude, elevation_meters]"},"properties":{"properties":{"elevation_m":{"description":"Elevation in meters above mean sea level (WGS84 EGM96 geoid)","example":35.2,"type":"number"}},"required":["elevation_m"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"ElevationLookupResult","type":"object"},"PedestrianParameters":{"description":"Walker options for `mode: foot`. Values out of range, and unknown options, are rejected with 422. `walking_speed` changes the trip's duration; the other preferences only change which way the route goes. Walkers keep off ways tagged `foot=no` and crossings tagged `crossing=no`.","example":{"use_lit":1,"walking_speed":4.5,"wheelchair":false},"properties":{"max_hiking_difficulty":{"default":1,"description":"Hardest trail to use on the SAC scale, 1 (`hiking`) to 6 (`difficult_alpine_hiking`) (default: 1). Ways without `sac_scale` are always used.","maximum":6,"minimum":1,"type":"integer"},"sidewalk_factor":{"default":1,"description":"Cost multiplier for roads tagged with a sidewalk, 0.1 to 10 (default: 1). Main roads without a sidewalk cost 1.3 times their walking time.","maximum":10,"minimum":0.1,"type":"number"},"step_penalty":{"default":30,"description":"Seconds added to the cost of each flight of steps, plus half a second per tagged step, 0 to 3600 (default: 30). Not part of `duration_s`.","maximum":3600,"minimum":0,"type":"number"},"use_hills":{"default":0.5,"description":"0 to 1 (default: 0.5). Lower values avoid steep ways, up or down; needs elevation data along the route.","maximum":1,"minimum":0,"type":"number"},"use_lit":{"default":0,"description":"0 to 1 (default: 0). Higher values prefer ways tagged `lit=yes` and avoid `lit=no` and ways without lighting information.","maximum":1,"minimum":0,"type":"number"},"walking_speed":{"default":5,"description":"Walking speed in km/h on flat ground, 1 to 10 (default: 5)","maximum":10,"minimum":1,"type":"number"},"walkway_factor":{"default":1,"description":"Cost multiplier for footways, pedestrian streets and paths, 0.1 to 10 (default: 1). Below 1 prefers them.","maximum":10,"minimum":0.1,"type":"number"},"wheelchair":{"default":false,"description":"Wheelchair routing (default: false). Leaves out steps, ways tagged `wheelchair=no`, grades or `incline` steeper than 8%, sand and mud, and very bad `smoothness`; prefers `wheelchair=yes` and smooth surfaces, and avoids raised or unknown kerbs (`kerb=*`, `barrier=kerb` on footway nodes; rolled kerbs a little, lowered and flush kerbs not at all).","type":"boolean"}},"title":"PedestrianParameters","type":"object"},"DatasetDictionary":{"description":"Field dictionary for a dataset: every property its features carry. Plaza-curated datasets describe each field; user datasets report the detected schema.","properties":{"dataset_id":{"format":"uuid","type":"string"},"fields":{"additionalProperties":{"$ref":"#/components/schemas/DatasetField"},"description":"Field name → field description","type":"object"},"slug":{"example":"natural-earth-countries","type":"string"},"vintage":{"example":"2022","nullable":true,"type":"string"}},"required":["dataset_id","slug","fields"],"title":"DatasetDictionary","type":"object"},"BatchReverseGeocodeRequest":{"description":"Request body for batch reverse geocoding: the points, and options that apply to every point as on POST /geocode/reverse.","properties":{"lang":{"description":"Preferred response language (ISO 639-1)","nullable":true,"type":"string"},"layer":{"description":"Filter by result layer (e.g. `address`, `place`, `poi`)","nullable":true,"type":"string"},"limit":{"default":1,"description":"Maximum results per point (default: 1, max: 20). Out-of-range values are a 400.","maximum":20,"minimum":1,"nullable":true,"type":"integer"},"points":{"description":"Points to reverse geocode (1 to 1000): an array of GeoJSON Points or one MultiPoint.","oneOf":[{"items":{"$ref":"#/components/schemas/PointGeometry"},"maxItems":1000,"minItems":1,"type":"array"},{"properties":{"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"maxItems":1000,"minItems":1,"type":"array"},"type":{"enum":["MultiPoint"],"type":"string"}},"required":["type","coordinates"],"type":"object"}]},"radius":{"default":200,"description":"Search radius in meters around each point (default: 200, 1-5000). Out-of-range values are a 400.","maximum":5000,"minimum":1,"nullable":true,"type":"integer"}},"required":["points"],"title":"BatchReverseGeocodeRequest","type":"object"},"FeatureCollection":{"description":"GeoJSON FeatureCollection (RFC 7946). For paginated endpoints, metadata is returned in HTTP response headers:\n\n| Header | Description |\n|---|---|\n| `X-Limit` | Requested result limit |\n| `X-Has-More` | `true` if more results exist |\n| `X-Next-Cursor` | Opaque cursor for the next page (keyset pagination) |\n| `X-Next-Offset` | Numeric offset for next page (offset pagination) |\n| `Link` | RFC 8288 `rel=\"next\"` link to the next page |\n\nWhen another page exists, a JSON body also carries the cursor as `next_cursor`. Pass it back as `cursor` (PlazaQL: `.cursor(\"...\")`) with the same query to get the next page. The last page has no `next_cursor`.\n\nContent-Type is `application/geo+json`.\n","properties":{"features":{"description":"Array of GeoJSON Feature objects","items":{"$ref":"#/components/schemas/GeoJsonFeature"},"type":"array"},"next_cursor":{"description":"Opaque cursor of the next page, present only when more results follow. Valid only for the query that returned it; another query, or an edited cursor, is a 400 `invalid_cursor`.","type":"string"},"type":{"description":"Always `FeatureCollection`","enum":["FeatureCollection"],"type":"string"}},"required":["type","features"],"title":"FeatureCollection","type":"object"},"MultiLineStringGeometry":{"description":"GeoJSON MultiLineString geometry per RFC 7946. An array of LineString coordinate arrays.","properties":{"coordinates":{"description":"Array of LineString coordinate arrays","items":{"items":{"items":{"type":"number"},"maxItems":3,"minItems":2,"type":"array"},"minItems":2,"type":"array"},"type":"array"},"type":{"enum":["MultiLineString"],"type":"string"}},"required":["type","coordinates"],"title":"MultiLineStringGeometry","type":"object"},"CentroidResult":{"description":"GeoJSON Point Feature at the road-network vertex with the lowest total travel cost from every location. Travel is directed: each location travels to the meeting point, so one-way streets count in that direction.","properties":{"geometry":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"The meeting point"},"properties":{"properties":{"costs_per_location":{"description":"Travel from each location, in request order","items":{"$ref":"#/components/schemas/CentroidLocationCost"},"type":"array"},"max_duration_s":{"description":"Longest travel time of any one location","type":"number"},"metric":{"enum":["time","distance"],"type":"string"},"mode":{"enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter"],"type":"string"},"total_distance_m":{"description":"Sum of every location's travel distance","type":"number"},"total_duration_s":{"description":"Sum of every location's travel time","type":"number"}},"required":["mode","metric","total_duration_s","total_distance_m","max_duration_s","costs_per_location"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"CentroidResult","type":"object"},"ExpansionRequest":{"description":"Request body for routing graph expansion. `action` picks the request to expand; the other fields are that request's own: `origin` and `destination` for `route`, `geometry` and `time` for `isochrone`, `origins` and `destinations` for `matrix` (at most 100 pairs). Same options as PlazaQL `expansion(action: ..., ...)`.","example":{"action":"route","destination":{"coordinates":[2.35,48.87],"type":"Point"},"expansion_properties":["duration","distance","cumulative_cost"],"mode":"auto","origin":{"coordinates":[2.294,48.858],"type":"Point"}},"properties":{"action":{"description":"Request to expand","enum":["route","isochrone","matrix"],"type":"string"},"avoid_datasets":{"description":"Keep out of the polygons of these datasets: up to 10 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. Every road segment that touches one of their polygon features is left out of the graph (point and line features are ignored). The datasets may hold at most 1,000 polygons and 200,000 vertices in total (422 otherwise). A route with no way around them answers 404. Map matching never snaps a point to such a road. PlazaQL: `avoid_datasets:`.","example":["my-flood-zones"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"bicycle":{"allOf":[{"$ref":"#/components/schemas/BicycleParameters"}],"description":"Rider options for `mode: bicycle`; omitted values take the defaults. Rejected with 422 without `mode: bicycle`.","nullable":true,"type":"object"},"datasets":{"description":"Also travel the roads of these datasets: up to 20 dataset slugs or ids (yours or Plaza-curated), as an array or a comma-separated string. `plaza` and `all` are not accepted (400). Any other user's dataset answers 404 `dataset not found`, the same as one that doesn't exist. A road is a line feature with a `highway` (or `road_class`) property; `maxspeed`, `oneway`, `access`, `motorcar`, `motor_vehicle`, `vehicle`, `hgv`, `motorcycle`, `moped`, `foot`, `bicycle`, `surface`, `tracktype` and `toll` are read as the OSM tags are, so each mode keeps to the roads it may use and `duration_s` is timed as on OSM roads. A road joins the OSM network where one of its ends lies within 10 m of an OSM junction when the dataset is processed. OSM turn restrictions and turn costs don't apply on dataset roads, which carry no traffic profile or intersection delays; their edges have `osm_way_id: null`. Different from `avoid_datasets`, whose polygons are areas to stay out of. Not taken with `mode: transit`. On `/nearest` the point may snap to a dataset road (its `osm_way_id` is null). PlazaQL: `datasets:`.","example":["campus-roads"],"oneOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}]},"destination":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Route end (`route`)"},"destinations":{"description":"Matrix destinations (`matrix`)","items":{"$ref":"#/components/schemas/PointGeometry"},"type":"array"},"exclude":{"description":"Road types to avoid, as on `route`, `isochrone` and `matrix`, as a comma-separated string or an array. Unknown values are rejected with 400.","oneOf":[{"example":"toll,ferry","type":"string"},{"example":["toll","ferry"],"items":{"type":"string"},"type":"array"}]},"expansion_properties":{"description":"Properties to include on each edge (default `[\"duration\"]`; `on_path` is always included): `duration`, `distance`, `cost`, `cumulative_cost`, `edge_id`, `osm_way_id`.","items":{"enum":["duration","distance","cost","cumulative_cost","edge_id","osm_way_id"],"type":"string"},"type":"array"},"geometry":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Isochrone center (`isochrone`)"},"mode":{"description":"Travel mode of the expanded search (default: `auto`). `truck` keeps to roads the vehicle in `truck` fits and may use, at truck speeds; `motorcycle` and `motor_scooter` keep to the roads they may use (no motorways for scooters) at their own speeds. Other values are rejected with 422; the PlazaQL aliases `car`, `drive`, `walk`, `bike`, `motorbike`, `scooter` and `moped` are accepted too.","enum":["auto","foot","bicycle","truck","motorcycle","motor_scooter","bike","car","drive","moped","motorbike","scooter","walk"],"type":"string"},"motor_scooter":{"allOf":[{"$ref":"#/components/schemas/MotorScooterParameters"}],"description":"Rider options for `mode: motor_scooter`; omitted values take the defaults. Rejected with 422 without `mode: motor_scooter`.","nullable":true,"type":"object"},"motorcycle":{"allOf":[{"$ref":"#/components/schemas/MotorcycleParameters"}],"description":"Rider options for `mode: motorcycle`; omitted values take the defaults. Rejected with 422 without `mode: motorcycle`.","nullable":true,"type":"object"},"origin":{"allOf":[{"$ref":"#/components/schemas/PointGeometry"}],"description":"Route start (`route`)"},"origins":{"description":"Matrix origins (`matrix`)","items":{"$ref":"#/components/schemas/PointGeometry"},"type":"array"},"pedestrian":{"allOf":[{"$ref":"#/components/schemas/PedestrianParameters"}],"description":"Walker options for `mode: foot`; omitted values take the defaults. Rejected with 422 without `mode: foot`.","nullable":true,"type":"object"},"time":{"description":"Isochrone time budget(s) in seconds (`isochrone`): a number or an array; the search runs to the largest","oneOf":[{"example":600,"type":"number"},{"example":[300,600],"items":{"type":"number"},"type":"array"}]},"truck":{"allOf":[{"$ref":"#/components/schemas/TruckParameters"}],"description":"Vehicle for `mode: truck`; omitted values take the defaults. Rejected with 422 without `mode: truck`.","nullable":true,"type":"object"}},"required":["action"],"title":"ExpansionRequest","type":"object"},"GeocodingFeature":{"description":"GeoJSON Feature representing a geocoding result. The geometry is always a Point. Properties include the formatted display name, OSM metadata, `gid`, `layer`, `confidence`, `match_type`, `accuracy`, categories, and source type.","properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"properties":{"description":"Geocoding result properties","properties":{"category":{"description":"Top-level category from Plaza's taxonomy: food, shopping, transport, education, health, finance, government, religion, entertainment, culture, lodging, recreation, nature, travel, services, professional, admin.","example":"food","nullable":true,"type":"string"},"country_code":{"description":"ISO 3166-1 alpha-2 country code","example":"GB","maxLength":2,"minLength":2,"nullable":true,"type":"string"},"confidence":{"description":"Result quality from 0 to 1. Forward and structured results average the match type, the share of address fields matched, the house number and the postcode; fallback results never exceed 0.5. Reverse results score by distance (1.0 under 1 m, 0.5 past 1 km). Place lookups are 1.0.","example":0.95,"maximum":1,"minimum":0,"type":"number"},"house_number":{"description":"House or building number. Present for address and interpolated results.","example":"221B","nullable":true,"type":"string"},"postcode":{"description":"Postal code. Present for reverse geocode address results.","example":"NW1 6XE","nullable":true,"type":"string"},"admin_hierarchy":{"description":"Admin areas containing the place, country first. Place lookup only.","items":{"properties":{"admin_level":{"example":2,"type":"integer"},"country_code":{"example":"FR","nullable":true,"type":"string"},"name":{"example":"France","type":"string"},"name_en":{"nullable":true,"type":"string"},"type":{"example":"country","type":"string"}},"type":"object"},"nullable":true,"type":"array"},"interpolated":{"description":"Whether this result was estimated by address interpolation rather than an exact database match.","nullable":true,"type":"boolean"},"layer":{"description":"What kind of result this is","enum":["address","street","postalcode","poi","neighbourhood","locality","county","region","country","dataset"],"example":"address","type":"string"},"city":{"description":"City or town name. Present for address results.","example":"London","nullable":true,"type":"string"},"datasets":{"description":"Dataset features at the query point, returned when the request names `datasets`: in request order, each dataset's polygons containing the point (smallest first), then its nearest point or line feature within `radius`.","items":{"properties":{"dataset":{"description":"Dataset slug","type":"string"},"dataset_id":{"description":"Dataset id","format":"uuid","type":"string"},"distance_m":{"description":"Distance from the point in meters (0 for `contains`)","type":"number"},"feature_type":{"enum":["point","line","polygon"],"type":"string"},"id":{"description":"Feature id","type":"string"},"match":{"description":"`contains` for a polygon around the point, `nearest` otherwise","enum":["contains","nearest"],"type":"string"},"name":{"description":"Feature name","nullable":true,"type":"string"},"properties":{"description":"The feature's properties","type":"object"}},"required":["dataset","dataset_id","id","feature_type","match","distance_m","properties"],"type":"object"},"nullable":true,"type":"array"},"dataset":{"description":"Dataset slug (`layer: \"dataset\"` results)","nullable":true,"type":"string"},"street":{"description":"Street name. Present for address and interpolated results.","example":"Baker Street","nullable":true,"type":"string"},"source":{"description":"Result source indicating how the result was found: structured (exact field match), fuzzy (trigram similarity), address (reverse geocode address), place (reverse geocode POI), interpolation (estimated from neighboring addresses)","enum":["structured","fuzzy","address","place","boundary","interpolation"],"nullable":true,"type":"string"},"categories":{"description":"Category and `category:subcategory`, for filtering.","example":["food","food:restaurant"],"items":{"type":"string"},"nullable":true,"type":"array"},"osm_type":{"description":"OSM element type (node, way, relation)","enum":["node","way","relation"],"nullable":true,"type":"string"},"accuracy":{"description":"`point` for a precise location (an address or a POI node), `centroid` for the center of an area (street, postal code, admin area, way or relation).","enum":["point","centroid"],"example":"point","type":"string"},"name":{"description":"Place name (raw). Present for reverse geocode place results.","example":"Eiffel Tower","nullable":true,"type":"string"},"match_type":{"description":"How the result matched: `exact` (every given field matched), `interpolated` (house number estimated along the street), `fuzzy` (typo-tolerant or partial match), `fallback` (nothing matched at the requested level; a coarser layer such as the street, postal code or city is returned instead).","enum":["exact","interpolated","fuzzy","fallback"],"example":"exact","type":"string"},"distance_m":{"description":"Distance from the query point in meters (reverse geocode / nearby only)","nullable":true,"type":"number"},"osm_id":{"description":"OpenStreetMap element ID (null for interpolated results)","example":21154906,"nullable":true,"type":"integer"},"feature_type":{"description":"Dataset feature geometry type (`layer: \"dataset\"` results), or `address` for one of the dataset's addresses. Lines and polygons answer at a point on their surface.","enum":["point","line","polygon","address"],"nullable":true,"type":"string"},"full_address":{"description":"Complete formatted address from the database. Present for reverse geocode address results.","example":"221B Baker Street, London, NW1 6XE, United Kingdom","nullable":true,"type":"string"},"feature_id":{"description":"Feature id within the dataset (`layer: \"dataset\"` results)","nullable":true,"type":"string"},"tags":{"additionalProperties":{"type":"string"},"description":"Raw OSM tags. Present for place results.","nullable":true,"type":"object"},"country":{"description":"Country name. Present for reverse geocode address results.","example":"United Kingdom","nullable":true,"type":"string"},"census":{"description":"US Census geographies containing the query point, returned when the request sets `include: \"census\"`. Read from the Plaza-curated Census boundary datasets (TIGER/Line, falling back to cartographic boundaries). A field is null when that geography does not cover the point or its dataset is not loaded; the whole object is null outside US coverage.","nullable":true,"properties":{"cbsa_geoid":{"description":"Core-based statistical area code","example":"35620","nullable":true,"type":"string"},"cd_geoid":{"description":"Congressional district GEOID (state + district)","example":"3612","nullable":true,"type":"string"},"geoid_block_group":{"description":"Block group GEOID (12 digits)","example":"360610101001","nullable":true,"type":"string"},"geoid_county":{"description":"County GEOID (state + 3-digit county FIPS)","example":"36061","nullable":true,"type":"string"},"geoid_state":{"description":"State GEOID (2-digit FIPS)","example":"36","nullable":true,"type":"string"},"geoid_tract":{"description":"Census tract GEOID (11 digits)","example":"36061010100","nullable":true,"type":"string"},"names":{"description":"Names of the geographies above","properties":{"block_group":{"description":"Block group name","example":"1","nullable":true,"type":"string"},"cbsa":{"description":"CBSA name","example":"New York-Newark-Jersey City, NY-NJ","nullable":true,"type":"string"},"cd":{"description":"Congressional district name","example":"Congressional District 12","nullable":true,"type":"string"},"county":{"description":"County name","example":"New York","nullable":true,"type":"string"},"place":{"description":"Place name","example":"New York","nullable":true,"type":"string"},"state":{"description":"State name","example":"New York","nullable":true,"type":"string"},"tract":{"description":"Tract name","example":"101","nullable":true,"type":"string"},"zcta":{"description":"ZCTA name","example":"10118","nullable":true,"type":"string"}},"type":"object"},"place_geoid":{"description":"Census place GEOID (state + 5-digit place)","example":"3651000","nullable":true,"type":"string"},"zcta":{"description":"ZIP Code Tabulation Area (5 digits)","example":"10118","nullable":true,"type":"string"}},"type":"object"},"gid":{"description":"Plaza global ID, `osm:{node|way|relation}:{id}` (or `osm:address:{id}` / `osm:place:{id}` from place lookup). Pass it to GET /api/v1/place or as `boundary_gid`. Null for results that are not one OSM element (interpolated addresses, street and postal-code centroids).","example":"osm:node:21154906","nullable":true,"type":"string"},"dataset_properties":{"description":"The dataset feature's properties (`layer: \"dataset\"` results)","nullable":true,"type":"object"},"dataset_id":{"description":"Dataset id (`layer: \"dataset\"` results)","format":"uuid","nullable":true,"type":"string"},"state":{"description":"State or province name. Present for reverse geocode address results.","example":"England","nullable":true,"type":"string"},"subcategory":{"description":"Category detail, e.g. restaurant, supermarket, rail_station; the raw OSM value for tags without a curated mapping.","example":"restaurant","nullable":true,"type":"string"},"wikipedia":{"description":"Wikipedia article reference (e.g. en:Eiffel Tower). Present for notable places.","example":"en:Eiffel Tower","nullable":true,"type":"string"},"display_name":{"description":"Formatted address or place name","example":"221B Baker Street, London, NW1 6XE, United Kingdom","type":"string"},"score":{"description":"Relevance score (higher is better). Incorporates text match quality, spatial proximity boost, and popularity signals. Not bounded to 0-1.","minimum":0,"nullable":true,"type":"number"}},"required":["display_name"],"type":"object"},"type":{"enum":["Feature"],"type":"string"}},"required":["type","geometry","properties"],"title":"GeocodingFeature","type":"object"}},"securitySchemes":{"ApiKeyHeader":{"description":"API key via `x-api-key` header","in":"header","name":"x-api-key","type":"apiKey"},"BearerAuth":{"description":"API key as Bearer token: `Authorization: Bearer <key>`","scheme":"bearer","type":"http"}}},"info":{"contact":{"name":"Plaza","url":"https://plaza.fyi"},"description":"Geospatial data API serving the complete OpenStreetMap planet dataset.\n\nPlaza provides geocoding, routing, search, isochrones, elevation, map matching,\nroute optimization, and raw OSM element queries — all from a single API. Spatial\ndata is indexed using a proprietary H3 hexagonal tiling system for fast lookups\nat any scale.\n\n**Authentication**: Pass your API key via `Authorization: Bearer <key>`, `x-api-key: <key>` header, or `api_key=<key>` query parameter.\n\n**Response format**: Spatial endpoints return GeoJSON (`application/geo+json`). Paginated responses put metadata in HTTP headers (`X-Limit`, `X-Has-More`, `X-Next-Cursor`, `Link`), not the body.\n","title":"Plaza API","version":"0.1.0"},"openapi":"3.0.0","paths":{"/api/v1/features/{type}/{id}":{"get":{"callbacks":{},"description":"Returns one OpenStreetMap node, way, or relation as a GeoJSON Feature. Ways and relations include their assembled geometry.","operationId":"get_feature","parameters":[{"description":"Element type (node, way, relation)","in":"path","name":"type","required":true,"schema":{"type":"string"}},{"description":"OSM ID","in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoJsonFeature"}}},"description":"GeoJSON Feature"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Get feature by type and ID","tags":["Features"]}},"/api/v1/tiles/style.json":{"get":{"callbacks":{},"description":"A MapLibre style (spec version 8) that draws the Shortbread layers from GET /api/v1/tiles.json. With `tags[...]` filters it adds a `plaza-filtered` source and draws the matching elements (the `features` layer) on top. Needs no API key and is not metered. No URL in the style carries a key: add yours to tile requests, for example with MapLibre's `transformRequest`. The basemap layers are dynamic tiles too, metered as standard requests.","operationId":"get_tile_style","parameters":[{"description":"Tag filters: `tags[amenity]=restaurant` matches the value exactly, `tags[cuisine]=*` matches any value. Up to 10; all must match.","explode":true,"in":"query","name":"tags","required":false,"schema":{"additionalProperties":{"type":"string"},"type":"object"},"style":"deepObject"},{"description":"Comma-separated layers to build. Default: every Shortbread layer, or `features` alone when `tags[...]` filters are given. GET /api/v1/tiles.json lists them.","in":"query","name":"layers","required":false,"schema":{"type":"string"}},{"description":"Comma-separated tag keys copied into each feature's properties (up to 50). Default: the layer's Shortbread attributes, every tag on `features`. `kind`, `osm_type` and `osm_id` are always present.","in":"query","name":"properties","required":false,"schema":{"type":"string"}},{"description":"Comma-separated element tables to read: node, way, relation (default all)","in":"query","name":"element_types","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapStyle"}}},"description":"MapLibre style JSON"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid filters"}},"security":[],"summary":"Get a MapLibre style for the vector tiles","tags":["Tiles"]}},"/api/v1/geocode/structured":{"post":{"callbacks":{},"description":"Geocodes pre-parsed address components (street address, locality, region, postal code, country) without free-text parsing. Results are ranked by how many components they match. When no address matches, falls back to the street, postal code, then the most specific admin area given (`match_type: \"fallback\"`). PlazaQL: `geocode(address: ..., locality: ..., region: ...)`.","operationId":"structured_geocode","parameters":[{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeStructuredRequest"}}},"description":"Structured geocode request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"Geocoding results. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`boundary_gid` not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Geocode structured address components","tags":["Geocoding"]}},"/api/v1/geocode/batch":{"post":{"callbacks":{},"description":"Geocodes a list of addresses in one request. Each input returns its own result list, in input order. Each address counts as one standard request (one request against the per-minute rate limit). PlazaQL: `geocode(addresses: [...])`.","operationId":"batch_geocode","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"addresses":{"items":{"type":"string"},"maxItems":1000,"type":"array"}},"required":["addresses"],"type":"object"}}},"description":"Batch geocode request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchGeocodeResult"}}},"description":"Batch results"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The batch did not finish within the request timeout"}},"summary":"Batch geocode multiple addresses","tags":["Geocoding"]}},"/api/v1/features":{"post":{"callbacks":{},"description":"Returns OSM features that match the spatial predicates in the request body (`around`, `within`, `intersects`, and the others listed on SpatialPredicate; several predicates all apply), optionally filtered by element type. Results are ordered by `output.sort` (`osm_id` by default; `name`, `qt`, or `distance` from an `around` point) and keyset-paginated: when more results follow, the response carries `next_cursor` (body and `X-Next-Cursor` header), which you send back as `cursor` with the same request.\n\nWith `datasets` in the body (for example `[\"census-counties\"]` or `[\"plaza\"]`), the request queries those datasets instead, the REST twin of PlazaQL `search(dataset(...))`: the spatial predicate becomes optional (unless `type` also adds OSM element types), `tags` filter feature properties, results page with the same `cursor`, and `output` can be `count` or an aggregate (`sum`/`min`/`max`/`avg` with `expr`, optional `group_by`, and `weight=overlap_fraction` with `sum`). Aggregates answer `{value}`, grouped results `{groups, total}`, counts `{counts, total}`.","operationId":"query_features","parameters":[{"description":"Element types (comma-separated: node,way,relation)","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Legacy shorthand. H3 cell index. Use spatial predicates instead.","in":"query","name":"h3","required":false,"schema":{"type":"string"}},{"description":"Maximum results (default 100, max 10000). Values outside 1-10000 return 400.","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":10000,"minimum":1,"type":"integer"}},{"description":"Opaque keyset cursor: the `next_cursor` (or `X-Next-Cursor` header) of the previous page of the same query. A cursor from another query, or an edited one, is a 400 `invalid_cursor`. May also be sent in the JSON body.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Result offset for offset pagination (default 0, 0-100000; out-of-range values are a 400). Combining it with `cursor` is a 422.","in":"query","name":"offset","required":false,"schema":{"maximum":100000,"minimum":0,"type":"integer"}},{"description":"Response format. json (default) returns paginated GeoJSON. geojson/csv/ndjson stream via chunked transfer encoding.","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpatialPredicate"}}},"description":"Spatial filter and query options","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"GeoJSON FeatureCollection. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows.","headers":{"Link":{"description":"RFC 8288 `rel=\"next\"` link to the next page","schema":{"type":"string"},"style":"simple"},"X-Has-More":{"description":"`true` when another page follows","schema":{"type":"boolean"},"style":"simple"},"X-Limit":{"description":"The page size","schema":{"type":"integer"},"style":"simple"},"X-Next-Cursor":{"description":"Opaque cursor of the next page (also `next_cursor` in a JSON body); absent on the last page","schema":{"type":"string"},"style":"simple"},"X-Next-Offset":{"description":"Offset of the next page, when the request paged with `offset`","schema":{"type":"integer"},"style":"simple"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request, or an invalid cursor (`invalid_cursor`)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value, or `cursor` with `offset`"}},"summary":"Query features by spatial predicate, bounding box, or H3 cell","tags":["Features"]}},"/api/v1/query":{"post":{"callbacks":{},"description":"Runs a PlazaQL query and returns the result as a GeoJSON FeatureCollection, or the same body as the matching REST endpoint for a computation (a route Feature, a matrix object, ...). A search counts as one standard request; each computation the query runs (an output, a set-operation operand, or a variable used as a geometry) counts once as the REST endpoint it stands in for, premium where that endpoint is. An `optimize(...)` over more than 10 waypoints returns `{status: \"processing\", job_id}`, polled with get_optimize_job, like POST /optimize. Datasets are selected in the query text with `dataset(\"slug\")` (or `dataset(\"plaza\")`, `dataset(\"all\")`), the PlazaQL side of the REST `datasets` parameter on POST /features; there is no separate body parameter. A query with several named outputs (`$$.cafes = ...; $$.parks = ...;`) runs every output and returns `{\"outputs\": {name: result}}` as JSON; only `format=json` is accepted, and an optimize that would run as a job must be its own query. `search(...).tile(z, x, y)` returns one Mapbox Vector Tile (`application/vnd.mapbox-vector-tile`), the same tile, cache and metering as GET /api/v1/tiles/{z}/{x}/{y} with the search's tag filters, element types, `.fields(...)` as `properties` and `layers:`; it must be the query's only output. A search with `.limit(n)` (or `text_search(...)`) that has more results returns `next_cursor` in its FeatureCollection (and the `X-Next-Cursor` header for a single output); add `.cursor(\"<next_cursor>\")` to the same query for the next page. Each named output pages on its own. A cursor from another query, or an edited one, is a 400 `invalid_cursor`, and `.cursor()` cannot be combined with `.offset()`.","operationId":"run_query","parameters":[{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlazaQLQuery"}}},"description":"PlazaQL query","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/FeatureCollection"},{"$ref":"#/components/schemas/QueryOutputs"}]}},"application/vnd.mapbox-vector-tile":{"schema":{"format":"binary","type":"string"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"GeoJSON FeatureCollection, or a `QueryOutputs` object when the query has several named outputs. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows.","headers":{"Link":{"description":"RFC 8288 `rel=\"next\"` link to the next page","schema":{"type":"string"},"style":"simple"},"X-Has-More":{"description":"`true` when another page follows","schema":{"type":"boolean"},"style":"simple"},"X-Limit":{"description":"The page size","schema":{"type":"integer"},"style":"simple"},"X-Next-Cursor":{"description":"Opaque cursor of the next page (also `next_cursor` in a JSON body); absent on the last page","schema":{"type":"string"},"style":"simple"},"X-Next-Offset":{"description":"Offset of the next page, when the request paged with `offset`","schema":{"type":"integer"},"style":"simple"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Query error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Query ran past the plan's deadline (not billed)"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Execute a PlazaQL query","tags":["Query"]}},"/api/v1/elevation/profile":{"post":{"callbacks":{},"description":"Samples elevation along a line and returns the profile with total ascent, descent, and min/max elevation.","operationId":"elevation_profile","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElevationProfileRequest"}}},"description":"Profile request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElevationProfileResult"}}},"description":"Elevation profile"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No elevation data"}},"summary":"Elevation profile along coordinates","tags":["Elevation"]}},"/api/v1/isochrone":{"post":{"callbacks":{},"description":"Returns the area reachable from a point for each travel-time budget in `time`, or each distance along the roads in `contours_meters`, one GeoJSON polygon per budget, for the chosen travel mode. The search obeys the OSM turn restrictions that bind the mode at a single junction, as routes do; restrictions over a via way are not applied to isochrones. With `depart_at`, motor modes are timed by that hour's traffic profile and conditional road limits apply then, as on POST /route. `mode: transit` combines walking with public transit from the GTFS feeds Plaza has loaded, leaving at `depart_at`.","operationId":"isochrone","parameters":[{"description":"Response format when `time` or `contours_meters` has more than one value: json (default), geojson, csv, ndjson. A single budget always returns one GeoJSON Feature.","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IsochroneRequest"}}},"description":"Isochrone request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IsochroneResult"}}},"description":"Isochrone polygon"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request: missing or invalid `time` / `contours_meters`, or both of them"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No reachable vertices (`mode: transit`: no stop within `max_walk_m`)"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`mode: transit` only: the search exceeded its time budget or the plan's request timeout."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value, an invalid `depart_at` or `traffic_model`, `contours_meters` with `mode: transit`, invalid `truck` parameters, invalid `bicycle`, `pedestrian`, `motorcycle` or `motor_scooter` options (or one sent with another mode), an invalid `top_speed` or `fixed_speed` (or another costing option: isochrone budgets are travel time or distance, so only the speed overrides apply), an invalid transit option, an option `mode: transit` does not take (`arrive_by` among them), `wheelchair: true` with another mode, or a `depart_at` outside the published period of the transit feeds near the point"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`mode: transit` only (`transit_unavailable`): the feed's timetable for that day is larger than the memory limit, or is still being prepared (retry shortly) or failed to load."}},"summary":"Calculate an isochrone from a point","tags":["Isochrone"]}},"/api/v1/geocode/autocomplete":{"post":{"callbacks":{},"description":"Suggests completions for a partial address or place name as the user types.","operationId":"autocomplete","parameters":[{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteRequest"}}},"description":"Autocomplete request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/AutocompleteResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteResult"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"Autocomplete results. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`boundary_gid` not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Autocomplete a partial address","tags":["Geocoding"]}},"/api/v1/expansion":{"post":{"callbacks":{},"description":"Runs a route, isochrone or matrix search and returns every road edge it settled as a GeoJSON FeatureCollection, with the computed path marked `on_path`. For debugging why a route was chosen. Requires the `X-Plaza-Debug: true` header or an API key with the `admin` scope (403 `debug_access_required` otherwise), and is limited to 10 requests per minute on every plan, on top of the plan's rate limit. Counts as one premium request. Responses are capped at 50,000 edges and 10 MB of geometry. PlazaQL: `expansion(action: ..., ...)`.","operationId":"expansion","parameters":[{"description":"`true` to allow expansion (not needed with an `admin` API key)","in":"header","name":"X-Plaza-Debug","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpansionRequest"}}},"description":"Expansion request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/ExpansionResult"}}},"description":"Visited edges"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No debug access"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No route, or no road network nearby"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Search exceeded the plan's request timeout"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Expansion limit reached"}},"summary":"Show the road edges the router visited (debug)","tags":["Routing"]}},"/api/v1/datasets/{id}/syncs":{"get":{"callbacks":{},"description":"Most recent syncs of a Plaza-curated dataset from its upstream source, newest first. Empty for user datasets.","operationId":"list_dataset_syncs","parameters":[{"description":"Dataset ID or slug","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Max runs to return (1-100, default 20)","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetSyncList"}}},"description":"Sync history"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"List a dataset's source sync history","tags":["Datasets"]}},"/api/v1/matrix":{"post":{"callbacks":{},"description":"Computes travel durations and distances between every origin and every destination. Routes obey OSM turn restrictions and pay the same turn costs as `POST /route` does; a pair reachable only through a prohibited turn has no route, and turn costs choose the route but never add to `duration_s`. With `depart_at`, motor modes are timed by that hour's traffic profile and conditional road limits apply then, as on POST /route.","operationId":"matrix","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixRequest"}}},"description":"Matrix request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixResult"}}},"description":"Distance matrix"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Vertices not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"An invalid `depart_at` or `traffic_model`, invalid `truck` parameters, invalid `bicycle`, `pedestrian`, `motorcycle` or `motor_scooter` options (or one sent with another mode), or invalid costing options (`use_*`, `shortest`, `top_speed`, `fixed_speed`, `maneuver_penalty`, `service_penalty`, `gate_cost`, `toll_booth_cost`, `country_crossing_cost`)"}},"summary":"Calculate a distance matrix between points","tags":["Distance Matrix"]}},"/api/v1/datasets":{"get":{"callbacks":{},"description":"Lists datasets the caller can query: Plaza-curated datasets (synced from public sources, with license, vintage, refresh schedule and last sync) and the caller's own uploads. Filter with `scope=plaza` or `scope=user`.","operationId":"list_datasets","parameters":[{"description":"Filter by scope: plaza (Plaza-curated, synced from public sources), user. Default shows user's own + plaza datasets.","in":"query","name":"scope","required":false,"schema":{"type":"string"}},{"description":"Also list Plaza-curated datasets that have not finished their first sync (status pending, processing or error). Default false: only ready Plaza datasets are listed. Your own datasets are always listed.","in":"query","name":"include_pending","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetList"}}},"description":"Dataset list"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"}},"summary":"List datasets","tags":["Datasets"]},"post":{"callbacks":{},"description":"Creates an empty user-owned dataset. Upload GeoJSON to it with `POST /datasets/{dataset_id}/upload` or add features individually. Counts against the plan's dataset limit.","operationId":"create_dataset","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetCreateRequest"}}},"description":"Dataset attributes","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetResponse"}}},"description":"Created dataset"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Create a new dataset","tags":["Datasets"]}},"/api/v1/map-match":{"post":{"callbacks":{},"description":"Snaps a noisy GPS trace to the road network and returns the matched route geometry and per-point tracepoints. With `mode` (and that mode's `truck`, `bicycle`, `pedestrian`, `motorcycle` or `motor_scooter` options) only roads that mode may use are candidates, so a scooter's trace never snaps to a motorway; without it any road matches. `datasets` lets the trace match the roads of your datasets too; a matched dataset road is named by its `name` property. `avoid_datasets` keeps it off roads that touch the polygons of the named datasets. PlazaQL: `map_match(points: [...], mode:, radiuses:, exclude:, datasets:, avoid_datasets:)`.","operationId":"map_match","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapMatchRequest"}}},"description":"Map match request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapMatchResult"}}},"description":"Match result"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Could not match points"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Match exceeded the plan's request timeout"}},"summary":"Match GPS coordinates to the road network","tags":["Map Matching"]}},"/api/v1/centroid":{"post":{"callbacks":{},"description":"Returns the point on the road network that minimises the total travel time (or distance) from every location, with each location's travel time and distance to it. Each location travels to the meeting point, so one-way streets count in that direction, and so do OSM turn restrictions. Locations must lie within 2 degrees of each other, and no location's trip may exceed 2 hours (150 km with `metric: distance`). Counts as one premium request. PlazaQL: `centroid(locations: [...], mode:, metric:, exclude:, avoid_datasets:)`.","operationId":"centroid","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CentroidRequest"}}},"description":"Centroid request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/CentroidResult"}}},"description":"Meeting point"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request, including locations more than 2 degrees apart"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"A location is not near a road, or no point is reachable from every location"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Search exceeded the plan's request timeout"}},"summary":"Find the least-cost meeting point for several locations","tags":["Routing"]}},"/api/v1/optimize/{job_id}":{"get":{"callbacks":{},"description":"Returns the status of an asynchronous optimization job, and the optimized route once it has completed.","operationId":"get_optimize_job","parameters":[{"description":"","in":"path","name":"job_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizeJobStatus"}}},"description":"Optimization status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Job not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Optimization failed"}},"summary":"Get async optimization result","tags":["Optimization"]}},"/api/v1/geocode":{"post":{"callbacks":{},"description":"Converts an address or place name into ranked GeoJSON Features with coordinates and structured address fields.","operationId":"geocode","parameters":[{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeForwardRequest"}}},"description":"Forward geocode request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"Geocoding results. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`boundary_gid` not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Forward geocode an address","tags":["Geocoding"]}},"/api/v1/search":{"post":{"callbacks":{},"description":"Full-text search over OSM feature names, best match first (trigram similarity, boosted for places with a Wikipedia article). When the place index has no match and the request has a spatial filter (`within`, `around`, `intersects`, ...), names containing `q` are matched over all OSM features inside it; without a spatial filter only the place index is searched. When more hits follow, the response carries `next_cursor` (body and `X-Next-Cursor` header); send it back as `cursor` with the same `q` for the next page. PlazaQL: `text_search(query: ...).cursor(\"...\")`. Datasets are not searched here; to find dataset features by name, use POST /features with `datasets` and `tags: {\"name\": \"~pattern\"}`.","operationId":"search","parameters":[{"description":"Search query string","in":"query","name":"q","required":true,"schema":{"type":"string"}},{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}},{"description":"Maximum results (default 25, max 100). Values outside 1-100 return 400.","in":"query","name":"limit","required":false,"schema":{"default":25,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Opaque keyset cursor: the `next_cursor` (or `X-Next-Cursor` header) of the previous page of the same query. A cursor from another query, or an edited one, is a 400 `invalid_cursor`. May also be sent in the JSON body.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Result offset for offset pagination (default 0, 0-100000; out-of-range values are a 400). Combining it with `cursor` is a 422.","in":"query","name":"offset","required":false,"schema":{"maximum":100000,"minimum":0,"type":"integer"}},{"description":"Coordinate decimal precision (1-15, default 7)","in":"query","name":"output[precision]","required":false,"schema":{"type":"integer"}},{"description":"Comma-separated property fields to include","in":"query","name":"output[fields]","required":false,"schema":{"type":"string"}},{"description":"Extra computed fields: bbox, distance, center","in":"query","name":"output[include]","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"GeoJSON FeatureCollection. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows.","headers":{"Link":{"description":"RFC 8288 `rel=\"next\"` link to the next page","schema":{"type":"string"},"style":"simple"},"X-Has-More":{"description":"`true` when another page follows","schema":{"type":"boolean"},"style":"simple"},"X-Limit":{"description":"The page size","schema":{"type":"integer"},"style":"simple"},"X-Next-Cursor":{"description":"Opaque cursor of the next page (also `next_cursor` in a JSON body); absent on the last page","schema":{"type":"string"},"style":"simple"},"X-Next-Offset":{"description":"Offset of the next page, when the request paged with `offset`","schema":{"type":"integer"},"style":"simple"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request, or an invalid cursor (`invalid_cursor`)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The search did not finish within the request timeout (`request_timeout`)"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value, or `cursor` with `offset`"}},"summary":"Search OSM features by name","tags":["Search"]}},"/api/v1/datasets/{dataset_id}/upload":{"post":{"callbacks":{},"description":"Uploads a GeoJSON file (multipart `file`) into a dataset you own. `mode` is `replace` (atomic swap), `merge` (upsert by feature id) or `append`. Processing is asynchronous: the response returns the dataset in `processing` status; poll `GET /datasets/{id}` until it is `ready` or `error`.","operationId":"upload_dataset","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DatasetUploadRequest"}}},"description":"Dataset upload","required":false},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetResponse"}}},"description":"Upload accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Storage quota exceeded"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dataset is processing"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"File too large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing `file` or missing/invalid `mode`"}},"summary":"Upload data into a dataset","tags":["Datasets"]}},"/api/v1/route":{"post":{"callbacks":{},"description":"Computes a route between an origin and a destination over the OSM road network for the chosen travel mode. Routes obey OSM turn restrictions (`no_left_turn`, `only_straight_on` and the rest, at a node or via ways): cars, trucks, motorcycles and scooters follow plain restrictions unless `except` exempts them, bicycles only `restriction:bicycle`, walkers only `restriction:foot`; conditional restrictions apply at `depart_at` local time and are ignored without it. A route may turn round at a dead end to keep to a restriction, and a waypoint does not reset them: the leg leaving it obeys the turns the route arrived for. When the only way to the destination is a prohibited turn, there is no route. Cars, trucks, motorcycles and scooters also pay small turn costs that steer the route away from left turns across oncoming traffic (right turns where traffic keeps left), turns onto a busier road at a junction without signals, and U-turns at junctions, so a route may go round a block to avoid one; they never add to `duration_s`, and `shortest` leaves them out. Ferries (`route=ferry`) are part of the network, timed by their `duration` tag (20 km/h without one), and carry each mode their access tags allow. Barrier nodes close a road to the modes they stop: bollards and similar to motor vehicles, stiles and turnstiles to everyone but walkers, locked or private gates to everyone; motor vehicles avoid other gates with a 300 s penalty that leaves `duration_s` alone. Request `alternatives` to get several candidate routes as a FeatureCollection. Add `ev` to plan charging stops; it combines with `waypoints` or with `alternatives` (each alternative is planned separately). `waypoints` and `alternatives` cannot be combined. Options such as `depart_at`, `traffic_model`, `exclude`, `avoid_datasets` and `datasets` apply to every leg and alternative. `datasets` adds the roads of your datasets to the graph (a campus or private estate OSM lacks), joined to OSM where their ends meet an OSM junction. With `mode: truck` and a `truck` vehicle the route avoids roads whose height, width, length, weight, axle-load or hazmat restrictions the vehicle exceeds; with `ev` it plans an electric truck (consumption by its `weight`, CCS and MCS chargers); with `mode: motorcycle` or `motor_scooter` `ev` plans an electric motorcycle or scooter (its own consumption, and only sockets a two-wheeler can use unless `connector_types` says otherwise). `mode: bicycle` takes a `bicycle` object (bike type, speed, and how much to avoid main roads, hills and rough surfaces) and `mode: foot` a `pedestrian` object (walking speed, hills, lighting, steps, hiking difficulty, wheelchair); preferences change which way the route goes, not its duration. `mode: motorcycle` takes a `motorcycle` object (touring or adventure style, tracks, curvy roads, lane splitting) and `mode: motor_scooter` a `motor_scooter` object (main roads, hills); scooters never use motorways and ride at most 45 km/h unless `top_speed` is set. Both report `curviness_avg` and `surface_breakdown`. With `mode: transit` the route walks and rides public transit from the GTFS feeds Plaza has loaded, leaving at `depart_at` or arriving by `arrive_by` (the latest departure that arrives in time): the response lists `legs` (walks and vehicles with stops, route names and times). `wheelchair: true` rides only accessible trips between accessible stops. A journey can change between feeds where their stops are a short walk apart; the search covers up to 4 hours of travel. Costing options (`use_highways`, `use_tolls`, `use_ferries`, `use_living_streets`, `use_tracks`, `shortest`, `top_speed`, `fixed_speed`, `maneuver_penalty`, `service_penalty`, `gate_cost`, `toll_booth_cost`, `country_crossing_cost`) tune which route is chosen; `duration_s` stays the travel time. Per-point `location_types`, `headings`, `heading_tolerances`, `preferred_sides` and `approaches` (`curb` arrives on the driving side) set how each point is passed, and `recostings` reports the route's time and cost under other costing models.","operationId":"route","parameters":[{"description":"Response format when `alternatives` > 0: json (default), geojson, csv, ndjson. Without alternatives the route is always a single GeoJSON Feature.","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteRequest"}}},"description":"Route request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteResult"}}},"description":"Route result"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No route found. For `mode: transit`, also no stop (with `wheelchair`, no accessible stop) within `max_walk_m` of either end, or nothing arrives by `arrive_by`. For `mode: truck`, `no_route` with `details.reason` `vehicle_dimensions_exceeded` means the road network connects the points but every path crosses a restriction the vehicle exceeds; `details.restrictions` lists those on the path it would otherwise take."},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`mode: transit` only: the search exceeded its time budget or the plan's request timeout."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid costing option, `location_types`, `headings`, `heading_tolerances`, `preferred_sides`, `approaches` or `recostings` (or one of them with `ev`), `ev`, `truck`, `bicycle`, `pedestrian`, `motorcycle` or `motor_scooter` options (or one sent with another mode), `depart_at`, transit option (`use_bus`, `use_rail`, `use_transfers`, `max_walk_m`, `max_transfers`, `wheelchair`, `arrive_by`), both `depart_at` and `arrive_by`, `arrive_by` or `wheelchair: true` with another mode, an option `mode: transit` does not take, a `depart_at` outside the published period of every transit feed near the origin, `traffic_model`, `lang`, `units`, `verbal`, `voice_instructions`, `banner_instructions`, `roundabout_exits`, `voice_units`, `waypoint_names` or `format` (an unsupported `lang` lists the supported codes in `details.supported`), or (`ev_range_insufficient`) the EV cannot reach the destination: no matching charging station is in range. `details.stranded_at_m` is the distance along the route where range runs out."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`mode: transit` only (`transit_unavailable`): the feed's timetable for that day is larger than the memory limit, or is still being prepared (retry shortly) or failed to load."}},"summary":"Calculate a route between two points","tags":["Routing"]}},"/api/v1/datasets/{id}/dictionary":{"get":{"callbacks":{},"description":"Describes each property a dataset's features carry: type, description and, for Plaza-curated datasets, the source field it comes from.","operationId":"get_dataset_dictionary","parameters":[{"description":"Dataset ID or slug","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetDictionary"}}},"description":"Field dictionary"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Get a dataset's field dictionary","tags":["Datasets"]}},"/api/v1/place":{"get":{"callbacks":{},"description":"Returns up to 50 places by Plaza GID (`osm:node:123`, `osm:way:456`, `osm:relation:789`, `osm:address:<id>`, `osm:place:<id>`) as a GeoJSON FeatureCollection in request order, each with its admin hierarchy and categories. Every geocoding result carries its `gid`. GIDs that match nothing are left out; 404 when none match. PlazaQL: `place_lookup(\"osm:node:123\", ...)`.","operationId":"place_lookup","parameters":[{"description":"Comma-separated GIDs, at most 50","example":"osm:node:21154906,osm:relation:1124039","in":"query","name":"ids","required":true,"schema":{"type":"string"}},{"description":"Preferred language for names (ISO 639-1)","in":"query","name":"lang","required":false,"schema":{"type":"string"}},{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResult"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"Places. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, malformed or too many GIDs"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No place matches any GID"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Look up places by GID","tags":["Geocoding"]}},"/api/v1/optimize":{"post":{"callbacks":{},"description":"Solves the visiting order for 2 to 50 waypoints for one vehicle, from travel times that obey OSM turn restrictions. Without constraints it is the traveling salesman problem, each pair of waypoints priced by its faster direction. With `time_windows`, `service_s` or `demands` and `capacity`, travel times are directed and each waypoint also gets its arrival, wait, service, departure and load; a problem no order can meet, or a load that needs more than one vehicle, is a 422 `infeasible`. Up to 10 waypoints return the optimized route directly; more return a `job_id` to poll with get_optimize_job.","operationId":"optimize","parameters":[{"description":"Response format for a solved result: json (default), geojson, csv, ndjson. An async job response (`status: processing`) is always JSON.","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizeRequest"}}},"description":"Optimize request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizeResult"}}},"description":"Optimization result"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value, or `infeasible`: no order meets the time windows and capacity"}},"summary":"Optimize route through waypoints","tags":["Optimization"]}},"/api/v1/geocode/reverse/batch":{"post":{"callbacks":{},"description":"Reverse geocodes up to 1000 points in one request. Each point returns its own FeatureCollection of nearest addresses and places, in input order; a point with nothing nearby gets an empty collection. `radius`, `limit`, `layer` and `lang` apply to every point, as on POST /geocode/reverse; `include` and `datasets` are single-point only. Each point counts as one standard request. PlazaQL: `reverse_geocode(points: [...])`.","operationId":"batch_reverse_geocode","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchReverseGeocodeRequest"}}},"description":"Batch reverse geocode request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchReverseGeocodeResult"}}},"description":"Batch results"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid `points`, or more than 1000 of them"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The lookups exceeded the request timeout"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"`include` or `datasets`, which batch requests do not take"}},"summary":"Batch reverse geocode multiple coordinates","tags":["Geocoding"]}},"/api/v1/geocode/reverse":{"post":{"callbacks":{},"description":"Finds the addresses and places closest to a coordinate, nearest first.","operationId":"reverse_geocode","parameters":[{"description":"Response format: json (default), geojson, csv, ndjson","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeReverseRequest"}}},"description":"Reverse geocode request","required":false},"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeResult"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"Reverse geocoding result. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No address found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Reverse geocode a coordinate","tags":["Geocoding"]}},"/api/v1/datasets/{dataset_id}/features/{id}":{"delete":{"callbacks":{},"description":"Deletes one feature from a dataset you own.","operationId":"delete_dataset_feature","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}},{"description":"Feature ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Delete a feature","tags":["Dataset Features"]},"get":{"callbacks":{},"description":"Returns one feature of a visible dataset by its feature id.","operationId":"get_dataset_feature","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}},{"description":"Feature ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetFeatureResponse"}}},"description":"GeoJSON Feature"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Get a single feature","tags":["Dataset Features"]},"patch":{"callbacks":{},"description":"Updates the geometry and/or properties of one feature in a dataset you own.","operationId":"update_dataset_feature","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}},{"description":"Feature ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetFeatureUpdateRequest"}}},"description":"Feature update","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetFeatureResponse"}}},"description":"Updated feature"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Update a feature","tags":["Dataset Features"]}},"/api/v1/elevation":{"post":{"callbacks":{},"description":"Returns ground elevation in meters for one point or a batch of points, sampled from the Copernicus 30m DEM.","operationId":"elevation","parameters":[{"description":"Response format for MultiPoint lookups: json (default), geojson, csv, ndjson. A Point lookup always returns a single GeoJSON Feature.","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElevationLookupRequest"}}},"description":"Elevation lookup request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElevationLookupResult"}}},"description":"Elevation result"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No elevation data"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value"}},"summary":"Look up elevation at one or more points","tags":["Elevation"]}},"/api/v1/tiles/{z}/{x}/{y}":{"get":{"callbacks":{},"description":"Returns one Mapbox Vector Tile (gzip-encoded when the client accepts it) rendered live from OpenStreetMap data in the Shortbread 1.0 schema: `water_polygons`, `land`, `buildings`, `streets`, `place_labels`, `pois` and the other Shortbread layers, each feature carrying `kind`, `osm_type`, `osm_id` and its layer's attributes. With `tags[key]=value` (or `tags[key]=*`) filters the tile holds a `features` layer with every matching element and its tags instead. Zoom 2-22; data is complete at zoom 14, so clients overzoom beyond it. Counts as one standard request toward a paid plan's monthly allocation; on the free plan tiles have their own daily budget (5,000 tiles/day) instead of using the 500 standard requests/day. Tile requests have their own per-minute rate limit, higher than the plan's general one. Tiles larger than 8 MB uncompressed are refused with a 400. The PlazaQL equivalent is `search(...).tile(z, x, y)` on POST /query.","operationId":"get_tile","parameters":[{"description":"Zoom level (2-22)","in":"path","name":"z","required":true,"schema":{"type":"integer"}},{"description":"Tile column (0 to 2^z - 1)","in":"path","name":"x","required":true,"schema":{"type":"integer"}},{"description":"Tile row (0 to 2^z - 1)","in":"path","name":"y","required":true,"schema":{"type":"integer"}},{"description":"Tag filters: `tags[amenity]=restaurant` matches the value exactly, `tags[cuisine]=*` matches any value. Up to 10; all must match.","explode":true,"in":"query","name":"tags","required":false,"schema":{"additionalProperties":{"type":"string"},"type":"object"},"style":"deepObject"},{"description":"Comma-separated layers to build. Default: every Shortbread layer, or `features` alone when `tags[...]` filters are given. GET /api/v1/tiles.json lists them.","in":"query","name":"layers","required":false,"schema":{"type":"string"}},{"description":"Comma-separated tag keys copied into each feature's properties (up to 50). Default: the layer's Shortbread attributes, every tag on `features`. `kind`, `osm_type` and `osm_id` are always present.","in":"query","name":"properties","required":false,"schema":{"type":"string"}},{"description":"Comma-separated element tables to read: node, way, relation (default all)","in":"query","name":"element_types","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/vnd.mapbox-vector-tile":{"schema":{"format":"binary","type":"string"}}},"description":"Mapbox Vector Tile. `X-Cache` is `hit` or `miss`."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid tile coordinates or filters"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"408":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Tile took too long to render"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"}},"summary":"Get a vector tile","tags":["Tiles"]}},"/api/v1/tiles.json":{"get":{"callbacks":{},"description":"TileJSON 3.0.0 describing GET /api/v1/tiles/{z}/{x}/{y}: the tile URL template, zoom range, bounds, attribution and each layer's fields. Takes the same `tags[...]`, `layers`, `properties` and `element_types` parameters as the tile endpoint and carries them in the tile URL. Needs no API key and is not metered; the tile URL carries no key, so send yours with each tile request.","operationId":"get_tilejson","parameters":[{"description":"Tag filters: `tags[amenity]=restaurant` matches the value exactly, `tags[cuisine]=*` matches any value. Up to 10; all must match.","explode":true,"in":"query","name":"tags","required":false,"schema":{"additionalProperties":{"type":"string"},"type":"object"},"style":"deepObject"},{"description":"Comma-separated layers to build. Default: every Shortbread layer, or `features` alone when `tags[...]` filters are given. GET /api/v1/tiles.json lists them.","in":"query","name":"layers","required":false,"schema":{"type":"string"}},{"description":"Comma-separated tag keys copied into each feature's properties (up to 50). Default: the layer's Shortbread attributes, every tag on `features`. `kind`, `osm_type` and `osm_id` are always present.","in":"query","name":"properties","required":false,"schema":{"type":"string"}},{"description":"Comma-separated element tables to read: node, way, relation (default all)","in":"query","name":"element_types","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TileJson"}}},"description":"TileJSON document"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid filters"}},"security":[],"summary":"Get TileJSON for the vector tiles","tags":["Tiles"]}},"/api/v1/datasets/{dataset_id}/features":{"get":{"callbacks":{},"description":"Lists features of a visible dataset in feature id order. When more features follow, the response carries an opaque `next_cursor` (in the body and the `X-Next-Cursor` header); pass it as `cursor` to fetch the next page. A cursor from another dataset or request is a 400 `invalid_cursor`. `format=geojson`, `ndjson` or `csv` stream the page with chunked transfer encoding, reading the features from the database as they are sent; the next cursor is then in the `X-Next-Cursor` header only. PlazaQL: `search(dataset(\"slug\"))` on POST /query takes the same `format`.","operationId":"list_dataset_features","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}},{"description":"Maximum results (default 100, max 10000)","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Opaque cursor from the previous page's `next_cursor`","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Response format: json (default) returns one GeoJSON FeatureCollection; geojson, csv and ndjson stream the page via chunked transfer encoding (ndjson: one Feature per line).","in":"query","name":"format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/geo+json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}},"application/x-ndjson":{"schema":{"description":"Newline-delimited JSON: one GeoJSON Feature per line, streamed with chunked transfer encoding.","type":"string"}},"text/csv":{"schema":{"description":"CSV with a header row and columns `id,type,lat,lng,properties` (`properties` is a JSON-encoded object), streamed with chunked transfer encoding.","type":"string"}}},"description":"GeoJSON FeatureCollection. Select the representation with the `format` parameter: `json` (default) or `geojson` return GeoJSON, `ndjson` streams one Feature per line, `csv` streams rows.","headers":{"Link":{"description":"RFC 8288 `rel=\"next\"` link to the next page","schema":{"type":"string"},"style":"simple"},"X-Has-More":{"description":"`true` when another page follows","schema":{"type":"boolean"},"style":"simple"},"X-Limit":{"description":"The page size","schema":{"type":"integer"},"style":"simple"},"X-Next-Cursor":{"description":"Opaque cursor of the next page (also `next_cursor` in a JSON body); absent on the last page","schema":{"type":"string"},"style":"simple"},"X-Next-Offset":{"description":"Offset of the next page, when the request paged with `offset`","schema":{"type":"integer"},"style":"simple"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid limit, or an invalid cursor (`invalid_cursor`)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid `format` value, or `cursor` with `offset`"}},"summary":"List features in a dataset","tags":["Dataset Features"]},"post":{"callbacks":{},"description":"Adds one or more GeoJSON features to a dataset you own. Each feature needs a unique `id`.","operationId":"create_dataset_features","parameters":[{"description":"Dataset ID","in":"path","name":"dataset_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetFeatureCreateRequest"}}},"description":"GeoJSON features","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetFeatureList"}}},"description":"Created features"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Add features to a dataset","tags":["Dataset Features"]}},"/api/v1/datasets/{id}":{"delete":{"callbacks":{},"description":"Permanently deletes a dataset you own and all its features, addresses and routing edges. Plaza-curated datasets cannot be deleted.","operationId":"delete_dataset","parameters":[{"description":"Dataset ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Delete a dataset","tags":["Datasets"]},"get":{"callbacks":{},"description":"Returns metadata for one dataset: counts, storage, detected schema and processing status. Plaza-curated datasets also carry source metadata and the most recent sync.","operationId":"get_dataset","parameters":[{"description":"Dataset ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetResponse"}}},"description":"Dataset"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"}},"summary":"Get dataset by ID","tags":["Datasets"]},"patch":{"callbacks":{},"description":"Updates the name, description or strict mode of a dataset you own. Plaza-curated datasets are read-only.","operationId":"update_dataset","parameters":[{"description":"Dataset ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetUpdateRequest"}}},"description":"Dataset attributes","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetResponse"}}},"description":"Updated dataset"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Update a dataset","tags":["Datasets"]}},"/api/v1/nearest":{"post":{"callbacks":{},"description":"Snaps a coordinate to the closest point on the routable road network and returns the snapped point and its distance.","operationId":"nearest","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestRequest"}}},"description":"Nearest request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestResult"}}},"description":"Nearest road result"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No road nearby"}},"summary":"Snap a coordinate to the nearest road","tags":["Routing"]}},"/api/v1/features/batch":{"post":{"callbacks":{},"description":"Fetches up to 100 features in one request by type and OSM ID. IDs that do not exist are left out of the FeatureCollection instead of failing the request.","operationId":"batch_get_features","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"description":"Batch request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureCollection"}}},"description":"GeoJSON FeatureCollection"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"}},"summary":"Fetch multiple features by type and ID","tags":["Features"]}}},"security":[{"BearerAuth":[]},{"ApiKeyHeader":[]}],"servers":[{"description":"Production","url":"https://plaza.fyi","variables":{}},{"description":"Local development","url":"http://localhost:4000","variables":{}}],"tags":[{"description":"Look up and spatially query raw OSM nodes, ways and relations.","name":"Features"},{"description":"Full-text search over feature names.","name":"Search"},{"description":"Run PlazaQL queries.","name":"Query"},{"description":"Forward, reverse, batch and autocomplete geocoding.","name":"Geocoding"},{"description":"Point-to-point routing and road snapping.","name":"Routing"},{"description":"Reachable areas within a travel-time budget.","name":"Isochrone"},{"description":"Travel times and distances between many points.","name":"Distance Matrix"},{"description":"Snap GPS traces to the road network.","name":"Map Matching"},{"description":"Waypoint ordering (traveling salesman).","name":"Optimization"},{"description":"Point elevation and elevation profiles.","name":"Elevation"},{"description":"Mapbox Vector Tiles of OSM data.","name":"Tiles"},{"description":"Upload and manage your own geospatial datasets.","name":"Datasets"},{"description":"Read and edit features inside a dataset.","name":"Dataset Features"}]}