The AccessScore: Streets API returns an accessibility score in the range (0, 1) for each
street segment — higher is more accessible. The score weights each clustered accessibility feature by its
type, its severity/quality rating, and its tags, then squashes the total with a logistic function.
AccessScore extends the method introduced in Li et al., A Pilot Study of Sidewalk Equity in Seattle (Urban Access 2022). It is experimental: the weights are deliberately simple and subject to change. For full control you can compute your own index from the Label Clusters API.
Below is a live preview of street AccessScores from a sample region in Hackensack, Nueva Jersey, retrieved directly from the API. Streets are colored from red (low accessibility) to green (high); gray streets have not yet been audited. Hover or click a street to see its score and the accessibility features that produced it.
One method, not the method. There is no single correct way to measure street-level accessibility—researchers and practitioners use many different approaches. AccessScore implements just one such algorithm, and it is experimental: the weighting is deliberately simple and subject to change. Treat these scores as one lens rather than a definitive measure, and compute your own index from the Label Clusters API if a different method suits your needs better.
Returns a street segment and its AccessScore for each street in the queried area, optionally filtered by the Query Parameters below.
GET /v3/api/accessScoreStreets
/v3/api/accessScoreStreets?filetype=geojson Get AccessScores for all streets in GeoJSON (default)
/v3/api/accessScoreStreets?filetype=geojson&inline=true Same, but opened in the browser
/v3/api/accessScoreStreets?filetype=csv Get AccessScores for all streets in CSV
/v3/api/accessScoreStreets?regionId=8 Get scores for streets in a single region
Project Sidewalk clusters proximal labels of the same type. Each scored cluster on a street contributes a
signed weight; the street's score is the logistic (sigmoid) of the sum of those weights, mapped to
(0, 1). An empty or unlabeled street scores the neutral 0.5.
Each cluster's contribution is base(type) × ratingMultiplier + Σ tagAdjustments:
+1.0 / +0.5 / −1.0. A Bad feature therefore lowers the score.0.33 / 0.67 / 1.0 of the (negative) base.
The per-type cluster_counts and sub_scores in each response let you see exactly how
a street's score was composed. Other label types (Occlusion, Other) do not affect the score.
Note: The score is not normalized by street length — a long street with many issues saturates toward 0. Region scores (see the AccessScore: Regions API) are length-weighted.
Download street AccessScore data directly in your preferred format:
Note: This downloads scores for all streets. For filtered data, use the API Query Parameters described below.
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. A region filter is resolved to the
region's bounding box, and the streets are then trimmed back to that region.
| 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). If omitted, the city's default bounding box is used. |
regionId |
integer |
Score only streets within the region with this id. Takes precedence over regionName; bbox takes precedence over both. |
regionName |
string |
Score only streets within the region with this name. Used only when bbox and regionId are absent. |
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. |
On success, the API returns 200 OK and the requested data in the specified filetype format.
Returns a GeoJSON FeatureCollection where each feature is a street segment (LineString, WGS84 / EPSG:4326).
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [[-74.0243, 40.8839], [-74.0245, 40.8836]]
},
"properties": {
"street_edge_id": 766,
"osm_way_id": 11584845,
"region_id": 8,
"score": 1.0,
"audit_count": 2,
"length_meters": 142.7,
"label_count": 29,
"cluster_counts": {
"CurbRamp": 10, "NoCurbRamp": 0, "Obstacle": 0, "SurfaceProblem": 1,
"NoSidewalk": 0, "Crosswalk": 6, "Signal": 0
},
"sub_scores": {
"CurbRamp": 7.5, "NoCurbRamp": 0.0, "Obstacle": 0.0, "SurfaceProblem": -0.67,
"NoSidewalk": 0.0, "Crosswalk": 4.25, "Signal": 0.0
}
}
},
...
]
}
| Field Path | Type | Description |
|---|---|---|
geometry.coordinates | array[number] | Coordinate pairs forming the street's path, in [longitude, latitude] (WGS84 / EPSG:4326). |
properties.street_edge_id | integer | Project Sidewalk's unique identifier for this street segment. |
properties.osm_way_id | integer | OpenStreetMap Way ID for the street, if available. |
properties.region_id | integer | Identifier for the region the street belongs to. |
properties.score | number | AccessScore in (0, 1); higher is more accessible. null when the street has not been audited. |
properties.audit_count | integer | Number of completed (high-quality) audits of this street. |
properties.length_meters | number | Street length in meters (used to length-weight region scores). |
properties.label_count | integer | Number of labels contributing to this street's scored clusters. |
properties.cluster_counts | object | Number of scored clusters of each label type on the street, keyed by label-type name. |
properties.sub_scores | object | Summed contribution of each label type to the pre-sigmoid total, keyed by label-type name. Explains how the score was composed. |
If filetype=csv, the first row is the header. The per-type cluster_counts and sub_scores are flattened into one column per label type (n_* and score_*), and the geometry is simplified to start/end points.
street_edge_id,osm_way_id,region_id,score,audit_count,length_meters,label_count,n_curb_ramp,n_no_curb_ramp,n_obstacle,n_surface_problem,n_no_sidewalk,n_crosswalk,n_signal,score_curb_ramp,score_no_curb_ramp,score_obstacle,score_surface_problem,score_no_sidewalk,score_crosswalk,score_signal,start_point,end_point
766,11584845,8,1.0,2,142.7,29,10,0,0,1,0,6,0,7.5,0.0,0.0,-0.67,0.0,4.25,0.0,"-74.0243,40.8839","-74.0245,40.8836"
...
If filetype=shapefile, the response is a ZIP archive of Shapefile components (.shp, .shx, .dbf, .prj). Because the DBF format truncates column names at 10 characters, the per-type columns use short codes (e.g. nCRamp, sCRamp); the GeoJSON, CSV, and GeoPackage formats keep the full names.
If filetype=geopackage, the response is a GeoPackage (.gpkg) file with full geometry and attributes (full snake_case column names).
400 Bad Request: Invalid parameter values (e.g., malformed bounding box, non-positive or unknown region id).500 Internal Server Error: An unexpected error occurred on the server.{
"status": 400,
"code": "INVALID_PARAMETER",
"message": "Invalid value for bbox parameter. Expected format: minLng,minLat,maxLng,maxLat.",
"parameter": "bbox"
}
cluster_counts and sub_scores explain each score and help you sanity-check it.null score means the street has not been audited — absence of data, not poor accessibility.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
If you are interested in bringing Project Sidewalk to your city, please read our Wiki page.