Games & Comics — entry 071 of 75
Valorant (non-official)
Valorant-API.com is a free, keyless, non-official reference for Valorant's static game data — agents and abilities, weapon skins and chromas, buddies, cards, currencies, game modes, maps, seasons, and titles — including image assets for most entities. It's a fan project, not endorsed by or affiliated with Riot Games, and covers only static reference data rather than live match or account data.
Valorant-API.com is a free, keyless reference for Valorant's static game data, wrapping every response in a {status, data} envelope that mirrors the HTTP status code inside the body. A live GET this run against /version returned a genuine 282 B envelope at HTTP 200, content-type: application/json; charset=utf-8.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required — the live GET above returned real client version data with no auth header of any kind attached. CORS is Origin-gated: a live request this run carrying
Origin: https://greatapis.comcame back withaccess-control-allow-origin: *, while the identical request with noOriginheader returned noaccess-control-*header at all. Direct browser fetches still work, since a browser always sendsOriginon a cross-origin request.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Fetch the current game client build info
GEThttps://valorant-api.com/v1/version
{
"status": 200,
"data": {
"manifestId": "54C782AB97C0AB9C",
"branch": "release-13.02",
"version": "13.02.00.5092570",
"buildVersion": "7",
"engineVersion": "5.3.2.0",
"riotClientVersion": "release-13.02-shipping-7-5092570",
"riotClientBuild": "111.0.0.3261.5663",
"buildDate": "2026-07-16T22:11:11Z"
}
}The flagship /agents/{uuid} endpoint wraps the same {status, data} envelope around a much larger object — a live GET this run against Gekko's uuid (e370fa57-4757-3604-3648-499e1f642d3f) returned a genuine 4,106 B response nesting a role object and a 4-element abilities array, each carrying its own displayIcon asset URL under media.valorant-api.com.
Try it
Developer reference
https://valorant-api.com/v1- GET/agents/{uuid}
- GET/agents
- GET/weapons
- GET/version
Gotchas & limits
- The envelope's shape changes entirely on error — there is no
datakey at all, only on success. A live GET this run against a well-formed but nonexistent agent uuid returned real HTTP 404, 57 B:{"status":404,"error":"the requested uuid was not found"}. Code that unconditionally readsbody.data.displayNameafter checkingresponse.okwill throw on this well-formed-but-missing case exactly like it would on a malformed one. - The locale is a query parameter here (
?language=en-US), not a path segment like TCGdex's locale routing (quartet 4) — and the two APIs fail differently on a bad value. Omittinglanguageentirely defaults silently to English (confirmed live this run: byte-identical 4,106 B response with and without the param on the same agent). But supplying an unrecognized value doesn't fall back — it 404s the whole request: a live GET this run with?language=zz-ZZon the same valid agent uuid returned a different 404, 61 B:{"status":404,"error":"the requested language was not found"}, distinct from the bad-uuid error text above despite sharing the same HTTP status. - The docs live on a separate host from the API. The entry's
docsUrl(https://dash.valorant-api.com) is an interactive reference site — confirmed live this run, 200,text/html; charset=utf-8— while every actual data call goes to the barevalorant-api.comhost. Its response size is not stable enough to pin — it varies by a few dozen bytes from request to request, because the Cloudflare-injected font CSS is emitted in a non-deterministic order. Eight consecutive probes this run happened to land between 20,688 and 20,728 B, but that spread is just what those eight requests returned, not a bound the page stays inside. - The API applies two different policies to unknown input depending on whether it's the value or the parameter name it doesn't recognize — and the difference is what tells you a filter actually ran. An unrecognized value for a known parameter hard-404s the whole request (
?language=zz-ZZ, above), but an unrecognized parameter name is silently ignored: a live GET this run against/agents?bogusParam=truereturned a normal 200 with the full 107,834 B payload, exactly as if the parameter were absent, so a typo'd filter name fails open with no error. Against that control, boolean schema fields are confirmed real server-side filters:/agents?isPlayableCharacter=falsereturned 200 with just 24 B —{"status":200,"data":[]}— while?isPlayableCharacter=trueand the unfiltered/agentsboth returned the identical 107,834 B / 29-entry payload. Since unknown parameters are demonstrably ignored rather than honored, that empty result can only mean the server genuinely applied the filter. In practice all 29 agents currently in the collection areisPlayableCharacter: true, so the filter is a no-op today — but it is the real way to exclude test/unreleased entries if Riot ships any. - Several fields in the agent schema are only partially backfilled, so
nullmeans "not filled in for this agent" rather than "not supported". Tallied across all 29 agents live this run:characterTagsis non-null on 11 of 29 (e.g. Raze["Area Damage Specialist"], Cypher["Detection","Defensive Lockdown"], Jett["Evasion","Mobility"]) and null on the other 18 — Gekko, the example above, happens to be one of the nulls, so checking a single agent will mislead you. The 11 tagged agents are Valorant's earliest roster and every agent added later is null, though the payload can't corroborate that itself:releaseDateis the epoch-zero placeholder1970-01-01T00:00:00Zon 25 of 29 agents, with a real date on only 4 (Tejo, Waylay, Veto, Miks).voiceLine, by contrast, is null on all 29 and can be treated as genuinely unpopulated.