Data Dragon and Community Dragon: Riot’s public data endpoints
Riot publishes the static data behind its games on three open CDNs. There is no key, no quota and no registration on any of them — but there is also no contract, no changelog and no published index, so the usual way to find an endpoint is to read someone else’s code. This page is that code, written out: every URL shape below is one the collectors behind this database fetch on a schedule, with what it returns and how it breaks. Everything in RuneGrove's 31,244-row catalogue came down one of the URLs on this page.
Three trees, and they do not overlap the way people expect. Data Dragon is Riot’s official, versioned bundle for League and Teamfight Tactics. Legends of Runeterra Data Dragon is a separate host with a different layout, different locale casing and no version number at all. Community Dragon is a fan-run mirror of the game client’s own asset tree — unofficial, far more complete, and the only one of the three that carries ward skins, emotes, skin lines, challenges or the full Teamfight Tactics set file.
Data Dragon — ddragon.leagueoflegends.com
Everything on Data Dragon except champion splash and loading art is namespaced by a patch string. You fetch the list of patch strings first, take the first element, and build every other URL from it:
GET https://ddragon.leagueoflegends.com/api/versions.json → a JSON array of patch strings, newest first, e.g. ["16.18.1","16.17.1","16.16.1", …]. Element 0 is the newest published version, which trails the live patch by a day or two after a deploy.
Data files
All of these sit under /cdn/{version}/data/{locale}/ and return a JSON object with a type, a version and a data map keyed by id. The locale on this host is written with an upper-case region: en_US, not en_us.
| URL | Returns |
|---|---|
/cdn/{version}/data/en_US/champion.json | every champion, shallow: id, key, name, title, blurb, tags, a stat block |
/cdn/{version}/data/en_US/champion/{ChampionId}.json | one champion, deep: lore, spells, passive, skins, tips. The shallow file does not contain abilities |
/cdn/{version}/data/en_US/item.json | the item shop: gold, stats, from/into build paths, tags |
/cdn/{version}/data/en_US/runesReforged.json | the four rune trees, nested path → slots → runes |
/cdn/{version}/data/en_US/summoner.json | summoner spells, with cooldowns and mode availability |
/cdn/{version}/data/en_US/profileicon.json | every summoner icon id |
/cdn/{version}/data/en_US/map.json | the playable maps |
/cdn/{version}/data/en_US/tft-champion.json | Teamfight Tactics units for the live set |
/cdn/{version}/data/en_US/tft-trait.json | Teamfight Tactics traits |
/cdn/{version}/data/en_US/tft-item.json | Teamfight Tactics items |
/cdn/{version}/data/en_US/tft-augments.json | Teamfight Tactics augments (note the plural — every other tft file is singular) |
/cdn/{version}/data/en_US/tft-tactician.json | Little Legends |
/cdn/{version}/data/en_US/tft-arena.json, tft-queues.json, tft-regalia.json | board skins, game modes, ranked rewards |
Images
Most image paths are versioned and take the filename straight out of the matching data file — image.full on a champion, a spell, an item or a Teamfight Tactics row. Champion art is the exception and is not versioned at all.
| URL | What it is |
|---|---|
/cdn/{version}/img/champion/{ChampionId}.png | square champion icon |
/cdn/{version}/img/spell/{image.full} | ability icon |
/cdn/{version}/img/passive/{image.full} | passive icon |
/cdn/{version}/img/item/{itemId}.png | item icon |
/cdn/{version}/img/profileicon/{image.full} | summoner icon |
/cdn/{version}/img/map/map{mapId}.png | map image |
/cdn/{version}/img/tft-champion/{image.full} | and the same shape for tft-trait, tft-item, tft-augment, tft-tactician, tft-arena, tft-queue-type, tft-regalia |
/cdn/img/champion/splash/{ChampionId}_{skinNum}.jpg | no version segment. Full splash art. _0 is the base skin |
/cdn/img/champion/loading/{ChampionId}_{skinNum}.jpg | no version segment. The tall loading-screen crop |
/cdn/img/{icon} | rune icons — runesReforged.json stores a path already relative to /cdn/img/, so do not prepend a version to it |
Legends of Runeterra Data Dragon — dd.b.pvp.net
This is a different host with a different design, and it is the one most people arrive looking for. It ships zip bundles, not individual JSON documents, and the locale is written lower-case: en_us.
| URL | Returns |
|---|---|
https://dd.b.pvp.net/latest/core-en_us.zip | the core bundle: keywords, regions, rarities, spell speeds, card types, plus the shared art |
https://dd.b.pvp.net/latest/set1-en_us.zip … set9-en_us.zip | one bundle per card set. Inside each is {set}-en_us.json, an array of card objects, next to the card art |
The set list is not a numeric range. The real ids are set1, set2, set3, set4, set5, set6, set6cde, set7, set7b, set8 and set9 — so a loop over set1..set9 silently skips set6cde and set7b entirely.
Each card object carries cardCode, name, descriptionRaw, flavorText, regionRefs, cost, attack, health, supertype, rarityRef, collectible, and an assets array whose gameAbsolutePath and fullAbsolutePath are absolute URLs to the card art. Take the art URLs from that array rather than composing them: composing them is exactly what stopped working.
The path the search results still point at is dead
The unpacked layout — https://dd.b.pvp.net/latest/set9/en_us/data.json, and the matching /latest/{set}/en_us/img/cards/{CARDCODE}.png for art — is the shape nearly every tutorial, forum answer and Stack Overflow post about Legends of Runeterra data still gives. Measured on 22 September 2026 it returns:
HTTP/1.1 403 Forbidden — <Error><Code>AccessDenied</Code><Message>Access Denied</Message></Error>
Every unpacked path under that host answers the same way, for set1 as well as set9, for JSON as well as images. It is the bucket refusing to list or serve loose objects, not a missing file, so no amount of correcting the set name or the locale will bring it back. The zip bundles above are the live route, and they still answer 200 application/zip.
There is no version number, so use the ETag
Legends of Runeterra Data Dragon exposes nothing like versions.json. The way to tell whether the data has changed without downloading roughly a gigabyte of bundles is a HEAD request against the core bundle and a comparison of the ETag header against the one you stored last time. That is what the collector behind this site’s card catalogue does, and it is the only change signal the host gives you.
Community Dragon — raw.communitydragon.org
Community Dragon is a fan-run extraction of the League client’s own data files. It is unofficial and can lag or break, and it is also the only public source for a long list of things Data Dragon has never carried. The first path segment is a channel: latest for the live patch, pbe for the public beta, or a patch string such as 15.12 to pin.
| URL | Returns |
|---|---|
https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/ward-skins.json | every ward skin, with its asset path and legacy flag |
…/global/default/v1/skinlines.json | skin lines (Star Guardian, Project, and the rest) |
…/global/default/v1/summoner-emotes.json | emotes |
…/global/default/v1/tftdamageskins.json | Teamfight Tactics damage skins |
…/global/default/v1/challenges.json | the challenge system |
…/global/default/v1/champion-icons/{championKey}.png | champion icon by numeric key |
https://raw.communitydragon.org/latest/cdragon/tft/en_us.json | the entire Teamfight Tactics set file — units, traits, items, augments, every set at once. Around 24 MB |
https://raw.communitydragon.org/latest/cdragon/arena/en_us.json | Arena augments |
https://raw.communitydragon.org/latest/plugins/rcp-lor-game-data/global/en_us/data | Legends of Runeterra game data, mirrored |
https://raw.communitydragon.org/data/hashes/lol/hashes.game.txt | the hash table that maps obfuscated game file names to readable paths |
https://raw.communitydragon.org/pbe/cdragon/files.exported.txt | a full listing of everything exported for that channel |
Translating an asset path
Asset references inside Community Dragon’s JSON are client paths, not URLs. They look like /lol-game-data/assets/ASSETS/Characters/Aatrox/HUD/Aatrox_Square.png. To fetch one: strip the leading /lol-game-data/assets/, lower-case the remainder, and hang it off https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/. The lower-casing is not cosmetic — the export is lower-cased on disk, so a path that keeps its original mixed case returns 404, and that single detail is the most common reason a Community Dragon URL fails.
Teamfight Tactics asset paths in cdragon/tft/en_us.json follow the same rule against a different root: strip to the ASSETS/… portion, lower-case it, and hang it off https://raw.communitydragon.org/latest/game/.
Patch strings, and how versioning actually behaves
A Data Dragon version is a three-part patch string such as 15.12.1. The first two parts are the game patch; the third is a Data Dragon build within that patch, so 15.12.1 and 15.12.2 can both exist and only the newer one is in versions.json. Old versions are never removed, which is what makes Data Dragon usable as an archive: a URL built against a two-year-old patch string still returns that patch’s data today.
Community Dragon has no equivalent history. latest moves under you and there is no list of previous builds, so anything you need to keep, you copy. Legends of Runeterra Data Dragon has neither a version nor a history — only latest and an ETag.
Five ways these URLs fail
Why does the champion id not match the champion’s name?
Every Data Dragon path keys on the internal id, not the display name, and three of them differ by more than punctuation: MonkeyKing is Wukong, Nunu is Nunu & Willump, and Renata is Renata Glasc. Everything else is the name with the spaces and apostrophes removed and the internal capitalisation kept — Kai’Sa is Kaisa, Dr. Mundo is DrMundo, Jarvan IV is JarvanIV. Match on the id, never on the name.
Why is the locale rejected?
Because the three hosts disagree. Data Dragon wants en_US with an upper-case region. Legends of Runeterra Data Dragon and Community Dragon both want en_us, all lower-case. The same locale written the other way is a 404 on either side.
Why is splash art missing from the versioned path?
Because it was never there. /cdn/{version}/img/champion/… holds the small square icon only. Splash and loading art live outside the version tree entirely, at /cdn/img/champion/splash/{Id}_{num}.jpg and /cdn/img/champion/loading/{Id}_{num}.jpg, and are always the current art — there is no way to ask Data Dragon for the splash a champion had two patches ago.
Why does dd.b.pvp.net/latest/set9/en_us/data.json return 403?
Because loose objects on that bucket are no longer served, as measured above. Use https://dd.b.pvp.net/latest/set9-en_us.zip and read set9-en_us.json out of it.
Why did a Teamfight Tactics augment lookup come back empty?
Because the data and the match payload have drifted apart. tft-augments.json still lists augments and Community Dragon still carries their text, but Riot removed the augments field from the match payload, so there is no honest way to compute a pick rate or a placement from public data. That is why the augment list on this site is a list of names and nothing more.
What this site built out of them
Each of these catalogues is one of the endpoints above, collected, stored and given a page per row rather than a JSON blob per patch:
Two sources on this site do not come from any of the three trees, and it is worth saying so rather than implying otherwise: Riftbound is pulled from Riot’s own riftbound/content/v1/contents endpoint, and Arcane is wiki-sourced, because a television series has no Data Dragon.