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

Pick a nickname — you don't have to use your real name. It's shown publicly on the leaderboard and your profile, and you can change it anytime.

  • At least 8 characters
  • One uppercase letter
  • One lowercase letter
  • One number
Passwords match

Overall Stats API

The Overall Stats API provides project-wide statistics about Project Sidewalk's data collection efforts in Washington, DC, including total distance covered, label counts by type, user participation metrics, and data quality indicators.

Overall Stats API Preview

Below is a live preview of the Overall Stats API data for Washington, DC:

Loading project statistics...

Endpoint

Retrieve overall statistics for the entire Project Sidewalk dataset.

GET /v3/api/overallStats

Examples

/v3/api/overallStats?filetype=json Get overall stats for Washington, DC in JSON (default)

/v3/api/overallStats?filetype=csv Get overall stats for Washington, DC in CSV

Quick Download

Download overall statistics data directly in your preferred format:

Preparing your download...
This should only take a few seconds.

Query Parameters

This endpoint accepts the following optional query parameters.

Parameter Type Description
filterLowQuality boolean When set to true, excludes data from low-quality contributors to provide more reliable statistics. Default: false (includes all data).
filetype string Specify the output format. Options: json (default), csv.

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.

JSON Format (Default)

Returns a JSON object with comprehensive project statistics:

{
  "launch_date": "2021-06-15T00:00:00Z",
  "km_explored": 1834.26,
  "km_explored_no_overlap": 1523.75,
  "km_explored_multiple_users": 412.08,
  "km_explored_single_user": 1111.67,
  "km_needs_reaudit": 86.42,
  "km_explorable": 1987.40,
  "km_by_status": {
    "open": 1987.40,
    "no_imagery": 142.13,
    "closed": 38.55,
    "disabled": 6.20
  },
  "user_counts": {
    "all_users": 4287,
    "labelers": 3892,
    "validators": 895,
    "registered": 3456,
    "anonymous": 831,
    "turker": 214,
    "researcher": 42
  },
  "labels": {
    "count": 183427,
    "count_with_severity": 162320,
    "avg_label_timestamp": "2021-05-10T20:20:25.147504Z",
    "avg_timestamp_last_100_labels": "2023-09-25T14:32:47Z",
    "avg_age_of_image_when_labeled": "672 days",
    "stddev_label_timestamp": "188 days",
    "stddev_age_of_image_when_labeled": "543 days",
    "CurbRamp": {
      "count": 72964,
      "count_with_severity": 61837,
      "severity_mean": 1.2,
      "severity_stddev": 0.5
    },
    "NoCurbRamp": {
      "count": 35682,
      "count_with_severity": 31245,
      "severity_mean": 3.8,
      "severity_stddev": 0.9
    },
    // Some label types like NoSidewalk and Signal don't have severity ratings, so severity fields are null.
    "NoSidewalk": {
      "count": 61837,
      "count_with_severity": null,
      "severity_mean": null,
      "severity_stddev": null
    },
    ... // Remaining label types
  },
  // Validation stats are split into three parallel blocks: "combined" (all votes), "human" (non-AI votes only),
  // and "ai" (AI votes only). Each block has the same structure. AI votes are included in "combined".
  "validations": {
    "combined": {
      "total_validations": 125834,
      "Overall": {
        "validated": 151196,
        "agreed": 127564,
        "disagreed": 23632,
        "accuracy": 0.84,
        "has_a_validation": 162974
      },
      "CurbRamp": {
        "validated": 54321,
        "agreed": 48923,
        "disagreed": 5398,
        "accuracy": 0.90,
        "has_a_validation": 59422
      },
      ... // Remaining label types
    },
    "human": {
      "total_validations": 119032,
      "Overall": {
        "validated": 142880,
        "agreed": 120115,
        "disagreed": 22765,
        "accuracy": 0.84,
        "has_a_validation": 154219
      },
      ... // Same label-type structure as "combined"
    },
    "ai": {
      "total_validations": 6802,
      "Overall": {
        "validated": 8316,
        "agreed": 7449,
        "disagreed": 867,
        "accuracy": 0.90,
        "has_a_validation": 8755
      },
      ... // Same label-type structure as "combined"
    }
  },
  "ai_stats": {
    "Overall": {
      "human_majority_vote": {
        "ai_yes_maj_vote_concurs": 37,
        "ai_yes_maj_vote_differs": 3,
        "ai_no_maj_vote_differs": 2,
        "ai_no_maj_vote_concurs": 37
      },
      "admin_majority_vote": {
        "ai_yes_maj_vote_concurs": 127,
        "ai_yes_maj_vote_differs": 54,
        "ai_no_maj_vote_differs": 27,
        "ai_no_maj_vote_concurs": 134
      }
    },
    "CurbRamp": {
      "human_majority_vote": {
        "ai_yes_maj_vote_concurs": 20,
        "ai_yes_maj_vote_differs": 0,
        "ai_no_maj_vote_differs": 0,
        "ai_no_maj_vote_concurs": 2
      },
      "admin_majority_vote": {
        "ai_yes_maj_vote_concurs": 42,
        "ai_yes_maj_vote_differs": 2,
        "ai_no_maj_vote_differs": 6,
        "ai_no_maj_vote_concurs": 48
      }
    },
    ... // Remaining label types
  }
}
JSON Field Descriptions

The response includes the following fields:

Field Type Description
launch_datestringISO 8601 formatted date when Project Sidewalk was launched in this city.
km_explorednumberTotal kilometers of streets explored by all users, counting a street once per user who completed it (i.e. with overlap — the total auditing work done).
km_explored_no_overlapnumberTotal kilometers of unique streets with at least one completed audit, each street counted once regardless of how many users explored it or how old its imagery is. Monotonic: it never decreases when newer street-view imagery lands on an audited street — km_needs_reaudit carries that freshness signal as a subset.
km_explored_multiple_usersnumberKilometers of unique streets that have been completely audited by two or more distinct (non-excluded) users — i.e. redundantly covered. A street counts here only if each of the ≥2 users completed the whole street.
km_explored_single_usernumberKilometers of unique streets audited by exactly one user. Equals km_explored_no_overlap − km_explored_multiple_users.
km_needs_reauditnumberKilometers of unique streets needing re-audit: streets audited before, but whose completed audits all predate newer street-view imagery. A subset of km_explored_no_overlap, so kilometers audited on current imagery = km_explored_no_overlap − km_needs_reaudit.
km_explorablenumberKilometers of streets that are auditable right now (status open). This is the natural denominator for "percent of the city audited" (km_explored_no_overlap / km_explorable). Alias of km_by_status.open. Note: a street can be audited and later marked closed/no-imagery, so km_explored_no_overlap is not strictly bounded by this value.
km_by_statusobjectTotal street kilometers broken down by availability status (see the /v3/api/streets status field). Lets you choose your own denominator. Keys: open (auditable now), no_imagery (a real street with no street-view imagery), closed (a real street whose region is not yet open to the public), disabled (not a genuine auditable street, e.g. an OSM miscategorization). The tutorial street is excluded from every bucket.
user_counts.all_usersintegerTotal number of users who have contributed to Project Sidewalk.
user_counts.labelersintegerNumber of users who have participated in explore/labeling tasks.
user_counts.validatorsintegerNumber of users who have participated in validation tasks.
user_counts.registeredintegerNumber of users who have created accounts on Project Sidewalk.
user_counts.anonymousintegerNumber of anonymous users.
user_counts.turkerintegerNumber of users from crowdsourcing platforms.
user_counts.researcherintegerNumber of users with the researcher role (includes all Admins).
labelsobjectStatistics about label counts and severity ratings by label type.
labels.countintegerTotal number of accessibility labels placed by all users.
labels.count_with_severityintegerTotal number of labels placed by all users with an associated severity rating.
labels.avg_label_timestampstringISO 8601 formatted average timestamp when labels were created.
labels.avg_timestamp_last_100_labelsstringISO 8601 formatted average timestamp of the 100 most recent labels, indicating data recency.
labels.avg_age_of_image_when_labeledstringThe average, across all labels, of the age of the image when the label was placed (in days).
labels.stddev_label_timestampstringStandard deviation (spread) of label creation timestamps, expressed as a duration in days. A standard deviation of dates is a duration, not a date.
labels.stddev_age_of_image_when_labeledstringStandard deviation (spread), in days, of the age of the image when each label was placed.
labels.[type].countintegerTotal number of labels of this type.
labels.[type].count_with_severityinteger | nullNumber of labels of this type that have severity ratings, or null if no severity ratings exist.
labels.[type].severity_meannumber | nullMean severity rating for this label type, or null if no severity ratings exist.
labels.[type].severity_stddevnumber | nullStandard deviation of severity ratings for this label type, or null if insufficient data.
validationsobjectValidation statistics split into three parallel blocks by vote source: combined (all votes), human (votes cast by people), and ai (votes cast by Project Sidewalk's AI). Each block has the identical structure described below. Note that combined includes AI votes, so it is not the same as human.
validations.[source]objectOne of combined, human, or ai. Holds the validation breakdown computed using only that source's votes.
validations.[source].total_validationsintegerTotal number of individual validation judgments made by this source across all labels.
validations.[source].[type]objectPer-label-type breakdown for this source. The special key Overall aggregates across all label types; in particular validations.[source].Overall.has_a_validation is the total number of labels with at least one validation from this source.
validations.[source].[type].validatedintegerNumber of labels of this type that this source has validated as either "correct" or "incorrect" through majority vote; a label is not included if the number of agree and disagree votes are equal.
validations.[source].[type].agreedintegerNumber of labels of this type that this source has validated as "correct" through majority vote.
validations.[source].[type].disagreedintegerNumber of labels of this type that this source has validated as "incorrect" through majority vote.
validations.[source].[type].accuracynumber | nullCalculated accuracy rate (agreed / validated) for this label type and source, or null if no validations. Note that for the ai source this measures how often AI's own majority verdict was "agree", which is distinct from ai_stats (AI vs. human agreement).
validations.[source].[type].has_a_validationintegerNumber of labels of this type that have received at least one validation vote from this source.
ai_statsobjectStatistics human agreement with AI validations.
ai_stats.[type].[vote]objectWhich majority vote the AI is compared against: human_majority_vote for the majority vote across all users, or admin_majority_vote for the majority vote across admin users. The maj_vote in the field names below refers to whichever of the two this block is.
ai_stats.[type].[vote].ai_yes_maj_vote_concursintegerNumber of labels where AI voted yes and the majority vote was also yes.
ai_stats.[type].[vote].ai_yes_maj_vote_differsintegerNumber of labels where AI voted yes but the majority vote was no.
ai_stats.[type].[vote].ai_no_maj_vote_differsintegerNumber of labels where AI voted no but the majority vote was yes.
ai_stats.[type].[vote].ai_no_maj_vote_concursintegerNumber of labels where AI voted no and the majority vote was also no.

CSV Format

If filetype=csv is specified, the response body is CSV data with one metric per row, under a metric,value header. Each metric is named for its path through the JSON above, joined with dots, so labels.CurbRamp.count in the CSV is the value you would read as labels.CurbRamp.count from the JSON. Every field carries the same name in both formats.

metric,value
launch_date,2021-06-15
km_explored,1834.26
km_explored_no_overlap,1523.75
km_explored_multiple_users,412.08
km_explored_single_user,1111.67
km_needs_reaudit,86.42
km_explorable,1987.40
km_by_status.open,1987.40
km_by_status.no_imagery,142.13
km_by_status.closed,38.55
km_by_status.disabled,6.20
user_counts.all_users,4287
user_counts.labelers,3892
user_counts.validators,895
user_counts.registered,3456
user_counts.anonymous,831
user_counts.turker,214
user_counts.researcher,42
labels.count,183427
labels.count_with_severity,162320
labels.avg_label_timestamp,2021-05-10T20:20:25.147504Z
labels.avg_timestamp_last_100_labels,2023-09-25T14:32:47Z
labels.avg_age_of_image_when_labeled,672 days
labels.stddev_label_timestamp,188 days
labels.stddev_age_of_image_when_labeled,543 days
labels.CurbRamp.count,72964
labels.CurbRamp.count_with_severity,61837
labels.CurbRamp.severity_mean,1.2
labels.CurbRamp.severity_stddev,0.5
... // Remaining label types
validations.combined.total_validations,125834
validations.combined.Overall.validated,151196
validations.combined.Overall.agreed,127564
validations.combined.Overall.disagreed,23632
validations.combined.Overall.accuracy,0.84
validations.combined.Overall.has_a_validation,162974
validations.combined.CurbRamp.validated,54321
...
validations.human.total_validations,119032
validations.human.Overall.validated,142880
...
validations.ai.total_validations,6802
validations.ai.Overall.validated,8316
...
ai_stats.Overall.human_majority_vote.ai_yes_maj_vote_concurs,37
ai_stats.Overall.human_majority_vote.ai_yes_maj_vote_differs,3
ai_stats.Overall.human_majority_vote.ai_no_maj_vote_differs,2
ai_stats.Overall.human_majority_vote.ai_no_maj_vote_concurs,37
ai_stats.Overall.admin_majority_vote.ai_yes_maj_vote_concurs,127
ai_stats.Overall.admin_majority_vote.ai_yes_maj_vote_differs,54
ai_stats.Overall.admin_majority_vote.ai_no_maj_vote_differs,27
ai_stats.Overall.admin_majority_vote.ai_no_maj_vote_concurs,134
ai_stats.CurbRamp.human_majority_vote.ai_yes_maj_vote_concurs,20
...

A value that is null in the JSON is an empty cell in the CSV. Every field is always present in both formats, so the row set does not vary between cities.

CSV Format Description

In CSV format, each row is one metric in a key-value format:

  • Top-level statistics are named rows (e.g., km_explored,1834.26)
  • Nested statistics like user_counts and labels are flattened into one row per value, each named for its dotted path (e.g., user_counts.labelers)
  • For each label type, severity stats are four rows: count, count_with_severity, severity_mean, and severity_stddev, under labels.[type]
  • For each source and label type, validation stats are five rows: validated, agreed, disagreed, accuracy, and has_a_validation, under validations.[source].[type]
  • Rows appear in the same order as the fields of the JSON response
  • This flat structure makes the data easy to parse and analyze in spreadsheet applications

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.
  • 404 Not Found: The requested resource does not exist.
  • 500 Internal Server Error: An unexpected error occurred on the server.
  • 503 Service Unavailable: The server is temporarily unable to handle the request.

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

Data Analysis Tips

The Overall Stats API provides a comprehensive view of Project Sidewalk data. Here are some suggestions for effectively using this data:

  • Consider using filterLowQuality=true for more reliable analysis, especially when examining severity ratings
  • Compare accuracy rates across label types to identify which accessibility issues might be more ambiguous or difficult to detect
  • Use km_explored vs. km_explored_no_overlap to understand the level of redundancy in data collection
  • Look at labels.avg_timestamp_last_100_labels to gauge how recently the data has been updated
  • Analyze the ratio of validators to explorers to understand community participation patterns

Related APIs

For more detailed analysis, consider using the Overall Stats API in conjunction with:

  • User Stats API - Get statistics for individual users and their contributions
  • Raw Labels API - Access the individual label data with geographic information
  • Label Types API - Get information about the different types of accessibility issues
  • Cities API - See all cities where Project Sidewalk is deployed

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