The Overall Stats API provides project-wide statistics about Project Sidewalk's data collection efforts in San Pedro Garza García, México, including total distance covered, label counts by type, user participation metrics, and data quality indicators.
Below is a live preview of the Overall Stats API data for San Pedro Garza García, México:
Retrieve overall statistics for the entire Project Sidewalk dataset.
GET /v3/api/overallStats
/v3/api/overallStats?filetype=json Get overall stats for San Pedro Garza García, México in JSON (default)
/v3/api/overallStats?filetype=csv Get overall stats for San Pedro Garza García, México in CSV
Download overall statistics data directly in your preferred format:
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. |
On success, the API returns an HTTP 200 OK status code and the requested data in the specified filetype format.
Returns a JSON object with comprehensive project statistics:
{
"launch_date": "2021-06-15T00:00:00Z",
"avg_timestamp_last_100_labels": "2023-09-25T14:32:47Z",
"km_explored": 1834.26,
"km_explored_no_overlap": 1523.75,
"km_explored_multiple_users": 412.08,
"km_explored_single_user": 1111.67,
"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": {
"label_count": 183427,
"label_count_with_severity": 162320,
"avg_label_timestamp": "2021-05-10T20:20:25.147504Z",
"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_sd": 0.5
},
"NoCurbRamp": {
"count": 35682,
"count_with_severity": 31245,
"severity_mean": 3.8,
"severity_sd": 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_sd": 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_human_concurs": 37,
"ai_yes_human_differs": 3,
"ai_no_human_differs": 2,
"ai_no_human_concurs": 37
},
"admin_majority_vote": {
"ai_yes_human_concurs": 127,
"ai_yes_human_differs": 54,
"ai_no_human_differs": 27,
"ai_no_human_concurs": 134
}
},
"CurbRamp": {
"human_majority_vote": {
"ai_yes_human_concurs": 20,
"ai_yes_human_differs": 0,
"ai_no_human_differs": 0,
"ai_no_human_concurs": 2
},
"admin_majority_vote": {
"ai_yes_human_concurs": 42,
"ai_yes_human_differs": 2,
"ai_no_human_differs": 6,
"ai_no_human_concurs": 48
}
},
... // Remaining label types
}
}
The response includes the following fields:
| Field | Type | Description |
|---|---|---|
launch_date | string | ISO 8601 formatted date when Project Sidewalk was launched in this city. |
avg_timestamp_last_100_labels | string | ISO 8601 formatted average timestamp of the 100 most recent labels, indicating data recency. |
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). |
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_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.label_count | integer | Total number of accessibility labels placed by all users. |
labels.label_count_with_severity | integer | Total number of labels placed by all users with an associated severity rating. |
avg_label_timestamp | string | ISO 8601 formatted average timestamp when labels were created. |
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_sd | 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 | Vote can be either "human" for majority vote across all users, or "admin" for majority vote across admin users. |
ai_stats.[type].[vote].ai_yes_human_concurs | object | Number of labels where AI voted yes and human users voted yes more often than no. |
ai_stats.[type].[vote].ai_yes_human_differs | object | Number of labels where AI voted yes but human users voted no more often than yes. |
ai_stats.[type].[vote].ai_no_human_differs | object | Number of labels where AI voted no but human users voted yes more often than no. |
ai_stats.[type].[vote].ai_no_human_concurs | object | Number of labels where AI voted no and human users voted no more often than yes. |
If filetype=csv is specified, the response body will be CSV data with key-value pairs. Each row represents a different statistic or metric:
Launch Date,2021-06-15
Recent Labels Average Timestamp,2023-09-25T14:32:47Z
KM Explored,1834.26
KM Explored Without Overlap,1523.75
Total User Count,4287
Explore User Count,3892
Validate User Count,895
Registered User Count,3456
Anonymous User Count,831
Turker User Count,214
Researcher User Count,42
Total Label Count,183427
Total Label Count With Severity,162320
Average Label Timestamp,2021-05-10T20:20:25.147504Z
Average Age of Image When Labeled,672 days
CurbRamp Count,72964
CurbRamp Count With Severity,61837
CurbRamp Severity Mean,1.2
CurbRamp Severity SD,0.5
...
Combined Total Validations,125834
Combined Overall Labels Validated,151196
Combined Overall Agreed Count,127564
Combined Overall Disagreed Count,23632
Combined Overall Accuracy,0.84
Combined Overall Labels With a Validation,162974
Combined CurbRamp Labels Validated,54321
...
Human Total Validations,119032
Human Overall Labels Validated,142880
...
AI Total Validations,6802
AI Overall Labels Validated,8316
...
Overall AI Yes and Human Majority Vote Concurs,37
Overall AI Yes but Human Majority Vote Differs,3
Overall AI No but Human Majority Vote Differs,2
Overall AI No and Human Majority Vote Concurs,37
Overall AI Yes and Admin Majority Vote Concurs,127
Overall AI Yes but Admin Majority Vote Differs,54
Overall AI No but Admin Majority Vote Differs,27
Overall AI No and Admin Majority Vote Concurs,134
CurbRamp AI Yes and Human Majority Vote Concurs,20
CurbRamp AI Yes but Human Majority Vote Differs,0
CurbRamp AI No but Human Majority Vote Differs,0
CurbRamp AI No and Human Majority Vote Concurs,2
CurbRamp AI Yes and Admin Majority Vote Concurs,42
CurbRamp AI Yes but Admin Majority Vote Differs,2
CurbRamp AI No but Admin Majority Vote Differs,6
CurbRamp AI No and Admin Majority Vote Concurs,48
...
In CSV format, each row represents a specific metric in a key-value format:
user_counts and labels are flattened into multiple rows with descriptive namesIf 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.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)
}
The Overall Stats API provides a comprehensive view of Project Sidewalk data. Here are some suggestions for effectively using this data:
For more detailed analysis, consider using the Overall Stats API in conjunction with:
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.