Skip to content
pokemontcgapi.com
Documentation

Price history

A time series for one card: one point per day, week or month, per source and variant.

GET/v1/cards/{id}/prices/history5 creditsfree plan

Cache-Control: private, max-age=300

Objects returned

No key yet? One call gets you one: POST /v1/accounts/free with an Idempotency-Key header and your email address returns a working key in the response. Keep the original Idempotency-Key and body for response replay for up to 24 hours, under the conditions in the quickstart. The trial is 800 credits over 30 days once the address is confirmed, no card; paid plans start at 29 € a month. See the quickstart and the pricing.

Days with no observation are omitted, not interpolated: a straight line through a gap would be a claim we did not observe. Observations begin on 2026-07-28, the day the current ingest started, so a from before that returns the same series as from=2026-07-28.

The window is the plan’s: 7 days on the trial, 90 on Developer, the whole history on Growth and Professional. meta.plan_window_days reports the limit that applied (null when none did) and meta.truncated says whether from was moved. A series longer than the point cap is cut and flagged in meta.capped — pick a coarser bucket rather than paging.

Path parameters

Path parameters
NameTypeDefaultDescription
id requiredstring—Card id or alternate id.

Query parameters

Query parameters
NameTypeDefaultDescription
sourcestring—One source code, e.g. CARDMARKET, CARDTRADER, TCGPLAYER or PTCG_INDEX. A chart that mixes sources means nothing, so filter to one.
variantstring—One variant, e.g. MARKET, for the same reason.
localestring—Restrict to one printing language.
printingstring—Restrict to one printing: HOLOFOIL, REVERSE_HOLO, …
fromdate—YYYY-MM-DD, inclusive. Defaults to the start of the plan’s window.
todate—YYYY-MM-DD, inclusive. Defaults to today.
bucketstringdayday, week or month. Coarser buckets keep a long window under the point cap.

Headers

Headers
NameTypeDefaultDescription
X-Api-Key requiredstring—Your API key. Authorization: Bearer <key> is accepted as an alias.
If-None-Matchstring—Send back the ETag you stored. The API returns a strong ETag on every catalogue response, and a 304 is a header exchange: no body, no database row read.

Example request

curl -s -G "https://api.pokemontcgapi.com/v1/cards/base1-4/prices/history" \
  --data-urlencode "source=TCGPLAYER" \
  --data-urlencode "variant=MARKET" \
  --data-urlencode "bucket=week" \
  -H "X-Api-Key: $PTCG_API_KEY"

Example response

200 OK · Cache-Control: private, max-age=300

response.json
{
  "data": [
    {
      "date": "2026-07-27",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": "HOLOFOIL",
      "amount": 800.43,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-07-27",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 800.43,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-08-03",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 818.65,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-08-10",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 825.38,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-08-17",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 855.52,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-08-24",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 855.52,
      "currency": "USD",
      "sample_n": 0
    },
    {
      "date": "2026-08-31",
      "source": "TCGPLAYER",
      "variant": "MARKET",
      "locale": "en",
      "printing": null,
      "amount": 868.56,
      "currency": "USD",
      "sample_n": 0
    }
  ],
  "meta": {
    "card_id": "base1-4",
    "from": "2026-06-04",
    "to": "2026-09-02",
    "bucket": "week",
    "count": 7,
    "truncated": false,
    "capped": false,
    "plan_window_days": null
  }
}

Errors

Every error body carries error.code, error.message and error.request_id. Switch on the code, never on the message.

Errors returned by this endpoint
StatusCodeWhen
401MISSING_API_KEYNo X-Api-Key header and no bearer token on a route that requires one.
401INVALID_API_KEYThe key does not match any account.
400INVALID_PARAMETERA query parameter has the wrong type or an unsupported value — a non-integer limit, an unknown lang, an unknown region, a sort key that is not sortable.
403UPGRADE_REQUIREDA parameter asks for more than the plan allows: a window longer than the plan’s history, for example. details.plan_window_days says how much the plan gives; details.next_step carries the owner action and handoff.
429QUOTA_EXCEEDEDTrial credits, monthly credits or the daily cap are exhausted, and details says which: daily_cap with retry_after_s is the trial daily cap, which resets at midnight UTC; renews: true with resets_at is the monthly quota of a paid plan; renews: false is the trial allowance, which never comes back. details.next_step carries the plan, prices and owner action, or email verification when it unlocks the full trial.
403PLAN_REQUIREDThe feature is outside the plan (movers require Growth; photo recognition has 5 calls after Free email confirmation, then requires Growth), or the account subscription is canceled or suspended. Centering requires Growth or higher; Developer is excluded. After email confirmation the trial includes 5 measure and 5 confirm calls independently; grade and standards use trial credits without separate call counters. Before email confirmation, the message starts with “Confirm your email…”. Follow details.next_step when present.
403TRIAL_EXPIREDThe trial has ended: the account is on the trial and its 30 days from signup are over, and this route costs credits. details.trial_expired_at is the date, details.trial_days the length, and details.next_step the owner handoff. Zero-cost routes — /v1/me, /v1/me/usage, the key routes and /v1/billing/checkout — still answer.

The full taxonomy, with what to do about each code, is on the errors page.

view this page as markdown