TCGplayer
TCGplayer market price, listing count and lowest listing, with set, rarity and card number, by product id, about 1.3 million products per credit. Search too.
TCGplayer market price, listing count and lowest listing, with set, rarity and card number, by product id, about 1.3 million products per credit. Search too.
At a glance
Property | Value |
|---|---|
|
|
Product id | The number in a TCGplayer product link, |
Marketplaces | Live: |
Tier |
|
Ids per call | 500 |
Typical call | 5–15 s for 500 ids |
Search |
|
Market price is not a listing price
price is TCGplayer's market price: a figure TCGplayer works out from recent sales, one per product, shown to the cent (TCGplayer itself carries more decimals). It is not tied to a condition, and it is null when TCGplayer has none (thin products), never 0. For products sold in more than one printing it is still one figure: in our checks it matched the Normal printing where Normal has a price, and the Foil printing on foil-only products, but that is inferred from a few products, not something TCGplayer states. Treat it as a product-level figure. tcgplayer.lowestListing is the cheapest listing in any condition and printing, so it can be a damaged copy.
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "tcgplayer",
"ids": [
"662182",
"https://www.tcgplayer.com/product/684332/pokemon-me03-perfect-order-poke-pad-081-088"
]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={
"platform": "tcgplayer",
"ids": [
"662182",
"https://www.tcgplayer.com/product/684332/pokemon-me03-perfect-order-poke-pad-081-088",
],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), p["tcgplayer"]["listingCount"])const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'tcgplayer',
ids: [
'662182',
'https://www.tcgplayer.com/product/684332/pokemon-me03-perfect-order-poke-pad-081-088',
],
}),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.tcgplayer?.listingCount);Full reference → POST /v1/products
TCGplayer fields
Besides the common fields, each result carries a tcgplayer object. There is no rating or review count: TCGplayer is a marketplace and shows none. availability.inStock is true when at least one listing exists; it is not a stock count.
Field | Description |
|---|---|
| TCGplayer's market price (see above); |
| Listings for sale on TCGplayer now, across sellers, conditions and printings. |
| The cheapest listing in any condition and printing. It can be a damaged copy and is not the market price. |
| The cheapest listing counting its shipping, in any condition and printing. |
| The game, the set and its code, and the rarity ( |
| The number printed on the card ( |
| True when the product exists only as a foil printing. |
| The game's own attributes (hp, color, power…), short text only. Which ones are present depends on the game; most sealed products have none. |
Not offered: prices per printing or per condition, recent sales, and individual listings and sellers. Sealed products are not flagged, because TCGplayer does not mark them reliably.
Statuses on TCGplayer
partial: TCGplayer answered without a title. Ask again later.not_found: TCGplayer has no such product id.unavailable: no usable answer after retries. Not charged; ask again.