Specification changes
Read the newest changes collected from tracked web-platform specifications. The feed is intentionally small and deterministic, making it useful for a recent-changes panel or a scheduled sync.
/api/spec-diffsapplication/json response01 / request
No request inputs
Send a GET request with no body. This endpoint does not support filter or pagination query parameters: arbitrary query strings are not a way to change the result set.
| Input | Supported | Details |
|---|---|---|
| body | none | Do not send a JSON request body. |
| query | none | There are no supported filters, cursors, offsets, or page-size controls. |
02 / selection
Newest 50 records
The server returns at most 50 records, ordered by fetchedAt descending. The first item is therefore the newest fetched change available in the feed. The limit and ordering are fixed server behavior, not client-configurable pagination.
items wrapper and no metadata object containing a cursor or total count.03 / response · 200
Change rows
A successful request returns 200 application/json containing an array of SpecDiffRow objects. Every row has the fields below; sourceUrl is the only nullable field.
| Field | Type | Description |
|---|---|---|
| id | UUID string | Stable identifier for the persisted change row. |
| specSource | string | Name of the specification source that reported the change. |
| externalId | string | Identifier supplied by the external source. It is not guaranteed to be a clickable URL. |
| sourceUrl | string | null | When present, the clickable external source for this change. Legacy rows may have null. |
| entity | string | API, feature, or specification entity affected by the change. |
| changeSummary | string | Human-readable summary of what changed. |
| fetchedAt | ISO timestamp string | UTC timestamp for when the source record was fetched; used for descending ordering. |
04 / empty state
No changes yet
If no change rows have been collected, the endpoint still succeeds with 200and returns an empty array. Clients can treat [] as a normal empty state, not as an error or a missing response envelope.
[]05 / example
Request and response
The response below is illustrative, but it is checked against the shared SpecDiffRow type at compile time. It shows both source behaviors: a row with a clickable sourceUrl and a legacy row with null. Use the URL field for source navigation; do not build a link from externalId alone.
curl "${APP_URL}/api/spec-diffs"[
{
"id": "a4c9d0c1-7a67-4d4d-9e2d-2c9d48bdb7a1",
"specSource": "WHATWG WebSockets",
"externalId": "websocket-close-event",
"sourceUrl": "https://websockets.spec.whatwg.org/",
"entity": "WebSocket close event",
"changeSummary": "Clarified the event dispatch conditions for a closed connection.",
"fetchedAt": "2026-09-07T09:30:00.000Z"
},
{
"id": "f5e2b0b8-7f09-4ed9-a7d8-d3d89bbd5c23",
"specSource": "CSS Working Group drafts",
"externalId": "css-color-5-mix",
"sourceUrl": null,
"entity": "color-mix()",
"changeSummary": "Legacy record retained without a source URL.",
"fetchedAt": "2026-09-06T09:30:00.000Z"
}
]