Entertainment — entry 007 of 9
PotterDB
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.
GreatAPIs Score
Auth quickstart
- No API key or signup required — the live probe above returned data with no auth header sent at all.
- 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.
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
{"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
https://api.potterdb.com/v1Gotchas & 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.