The card catalogue as JSON. Read-only, with a key.
Ask for access on Discord. Your key then appears under Account on My Decks.
Send it in a header on every request. The base URL is https://fowca.gg.
curl -H "Authorization: Bearer fowca_YOUR_KEY" \ "https://fowca.gg/api/cards/search?q=set%3ACPB&limit=200" # or curl -H "X-API-Key: fowca_YOUR_KEY" "https://fowca.gg/api/card/CPB-017"
Check that it works with GET /api/key. It answers
{ ok, user, limit, remaining, reset } for a valid key and 401 without one.
GET requests only.
600 requests per 15 minutes per key. Without a key you get a small allowance for trying things out.
Every response has RateLimit and RateLimit-Policy headers.
Responses carry an ETag, so If-None-Match returns 304 when nothing changed.
Errors are JSON: { "error": "..." }.
| Status | Meaning |
|---|---|
| 400 | A bad parameter, a key sent in the URL, or a query over 500 characters or 40 terms. |
| 401 | Malformed API key, or Invalid or revoked API key. |
| 403 | API keys are read-only, or Price data is not available through the API. |
| 404 | Card not found, or Not found for an unknown path. |
| 429 | Over the limit. Retry-After says how many seconds to wait. |
GET /api/cards/search
One row per card. q uses the search syntax.
With no q it returns the whole catalogue.
| Parameter | Meaning |
|---|---|
q | Search query, such as set:CPB or artist:"Kairi Miura". |
page | Page number, from 1. |
limit | Rows per page, 1 to 200. Default 60. |
offset | Row offset. Overrides page. |
sort | name, cost, atk, def, released, set, type, color, rarity, popularity. |
dir | asc or desc. |
unique | prints returns every printing, variants included. |
format | Only cards legal in that format, such as paradox or evil_cluster. Same as format: in q. |
name | Exact card name. Returns every match and ignores the other parameters. |
{
"cards": [
{
"code": "TTW-002",
"name": "Alice's Little Supply Force",
"type": "Resonator",
"cost": "{W}",
"atk": "200",
"def": "200",
"rarity": "C",
"variant_type": null,
"race": "Soldier",
"attribute": "{W}",
"set_code": "TTW",
"release_date": "2015-12-11",
"is_main_set": true,
"illustrator": "城戸春一",
"artists": ["城戸春一"],
"illustrator_canonical": "Haruichi Kido",
"hasBack": false,
"hasBack2": false
}
],
"total": 111,
"page": 1,
"totalPages": 2,
"offset": 0,
"description": "where in set \"TTW\"",
"warnings": [],
"sort": "name",
"dir": "asc"
}| Field | Meaning |
|---|---|
code | The printing, and the id for the card endpoint. Case-sensitive. |
name | Card name. Not unique. Split cards join both halves with //. |
cost, attribute | Symbols, such as {W}{W}{1}. |
atk, def | Numbers sent as strings, or null. |
rarity | C, U, R, SR, MR and so on. |
variant_type | null for a regular print, else the variant, such as Full Art. |
set_code, release_date | The set, and its date as YYYY-MM-DD. |
is_main_set | false for promos and starter decks. |
artists | Who drew it, one name each. Some cards have several. |
illustrator | The same names on one line, joined with / . |
illustrator_canonical | That line with each artist under one spelling. |
hasBack, backFace1 | Two-sided cards. backFace1 has the other side's code, name and type. |
warnings | Parts of the query that were not understood. |
null or "". Treat them the same.unique=prints, a row is unique by code plus variant_type._back, with isBack and frontCode.GET /api/card/:codeOne printing in full. Add ?variant=Full+Art for a variant of the same code.
| Field | Meaning |
|---|---|
code, name, dbName | dbName is the exact name the name= parameters take. |
type, subtype, race, attribute | The type line. |
cost, totalCost, atk, def | totalCost is a number. The rest are strings. |
divinity, willpower | Strings, on the card types that have them. |
text, flavor_text, solo_text | Rules text, one ability per line. |
artists, illustrator, illustrator_canonical | As in search. |
setName, rarity, release_date, variant_type | This printing. |
printings | Every printing: [{ code, set_name, rarity, variant_type, tcgplayer_id }]. |
legality | Legal, Not Legal, Banned or Restricted per format. |
faces | The other sides of a two-sided card. |
rulings, references, referencedBy | Official rulings, and cards that name each other. |
usage | Up to 20 tournament decklists that play it. |
Fields not listed here may change.
GET /api/setsEvery set, newest first. Use code in set:CODE searches.
[
{ "code": "QSK", "name": "The Quest of the Seven Keys", "release_date": "2026-09-25", "card_count": 109 }
]| Endpoint | Returns |
|---|---|
GET /api/cards/printings?name= | All printings of one card: [{ code, set_name, rarity, variant_type, tcgplayer_id }]. |
GET /api/cards/filters | { types, sets, rarities, attributes }. sets holds names. For codes use /api/sets. |
GET /api/cards/suggest?q= | Up to 8 name matches for 2 or more letters: [{ type, text, code }]. |
GET /api/cards/top?era=®ion= | The 30 most-played cards: [{ name, code, deck_count, total_copies }]. |
GET /api/cards/random?count= | 1 to 20 random cards: [{ code, name }]. |
GET /api/eras | The clusters, whose id is the era value above. |
region is Asia, Europe, North America, Oceania or Online./api/ paths serve this site's own pages and may change.
Thumbnails are at https://fowca.gg/img/thumb/CODE.webp?w=260.
w is 130, 260, 390, 520 or 744. No key needed.
The whole catalogue is about 30 requests. New printings are easiest to find by date.
# every card, 200 at a time, until page passes totalPages GET /api/cards/search?limit=200&page=1 # every printing, newest first; stop at one you already have GET /api/cards/search?unique=prints&sort=released&dir=desc&limit=200 # or compare the set list, then fetch the sets you lack GET /api/sets GET /api/cards/search?q=set%3ACPB&limit=200
User-Agent that names your project and how to reach you.