Entertainment — entry 007 of 9

PotterDB

Verified Jul 2026

PotterDB is a free, keyless database of the Harry Potter universe covering books, chapters, characters, movies, potions, and spells, reachable through both a JSON:API-style REST interface (api.potterdb.com) and a GraphQL endpoint. Every resource supports filtering, sorting, sparse fieldsets, and pagination in the JSON:API convention, and the REST side publishes a live OpenAPI schema. It's a community-run, open-source project welcoming Hacktoberfest contributions rather than a commercial offering.

PotterDB's REST side is a genuine JSON:API implementation, not a plain-JSON API with JSON:API-flavored docs: a live GET to `/v1/spells?page[size]=1` returned `content-type: application/vnd.api+json; charset=utf-8`, a `data` array of resource objects, and a `meta.pagination` block reporting 345 total spell records at probe time.

harry-potterfictional-universegraphqlkeyless
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, GraphQLResponses can be requested as JSON or GraphQL.

GreatAPIs Score

Score80out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats15/15Supports 2 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 80 on greatapis.com
<a href="https://greatapis.com/api/potterdb/"><img src="https://greatapis.com/badge/potterdb.svg" alt="Scored 80 on greatapis.com"></a>

Auth quickstart

  1. No API key or signup required — the live probe above returned data with no auth header sent at all.
  2. Page through results with the JSON:API `page[size]` / `page[number]` query params (bracket syntax, so URL-encode or use a client that does it for you) rather than any offset/limit pair — confirmed live in the `links.next`/`links.last` URLs the API itself returned.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

List spells, one page at a time

GEThttps://api.potterdb.com/v1/spells?page[size]=1

200 application/vnd.api+json; charset=utf-8

{"data":[{"id":"1fcca6dd-f25d-414f-889a-e99b0c4b40c4","type":"spell","attributes":{"slug":"age-line","category":"Charm","creator":null,"effect":"Prevented people above or below a certain age from access to a target","hand":null,"image":"https://static.wikia.nocookie.net/harrypotter/images/e/e5/Age_Line_surrounding_the_Goblet_of_Fire_PM.jpg","incantation":null,"light":"Blue","name":"Age Line","wiki":"https://harrypotter.fandom.com/wiki/Age_Line"},"links":{"self":"/v1/spells/1fcca6dd-f25d-414f-889a-e99b0c4b40c4"}}],"meta":{"pagination":{"current":1,"next":2,"last":345,"records":345},"copyright":"Copyright © Potter DB 2026","generated_at":"2025-12-12T20:13:46.150Z"},"links":{"self":"https://api.potterdb.com/v1/spells?page[size]=1","current":"https://api.potterdb.com/v1/spells?page[number]=1&page[size]=1","next":"https://api.potterdb.com/v1/spells?page[number]=2&page[size]=1","last":"https://api.potterdb.com/v1/spells?page[number]=345&page[size]=1"}}

Captured byte-for-byte from this run's live probe against page 1, size 1 — the specific spell returned ("Age Line") is whichever record sorts first server-side, and `meta.pagination.records` (345) reflects the live spell count at probe time, not a fixed total.

Developer reference

Base URLhttps://api.potterdb.com/v1

Gotchas & limits

  • The response content type is `application/vnd.api+json`, not `application/json` — confirmed on both the listing probe above and a 404 probe below — so a client that only parses a plain-JSON content type will reject or mishandle every response unless it's told to treat this as JSON anyway.
  • An unknown id doesn't 200 with an empty body — a live GET to `/v1/spells/00000000-0000-0000-0000-000000000000` returned HTTP 404 with the JSON:API error envelope `{"errors":[{"status":"404","source":null,"title":"Not Found","detail":"Couldn't find Spell with 'id'=00000000-0000-0000-0000-000000000000"}]}`.
  • Pagination metadata is real and derived from the live dataset: the probe above's `meta.pagination` reported `current: 1`, `next: 2`, `last: 345`, `records: 345`, and the `links.next`/`links.last` URLs echo the same page numbers back as `page[number]` query params.
  • CORS is open: a live GET to `/v1/spells` with an `Origin` header returned `Access-Control-Allow-Origin: *` and `Access-Control-Allow-Methods: GET`, so this API is callable directly from browser JS on any origin.