Canonical host: https://pwaregistry.org. Format version: 1. Dataset counter: revision. No API keys.
If you are new, read Using PWARegistry and Quick Start first. This page is the endpoint list.
CORS is open (Access-Control-Allow-Origin: *).
GET /registry/v1/meta.json
Purpose. Schema version, revision, generatedAt, lastChanged, counts.
Example. /registry/v1/meta.json
Caching. max-age=30, ETag: "rev-N".
Same payload: GET /api/v1/meta, GET /registry/v1/revision.json.
GET /registry/v1/index.json
Purpose. Compact listing of every record.
Example. /registry/v1/index.json
Caching. max-age=60, stale-while-revalidate 600.
GET /registry/v1/apps/{id}
Purpose. Full normalized record. {id} is the hostname. .json suffix is optional.
Example. GET /registry/v1/apps/squoosh.app.json
Errors. 404 not_found.
Caching. max-age=60, ETag: "rev-N", Last-Modified.
Same payload: GET /api/v1/apps/{id}.
GET /registry/v1/categories.json
Purpose. Known categories and ACTIVE counts.
Same payload: GET /api/v1/categories.
GET /registry/v1/categories/{category}.json
Purpose. Lightweight index of ACTIVE apps in that category.
Example. GET /registry/v1/categories/games.json
Errors. 404 unknown_category. Empty known category → 200 with apps: [].
Same idea: GET /api/v1/apps?category=games&status=active (paginated) and GET /api/v1/categories/{id}.
GET /registry/v1/status/{active|degraded|removed}.json
Purpose. Lightweight index by status.
Errors. 404 unknown_status.
GET /registry/v1/changes.json?since=N
Purpose. Net added, updated, and removed ids since revision N.
Parameters. since (integer, default 0).
Example. GET /registry/v1/changes.json?since=152
Caching. max-age=30.
Same payload: GET /api/v1/changes?since=N.
GET /registry/v1/revisions/{n}.json
Purpose. Snapshot of a single revision. Immutable once superseded.
Errors. 404 not_found.
GET /registry/v1/search.json?q=
Purpose. Name and domain search. Lightweight hits.
Parameters. q (required), status, limit, cursor.
Errors. 400 missing_query.
Same idea: GET /api/v1/search?q=.
GET /api/v1/apps
Purpose. Filtered, paginated lightweight list.
Parameters.
| Name | Default | Notes |
|---|---|---|
status |
ACTIVE |
ACTIVE, DEGRADED, REMOVED, ALL |
category |
— | Manifest category, lowercased |
capability |
— | See Capabilities |
q |
— | Name / domain substring |
limit |
50 |
Max 200 |
cursor |
— | Domain of the last item from the previous page |
Combine with AND.
Example. GET /api/v1/apps?category=games&status=active
Errors. 400 invalid_status, invalid_capability, invalid_category. 429 rate_limited.
Caching. max-age=60.
Record shape (abridged)
{
"spec": "https://pwaregistry.org/docs/registry-format",
"version": 1,
"id": "squoosh.app",
"status": "ACTIVE",
"domain": "squoosh.app",
"origin": "https://squoosh.app",
"firstSeen": "...",
"lastChecked": "...",
"lastChanged": "...",
"manifestUrl": "https://squoosh.app/manifest.json",
"capabilities": {
"narrowScreenshots": true,
"wideScreenshots": true,
"maskableIcon": true,
"serviceWorker": false,
"shareTarget": true,
"standaloneDisplay": true
},
"application": {
"name": "Squoosh",
"shortName": "Squoosh",
"description": "...",
"startUrl": "https://squoosh.app/",
"categories": ["photo", "productivity", "utilities"],
"icons": { "primary": {}, "maskable": [], "monochrome": [], "any": [], "all": [] },
"screenshots": { "narrow": [], "wide": [], "unspecified": [], "platformSpecific": [] },
"sources": { "name": "manifest.name", "description": "manifest.description" }
},
"validation": { "result": "PASS WITH WARNINGS", "checks": [] }
}
Empty or null means the site did not provide that member, or it was not a reachable image. Nothing is invented.
Errors are documented on Errors. Caching details on Caching.