AccessScore: Regions API #
The AccessScore: Regions API returns an accessibility score in the range (0, 1) for each region (neighborhood) — higher is more accessible. A region's score is the street-length-weighted mean of the AccessScores of its audited streets, so long streets count proportionally more than short ones, and its intersection_score the plain mean of its scored intersections — every crossing counts once.
AccessScore extends the method introduced in Li et al., A Pilot Study of Sidewalk Equity in Seattle (Urban Access 2022). It is experimental and the weights are subject to change. See the AccessScore: Streets API for how individual street scores are computed.
AccessScore: Regions Preview #
Below is a live preview of region AccessScores in La Piedad, Mexico, retrieved directly from the API. Each region is colored from red (low accessibility) to green (high); use the Color by dropdown to switch between the AccessScore and audit coverage. Hover or click a region to see its score and coverage.
One method, not the method. There is no single correct way to measure street- and neighborhood-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.
Endpoint#
Returns a region boundary and its AccessScore for each region in the queried area, optionally filtered by the Query Parameters below.
GET /v3/api/accessScoreRegions
Examples#
/v3/api/accessScoreRegions?filetype=geojson Get AccessScores for all regions in GeoJSON (default)
/v3/api/accessScoreRegions?filetype=geojson&inline=true Same, but opened in the browser
/v3/api/accessScoreRegions?filetype=csv Get AccessScores for all regions in CSV
/v3/api/accessScoreRegions?regionId=8 Get the score for a single region
How the score is computed#
Each of the region's audited streets is scored as described in the AccessScore: Streets API. The region's score is the mean of those street scores weighted by street length: Σ(score × length) / Σ(length). Unaudited streets are excluded. When a region has no audited streets, its score is null.
intersection_score is the unweighted mean of the scores of the region's intersections that have one (any street meeting them audited); grade-separated crossings are neither counted nor scored. intersection_count and scored_intersection_count say how many that is.
coverage reports the fraction of the region's streets that have been audited, so you can judge how complete a region's score is.
Quick Download #
Download region AccessScore data directly in your preferred format:
Note: This downloads scores for all regions. 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 regions within the box. If omitted, the city's default bounding box is used. |
regionId |
integer |
Return only the region with this id. Takes precedence over regionName; bbox takes precedence over both. |
regionName |
string |
Return only 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. |
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 region (MultiPolygon, WGS84 / EPSG:4326).
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "MultiPolygon", "coordinates": [...] },
"properties": {
"region_id": 8,
"name": "Terhune Park",
"score": 0.5623,
"coverage": 1.0,
"audited_street_count": 52,
"total_street_count": 52,
"intersection_score": 0.7412,
"intersection_count": 31,
"scored_intersection_count": 31,
"avg_cluster_counts": {
"CurbRamp": 2.1, "NoCurbRamp": 0.3, "Obstacle": 0.4, "SurfaceProblem": 0.6,
"Crosswalk": 0.9, "Signal": 0.1, "NoSidewalk": 0.5
}
}
},
...
]
}
GeoJSON Field Descriptions #
| Field Path | Type | Description |
|---|---|---|
geometry | MultiPolygon | The region's boundary polygon(s), in [longitude, latitude] (WGS84 / EPSG:4326). |
properties.region_id | integer | Project Sidewalk's unique identifier for this region. |
properties.name | string | The region (neighborhood) name. |
properties.score | number | Length-weighted mean AccessScore of the region's audited streets, in (0, 1). null when no streets in the region have been audited. |
properties.coverage | number | Fraction of the region's streets that have been audited, in [0, 1]. |
properties.audited_street_count | integer | Number of audited streets in the region. |
properties.total_street_count | integer | Total number of streets in the region. |
properties.intersection_score | number | Plain mean of the region's scored intersections' AccessScores, in (0, 1). null when none is scored. |
properties.intersection_count | integer | Number of intersections in the region, grade-separated crossings excluded. |
properties.scored_intersection_count | integer | How many of those have a score. |
properties.avg_cluster_counts | object | Mean number of scored clusters of each label type across the region's audited streets, keyed by label-type name. |
CSV Format #
If filetype=csv, the first row is the header. The per-type avg_cluster_counts are flattened into one avg_cluster_counts.<type> column per label type, and the geometry is simplified to the region centroid.
region_id,name,score,coverage,audited_street_count,total_street_count,intersection_score,intersection_count,scored_intersection_count,avg_cluster_counts.CurbRamp,avg_cluster_counts.NoCurbRamp,avg_cluster_counts.Obstacle,avg_cluster_counts.SurfaceProblem,avg_cluster_counts.Crosswalk,avg_cluster_counts.Signal,avg_cluster_counts.NoSidewalk,center_point
8,Terhune Park,0.5623,1.0,52,52,0.7412,31,31,2.1,0.3,0.4,0.6,0.9,0.1,0.5,"-74.012,40.895"
...
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 intersection columns are intScore, intCount, and scIntCount, and the per-type columns use short codes (e.g. aCRamp); 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. The per-type columns are named as in the CSV but with each dot turned into an underscore, since ArcGIS doesn't allow dots in column names: avg_cluster_counts_CurbRamp, and so on.
Error Responses#
400 Bad Request: Invalid parameter values (e.g., malformed bounding box, non-positive or unknown region id).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#
- Read
coveragealongsidescore: a high score over low coverage reflects only the audited fraction of the region. - Treat the score as relative, not absolute: the weights are experimental. Use scores to compare regions, not as a calibrated index.
- Drill down: use the AccessScore: Streets API and AccessScore: Intersections API to see which streets and crossings drive a region's scores.
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.