Label Edits API #
The Label Edits API lists every change made to a label's severity or tags after the label was placed. An edit records who made it, the severity and tags before and after, the interface it was made in, and when. Edits come from two places: a validator who agrees a label is correct can fix its severity or tags as part of their vote (those edits carry the vote's label_validation_id), and the person who placed a label, or an admin, can edit it directly from the label's detail card on the Label Map or Gallery (those have no validation).
Use it to study how crowd editing refines label metadata, to audit changes to a specific label, or to reconstruct what a label looked like at a point in time. The Raw Labels API always reflects the current, post-edit state.
Endpoint #
Retrieve label edits with optional filtering.
GET /v3/api/labelEdits
Examples#
/v3/api/labelEdits Get all label edits in JSON (default)
/v3/api/labelEdits?filetype=csv Get all label edits in CSV format
/v3/api/labelEdits?labelId=12345 Get the edit history of one label
/v3/api/labelEdits?withValidation=false Get only edits made directly from the label detail card, not as part of a vote
/v3/api/labelEdits?source=ExpertValidate Get only edits made through the Expert Validate interface
Quick Download #
Download label edit data directly in your preferred format:
Query Parameters#
This endpoint accepts the following optional query parameters.
| Parameter | Type | Description |
|---|---|---|
labelId |
integer |
Only edits to a specific label. |
userId |
string |
Only edits made by a specific user. |
labelTypeId |
integer |
Only edits to labels of a specific type. See Label Types API. |
editTimestamp |
string |
Only edits made at or after this ISO 8601 timestamp (e.g., "2023-01-01T00:00:00Z"). |
source |
string |
Only edits made in this interface (matches the source field in the response), e.g. Validate, ExpertValidate, LabelMap, GalleryExpanded, UserMap. |
withValidation |
boolean |
true for only edits submitted with a validation (those with a label_validation_id), false for only standalone edits made from the label detail card. |
filetype |
string |
Output format: json (default), csv. Spatial formats are not supported; an edit has no coordinates of its own. |
inline |
boolean |
Whether to display the file inline (true) or as a download attachment (false, default). |
Responses#
Success Response (200 OK)#
On success, the API returns an HTTP 200 OK status code and the requested data in the specified format.
JSON Format (Default) #
Returns a JSON array of edit objects:
[
{
"label_edit_id": 501,
"label_id": 67890,
"label_type_id": 2,
"label_type": "NoCurbRamp",
"user_id": "user_abc123",
"old_severity": 2,
"new_severity": 3,
"old_tags": ["narrow"],
"new_tags": ["narrow", "steep"],
"source": "ExpertValidate",
"edit_time": "2025-08-04T21:52:05.158Z",
"label_validation_id": 12345
},
{
"label_edit_id": 502,
"label_id": 67891,
"label_type_id": 1,
"label_type": "CurbRamp",
"user_id": "user_def456",
"old_severity": 1,
"new_severity": 2,
"old_tags": ["points into traffic"],
"new_tags": ["points into traffic"],
"source": "LabelMap",
"edit_time": "2025-08-05T14:10:41.002Z",
"label_validation_id": null
}
]
JSON Field Descriptions #
| Field | Type | Description |
|---|---|---|
label_edit_id | integer | Unique identifier for the edit. |
label_id | integer | ID of the edited label. |
label_type_id | integer | ID of the label's type (e.g., 1 for CurbRamp, 2 for NoCurbRamp). |
label_type | string | Name of the label's type (e.g., "CurbRamp", "Obstacle"). |
user_id | string | ID of the user who made the edit: the labeler, a validator, or an admin. |
old_severity | integer | null | Severity (1-3) before the edit, or null if the label had none. |
new_severity | integer | null | Severity (1-3) after the edit, or null if it was cleared or the label type has no severity. |
old_tags | array[string] | Tags before the edit. |
new_tags | array[string] | Tags after the edit. |
source | string | The interface the edit was made in: a validation tool (Validate, ExpertValidate, ValidateMobile, ...) or a surface hosting the label detail card (LabelMap, GalleryExpanded, UserMap, ...). |
edit_time | string | ISO 8601 timestamp of the edit. A user's consecutive changes to a label from the card within a few minutes are recorded as one edit; this is the time of the last of them. |
label_validation_id | integer | null | The validation the edit was submitted with (see the Validations API), or null for an edit made directly from the label detail card. |
CSV Format #
If filetype=csv is specified, the response is CSV data with the same fields:
label_edit_id,label_id,label_type_id,label_type,user_id,old_severity,new_severity,old_tags,new_tags,source,edit_time,label_validation_id
501,67890,2,NoCurbRamp,user_abc123,2,3,"[narrow]","[narrow,steep]",ExpertValidate,2025-08-04T21:52:05.158Z,12345
502,67891,1,CurbRamp,user_def456,1,2,"[points into traffic]","[points into traffic]",LabelMap,2025-08-05T14:10:41.002Z,
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., a malformed editTimestamp, an unknown source, a spatial filetype).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 #
- Reconstruct a label's history by ordering its edits by
edit_time: each edit'sold_*values equal the previous edit'snew_*values, starting from the label as it was placed. - Compare validator edits with direct edits using
withValidationto see whether the two paths change labels differently. - Measure which tags and severities get corrected most by diffing
old_tags/new_tagsandold_severity/new_severityper label type.
Related APIs
- Validations API - The votes that some edits were submitted with
- Raw Labels API - The labels' current severity and tags
- Label Tags API - The tags that can be applied to each label type
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.
