Get price history
One quote over time: a marketplace series, or a graded slot.
Points are dense. Prices are stored when they move, and every day carries the last reading forward, including one from before from, so a flat run is a price that did not change, not missing data. A card first priced inside the range starts on that day, so count can be lower than the days asked for; a card never priced on the series returns no points.
Amounts are in major units of the source's currency: market and low on a marketplace series, price on a graded one.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| cardIdrequired | string | A card id. An id retired by a set re-key keeps working and is reported in meta.movedFrom. |
Query parameters
Any other query parameter is a 400 naming it and listing these, so a misspelt one is never silently ignored. api_key is accepted on every endpoint as an alternative to the header.
| Parameter | Type | Description |
|---|---|---|
| source | string | The marketplace. Case-insensitive. One of: Default: |
| finish | string | Which printing's series. Without it: the finish of the card's current retail quote on source, else the finish with the most history, else normal. meta.finishes lists every series the source holds for the card.One of: Default: the finish the card is quoted in now |
| interval | string | Point spacing. Weeks run Monday to Sunday and months are calendar months, UTC. A WEEK or MONTH point is the bucket's last day inside the range, with the price held on that day: a price that was really quoted, not an average. Case-insensitive.One of: Default: |
| from | string | First day, YYYY-MM-DD, inclusive.Default: |
| to | string | Last day, YYYY-MM-DD, inclusive. At most 1,826 days after from.Default: today, UTC |
| grader | string | With grade, the graded slot's series instead of a marketplace's; source and finish are then ignored.One of: |
| grade | string | The other half of the slot. One of: |
Response
200 The series. Marketplace and graded series differ in shape.
| Field | Type | Description |
|---|---|---|
| data | object | The series. |
| data.cardId | string | The card's current id. |
| data.source | string | Marketplace series: the source. One of: Absent unless it applies. |
| data.finish | string | Marketplace series: the finish used. One of: Absent unless it applies. |
| data.grader | string | Graded series: the grader. One of: Absent unless it applies. |
| data.grade | string | Graded series: the grade. One of: Absent unless it applies. |
| data.interval | string | The spacing used. One of: |
| data.points | object[] | Oldest first. |
| data.points[].day | string | YYYY-MM-DD: the day, or the last day of the week or month inside the range. |
| data.points[].market | number | null | Marketplace series: the headline price that day. Absent unless it applies. |
| data.points[].low | number | null | Marketplace series: the low that day. Absent unless it applies. |
| data.points[].price | number | Graded series: the slot's price that day. Absent unless it applies. |
| data.points[].currency | string | The currency. One of: |
| meta | object | The range and what else exists. |
| meta.from | string | The first day used. |
| meta.to | string | The last day used. |
| meta.count | integer | Points returned. |
| meta.finishes | string[] | Marketplace series: every finish the source has history for, most history first. Absent unless it applies. |
| meta.note | string | How to read the points. |
| meta.pricesFrom | string | Present when the card is a localized printing served its English printing's prices. One of: Absent unless it applies. |
| meta.englishId | string | The English printing the prices are from. Present with pricesFrom.Absent unless it applies. |
| meta.movedFrom | string | The id you asked for, when it was retired by a set re-key. Absent unless it applies. |
Examples
Real responses from the production API, recorded on 2026-09-24 by the script that also checks every field above against them. Arrays are shown in full.
Weekly, first half of 2026
curl "https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?from=2026-01-01&to=2026-03-31&interval=week" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?from=2026-01-01&to=2026-03-31&interval=week", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history",
params={
"from": "2026-01-01",
"to": "2026-03-31",
"interval": "week",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": {
"cardId": "pkm_sv3pt5_6",
"source": "cardmarket",
"finish": "foil",
"interval": "WEEK",
"points": []
},
"meta": {
"from": "2026-01-01",
"to": "2026-03-31",
"count": 0,
"finishes": [
"foil",
"normal"
],
"note": "Points are dense: a price is held forward until it next moves."
}
}A holo-only card: the default finish follows the quote
No finish was sent; the series is foil because that is what the card is quoted in.
curl "https://api.tcggraph.com/v1/prices/pkm_swshp_SWSH262/history?source=tcgplayer&interval=month&from=2026-01-01&to=2026-06-30" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/prices/pkm_swshp_SWSH262/history?source=tcgplayer&interval=month&from=2026-01-01&to=2026-06-30", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/prices/pkm_swshp_SWSH262/history",
params={
"source": "tcgplayer",
"interval": "month",
"from": "2026-01-01",
"to": "2026-06-30",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": {
"cardId": "pkm_swshp_SWSH262",
"source": "tcgplayer",
"finish": "foil",
"interval": "MONTH",
"points": [
{
"day": "2026-01-31",
"market": 59.82,
"low": 46.98,
"currency": "USD"
},
{
"day": "2026-02-28",
"market": 53.51,
"low": 49.09,
"currency": "USD"
},
{
"day": "2026-03-31",
"market": 72.6,
"low": 62.47,
"currency": "USD"
},
{
"day": "2026-04-30",
"market": 84.27,
"low": 66.55,
"currency": "USD"
},
{
"day": "2026-05-31",
"market": 90.29,
"low": 75,
"currency": "USD"
},
{
"day": "2026-06-30",
"market": 84.33,
"low": 70,
"currency": "USD"
}
]
},
"meta": {
"from": "2026-01-01",
"to": "2026-06-30",
"count": 6,
"finishes": [
"foil"
],
"note": "Points are dense: a price is held forward until it next moves."
}
}PSA 10, monthly
curl "https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?grader=psa&grade=10&interval=month&from=2026-01-01&to=2026-06-30" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?grader=psa&grade=10&interval=month&from=2026-01-01&to=2026-06-30", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history",
params={
"grader": "psa",
"grade": "10",
"interval": "month",
"from": "2026-01-01",
"to": "2026-06-30",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"data": {
"cardId": "pkm_sv3pt5_6",
"grader": "psa",
"grade": "10",
"interval": "MONTH",
"points": []
},
"meta": {
"from": "2026-01-01",
"to": "2026-06-30",
"count": 0,
"note": "Points are dense: a price is held forward until it next moves."
}
}Errors
Every error has the same body; switch on error.code. Any endpoint can also answer 401, 402, 403 or 429 for reasons of key, plan or rate; those are on Errors.
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | A date that is not YYYY-MM-DD, from after to, or a range over 1,826 days. |
| 400 | invalid_request | A finish, interval, source, grader or grade outside its list, or a parameter this endpoint does not take. |
| 404 | not_found | No card has that id. |
Range too long
curl "https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?from=2015-01-01&to=2026-01-01" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?from=2015-01-01&to=2026-01-01", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history",
params={
"from": "2015-01-01",
"to": "2026-01-01",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "That range covers 4018 days; the maximum is 1826.",
"details": {
"field": "from",
"maxDays": 1826
}
}
}Unknown finish
curl "https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?finish=holo" \
-H "Authorization: Bearer $TCGGRAPH_API_KEY"const response = await fetch("https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history?finish=holo", {
headers: {
Authorization: `Bearer ${process.env.TCGGRAPH_API_KEY}`,
},
});
const body = await response.json();
if (!response.ok) throw new Error(`${body.error.code}: ${body.error.message}`);import os
import requests
response = requests.get(
"https://api.tcggraph.com/v1/prices/pkm_sv3pt5_6/history",
params={
"finish": "holo",
},
headers={"Authorization": f"Bearer {os.environ['TCGGRAPH_API_KEY']}"},
)
body = response.json()
response.raise_for_status(){
"error": {
"code": "invalid_request",
"message": "Unknown finish \"holo\".",
"details": {
"field": "finish",
"allowed": [
"normal",
"foil",
"etched",
"reverse-holo",
"cosmos-holo",
"pokeball",
"masterball",
"energy-symbol",
"duskball",
"loveball",
"staff",
"prerelease",
"league",
"1st-edition",
"1st-edition-foil",
"shadowless",
"limited"
]
}
}
}