Public API
Free, no key required, CORS enabled. Rate limited per client. Please cache responses using the ETag we return.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/health | Service status and operating mode. |
| GET | /api/v1/providers | Published providers with their latest event and coverage. |
| GET | /api/v1/providers/{slug} | Provider detail with statistics, 26-week heatmap, latest event, and latest reset. |
| GET | /api/v1/providers/{slug}/events | Events for one provider. |
| GET | /api/v1/events | All published events, newest first. |
| GET | /api/v1/events/{id-or-slug} | Event detail with evidence and revision history. |
| POST | /api/v1/reactions | Anonymous reaction. One per browser per event. |
| GET | /api/v1/feed.rss | RSS 2.0 feed. |
| GET | /api/v1/feed.atom | Atom 1.0 feed. |
Query parameters
- provider
- Filter by provider slug.
- event_type
- Comma-separated event types.
- from / to
- RFC3339 bounds on announcement time. from is inclusive, to is exclusive.
- limit
- 1 to 100. Defaults to 50.
- cursor
- Opaque pagination cursor from the previous response.
- minimum_confidence
- Feeds only. Defaults to verified.
Response notes
- Every response carries a
metaobject with the generation time and schema version. - Statistics include
includedEventTypes,excludedCount, andexclusionReasonsso you can see exactly what was counted. - Provider detail returns both
latest_eventandlatest_reset. They differ when the newest event is a policy change rather than a reset. - Fields the source did not state are
nullor empty withscope_evidence: "unknown". They are never inferred. - Pagination is keyset-based. Pass
next_cursorback ascursor; do not construct cursors yourself. - Errors use
application/problem+jsonand include arequest_id.
Conditional requests
curl -H 'If-None-Match: W/"abc123"' \
https://tokenresets.com/api/v1/eventsA matching ETag returns 304 Not Modified with no body. The ETag is computed from the content only, so it does not change just because you asked again.
