The DM's Toolkit 2024 SRD API · The DM's Toolkit
SRD 5.2 · Legacy · 2024 Expanded · Public

D&D 2024 SRD API

A standalone, public JSON API serving three D&D 5e datasets — the official 2024 SRD 5.2 corpus, a legacy archive of original 5e + third-party material, and 2024 Expanded, which unions SRD 5.2 with community-submitted homebrew content. CORS-open, no auth required for reads. Stat blocks, level progressions, and lookup tables are parsed into structured JSON so they're queryable.

34,969 records across 7 resources in 3 datasets

Endpoints SRD 5.2

Hit GET /api for namespaces, GET /api/2024 for the SRD 5.2 resource list.
Resource List Detail
Monsters 345 records GET /api/2024/monsters GET /api/2024/monsters/{slug}
Spells 342 records GET /api/2024/spells GET /api/2024/spells/{slug}
Backgrounds 4 records GET /api/2024/backgrounds GET /api/2024/backgrounds/{slug}
Feats 17 records GET /api/2024/feats GET /api/2024/feats/{slug}
Magic Items 257 records GET /api/2024/items GET /api/2024/items/{slug}
Species 9 records GET /api/2024/species GET /api/2024/species/{slug}
Classes 12 records GET /api/2024/classes GET /api/2024/classes/{slug}

Filtering

List endpoints accept query-string filters on publisher, book, source.
?source=*SRD*Contains match (case-insensitive). * is the wildcard.
?publisher=Wizards*Starts-with.
?source=a,bOR within a single field.
?source=*SRD*&publisher=Wizards*AND across fields.
?fields=name,slug,sourceChoose which columns the list endpoint returns.

Response shape

Two envelopes — list (name+slug) and detail (full record).
GET /api/2024/monsters
{
  "data": [ { "name": "Aboleth", "slug": "aboleth" }, ... ],
  "count": 345
}

GET /api/2024/monsters/aboleth
{
  "data": {
    "slug": "aboleth", "name": "Aboleth",
    "description":    "Aboleth Large Aberration, Lawful Evil AC 17 HP 150 ...",
    "description_md": "## Aboleth\n\n*Large Aberration, Lawful Evil*\n\n- **AC** 17\n- **HP** 150 ...",
    "properties": { "size": "Large", "creatureType": "Aberration", "stats": { ... }, "actions": { ... } },
    "source": "SRD 5.2"
  }
}

Quick links

Browser · SRD 5.2

Live, filterable table view of the 2024 SRD 5.2 corpus. Click a row for the full detail panel: properties, rendered markdown, raw JSON, and image (where present).

Open SRD 5.2 browser

API root · /api/2024

Self-discovery endpoint for the SRD 5.2 namespace — returns the seven resource names. Use it from clients that enumerate before crawling.

Open /api/2024

Discovery · /api

Lists every namespace this API serves (SRD 5.2 · Legacy · 2024 Expanded). Good entry point for any client that wants to walk the whole surface.

Open /api

Report an issue

Found a missing entry, a typo, or a row sourced from the wrong edition? Send a quick note and we'll fix it. Goes to both maintainers.

Endpoints Legacy

Original 5e + third-party corpus. GET /api/legacy lists the resources in this namespace.
Resource List Detail
Monsters 11,463 records GET /api/legacy/monsters GET /api/legacy/monsters/{slug}
Spells 5,849 records GET /api/legacy/spells GET /api/legacy/spells/{slug}
Backgrounds 405 records GET /api/legacy/backgrounds GET /api/legacy/backgrounds/{slug}
Magic Items 15,749 records GET /api/legacy/items GET /api/legacy/items/{slug}
Species 383 records GET /api/legacy/species GET /api/legacy/species/{slug}
Classes 134 records GET /api/legacy/classes GET /api/legacy/classes/{slug}

Filtering

Same filter syntax as SRD 5.2 — publisher, book, and source. Legacy data has richer publisher/book values since it includes third-party material.
?publisher=*Kobold Press*Filter by third-party publisher (contains match).
?source=*SRD*Find legacy entries that carry an SRD Source tag.
?publisher=Kobold Press,Goodman GamesOR within a single field.
?source=*5e*&book=*Tome*AND across fields.
?fields=name,slug,publisher,book,sourceChoose which columns the list endpoint returns.

Response shape

Identical envelope to SRD 5.2. Legacy records typically carry populated publisher and book fields.
GET /api/legacy/monsters
{
  "data": [ { "name": "Aboleth", "slug": "aboleth" }, ... ],
  "count": 11,463
}

GET /api/legacy/monsters/aboleth
{
  "data": {
    "slug": "aboleth", "name": "Aboleth",
    "description": "...",
    "properties": { "Category": "Monsters", "Size": "Large", "Type": "aberration", "Source": "5th Edition SRD", ... },
    "publisher": "Wizards of the Coast",
    "book": "Systems Reference Document 5.1",
    "source": "5th Edition SRD"
  }
}

// Note: legacy responses omit `description_md` — that field is only present
// on the curated 2024 SRD tables (and inherited by the expanded namespace).

Sources Legacy

Curated from official products and community-supported references.

The data in this library has been curated from a variety of official and community-supported resources. Notable contributors include:

PHBPlayer's Handbook (2024)
DMGDungeon Master's Guide (2024)
MMMonster Manual
XGtEXanathar's Guide to Everything
TCoETasha's Cauldron of Everything
BGotGBigby Presents — Glory of the Giants
MPMMMordenkainen Presents — Monsters of the Multiverse
CoSCurse of Strahd
PoAPrinces of the Apocalypse
+ many more · 193 sources in total

OGL 1.0a Includes content from the System Reference Document 5.1 and 5.2, released under the Open Gaming License Version 1.0a.

MIT Additional data is licensed under the MIT License — see LICENSE.txt.

Quick links

Browser · Legacy

Live, filterable table view of the legacy 5e + 3pp corpus. Same filter/detail UI as the SRD 5.2 browser, scoped to the legacy namespace.

Open Legacy browser

API root · /api/legacy

Self-discovery endpoint for the legacy namespace — returns the six resource names. Note: feats isn't part of the legacy corpus.

Open /api/legacy

Discovery · /api

Lists every namespace this API serves (SRD 5.2 · Legacy · 2024 Expanded). Good entry point for any client that wants to walk the whole surface.

Open /api

Report an issue

Legacy data was imported from external sources and hasn't been fully verified. If you spot inaccuracies or edition mismatches, please flag them so they can be reviewed.

Have homebrew content to share?

Submit monsters, spells, magic items, classes, species, feats, or backgrounds for inclusion in the 2024 Expanded library. All submissions are reviewed before being published. Slug prefixes are auto-generated from your publisher name so nothing collides with the SRD baseline.

Endpoints 2024 Expanded

Reads union the SRD 5.2 baseline with approved homebrew. GET /api/expanded lists the resources.
Resource List Detail
Monsters 345 SRD + 345 approved GET /api/expanded/monsters GET /api/expanded/monsters/{slug}
Spells 342 SRD + 402 approved GET /api/expanded/spells GET /api/expanded/spells/{slug}
Backgrounds 4 SRD + 4 approved GET /api/expanded/backgrounds GET /api/expanded/backgrounds/{slug}
Feats 17 SRD + 17 approved GET /api/expanded/feats GET /api/expanded/feats/{slug}
Magic Items 257 SRD + 307 approved GET /api/expanded/items GET /api/expanded/items/{slug}
Species 9 SRD + 9 approved GET /api/expanded/species GET /api/expanded/species/{slug}
Classes 12 SRD + 12 approved GET /api/expanded/classes GET /api/expanded/classes/{slug}

Submit content POST

Use the Submit content button above for a guided form, or POST directly to the API.
POST /api/expanded/{resource}Public — no auth required. Rate-limited per IP.
Required: name, publisherSlug is auto-generated as <publisher-slug>-<name-slug>.
Optional: description_md, properties, book, sourcePlain description is derived from description_md via Parsedown on save.
Response: { submission_id, slug, status: "pending" }Submissions appear in the public reads only after admin approval.
409 on slug collision · 400 on missing fieldPick a different name or contact the maintainer for already-existing slugs.
POST /api/expanded/monsters
Content-Type: application/json

{
  "name":      "Iron Dragon",
  "publisher": "Kobold Press",
  "book":      "Tome of Beasts",
  "source":    "kobold-press",
  "description_md": "## Iron Dragon\n\n*Large Construct...*\n\n- **AC** 19\n- **HP** 200",
  "properties": { "size": "Large", "creatureType": "Construct" }
}

→ 201 Created
{
  "data": {
    "submission_id": 42,
    "slug": "kobold-press-iron-dragon",
    "status": "pending",
    "message": "Submission received. It will be reviewed before appearing in the public API."
  }
}

Filtering & response shape

Same syntax as SRD 5.2 / Legacy. Detail responses include description_md for both baseline and homebrew rows.
?source=homebrewFilter to just approved homebrew (excludes the SRD baseline).
?publisher=*Kobold*Find all approved entries from a particular publisher.
?fields=name,slug,publisher,sourceNarrow the list columns. Filters apply to both UNION branches.
GET /api/expanded/monsters
{
  "data": [ { "name": "Aboleth", "slug": "aboleth" }, ... ],
  "count": 345
}

GET /api/expanded/monsters/kobold-press-iron-dragon
{
  "data": {
    "slug": "kobold-press-iron-dragon", "name": "Iron Dragon",
    "description":    "Iron Dragon Large Construct ...",
    "description_md": "## Iron Dragon\n\n*Large Construct, Lawful Neutral*\n\n- **AC** 19 ...",
    "properties": { "size": "Large", "creatureType": "Construct" },
    "publisher": "Kobold Press",
    "book":      "Tome of Beasts",
    "source":    "kobold-press"
  }
}

Quick links

Browser · 2024 Expanded

Live, filterable table view of the unioned namespace — SRD baseline + approved homebrew side by side. Same detail panel, different accent color.

Open Expanded browser

API root · /api/expanded

Self-discovery endpoint for the Expanded namespace — returns the seven resource names. Reads union with SRD 5.2 automatically.

Open /api/expanded

Submit content

Got homebrew to share? The submission form handles single entries or bulk JSON arrays — both feed the same admin review queue.

Discovery · /api

Lists every namespace this API serves. expanded sits alongside 2024 and legacy as a first-class read namespace.

Open /api

Rate limits & caching

Per client IP. Burst-friendly — short spikes pass; sustained scraping doesn't.
60 req / minutePlenty of headroom for any real UI or paginated crawl.
1,000 req / hourCatches loop-style scraping that slips under the per-minute cap.
10,000 req / daySlow-drip ceiling. Need more? Open an issue and tell us what you're building.
X-RateLimit-Limit / Remaining / ResetReturned on every response so honest clients can self-pace.
429 Too Many RequestsSent with Retry-After (seconds) when a window is exhausted.
Cache-Control: max-age=3600 & ETagSend If-None-Match to get a 304 with no body — doesn't count toward limits in practice since most clients/CDNs serve from cache.

Want to help out?

This API is 100% free — no rate-tier paywall, no ads, no tracking. Server bills and the hours behind keeping it audited / current come out of my pocket and my evenings. If it's saved you time on a tool you're building, or you just want to see it stay alive, any of the below makes a real difference.

Every contribution goes back into hosting, audit time, and new features. Thank you — seriously.

SRD 5.2 · Creative Commons Attribution 4.0 International

This work includes material taken from the System Reference Document 5.2 ("SRD 5.2") by Wizards of the Coast LLC. The SRD 5.2 is licensed under the Creative Commons Attribution 4.0 International License.