The Raw Labels API provides access to individual geo-located labels placed by Project Sidewalk users. Each label represents a sidewalk feature or barrier that has been identified and categorized in street view imagery.
This endpoint returns raw, unclustered data. For most applications, we recommend using the Label Clusters API as it groups potentially duplicate labels of the same feature using a custom clustering algorithm. Use this Raw Labels API when you need access to every individual label record, including metadata about the user (anonymized) and validation status.
Below is a live preview of raw labels from a sample region in New Taipei, Taiwan retrieved directly from the API. Compare this map to the Label Clusters equivalent to see the difference between clustered labels vs. raw labels. Depending on the number of labels in the region, it may take a bit to load.
Note: In this example, we are visualizing Project Sidewalk data only in a single region; however, the Raw Labels API can return data from all regions in the city or just a selected region—see the API query parameters below.
Retrieve a list of raw labels, optionally filtered by various criteria.
GET /v3/api/rawLabels
/v3/api/rawLabels?filetype=geojson Get all raw labels in GeoJSON (default)
/v3/api/rawLabels?filetype=geojson&inline=true Get all raw labels in GeoJSON but opened in the browser
/v3/api/rawLabels?filetype=csv Get all raw labels in a CSV
/v3/api/rawLabels?labelType=CurbRamp Get all raw labels of type CurbRamp. The available label types match those in the Label Types API
/v3/api/rawLabels?labelType=SurfaceProblem&minSeverity=2 Get all raw labels of type SurfaceProblem with a minimum severity of 2.
/v3/api/rawLabels?severity=none,3 Get all raw labels that are either unrated or severity 3.
/v3/api/rawLabels?tags=narrow&tags=uneven surface Get all raw labels carrying either the narrow or the uneven surface tag. Repeat tags once per tag.
/v3/api/rawLabels?tags=CurbRamp:narrow Narrow CurbRamp labels to those tagged narrow, leaving every other label type unfiltered.
/v3/api/rawLabels?labelType=CurbRamp&tags=CurbRamp:narrow Get only CurbRamp labels tagged narrow — pair the scoped tag with labelType to also drop the other types.
Download raw labels data directly in your preferred format:
Note: This downloads all raw labels. For filtered data, use the API query parameters described below.
Filter the raw labels returned by this endpoint using the following query parameters. All parameters are optional. Combine multiple filter parameters to narrow down results (filters are applied using AND logic). 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 labels by bounding box. Coordinates should be provided as a comma-separated string in the format: minLnggitude,minLatitude,maxLongitude,maxLatitude (e.g., -74.01,40.71,-74.00,40.72). Uses WGS84 (EPSG:4326) coordinates. If omitted, results are not spatially filtered (potentially very large response). |
regionId |
integer |
Filter labels by region ID. Returns only labels within the specified region. Note: If both bbox and regionId are provided, bbox takes precedence. |
regionName |
string |
Filter labels by region name. Returns only labels within the specified region. Note: If bbox or regionId are provided, they take precedence over regionName. |
labelType |
string |
Filter by one or more label types. Provide comma-separated values (e.g., labelType=CurbRamp,Obstacle). See Label Types Reference for available types.
Changed August 2026 (v3 is a preview API): values are validated against the known label types, so an unrecognized or empty value now returns a 400 error naming the parameter instead of silently matching nothing. |
tags |
string (repeatable) |
Filter by one or more tags associated with labels. Repeat the parameter once per tag (e.g., tags=missing tactile warning&tags=uneven surface). Matches labels containing *any* of the specified tags.
An entry may be scoped to a single label type with a LabelType:tag prefix (e.g., tags=CurbRamp:narrow). A scoped entry narrows only that label type — labels of types nobody scoped come back unfiltered — so pair it with labelType if you want the other types dropped too. An entry whose prefix (the text before the first colon) is not a valid label type is treated as a plain tag applying to every type, since tag names may themselves contain colons (e.g., cycle lane: faded paint).
Changed August 2026 (v3 is a preview API): tags is no longer comma-separated, because tag names may contain commas (e.g., yellow box, accessibility features not visible) and splitting on them silently shredded such a tag into two that matched nothing. Repeat the parameter instead (tags=a&tags=b); a comma-joined value from an older link is still accepted when its pieces name real tags. Values are now validated against this city's tags — an unknown tag, or a tag scoped to a label type that doesn't carry it, returns a 400 error naming the parameter instead of silently matching nothing. Scoped entries also no longer exclude the label types they don't name.
See Tags Reference for available tags. |
severity |
string |
Filter by an arbitrary set of severities. Provide comma-separated values from 1, 2, 3, and none (labels with no severity rating), e.g. severity=none,3. Matches labels with *any* of the listed severities. Cannot be combined with minSeverity/maxSeverity (returns a 400 error). |
minSeverity |
integer |
Filter labels with a severity rating/quality greater than or equal to this value (1-3). Cannot be combined with severity. |
maxSeverity |
integer |
Filter labels with a severity/quality rating less than or equal to this value (1-3). Cannot be combined with severity. |
validationStatus |
string |
Filter by one or more validation statuses (comma-separated, matching *any* of them). Possible values: validated_correct, validated_incorrect, unsure (has validations but no consensus yet), unvalidated (no validations at all). Changed August 2026 (v3 is a preview API): unvalidated now means zero validations; labels with non-consensus validations are returned by the new unsure value instead. |
highQualityUserOnly |
boolean |
When set to true, only include labels from users flagged as high quality contributors. Default: false. |
startDate |
string |
Filter labels created on or after this date/time. Format: ISO 8601 (e.g., 2024-01-01T00:00:00Z). Filters based on the time_created field. |
endDate |
string |
Filter labels created before this date/time. Format: ISO 8601 (e.g., 2024-12-31T23:59:59Z). Filters based on the time_created field. |
filetype |
string |
Specify the output format. Options: geojson (default), csv, shapefile, geopackage. |
inline |
boolean |
Whether to display the file inline or as an attachment. Default: false (attachment). Set to true to view data in the browser instead of downloading.
Fixed August 2026: filetype=csv previously forced an attachment and ignored this parameter. The fix applies to every /v3 endpoint that emits CSV, not just this one. |
On success, the API returns an HTTP 200 OK status code and the requested data in the specified filetype format.
Returns a GeoJSON FeatureCollection where each feature represents a single raw label. Coordinate Reference System (CRS) is WGS84 (EPSG:4326).
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-74.0243606567383, 40.8839912414551]
},
"properties": {
"label_id": 8,
"user_id": "18b26a38-24ab-402d-a64e-158fc0bb8a8a",
"pano_id": "DsCvWstZYz9JL81V9NloOQ",
"pano_source": "gsv",
"label_type": "CurbRamp",
"severity": 1,
"tags": [],
"description": null,
"time_created": 1692227245041,
"high_quality_user": true,
"street_edge_id": 951,
"osm_way_id": 11584845,
"region_id": 1,
"region_name": "Teaneck Community Charter School",
"correct": true,
"agree_count": 2,
"disagree_count": 0,
"unsure_count": 0,
"validations": [
{
"user_id": "056df9f9-a7de-46f1-ae52-02c069f5829f",
"validation": "1"
},
{
"user_id": "de691775-ac79-45f9-b265-e867702adc1d",
"validation": "1"
}
],
"audit_task_id": 6,
"mission_id": 3,
"image_capture_date": "2012-08",
"heading": 94.3114318847656,
"pitch": -24.6774997711182,
"zoom": 2,
"canvas_x": 395,
"canvas_y": 151,
"canvas_width": 480,
"canvas_height": 720,
"pano_x": 1781,
"pano_y": 3980,
"pano_width": 13312,
"pano_height": 6656,
"camera_heading": 228.928619384766,
"camera_pitch": -0.998329997062683,
"camera_roll": 0.888324597068312,
"pano_url": "https://www.google.com/maps/@?api=1&map_action=pano&pano=DsCvWstZYz9JL81V9NloOQ&heading=94.3114318847656&pitch=-24.6774997711182"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-74.0243835449219, 40.8839416503906]
},
"properties": {
"label_id": 9,
"user_id": "18b26a38-24ab-402d-a64e-158fc0bb8a8a",
"pano_id": "DsCvWstZYz9JL81V9NloOQ",
"pano_source": "gsv",
"label_type": "Crosswalk",
"severity": 1,
"tags": [],
"description": null,
"time_created": 1692227248747,
"street_edge_id": 95,
"osm_way_id": 11566031,
"region_id": 1,
"region_name": "Teaneck Community Charter School",
"correct": true,
"agree_count": 2,
"disagree_count": 1,
"unsure_count": 0,
"validations": [
{
"user_id": "2e602097-9e49-4217-ba24-816b2093e491",
"validation": "1"
},
{
"user_id": "8af92eb8-fb84-4aa6-9539-abc95216dcd7",
"validation": "1"
},
{
"user_id": "be481045-4448-42ae-bbac-3455ce914202",
"validation": "2"
}
],
"audit_task_id": 6,
"mission_id": 3,
"image_capture_date": "2012-08",
"heading": 140.740005493164,
"pitch": -18.1596431732178,
"zoom": 2,
"canvas_x": 246,
"canvas_y": 225,
"canvas_width": 480,
"canvas_height": 720,
"pano_x": 3038,
"pano_y": 3948,
"pano_width": 13312,
"pano_height": 6656,
"camera_heading": 228.928619384766,
"camera_pitch": -0.998329997062683,
"camera_roll": 0.888324597068312,
"pano_url": "https://www.google.com/maps/@?api=1&map_action=pano&pano=DsCvWstZYz9JL81V9NloOQ&heading=140.740005493164&pitch=-18.1596431732178"
}
},
...
]
}
Each feature in the GeoJSON response represents a single raw label with point geometry and detailed properties:
| Field Path | Type | Description |
|---|---|---|
geometry.coordinates |
array[number] |
Geographic coordinates in [longitude, latitude] format using WGS84 (EPSG:4326) coordinate system. |
properties.label_id |
integer |
Unique identifier for the label in the Project Sidewalk database. |
properties.user_id |
string |
Anonymized unique identifier (UUID) for the user who placed the label. All labels from the same user will have the same user_id. |
properties.label_type |
string |
Type of sidewalk feature or barrier represented by this label. Possible values: CurbRamp, NoCurbRamp, Crosswalk, SurfaceProblem, Obstacle, Signal, NoSidewalk, or Other. |
properties.severity |
integer |
User-reported severity rating: 1 (Low), 2 (Medium), or 3 (High). For accessibility features like curb ramps and marked crosswalks, the scale is defined as 1 (Good quality), 2 (Okay quality), or 3 (Low quality). |
properties.tags |
array[string] |
Array of string tags providing additional context about the label. Common tags include grass, height difference, no alternate route, points into cross traffic, among others. |
properties.description |
string | null |
Optional free-text description provided by the user, or null if none was provided. |
properties.time_created |
long |
Unix timestamp (milliseconds since epoch) when the label was created. |
properties.high_quality_user |
boolean |
Whether the user who created the label is flagged as a high-quality contributor based on algorithmic assessment. |
properties.street_edge_id |
integer |
Project Sidewalk internal identifier for the street segment the label is associated with. |
properties.osm_way_id |
integer |
OpenStreetMap Way ID for the street segment, if available. |
properties.region_id |
integer |
Project Sidewalk identifier for the region (neighborhood) the label falls within. Matches region_id in the Streets, Regions, and LabelClusters APIs. |
properties.region_name |
string |
Name of the region (neighborhood) the label falls within, as defined in Project Sidewalk's regions. |
properties.correct |
boolean | null |
Computed validation status based on user validations. true if the label has been verified as correct by community validation, false if determined to be incorrect, or null if insufficient validation data exists. |
properties.agree_count |
integer |
Number of users and/or AI who agreed with (confirmed) this label during validation tasks. To separate human vs. AI validations, use the validations endpoint (its validator_type field). |
properties.disagree_count |
integer |
Number of users and/or AI who disagreed with (disputed) this label during validation tasks. To separate human vs. AI validations, use the validations endpoint (its validator_type field). |
properties.unsure_count |
integer |
Number of users and/or AI who marked "unsure" for this label during validation tasks. To separate human vs. AI validations, use the validations endpoint (its validator_type field). |
properties.validations |
array |
Array of individual validation objects. Each object contains: user_id (anonymized identifier of the validating user) and validation (the validation value: "1" for agree, "2" for disagree, "3" for unsure). |
properties.audit_task_id |
integer |
Identifier for the auditing session during which this label was created. |
properties.mission_id |
integer |
Identifier for the mission the user was completing when this label was created. |
properties.pano_id |
string |
Panorama identifier where the label was placed. |
properties.pano_source |
string |
Imagery provider the panorama came from: gsv (Google Street View), mapillary, or infra3d. |
properties.image_capture_date |
string |
Date when the imagery was captured, typically in "YYYY-MM" format (e.g., "2012-08"). |
properties.pano_url |
string | null |
Link to view the panorama where this label was placed in its imagery provider's viewer, positioned at the label's heading and pitch. For Google Street View panoramas this uses Google's Maps URLs format (no API key required); for Mapillary it links to the Mapillary web app. null for providers without a shareable public viewer (e.g., infra3d). |
properties.heading |
number |
Horizontal angle (in degrees) of the user's view when placing the label, measured clockwise from north. |
properties.pitch |
number |
Vertical angle (in degrees) of the user's view when placing the label, with negative values indicating a downward tilt. |
properties.zoom |
integer |
Zoom level of the panorama when the label was placed. |
properties.camera_heading |
number |
Base heading of the camera (in degrees), before user rotation. |
properties.camera_pitch |
number |
Base pitch of the camera (in degrees), before user adjustment. |
properties.camera_roll |
number |
Roll (rotation) of the camera (in degrees). |
properties.canvas_x |
integer |
X-coordinate of the label placement on the user's canvas/viewport. |
properties.canvas_y |
integer |
Y-coordinate of the label placement on the user's canvas/viewport. |
properties.canvas_width |
integer |
Width of the user's canvas/viewport when the label was placed (in pixels). |
properties.canvas_height |
integer |
Height of the user's canvas/viewport when the label was placed (in pixels). |
properties.pano_x |
integer |
X-coordinate of the label position on the full panorama image. |
properties.pano_y |
integer |
Y-coordinate of the label position on the full panorama image. |
properties.pano_width |
integer |
Width of the full panorama image (in pixels). |
properties.pano_height |
integer |
Height of the full panorama image (in pixels). |
If filetype=csv is specified, the response body will be CSV data. The first row contains the headers, corresponding to the fields in the GeoJSON properties object, plus latitude and longitude columns derived from the geometry. CRS is WGS84 (EPSG:4326).
label_id,user_id,pano_id,pano_source,label_type,severity,tags,description,...,disagree_count,unsure_count,latitude,longitude
115,18b26a38-...,YQScv...,gsv,CurbRamp,2,[missing tactile warning],,...,1,0,40.715,-74.005
116,...,...,gsv,Obstacle,4,[construction],"Temporary fence",...,3,0,40.7151,-74.0051
...
If filetype=shapefile is specified, the response body will be a ZIP archive containing the Shapefile components (.shp, .shx, .dbf, .prj). The attribute table (.dbf) contains fields corresponding to the GeoJSON properties object (field names may be truncated due to Shapefile limitations). The included .prj file defines the Coordinate Reference System (CRS), typically WGS84 (EPSG:4326).
If filetype=geopackage is specified, the response body will be a GeoPackage file (.gpkg). This is an open standard format based on SQLite that contains both geometry and attributes in a single file, generally without the field name limitations of Shapefiles. CRS is typically WGS84 (EPSG:4326).
If an error occurs, the API will return an appropriate HTTP status code and a JSON response body containing details about the error.
400 Bad Request: Invalid parameter values (e.g., malformed bounding box, invalid date format).404 Not Found: The requested resource does not exist (e.g., incorrect base URL path).500 Internal Server Error: An unexpected error occurred on the server.503 Service Unavailable: The server is temporarily unable to handle the request (e.g., during maintenance).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)
}
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.