Video — entry 001 of 37

An API of Ice And Fire

Verified Jul 2026

An API of Ice And Fire is a fan-built REST API serving structured data from George R. R. Martin's A Song of Ice and Fire — characters, houses, and books with their cross-references — book-centric records that also carry TV-adaptation annotations, the character payload including tvSeries and playedBy. It's completely keyless and free, returning plain paginated JSON with no rate-limit headers observed on repeated calls.

An API of Ice And Fire is a fan-built, keyless REST API serving structured data from George R. R. Martin's A Song of Ice and Fire -- characters, houses, and books, with cross-references between them. The records are book-centric (`books`, `povBooks`, `culture`, and in-world `born`/`died` dates) but they also carry TV-adaptation annotations: the character payload below includes `tvSeries` and `playedBy`, and the provider's own homepage describes its scope as the universe of Ice and Fire "(and the HBO series Game of Thrones)".

fandombooksgame-of-thronescharacters
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.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/an-api-of-ice-and-fire/"><img src="https://greatapis.com/badge/an-api-of-ice-and-fire.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key required. A live `GET /characters/583` with no headers or credentials returned full character data this run; every documented endpoint (characters, houses, books) answered the same way.
Stored keyNo key stored

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

Look up a character by ID

GEThttps://anapioficeandfire.com/api/characters/583

200 application/json; charset=utf-8

{"url":"https://anapioficeandfire.com/api/characters/583","name":"Jon Snow","gender":"Male","culture":"Northmen","born":"In 283 AC","died":"","titles":["Lord Commander of the Night's Watch"],"aliases":["Lord Snow","Ned Stark's Bastard","The Snow of Winterfell","The Crow-Come-Over","The 998th Lord Commander of the Night's Watch","The Bastard of Winterfell","The Black Bastard of the Wall","Lord Crow"],"father":"","mother":"","spouse":"","allegiances":["https://anapioficeandfire.com/api/houses/362"],"books":["https://anapioficeandfire.com/api/books/5"],"povBooks":["https://anapioficeandfire.com/api/books/1","https://anapioficeandfire.com/api/books/2","https://anapioficeandfire.com/api/books/3","https://anapioficeandfire.com/api/books/8"],"tvSeries":["Season 1","Season 2","Season 3","Season 4","Season 5","Season 6"],"playedBy":["Kit Harington"]}

Try it

Developer reference

Base URLhttps://anapioficeandfire.com/api
Key endpoints
  • GET/characters/{id}
  • GET/books
  • GET/houses

Gotchas & limits

  • Plain `http://` is not left open here: a live `GET http://anapioficeandfire.com/api/characters/583` returned an HTTP 301 redirect (`Location: https://anapioficeandfire.com/api/characters/583`) to the https:// URL, confirmed this run.
  • A nonexistent-but-well-formed numeric ID (`/characters/9999999`) and a non-numeric path segment (`/characters/abc`) are both HTTP 404 with an empty body -- there is no JSON error envelope to parse either way, confirmed live this run against both.
  • Pagination is exposed only via the RFC 5988 `Link` response header, not in the JSON body: a live `GET /books` returned `link: <.../books?page=2&pageSize=10>; rel="next", <.../books?page=1&pageSize=10>; rel="first", <.../books?page=2&pageSize=10>; rel="last"` with no page/total fields anywhere in the array body itself -- callers must parse the header to paginate, and it's only exposed cross-origin because of the next gotcha.
  • CORS is Origin-conditional: a GET with no `Origin` header gets no `access-control-allow-origin` header at all, while the same GET with an `Origin` header gets back `access-control-allow-origin: *` plus `access-control-expose-headers: Link` -- that explicit expose is what makes the `Link` pagination header above readable from browser JS at all; without it a browser's fetch/XHR can't see it even though curl always can.
  • A live `OPTIONS` preflight (with `Origin` + `Access-Control-Request-Method: GET`) returned HTTP 204 with `access-control-allow-methods: GET,HEAD` and set two `ARRAffinity` session cookies scoped `HttpOnly; Secure` -- harmless for a keyless GET-only API, but a sign the backend sits behind an IIS/Azure App Service load balancer rather than a bare Cloudflare Worker.