Developers

Palworld TCG public API

Read-only JSON for the card database, prices, the community deck list and the aggregated meta statistics. CORS is on for every route. No auth, no key, no signup.

Base URL

https://dev.palworldtcg.gg/api/v1

Every endpoint below is relative to this URL. All responses are JSON with a stable envelope: { data, meta } for lists, { data } for single items, { error, message } on failures.

Rate limits and caching

The card, set, price and deck routes have no per-key limit. Please be a good citizen: cache responses locally, use ETag/If-None-Match, and don't hammer the endpoints in a tight loop. Every route ships aggressiveCache-Control headers (5 minutes for cards, 1 hour for sets and prices, 1 minute for decks) so Vercel's edge cache absorbs most traffic before it reaches our origin.

/meta is the exception: it is capped per IP per day, because its snapshot only changes daily. See below.

If we start seeing abuse, we'll flip on IP-based limits without notice. Build defensively.

GET/api/v1/cards

List cards with filters and pagination.

ParamDefaultNotes
page11-indexed page number.
per_page50Max 100.
q-Free-text: matches name, pal_name, card_number, effect_text.
set-Set code (e.g. TD01, BP01).
color-Comma list, any-of match: Red,Blue.
type-Comma list: Pal,Gear,Structure,Event,Soul.
cost_min-Integer.
cost_max-Integer.
keyword-Ability keyword (Quick, Assault).
lucky-true / false.
include_parallelsfalseInclude TSP/TSR/SEC/SR/SP alternate art.
statusrevealedPass "any" to include prototype/announced/etc.

Example

https://dev.palworldtcg.gg/api/v1/cards?set=TD01&type=Pal&cost_min=1&cost_max=3
GET/api/v1/cards/{slug}

Single card. Includes usage_count (how many public decks reference it).

Example

https://dev.palworldtcg.gg/api/v1/cards/td01-001-grizzbolt-rumbling-tank
GET/api/v1/sets

List every announced set, ordered by release date.

ParamDefaultNotes
page11-indexed page number.
per_page50Max 100.

Example

https://dev.palworldtcg.gg/api/v1/sets
GET/api/v1/sets/{code}

Set metadata plus its full card list.

Example

https://dev.palworldtcg.gg/api/v1/sets/TD01
GET/api/v1/prices

Every tracked printing's price — the cheaper of TCGplayer and eBay, in cents. No pagination; one snapshot, rewritten daily.

Example

https://dev.palworldtcg.gg/api/v1/prices
GET/api/v1/decks

Community-shared decks. Only rows the author marked public.

ParamDefaultNotes
page11-indexed page number.
per_page25Max 100.
color-Comma list, any-of match: Red,Blue.
sortupdated"updated" or "new".

Example

https://dev.palworldtcg.gg/api/v1/decks?color=Red,Blue&sort=new
GET/api/v1/decks/{share_id}

Single deck including its full payload (main + soul entries).

Example

https://dev.palworldtcg.gg/api/v1/decks/a3f9e8d201
GET/api/v1/meta

The meta: every archetype's representative decklist and win rate, plus the matchup matrix, card performance, play order and composition. Rate limited; see below.

ParamDefaultNotes
scopeall"all", "ranked" or "casual". all = ranked + casual.
window30"7", "30" or "all" — trailing days; "all" is the weekly all-time snapshot.
archetype-An archetype key. Returns that one, with its card stats and matchups.

Example

https://dev.palworldtcg.gg/api/v1/meta?scope=ranked&window=30

About /meta

This is the same aggregated data the /meta pages render. Every archetype carries decklist — its representative 50-card main deck as { slug, count } entries, the medoid of that archetype's population — alongside win rates with confidence intervals, the head-to-head matrix, play order and composition bands.

Those decklists are centroids computed over thousands of games, not anybody's saved deck: there are no per-game rows, no players and nothing that can be joined back to a person. Player-shared decks are a separate thing, and they live at /decks.

Add ?archetype=<key> to drill into one. That adds the archetype's own card performance, its matchup row, and cards_seen: every card recorded across its decks, which is a wider pool than the representative list — a card played in most builds but absent from that one deck would otherwise be invisible.

It is rate limited to a small number of requests per IP per day, because the snapshot is only regenerated about once a day — one call gets you everything, and a second call the same day almost always returns identical bytes. Read generated_at to tell whether it actually moved, and cache the rest. Over the limit you get a 429 with X-RateLimit-Limit.

Unknown scope or window values are rejected with a 400 rather than quietly falling back to the default — asking for ranked numbers and silently receiving the whole population is the one mistake that would not announce itself.

Field reference

Card fields, in the order they appear in list responses: slug, set_code, card_number, name, pal_name, card_type, subtype, color, cost, power, strike, rarity, effect_text, keywords, work_keywords, is_lucky, image_url, thumbnail_url, status. The single-card endpoint adds japanese_name, durability, effect_text_ja, flavor_text, attack_name, orientation, art_url_full, revealed_at, source_url, usage_count.

Machine-readable and agents

For scripts, bots, and AI agents, the same API is described in machine-readable form:

This page and the homepage also support Markdown content negotiation: send Accept: text/markdown to get a Markdown view instead of HTML.

Terms

The API surfaces the same data that powers the site itself. You're free to use it in personal projects, community tools, Discord bots, and open-source stuff. If you build something cool, tell us so we can link it. Please don't:

  • Re-serve a copy of our card database as your own competing site.
  • Scrape the API to train a model without asking us first.
  • Attribute card art to yourself. All card art belongs to Bushiroad / Pocketpair.

See our terms of use for the full editorial stance.