Places API #
The Places API returns the destinations that matter most to people with disabilities and to the city staff who plan for them: schools, health care, libraries, grocery stores, transit stops, parks, and community centers. Each is a point with a category, a name, the region it lies in, and the nearest street, so a street's AccessScore can be read as "the block between a bus stop and a clinic" rather than as a block on its own. The AccessScore map draws this layer.
Places come from OpenStreetMap, fetched for the city's bounds by a job that runs weekly, so a place added or corrected on OSM appears here within the week. OSM-derived fields (every field of an osm place) are © OpenStreetMap contributors, available under the Open Database License. A wrong or missing place is best fixed on OSM itself, where the fix reaches everyone; osm_url links straight to the object.
Places Preview #
Below is a live preview of the places in a sample region of Chicago, IL, retrieved directly from the API. Hover a place to highlight it; click for its name, category, and nearest street.
Endpoint#
Returns each place in the queried area, optionally filtered by the Query Parameters below.
GET /v3/api/places
Examples#
/v3/api/places?filetype=geojson Get every place in GeoJSON (default)
/v3/api/places?filetype=geojson&inline=true Same, but opened in the browser
/v3/api/places?category=school,health&filetype=csv Schools and health care only, in CSV
/v3/api/places?regionId=8 Get the places in a single region
How places are chosen#
A place is any OpenStreetMap node, way, or relation inside the city's bounds that carries one of the tags below; a way or relation is reduced to its center point. An object matching several categories takes the first in this order, so a school that also sells groceries is a school. Objects farther than 250 m from every region are left out as outside the city. The same list is published as place_categories on /v3/api/accessScoreConfig.
| Category | OpenStreetMap tags |
|---|---|
school |
amenity=college, amenity=kindergarten, amenity=school, amenity=university |
health |
amenity=clinic, amenity=doctors, amenity=hospital, amenity=pharmacy |
library |
amenity=library |
grocery |
shop=greengrocer, shop=supermarket |
transit |
highway=bus_stop; railway=halt, railway=station, railway=tram_stop; public_transport=station; amenity=bus_station, amenity=ferry_terminal |
park |
leisure=park, leisure=playground |
community |
amenity=community_centre, amenity=social_facility |
The nearest street is the closest open street within 250 m of the place (geodesic distance to the street's centerline) — the same streets the AccessScore and Streets APIs serve, so a street in a hidden region or without imagery is never the answer — and the region is the one whose polygon contains the point. Both are recomputed on every refresh. A refresh keeps a place's place_id as long as OpenStreetMap keeps the object, so an id in a shared link stays valid.
Places are refreshed from OpenStreetMap when the newest one is more than 7 days old; fetched_at on each place says when.
Quick Download #
Download the city's places directly in your preferred format:
Note: This downloads every place in the city. For filtered data, use the API Query Parameters described below.
Query Parameters#
All parameters are optional.
Note: When multiple location filters are provided (bbox, regionId, and regionName), bbox takes precedence over region filters, and regionId takes precedence over regionName.
| Parameter | Type | Description |
|---|---|---|
bbox |
string |
Filter by bounding box, as minLongitude,minLatitude,maxLongitude,maxLatitude (e.g., -74.04,40.88,-74.00,40.91), WGS84 (EPSG:4326). Returns the places inside the box. If omitted, with no region filter either, every place in the city is returned: a place is always within 250 m of one of the city's regions, so there is no default box to fall back to. |
regionId |
integer |
Return only places whose point lies in the region with this id. Takes precedence over regionName; bbox takes precedence over both. |
regionName |
string |
Return only places in the region with this name. Used only when bbox and regionId are absent. |
category |
string |
Comma-separated category ids to keep: any of school, health, library, grocery, transit, park, community. Every category by default. An unknown id is a 400. |
filetype |
string |
Output format. Options: geojson (default), csv, shapefile, geopackage. |
inline |
boolean |
Whether to display the file inline rather than as an attachment. Default: false. |
Responses#
Success Response (200 OK)#
On success, the API returns 200 OK and the requested data in the specified filetype format.
GeoJSON Format (Default) #
Returns a GeoJSON FeatureCollection where each feature is a place (Point, WGS84 / EPSG:4326).
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [-74.0105, 40.8805] },
"properties": {
"place_id": 128,
"category": "school",
"name": "Teaneck High School",
"source": "osm",
"osm_type": "way",
"osm_id": 34823917,
"osm_url": "https://www.openstreetmap.org/way/34823917",
"region_id": 8,
"region_name": "West Englewood",
"nearest_street_edge_id": 766,
"nearest_street_distance_m": 41.7,
"fetched_at": "2026-09-17T09:15:02.113Z"
}
},
...
]
}
GeoJSON Field Descriptions #
| Field Path | Type | Description |
|---|---|---|
geometry.coordinates | array[number] | The place's position, in [longitude, latitude] (WGS84 / EPSG:4326): the node itself, or the center of the way or relation. |
properties.place_id | integer | Project Sidewalk's identifier for the place; stable across refreshes. |
properties.category | string | One of school, health, library, grocery, transit, park, community; see how places are chosen. |
properties.name | string | The place's name, from its name tag; null for an unnamed object. |
properties.source | string | osm for a place from OpenStreetMap, city for one the city supplied. |
properties.osm_type | string | node, way, or relation; null for a city place. |
properties.osm_id | integer | The OpenStreetMap object id, unique with osm_type; null for a city place. |
properties.osm_url | string | The object's page on openstreetmap.org, where a wrong or missing place is fixed for everyone; null for a city place. |
properties.region_id | integer | Identifier of the region containing the point; null just outside every region. |
properties.region_name | string | Name of that region; null with it. |
properties.nearest_street_edge_id | integer | The street_edge_id of the nearest open street within 250 m (see the Streets API); null when no street is that close. |
properties.nearest_street_distance_m | number | Geodesic meters from the place to that street's centerline; null with it. |
properties.fetched_at | string | When the place was last fetched from its source (ISO 8601). |
CSV Format #
If filetype=csv, the first row is the header, with the geometry as lat, lng.
place_id,category,name,source,osm_type,osm_id,osm_url,region_id,region_name,nearest_street_edge_id,nearest_street_distance_m,fetched_at,lat,lng
128,school,Teaneck High School,osm,way,34823917,https://www.openstreetmap.org/way/34823917,8,West Englewood,766,41.7,2026-09-17T09:15:02.113Z,40.8805,-74.0105
...
Shapefile Format #
If filetype=shapefile, the response is a ZIP archive of Shapefile components (.shp, .shx, .dbf, .prj, .cpg). Text longer than 254 bytes is truncated. Because the DBF format truncates column names at 10 characters, the columns are placeId, category, name, source, osmType, osmId, osmUrl, regionId, regionName, streetId, distM, fetchedAt; the GeoJSON, CSV, and GeoPackage formats keep the full names.
GeoPackage Format #
If filetype=geopackage, the response is a GeoPackage (.gpkg) file with full geometry and the same fields, in the same order, as the GeoJSON properties, in a places layer.
Error Responses#
400 Bad Request: Invalid parameter values (e.g., malformed bounding box, non-positive region id, unknown category).429 Too Many Requests: The same file is already being built for an earlier request; waitRetry-Afterseconds and try again. AHEADrequest gets the same answer without building anything.500 Internal Server Error: An unexpected error occurred on the server.
Error Response Body #
All errors are returned as RFC 7807 “problem details” with the application/problem+json content type and the following structure:
{
"type": "about:blank", // RFC 7807 problem-type URI ("about:blank" means no type beyond the status)
"title": "Invalid Parameter", // Short, human-readable summary of the problem type (stable for a given code)
"status": 400, // HTTP status code (also repeated in the body)
"detail": "Invalid value for the bbox parameter. Expected format: minLng,minLat,maxLng,maxLat.", // This occurrence
"code": "INVALID_PARAMETER", // Stable, machine-readable error code you can branch on
"parameter": "bbox" // Extension member: the specific parameter at fault (omitted when not applicable)
}
Best Practices#
- Join to streets:
nearest_street_edge_idis thestreet_edge_idof the AccessScore: Streets API, so a place can carry the score of the street it sits on. - Mind
transit: bus stops are about half of all places in a large city. Filter bycategorywhen they are not what you are after. - Treat OSM coverage as uneven: a category with few places in a region may mean few were mapped, not few exist. Fix gaps on OpenStreetMap; the next weekly refresh picks them up.
- An empty response means the city's places have not been fetched yet (the first fetch follows the deployment's first nightly run), not that the city has none.
Contribute#
Project Sidewalk is an open-source project created by the Makeability Lab and hosted on GitHub. We welcome your contributions! If you found a bug or have a feature request, please open an issue on GitHub.
You can also email us at sidewalk@cs.uw.edu
Project Sidewalk in Your City!#
If you are interested in bringing Project Sidewalk to your city, please read our Wiki page.