DocsAPI / Registry Reference

API / Registry Reference

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.