REST API
REST API reference
Base URL: https://recallradar-api.vercel.app. OpenAPI schema at /v1/openapi.json.
Authentication
Pass your API key as a Bearer token in the Authorization header. Keys are prefixed recallradar_live_. Unauthenticated requests return a sample-scoped subset and are rate-limited.
Pagination
All list endpoints use keyset pagination (opaque cursor). Pass the next_cursor from one response as the cursor param of the next request.
has_more: true— more pages existnext_cursor: null— last page- Default page size: 25. Max: 200.
Errors
Errors follow RFC 9457 (Problem+JSON). Content-type: application/problem+json.
| Status | Problem type | Meaning |
|---|---|---|
| 400 | /problems/bad-request | Invalid query parameters |
| 401 | /problems/unauthorized | Missing or invalid token |
| 404 | /problems/not-found | Recall ID does not exist |
| 429 | /problems/rate-limited | Rate limit exceeded |
| 500 | /problems/internal | Server error |
Conditional GETs (ETag)
Every recall document response includes an ETag header. Pass it as If-None-Match to get a 304 Not Modified when nothing has changed — useful for polling the full dataset efficiently.
Endpoints
/v1/recallsoptional — anon returns sample-scoped subsetSearch & list recall notices
Returns a paginated list of recall notices. All filters are optional and combinable.
Query parameters
| Name | Type | Description |
|---|---|---|
| q | string | Full-text search across title, summary, hazard and remedy text. |
| authority | enum | cpsc | eu-safety-gate | health-canada | gov-uk-opss | accc |
| jurisdiction | string | ISO country/region code, e.g. US, DE, CA. |
| category_code | string | Unified category slug, e.g. toys, electronics, childcare. |
| hazard | string | Filter on hazard_types[] values. |
| manufacturer | string | Party name substring match (role=manufacturer or distributor). |
| published_from | ISO 8601 date | Lower bound on published_at. |
| published_to | ISO 8601 date | Upper bound on published_at. |
| limit | integer | Page size. Default 25, max 200. |
| cursor | string | Opaque keyset cursor from previous response next_cursor. |
| count | boolean | Set count=true to include total_count in response (costs one extra query). |
Example request
Example response
/v1/recalls/:idoptionalGet a single recall notice
Returns the full recall document for the given numeric ID, including all provenance fields, products, and parties.
Example request
Example response
/v1/sourcesnoneList ingested source authorities
Returns the five ingested source authorities with their code, description, homepage, and licence.
Example request
Example response
/v1/coveragerequired — paid tierCoverage statistics (paid)
Returns per-authority and per-category counts, date ranges, and field-fill rates. Requires a paid API key.
Query parameters
| Name | Type | Description |
|---|---|---|
| authority | enum | Filter to a single authority. |
| category_code | string | Filter to a category. |
Example request
Example response