Games & Comics — entry 062 of 75
Scryfall
Scryfall is the most complete and actively maintained Magic: The Gathering card database, covering every printing, ruling, legality, and price point (TCGplayer/Cardmarket/Cardhoarder) across the game's full history, alongside bulk data downloads for offline use. It's entirely keyless and free, with a courtesy rate limit of roughly 10 requests/second rather than a paid tier.
Scryfall is a keyless JSON database of every Magic: The Gathering card printing, queryable by exact or fuzzy name, ID, or a full search-query syntax. A live GET this run against /cards/named?exact=Black+Lotus returned a genuine 4,821 B card object at HTTP 200, with content-type: application/json; charset=utf-8 and access-control-allow-origin: * — no key or signup of any kind.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required — but Scryfall's own error response proves it insists on request hygiene: a live GET this run against
/cards/named?exact=Black+Lotuswith an emptyUser-Agentheader returned HTTP 400 (not a 403), with body{"object":"error","code":"bad_request","status":400,"details":"You submitted an invalid request. HTTP requests to api.scryfall.com must contain a User-Agent and Accept header. More info: https://scryfall.com/docs/api"}. Send a descriptive User-Agent and you're in.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Look up a card by its exact name
GEThttps://api.scryfall.com/cards/named?exact=Black+Lotus
{
"object": "card",
"id": "bd8fa327-dd41-4737-8f19-2cf5eb1f7cdd",
"name": "Black Lotus",
"released_at": "2014-06-16",
"set": "vma",
"set_name": "Vintage Masters",
"mana_cost": "{0}",
"cmc": 0.0,
"type_line": "Artifact",
"oracle_text": "{T}, Sacrifice this artifact: Add three mana of any one color.",
"rarity": "bonus",
"digital": true,
"games": [
"mtgo"
],
"prices": {
"usd": null,
"usd_foil": null,
"eur": null,
"tix": "45.73"
},
"...": "multiverse_ids, image_uris, legalities (23 formats), related_uris, purchase_uris omitted -- full object is 4,821 B"
}A live GET this run against /cards/search?q=lotus returned HTTP 200 with total_cards: 26 and has_more: false — all 26 matches in one 130,961 B page, from Black Lotus itself down to reprint-adjacent cards like Blacker Lotus. /cards/search paginates via has_more + a next_page URL once a query's total_cards exceeds one page.
Try it
Developer reference
https://api.scryfall.com10 requests/second (2/second on /cards/search, /cards/named, /cards/random, /cards/collection) -- per scryfall.com/docs/api/rate-limits, with a 429 and a 30-second lockout on violation.
- GET/cards/named
- GET/cards/search
- GET/cards/{id}
Gotchas & limits
- A name that matches no card is a real HTTP 404 with a typed error body, not a 200 — a live GET this run against
/cards/named?exact=Notacard+Xyzreturned exactly{"object":"error","code":"not_found","status":404,"details":"No cards found matching “Notacard Xyz”"}(122 B), curly quotes and all, insidedetails. /cards/named?exact=returns exactly one print, and it is not necessarily the card's original or most iconic printing — a live GET this run against/cards/search?q=!"Black Lotus"&unique=printsfound 5 total prints (vma,2ed,leb,lea,prm), yet the plainexact=Black+Lotuslookup above resolved tovma(2014's digital-only Vintage Masters), not the 1993 Alpha (lea) paper original.pricesmixes nullable fiat fields with a separate MTGO-onlytixfield, and digital-exclusive prints carry realtixpricing with nullusd/eur— confirmed live on the Black Lotus response above, whereusd,usd_foil, andeurare allnullwhiletixis the genuine string"45.73". Code that assumes a card always has a USD price will getnullfor any digital-only print.- Every request needs both a
User-Agentand anAcceptheader or it's rejected before it reaches card data — confirmed live above via the empty-User-Agent400. This is stricter than a typical keyless API: no key is required, but the two headers are not optional.