Public API
Everything this site renders, a third party can query. JSON only, all timestamps ISO 8601 UTC, all money in integer minor units with an explicit currency.
| GET /api/v1/apps | Catalogue, filtered and keyset-paginated |
| GET /api/v1/apps/{appId} | Full detail plus the current rollup |
| GET /api/v1/apps/{appId}/price-history | Price step series with the carry-forward point |
| GET /api/v1/apps/{appId}/players | Concurrent players at raw, hourly, or daily resolution |
| GET /api/v1/apps/{appId}/changes | Change events for one app |
| GET /api/v1/apps/{appId}/depots | Depots, branches, latest manifests |
| GET /api/v1/changes | The global change feed |
| GET /api/v1/search | Apps, companies and tags in one request |
| GET /api/v1/sales | Current discounts |
| GET /api/v1/compare | 2–4 apps as aligned rows |
| GET /api/v1/stats | Catalogue-wide totals |
| GET /api/v1/meta | Ingestion freshness per collector |
Pagination
Keyset, never OFFSET. Cursors are opaque — pass them back unmodified. There is no total count: counting a filtered catalogue on every request is a full scan to render a number almost nobody uses.
Errors
RFC 9457 problem documents with a stable machine-readable type, so a client can branch on the failure without matching on prose.
Rate limits
Per-IP token bucket. Every response carries RateLimit-Limit, -Remaining and -Reset so you can slow down before being rejected rather than after.