Endpoints
All endpoints are GET (plus HEAD/OPTIONS), return JSON, and live under
https://meta-api.leaguetoolkit.dev/v1. A trailing slash is tolerated on any
route. Errors come back as JSON too - 404 responses include a hint and a
pointer back to /v1. Class names and domain ids are exact and
case-sensitive; hashes are accepted in any spelling (see
Names and hashes).
Discovery
Section titled “Discovery”| Endpoint | Returns |
|---|---|
/v1 |
API metadata: the dataset window (first and latest tracked patch/build), class and patch counts, hash format, the PBE preview if there is one, and a map of every endpoint. Start here. |
/v1/openapi |
The OpenAPI 3.1 document describing every endpoint and schema - point a Swagger or Redoc viewer at it. |
Classes
Section titled “Classes”| Endpoint | Returns |
|---|---|
/v1/classes |
The full class list: { count, classes: [name, …] }. Unnamed classes appear as canonical hashes. |
/v1/classes?domain={id} |
The same list narrowed to the classes placed in one domain. Ids come from /v1/categories; an unknown id is a 404. |
/v1/classes/{name-or-hash} |
One class: hash, interface/value flags, kind, category, bases, lifetime, ancestor/descendant trees, and its own properties with types, defaults, and history. |
/v1/classes/{name-or-hash}?inherited=1 |
The same class in the precomputed flattened view: properties from all ancestors merged in, each stamped with a from field. |
/v1/categories |
The domains classes are grouped into, in display order: { count, domains: [{ id, title, description, unreleased, counts }] }. |
Class shape
Section titled “Class shape”curl https://meta-api.leaguetoolkit.dev/v1/classes/VfxEmitterDefinitionData{ "name": "VfxEmitterDefinitionData", "hash": "0x09cde442", "interface": false, "value": true, "kind": "value", "category": { "domain": "vfx", "via": "prefix", "family": "VfxEmitterDefinitionData" }, "bases": [], "since": null, "removedIn": null, "properties": [ { "name": "primitive", "hash": "0x007b14f6", "ft": "Pointer", "kt": null, "vt": null, "kh": "0x60c24094", "khName": null, "khKind": "class", "defaultValue": "{}" } ], "ancestorLevels": [], "descendantTree": []}Property type fields are the tuple the wiki renders: ft (field type), kt /
vt (aux key/value types for containers and maps, null when not
applicable), and the link target resolved three ways:
kh- the canonical hash of the referenced type, ornullwhen the property links nothing.khName- the resolved name, ornullwhen unknown.khKind- what the hash is:"class"(fetchable via/v1/classes/{kh}),"external"(an engine type outside the dumped class set), or"unknown".
Properties whose type changed over time carry a history array of the same
tuple with since/until patch bounds.
Dataset window: tracking begins at the dataset.firstPatch reported by
/v1 (currently patch 13.15). since: null means already present when
tracking began, not “has always existed”; since: "14.1" means the class
or property first appeared in that patch.
Inheritance: by default properties lists only the class’s own
properties, with the full ancestry in ancestorLevels (nearest level first)
and subclasses in descendantTree. With ?inherited=1, properties from all
ancestors are merged in (the nearest definition wins on a name conflict) and
every property gains a from field naming the class that defines it.
Category: every class sits in exactly one domain.
category.domain is an id from /v1/categories, category.via is the rule
that placed the class (pin, seed, prefix, usage, shared, or none),
and category.family is the root of its primary base chain. A class used from
several domains has the domain shared and lists them in usedByDomains; a
class no rule claims has the domain uncategorized. kind is the two flags
as one value: interface, value, or class. Placement is derived at build
time, so it can change between dataset generations without the class changing.
PBE preview
Section titled “PBE preview”Every response is live data unless the request says otherwise. While PBE is on
a patch that live has not reached, the API also describes the newest PBE build,
compared with the latest live build. /v1 reports it as preview:
{ "channel": "pbe", "patch": "16.21", "build": 8255794, "base": 8230722, "basePatch": "16.19", "classes": 236 }preview is null if PBE and live are on the same patch. base is the live
build that the PBE build is compared with, and classes counts the classes
whose PBE response differs from the live one.
| Endpoint | Returns |
|---|---|
/v1/classes/{name-or-hash}?channel=pbe |
The class as of the PBE build, in the same shape. A class that PBE adds has since set to the PBE patch; one that PBE removes has removedIn set to it. A class that PBE leaves alone returns the live response. Combines with inherited=1. |
/v1/classes?channel=pbe |
The class list with the PBE-only classes included. |
/v1/changelog/pbe |
What the PBE build changes against base, in the shape of a patch changelog, plus a preview object. A 404 if there is no preview. |
/v1/db/pbe |
The raw PBE overlay: the entries of /v1/db that differ as of the PBE build. Always present; build is null if there is no preview. |
/v1/versions, /v1/hashes and /v1/changelog carry the same preview
object, or null. In /v1/hashes it also lists the hashes that exist on PBE
only. The PBE build is never part of the versions array, and its number can
be lower than the number of a live build: order builds by channel, not by number.
A PBE build is replaced by the next one and is not promoted as is, so treat a
PBE response as a preview of the next patch, not as a release. Without a
preview, channel=pbe returns the live response. Any other channel value
than live or pbe is a 400.
Lookup tables
Section titled “Lookup tables”| Endpoint | Returns |
|---|---|
/v1/hashes |
Canonical hash → resolved name for every class (null = unnamed) and external type. Use it to translate hashes and names in bulk. |
/v1/index |
Class name → absolute wiki page URL, for linking back to the site. |
/v1/versions |
The full patch ↔ build-number map, for translating the raw build numbers that appear in changelog entries and /v1/db. |
Changelogs
Section titled “Changelogs”| Endpoint | Returns |
|---|---|
/v1/changelog |
Patch index, newest first, with per-patch change counts. |
/v1/changelog/{slug} |
Full changelog for one patch: classes and properties added, removed, or changed. The slug is the patch with a hyphen - 16-13 for patch 16.13. |
Bulk download
Section titled “Bulk download”| Endpoint | Returns |
|---|---|
/v1/db |
The complete raw meta database in one download (~3.5 MB, ~700 KB compressed). Unpadded hashes, per-build revisions. Live builds only. Prefer the per-class endpoints unless you genuinely need everything. |
Documentation
Section titled “Documentation”The endpoints above serve structural facts extracted from the game. Documentation endpoints add the community-written prose on top - fetch the facts for a class, then merge the prose in by property name.
| Endpoint | Returns |
|---|---|
/v1/docs |
Which classes have written documentation: { count, classes: [name, …] }. |
/v1/docs/{name-or-hash} |
The prose for one class: { name, class: {…}, properties: { propName: {…} } }, where each entry holds description, notes, and examples. |
/v1/docs/all |
Every documented class’s prose in one download - for tools bundling a documentation snapshot. |
curl https://meta-api.leaguetoolkit.dev/v1/docs/AbilityObject{ "name": "AbilityObject", "class": null, "properties": { "AbilityTraits": { "description": "Gameplay-behavior tags for the ability…", "notes": ["Stored as a 4-byte (`U32`) bitmask."] } }}Prose also updates on a different cadence than facts: facts change only when
a game patch is ingested, while prose changes whenever a documentation PR is
merged. Note that /v1/docs* is the only surface serving licensed
human-authored content - see Licensing if you redistribute
it.