Project Sidewalk

Welcome back

Project Sidewalk

Join Project Sidewalk

Map sidewalks. Help make your city accessible to everyone.

3–30 characters — letters, numbers, hyphens, and underscores
  • At least 8 characters
  • One uppercase letter
  • One lowercase letter
  • One number
Passwords match

Raw Labels API

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.

Raw Labels API Preview

Below is a live preview of raw labels from a sample region in Zurich, Switzerland 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.

Loading raw labels data...

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.

Endpoint

Retrieve a list of raw labels, optionally filtered by various criteria.

GET /v3/api/rawLabels

Examples

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

Quick Download

Download raw labels data directly in your preferred format:

Generating your download...
This may take anywhere from a few seconds to a few minutes depending on the data size.

Note: This downloads all raw labels. For filtered data, use the API query parameters described below.

Query Parameters

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.

Responses

Success Response (200 OK)

On success, the API returns an HTTP 200 OK status code and the requested data in the specified filetype format.

GeoJSON Format (Default)

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"
      }
    },
    ...
  ]
}
GeoJSON Field Descriptions

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

CSV Format

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

Shapefile Format

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

GeoPackage Format

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

Error Responses

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

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)
}

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