speedrun.io API

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.

Free for non-commercial use. Data is licensed under CC BY-NC 4.0, unless an individual record's own license says otherwise. See Sources & Licensing. See the Data License for full terms. By using this API you agree to the Terms of Service.

Namespaces

v1 API Live CC-BY-NC 4.0

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.

Release Notes & Current Status

Bruno

A full Bruno collection covering every available /v1 endpoint, with real example requests against live data, is available on GitHub.

github.com/speedrunio/bruno

Authentication

/v1 Public — no authentication required

Rate Limits

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

Caching

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.

Response Format

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" }
}
400Malformed ID, unknown filter, or invalid value
403Path is not part of the API
404Record not in the archive, or marked removed from speedrun.com
410Any /src path (retired)
429Rate limit exceeded
501Planned endpoint or parameter, not available yet. See Current Status
503Temporary failure, or the namespace is offline

Request Headers

HeaderRequiredDescription
User-AgentOptional, recommendedIdentify 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.

Response Headers

HeaderScopeDescription
X-SRIO-Request-IDAlwaysUUID for this request
X-SRIO-PerfAlwaysHandler execution time in milliseconds
X-SRIO-TimestampAlwaysUnix timestamp of request start
X-SRIO-URIAlwaysRequest URI including query string
Cache-ControlAlwaysEdge cache lifetime for this response
X-RateLimit-LimitAlways (non-exempt)Configured request limit (default 100/min)
X-RateLimit-RemainingAlways (non-exempt)Remaining requests in window
X-RateLimit-ResetAlways (non-exempt)Unix timestamp when window resets
X-RateLimit-MethodAlwaysAlways ip, rate limiting is IP-scoped
X-RateLimit-NamespaceAlwaysv1 on this namespace
X-RateLimit-ExemptExempt IPs only"true" for whitelisted IPs
Retry-After429 / 503 responses onlySeconds until retry is allowed

Health Check

GET /health returns the list of namespaces currently serving traffic. No authentication or rate limiting applies.

{ "status": "200", "data": { "namespaces": ["public", "v1", "webhooks"] } }

IDs

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.

Sources & Licensing

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.

Support

Until we have a formal ticket system in place, feel free to email any questions, issues, feature requests or general feedback to [email protected].