A public archive of speedrun.com data, collected under CC BY-NC 4.0 before speedrun.com's September 30, 2026 Terms of Use update. The archive is static. No new data is being collected.
speedrun.io's native API over the archived dataset. Every record carries both its original speedrun.com ID and a permanent speedrun.io ID, alongside a meta.sources block declaring who owns the license for it. Public, unauthenticated, read-only.
The /src namespace, the previous speedrun.com mirror, has been retired. Every /src path now returns 410 Gone.
A full Bruno collection covering every available /v1 endpoint, with real example requests against live data, is available on GitHub.
| /v1 | Public — no authentication required |
| Limit | 100 requests / minute |
| Window | 60-second fixed window |
| Scope | Per IP address |
| Exceeded | Returns 429 with Retry-After header |
| Abuse detection | 5 rate-limit hits within 1 hour → blacklisted for 1 hour |
| Gametypes, platforms, regions | 30 days |
| Games, series | 7 days |
| Categories, levels, variables, users, runs (single) | 1 day |
| Runs (list) | 5 minutes |
The archive is static, so these durations are a ceiling on edge cache freshness, not a reflection of how often the underlying data changes.
All responses use application/json. Successful responses wrap records in a data field, alongside status and a meta object carrying sources, licensing, and (for lists) pagination.
{
"status": 200,
"data": { "games": [ { ... } ] },
"meta": { "schema": "1.0", "sources": [ ... ] }
}
Error responses use a nested error object with a code and human-readable msg. Request metadata (request ID, timing, URI) is returned in response headers, not the body. This keeps successful response bodies pure, cacheable data.
{
"status": 400,
"error": { "code": "BAD_REQUEST", "msg": "invalid id: must be 8 characters" }
}
| 400 | Malformed ID, unknown filter, or invalid value |
| 403 | Path is not part of the API |
| 404 | Record not in the archive, or marked removed from speedrun.com |
| 410 | Any /src path (retired) |
| 429 | Rate limit exceeded |
| 501 | Planned endpoint or parameter, not available yet. See Current Status |
| 503 | Temporary failure, or the namespace is offline |
| Header | Required | Description |
|---|---|---|
| User-Agent | Optional, recommended | Identify your application (e.g. my-app/1.2.0). Not enforced, but including it helps us reach out and help debug your integration, specifically if something looks off on our end. An unidentified client is much harder to trace through logs. |
| Header | Scope | Description |
|---|---|---|
| X-SRIO-Request-ID | Always | UUID for this request |
| X-SRIO-Perf | Always | Handler execution time in milliseconds |
| X-SRIO-Timestamp | Always | Unix timestamp of request start |
| X-SRIO-URI | Always | Request URI including query string |
| Cache-Control | Always | Edge cache lifetime for this response |
| X-RateLimit-Limit | Always (non-exempt) | Configured request limit (default 100/min) |
| X-RateLimit-Remaining | Always (non-exempt) | Remaining requests in window |
| X-RateLimit-Reset | Always (non-exempt) | Unix timestamp when window resets |
| X-RateLimit-Method | Always | Always ip, rate limiting is IP-scoped |
| X-RateLimit-Namespace | Always | v1 on this namespace |
| X-RateLimit-Exempt | Exempt IPs only | "true" for whitelisted IPs |
| Retry-After | 429 / 503 responses only | Seconds until retry is allowed |
GET /health returns the list of namespaces currently serving traffic. No authentication or rate limiting applies.
{ "status": "200", "data": { "namespaces": ["public", "v1", "webhooks"] } }
Every record carries two IDs, named after its type: src_<type>_id, the original speedrun.com ID: base36, exactly 8 characters (e.g. src_game_id: "76rqmld8"), and srio_<type>_id, a permanent speedrun.io ID: base36, exactly 13 characters (e.g. srio_game_id: "08fi6aseicy2d").
Path parameters take the 8-character speedrun.com ID. An ID with fewer than 8 characters, extra padding, or a sign prefix is rejected with 400. speedrun.io IDs are not yet accepted in paths. That's planned alongside the restructure that moves the archive onto its own ID space. Game routes also accept the game's abbreviation (e.g. sm64, celeste) and return a 302 redirect to the canonical ID URL, matching speedrun.com's own behavior.
Every response's meta.sources declares the license for the records in it. speedrun.com is the authority source, so CC BY-NC 4.0 applies to every record by default. A user who has set their own license appears as an owner source instead, and that license takes precedence over the authority for their own records. See the full v1 API reference for the exact shape.
Until we have a formal ticket system in place, feel free to email any questions, issues, feature requests or general feedback to [email protected].