High-performance speedrun.com mirror and native v1 API — faster responses, better availability, richer data.
A faithful, high-performance mirror of the speedrun.com public API. Responses are carbon copies of the upstream JSON — no fields added, removed, or transformed. Use as a high-performance, low latency alternative.
🔒 The API is live. Full endpoint documentation is undergoing final review and will be posted here shortly.
A restructured, normalized schema with fat trimmed and speedrun.io-specific fields added: run statistics, aggregate run analytics, leaderboard snapshots, and daily differential feeds. Public access with the same IP-based rate limits as /src.
🔒 Currently in developer preview. Full public docs will be posted here at release.
Want early access to the native /v1 namespace, upcoming /src updates, and other features before they're public? Leave your email and we'll reach out as new previews open up.
A full changelog and release notes section is coming soon. In the meantime, current known differences from speedrun.com's API:
All other endpoints, pagination, and response formats match speedrun.com's API.
| /src | Public — no authentication required |
| /v1 | Public with IP-based rate limits. Bearer token authentication will be available at a future date. |
| Limit | 100 requests / minute |
| Window | 60-second fixed window |
| Scope | Per IP address |
| Exceeded | Returns 429 with X-RateLimit-Retry-After header |
| Abuse detection | 5 rate-limit hits within 1 hour → blacklisted for 1 hour |
| Games, platforms, regions, gametypes | 7 days |
| Users, series | 1 day |
| Runs (single) | 1 day |
| Runs (list) | 5 minutes |
All responses use application/json. Successful responses wrap the payload in a top-level data field alongside a status code.
{
"status": 200,
"data": { ... }
}
Error responses include an error string and a request object with debugging metadata.
| 400 | Invalid input (malformed ID, bad parameter) |
| 403 | Unknown endpoint |
| 404 | Valid request, record not found |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Additional status codes apply to the /v1 namespace and will be documented alongside its public release.
| 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 |
| X-RateLimit-Limit | Always (non-exempt) | Configured request limit (default 100) |
| X-RateLimit-Remaining | Always (non-exempt) | Remaining requests in window |
| X-RateLimit-Reset | Always (non-exempt) | Unix timestamp when window resets |
| X-RateLimit-Exempt | Exempt IPs only | "true" for whitelisted IPs |
| X-RateLimit-Retry-After | 429 responses only | Seconds until retry allowed |
GET /health returns 200 OK with {"status":"ok"} for load balancer health probing. No authentication or rate limiting applies.
speedrun.com uses base36-encoded IDs for all records (e.g. ldep0513). The /src namespace mirrors these IDs as-is. The /v1 namespace uses independently generated speedrun.io IDs — source IDs are not used in /v1 endpoint URIs. A dedicated mapping endpoint for resolving a /src ID to its corresponding /v1 ID is planned; details will be published here once finalized.