AccessScore: Streets API

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.

AccessScore: Streets Preview

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.

Endpoint

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

Examples

/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

How the score is computed

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:

  • Positive, quality-rated (CurbRamp, Crosswalk): rated Good / Okay / Bad → multiplier +1.0 / +0.5 / −1.0. A Bad feature therefore lowers the score.
  • Negative, severity-rated (NoCurbRamp, Obstacle, SurfaceProblem): rated Low / Medium / High → magnitude 0.33 / 0.67 / 1.0 of the (negative) base.
  • Presence-only (no rating): a pedestrian Signal contributes a fixed positive weight; a missing sidewalk (NoSidewalk) a fixed negative weight.
  • Tags adjust a cluster's weight when present on a majority of its labels — e.g. a Signal tagged hard to reach buttons counts negatively, while APS (accessible signal) counts positively.

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.

Quick Download

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.

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. A region filter is resolved to the region's bounding box, and the streets are then trimmed back to that region.

ParameterTypeDescription
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.

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 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
                }
            }
        },
        ...
    ]
}
GeoJSON Field Descriptions
Field PathTypeDescription
geometry.coordinatesarray[number]Coordinate pairs forming the street's path, in [longitude, latitude] (WGS84 / EPSG:4326).
properties.street_edge_idintegerProject Sidewalk's unique identifier for this street segment.
properties.osm_way_idintegerOpenStreetMap Way ID for the street, if available.
properties.region_idintegerIdentifier for the region the street belongs to.
properties.scorenumberAccessScore in (0, 1); higher is more accessible. null when the street has not been audited.
properties.audit_countintegerNumber of completed (high-quality) audits of this street.
properties.length_metersnumberStreet length in meters (used to length-weight region scores).
properties.label_countintegerNumber of labels contributing to this street's scored clusters.
properties.cluster_countsobjectNumber of scored clusters of each label type on the street, keyed by label-type name.
properties.sub_scoresobjectSummed contribution of each label type to the pre-sigmoid total, keyed by label-type name. Explains how the score was composed.

CSV Format

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"
...

Shapefile Format

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.

GeoPackage Format

If filetype=geopackage, the response is a GeoPackage (.gpkg) file with full geometry and attributes (full snake_case column names).

Error Responses

  • 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"
}

Best Practices

  • Treat the score as relative, not absolute: the weights are experimental. Use scores to compare streets, not as a calibrated index.
  • Read the breakdown: cluster_counts and sub_scores explain each score and help you sanity-check it.
  • Mind audit coverage: a null score means the street has not been audited — absence of data, not poor accessibility.
  • Roll up to neighborhoods: use the AccessScore: Regions API for length-weighted, region-level 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.

On This Page