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.

URLReturns
/cdn/{version}/data/en_US/champion.jsonevery champion, shallow: id, key, name, title, blurb, tags, a stat block
/cdn/{version}/data/en_US/champion/{ChampionId}.jsonone champion, deep: lore, spells, passive, skins, tips. The shallow file does not contain abilities
/cdn/{version}/data/en_US/item.jsonthe item shop: gold, stats, from/into build paths, tags
/cdn/{version}/data/en_US/runesReforged.jsonthe four rune trees, nested path → slots → runes
/cdn/{version}/data/en_US/summoner.jsonsummoner spells, with cooldowns and mode availability
/cdn/{version}/data/en_US/profileicon.jsonevery summoner icon id
/cdn/{version}/data/en_US/map.jsonthe playable maps
/cdn/{version}/data/en_US/tft-champion.jsonTeamfight Tactics units for the live set
/cdn/{version}/data/en_US/tft-trait.jsonTeamfight Tactics traits
/cdn/{version}/data/en_US/tft-item.jsonTeamfight Tactics items
/cdn/{version}/data/en_US/tft-augments.jsonTeamfight Tactics augments (note the plural — every other tft file is singular)
/cdn/{version}/data/en_US/tft-tactician.jsonLittle Legends
/cdn/{version}/data/en_US/tft-arena.json, tft-queues.json, tft-regalia.jsonboard 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.

URLWhat it is
/cdn/{version}/img/champion/{ChampionId}.pngsquare champion icon
/cdn/{version}/img/spell/{image.full}ability icon
/cdn/{version}/img/passive/{image.full}passive icon
/cdn/{version}/img/item/{itemId}.pngitem icon
/cdn/{version}/img/profileicon/{image.full}summoner icon
/cdn/{version}/img/map/map{mapId}.pngmap 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}.jpgno version segment. Full splash art. _0 is the base skin
/cdn/img/champion/loading/{ChampionId}_{skinNum}.jpgno 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.

URLReturns
https://dd.b.pvp.net/latest/core-en_us.zipthe core bundle: keywords, regions, rarities, spell speeds, card types, plus the shared art
https://dd.b.pvp.net/latest/set1-en_us.zipset9-en_us.zipone 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.

URLReturns
https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/ward-skins.jsonevery ward skin, with its asset path and legacy flag
…/global/default/v1/skinlines.jsonskin lines (Star Guardian, Project, and the rest)
…/global/default/v1/summoner-emotes.jsonemotes
…/global/default/v1/tftdamageskins.jsonTeamfight Tactics damage skins
…/global/default/v1/challenges.jsonthe challenge system
…/global/default/v1/champion-icons/{championKey}.pngchampion icon by numeric key
https://raw.communitydragon.org/latest/cdragon/tft/en_us.jsonthe 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.jsonArena augments
https://raw.communitydragon.org/latest/plugins/rcp-lor-game-data/global/en_us/dataLegends of Runeterra game data, mirrored
https://raw.communitydragon.org/data/hashes/lol/hashes.game.txtthe hash table that maps obfuscated game file names to readable paths
https://raw.communitydragon.org/pbe/cdragon/files.exported.txta 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.