# TCGplayer Data Scraper (`devcake/tcgplayer-data-scraper`) Actor

Scrape TCGPlayer prices in seconds. Get real-time market data, seller listings, No API key required. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/devcake/tcgplayer-data-scraper.md
- **Developed by:** [devcake](https://apify.com/devcake) (community)
- **Categories:** E-commerce, Other
- **Features:** Limited permissions
- **Stats:** 273 total users, 12 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🃏 TCGPlayer Scraper | Scrape Trading Card Prices & Data

**The TCGPlayer Scraper lets you scrape TCGPlayer for trading card prices, market data, and seller listings.** No API key required - perform TCGPlayer card search across store listings for Pokemon, Magic: The Gathering, Yu-Gi-Oh!, sports cards, and all TCG categories with real-time pricing, seller ratings, and optional sales history.

***

### 📋 What This Scraper Does

The TCGPlayer Scraper automatically searches and extracts comprehensive product data including:

- 💰 **Real-time market prices** - Current market value, median price, lowest price
- 🚚 **True total cost** - Lowest price including shipping for accurate cost comparison
- 🏪 **Complete seller data** - Ratings, verification status, gold seller badges, direct seller flags
- 🎴 **Card attributes** - Set info, rarity, card number, condition, printing type
- 📊 **Optional enrichment** - Actual sales history and price points by printing type (Normal/Foil)
- 📦 **Bulk export** - Scrape hundreds of products in a single run with concurrent processing

#### 🔧 Problem Solved

TCGPlayer data scraping has traditionally required an API key or expensive subscriptions. This scraper provides TCGPlayer data access without authentication - a cost-effective solution for:

- 📈 **Price tracking** - Monitor card values over time
- 💵 **Arbitrage research** - Find underpriced cards across sellers
- 📋 **Inventory management** - Pull current pricing for your listings
- 🔍 **Market analysis** - Build datasets for research or machine learning

***

### ⚡ Features

| Feature | Description |
|---------|-------------|
| 🔍 **TCGPlayer Search** | Search across all stores, categories, and card types |
| 🚀 **Concurrent Scraping** | 10x faster with parallel page processing |
| 🔐 **TLS Fingerprinting Bypass** | Uses curl_cffi Chrome impersonation for reliable access |
| 📝 **Multiple Search Queries** | Scrape different card categories simultaneously |
| 📄 **Full Pagination** | Up to 100 pages per query, 50 products per page |
| 🔄 **5 Sort Options** | Best Match, Best Selling, A-Z, Price High-Low, Price Low-High |
| 💵 **TCGPlayer Sales Data** | Get actual sales history, transaction prices, and price trends |
| 📥 **TCGPlayer Data Download** | Export results as JSON, CSV, Excel, or via REST API |
| ✨ **Clean Output** | Internal fields automatically removed |

***

### 🎛️ Input Parameters

| Parameter | Type | Default | Max | Description |
|-----------|------|---------|-----|-------------|
| `queries` | array | `["pokemon cards"]` | - | TCGPlayer card search queries. Search store listings for any card |
| `sortOption` | string | `"Best Match"` | - | Sort order (see options below) |
| `startPage` | integer | `1` | - | Starting page (1-based), applies per query |
| `pageCount` | integer | `3` | 100 | Pages to scrape **per query** (50 products/page) |
| `enrichData` | boolean | `false` | - | Fetch sales history & price points |

#### 🔀 Sort Options

- 🎯 `Best Match` - Default relevance ranking
- 🔥 `Best Selling` - Sort by popularity and sales volume
- 🔤 `A-Z` - Alphabetical by product name
- 💰 `Price: High to Low` - Highest prices first
- 💸 `Price: Low to High` - Lowest prices first

#### 📝 Example Input

```json
{
  "queries": ["charizard", "black lotus", "blue eyes white dragon"],
  "sortOption": "Price: Low to High",
  "startPage": 1,
  "pageCount": 2,
  "enrichData": false
}
```

**💡 Note:** With 3 queries × 2 pages × 50 products = **300 products total**

***

### 📤 Output Data Structure

#### 🎴 Core Product Fields

| Field | Type | Description |
|-------|------|-------------|
| `productId` | integer | Unique TCGPlayer product identifier |
| `productName` | string | Full product name |
| `productUrlName` | string | URL-safe product name slug |
| `url` | string | Direct link to product page |
| `imageUrl` | string | Product image URL (400x400) |
| `setName` | string | Card set name (e.g., "Base Set Unlimited") |
| `setCode` | string | Set abbreviation (e.g., "BASE") |
| `rarity` | string | Rarity code |
| `rarityName` | string | Full rarity name (e.g., "Rare Holo") |
| `number` | string | Card number in set |
| `condition` | string | Default condition |

#### 💰 Pricing Fields

| Field | Type | Description |
|-------|------|-------------|
| `marketPrice` | number | Current TCGPlayer market price |
| `medianPrice` | number | Median price across all listings |
| `lowestPrice` | number | Lowest listing price (before shipping) |
| `lowestPriceWithShipping` | number | **True lowest price including shipping** |
| `totalListings` | integer | Number of active seller listings |

#### 🏪 Seller Listing Details

Each product includes a `listings` array with:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | integer | Unique listing identifier |
| `sellerName` | string | Seller's store name |
| `sellerId` | integer | Seller's TCGPlayer ID |
| `sellerKey` | string | Seller's unique key |
| `sellerRating` | number | Seller rating score |
| `sellerSales` | integer | Total sales by seller |
| `sellerPrograms` | array | Seller program memberships |
| `verifiedSeller` | boolean | TCGPlayer verified status |
| `goldSeller` | boolean | Gold seller badge |
| `directSeller` | boolean | Direct from TCGPlayer |
| `condition` | string | Card condition (Mint, Near Mint, etc.) |
| `printing` | string | Printing type (Normal, Foil) |
| `language` | string | Card language (English, Japanese, etc.) |
| `price` | number | Listing price |
| `shippingPrice` | number | Shipping cost |
| `totalPrice` | number | Price + shipping combined |
| `quantity` | integer | Available quantity |

#### ⚡ Pokemon Card Attributes (when available)

| Field | Type | Description |
|-------|------|-------------|
| `customAttributes.cardType` | string | Card type (Pokemon, Trainer, Energy) |
| `customAttributes.energyType` | string | Energy type (Fire, Water, etc.) |
| `customAttributes.stage` | string | Evolution stage (Basic, Stage 1, Stage 2) |
| `customAttributes.hp` | string | Hit points |
| `customAttributes.retreatCost` | number | Retreat cost |
| `customAttributes.weakness` | string | Weakness type |
| `customAttributes.resistance` | string | Resistance type |
| `customAttributes.attack1` | object | First attack details |

#### 📊 Enrichment Data (when `enrichData: true`)

| Field | Type | Description |
|-------|------|-------------|
| `_enriched` | boolean | True if enrichment data was fetched |
| `_enrichment.sales.totalSales` | integer | Total number of recorded sales |
| `_enrichment.sales.lastSaleDate` | string | Date of most recent sale |
| `_enrichment.sales.avgPrice` | number | Average sale price |
| `_enrichment.sales.priceRange` | object | `{min, max}` sale prices |
| `_enrichment.sales.recentSales[]` | array | Last 10 sales with date, price, condition |
| `_enrichment.pricePoints.normal` | object | Normal printing prices |
| `_enrichment.pricePoints.foil` | object | Foil printing prices |

#### 🏷️ Metadata Tags

| Field | Type | Description |
|-------|------|-------------|
| `_query` | string | Search query that found this product |
| `_scrapedPage` | integer | Page number where product was found |
| `_sortOption` | string | Sort option used |
| `_scrapedAt` | string | ISO 8601 timestamp |
| `_scraperVersion` | string | Actor version |

***

### 📄 Example Output

```json
{
  "productId": 290158372,
  "productName": "Charizard - 4/102 - Base Set Unlimited",
  "productUrlName": "charizard-base-set-unlimited",
  "url": "https://www.tcgplayer.com/product/290158372/charizard-base-set-unlimited",
  "imageUrl": "https://product-images.tcgplayer.com/fit-in/400x400/290158372.jpg",
  "setName": "Base Set Unlimited",
  "setCode": "BASE",
  "rarity": "Rare Holo",
  "rarityName": "Rare Holo",
  "number": "4/102",
  "marketPrice": 450.00,
  "medianPrice": 425.00,
  "lowestPrice": 399.99,
  "lowestPriceWithShipping": 414.99,
  "totalListings": 15,
  "listings": [
    {
      "listingId": 12345678,
      "sellerName": "CardShopPro",
      "sellerId": 54321,
      "sellerKey": "cardshoppro",
      "sellerRating": 98.5,
      "sellerSales": 15000,
      "sellerPrograms": ["Verified", "Gold"],
      "verifiedSeller": true,
      "goldSeller": true,
      "directSeller": false,
      "condition": "Near Mint",
      "printing": "Normal",
      "language": "English",
      "price": 399.99,
      "shippingPrice": 15.00,
      "totalPrice": 414.99,
      "quantity": 1
    }
  ],
  "customAttributes": {
    "cardType": "Pokemon",
    "stage": "Stage 2",
    "hp": "120",
    "weakness": "Water",
    "resistance": "Fighting",
    "attack1": {"name": "Fire Spin", "damage": "100"}
  },
  "_query": "charizard",
  "_scrapedPage": 1,
  "_sortOption": "Price: Low to High",
  "_scrapedAt": "2026-02-13T12:00:00Z",
  "_scraperVersion": "3.0.0",
  "_enriched": false
}
```

#### 📊 Enriched Output Example (with `enrichData: true`)

```json
{
  "_enriched": true,
  "_enrichment": {
    "sales": {
      "totalSales": 234,
      "lastSaleDate": "2026-02-12T15:30:00Z",
      "avgPrice": 435.50,
      "priceRange": {"min": 380.00, "max": 520.00},
      "recentSales": [
        {"date": "2026-02-12T15:30:00Z", "price": 425.00, "condition": "Near Mint"}
      ]
    },
    "pricePoints": {
      "normal": {"marketPrice": 450.00, "listedMedian": 425.00},
      "foil": {"marketPrice": 1200.00, "listedMedian": 1100.00}
    }
  }
}
```

***

### 🎮 Supported Trading Card Categories

Works with all TCGPlayer categories:

- ⚡ **Pokemon** - Base set, Sword & Shield, Scarlet & Violet, all series
- 🧙 **Magic: The Gathering** - Standard, Modern, Commander, Legacy
- 🐉 **Yu-Gi-Oh!** - Main sets, special editions, reprint sets
- ⚾ **Sports Cards** - Baseball, Basketball, Football, Hockey
- 🎲 **Other TCGs** - Digimon, Dragon Ball Super, One Piece, Flesh and Blood, and more

***

### 🚀 Getting Started

#### ☁️ Run on Apify Cloud

1. Open the [TCGPlayer Scraper on Apify](https://apify.com/devcake/tcgplayer-data-scraper)
2. Click **Run** with default settings or configure input
3. Download your scraped data as JSON, CSV, Excel, or access via REST API

***

### 💡 Use Cases

| Use Case | Description |
|----------|-------------|
| 🔍 **Card Search** | Quickly find and compare cards across all TCGPlayer stores |
| 💰 **Card Collectors** | Find the best deals with true total cost (price + shipping) |
| 📈 **Price Tracking** | Monitor market trends and price history over time |
| 💵 **Arbitrage** | Identify price discrepancies between sellers |
| 📋 **Inventory Management** | Pull current pricing for your own listings |
| 🔍 **Market Research** | Analyze pricing patterns across sets and rarities |
| 📊 **Data Analysis** | Build datasets for ML models or business intelligence |

***

### 🔑 TCGPlayer API vs This Scraper

If you're searching for TCGPlayer API access, here's how this scraper compares to the official options:

| Feature | This Scraper | TCGPlayer Official API |
|---------|--------------|------------------------|
| 🔑 **API Key Required** | No | Yes (requires partnership) |
| 🌐 **Access Method** | Public search API | Authenticated REST API |
| 💵 **Sales History** | Yes (via `enrichData`) | Limited |
| 💰 **Price Data** | Real-time | Real-time |
| ⏱️ **Rate Limits** | Auto-managed | Based on tier |
| 💳 **Cost** | Pay per Apify run | Subscription required |
| 🎯 **Best For** | One-time scraping, research | Production apps, high volume |

#### ✅ When to Use This Scraper

- You need bulk price data without an API key
- You're doing market research or price tracking
- You want sales history and price point data
- You need to scrape multiple queries quickly

#### 🏢 When to Use Official TCGPlayer API

- You're building a production application
- You need authenticated, guaranteed access
- You require SLA guarantees
- You're doing high-volume commercial operations

> **💡 Note:** This scraper does NOT require or use any TCGPlayer API key. It accesses publicly available data.

***

### ❓ Frequently Asked Questions

#### 🔑 Do I need a TCGPlayer API key?

**No.** This scraper accesses TCGPlayer's public search API directly. No API key, authentication, or TCGPlayer account is required.

#### 💵 Can I get sales history data?

**Yes.** Set `enrichData: true` in your input to fetch actual sales transactions including sale dates, prices, and conditions. This adds 2 extra API calls per product.

#### 💰 What's the difference between `marketPrice` and `lowestPrice`?

- `marketPrice` - TCGPlayer's calculated market value based on recent sales
- `lowestPrice` - The cheapest current listing (before shipping)
- `lowestPriceWithShipping` - The cheapest listing including shipping cost

#### 📊 How many products can I scrape?

- Up to **50 products per page** (TCGPlayer API limit)
- Up to **100 pages per query** (configurable)
- With 3 queries × 100 pages × 50 products = **15,000 products max**

#### 📱 Does this work with TCGPlayer's app collection?

No. This scraper searches TCGPlayer's product database. It does not access personal collections from the TCGPlayer app.

#### 🔄 Is this the same as TCGPlayer's official API?

No. This is an independent scraper that accesses TCGPlayer's public search endpoints. For official API access with authentication and SLA guarantees, contact TCGPlayer directly.

***

# Actor input Schema

## `queries` (type: `array`):

List of search queries to scrape. Pagination settings (startPage, pageCount) apply to EACH query.

## `sortOption` (type: `string`):

How to sort the results

## `startPage` (type: `integer`):

Page number to start scraping from (1-based). Applied to each query independently.

## `pageCount` (type: `integer`):

Pages to scrape PER QUERY. Each page contains 50 products. E.g., 3 queries x 2 pages = 300 products total.

## `enrichData` (type: `boolean`):

Fetch additional product details (actual sales, price points). Makes 2 extra API calls per product.

## Actor input object example

```json
{
  "queries": [
    "pokemon cards"
  ],
  "sortOption": "Best Match",
  "startPage": 1,
  "pageCount": 3,
  "enrichData": true
}
```

# Actor output Schema

## `products` (type: `string`):

All scraped trading card products with prices and listings

## `overview` (type: `string`):

Quick overview of scraped products with key fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "pokemon cards"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devcake/tcgplayer-data-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": ["pokemon cards"] }

# Run the Actor and wait for it to finish
run = client.actor("devcake/tcgplayer-data-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "pokemon cards"
  ]
}' |
apify call devcake/tcgplayer-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devcake/tcgplayer-data-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LqXsN8Iz7a9RNz50T/builds/57spxpUKNBiB4s7VF/openapi.json
