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:
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:
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_date | string | ISO 8601 formatted date when Project Sidewalk was launched in this city. |
km_explored | number | Total 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_overlap | number | Total 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_users | number | Kilometers 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_user | number | Kilometers of unique streets audited by exactly one user. Equals km_explored_no_overlap − km_explored_multiple_users. |
km_needs_reaudit | number | Kilometers 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_explorable | number | Kilometers 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_status | object | Total 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_users | integer | Total number of users who have contributed to Project Sidewalk. |
user_counts.labelers | integer | Number of users who have participated in explore/labeling tasks. |
user_counts.validators | integer | Number of users who have participated in validation tasks. |
user_counts.registered | integer | Number of users who have created accounts on Project Sidewalk. |
user_counts.anonymous | integer | Number of anonymous users. |
user_counts.turker | integer | Number of users from crowdsourcing platforms. |
user_counts.researcher | integer | Number of users with the researcher role (includes all Admins). |
labels | object | Statistics about label counts and severity ratings by label type. |
labels.count | integer | Total number of accessibility labels placed by all users. |
labels.count_with_severity | integer | Total number of labels placed by all users with an associated severity rating. |
labels.avg_label_timestamp | string | ISO 8601 formatted average timestamp when labels were created. |
labels.avg_timestamp_last_100_labels | string | ISO 8601 formatted average timestamp of the 100 most recent labels, indicating data recency. |
labels.avg_age_of_image_when_labeled | string | The average, across all labels, of the age of the image when the label was placed (in days). |
labels.stddev_label_timestamp | string | Standard 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_labeled | string | Standard deviation (spread), in days, of the age of the image when each label was placed. |
labels.[type].count | integer | Total number of labels of this type. |
labels.[type].count_with_severity | integer | null | Number of labels of this type that have severity ratings, or null if no severity ratings exist. |
labels.[type].severity_mean | number | null | Mean severity rating for this label type, or null if no severity ratings exist. |
labels.[type].severity_stddev | number | null | Standard deviation of severity ratings for this label type, or null if insufficient data. |
validations | object | Validation 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] | object | One of combined, human, or ai. Holds the validation breakdown computed using only that source's votes. |
validations.[source].total_validations | integer | Total number of individual validation judgments made by this source across all labels. |
validations.[source].[type] | object | Per-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].validated | integer | Number 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].agreed | integer | Number of labels of this type that this source has validated as "correct" through majority vote. |
validations.[source].[type].disagreed | integer | Number of labels of this type that this source has validated as "incorrect" through majority vote. |
validations.[source].[type].accuracy | number | null | Calculated 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_validation | integer | Number of labels of this type that have received at least one validation vote from this source. |
ai_stats | object | Statistics human agreement with AI validations. |
ai_stats.[type].[vote] | object | Which 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_concurs | integer | Number of labels where AI voted yes and the majority vote was also yes. |
ai_stats.[type].[vote].ai_yes_maj_vote_differs | integer | Number of labels where AI voted yes but the majority vote was no. |
ai_stats.[type].[vote].ai_no_maj_vote_differs | integer | Number of labels where AI voted no but the majority vote was yes. |
ai_stats.[type].[vote].ai_no_maj_vote_concurs | integer | Number 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_countsandlabelsare 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, andseverity_stddev, underlabels.[type] - For each source and label type, validation stats are five rows:
validated,agreed,disagreed,accuracy, andhas_a_validation, undervalidations.[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.