# TCGplayer, Pokemon & MTG Market Price & Arbitrage API (`enigmalabs/tcgplayer-pokemon-mtg-price-scraper`) Actor

Extracts live TCGplayer USD market prices, lowest listings, foil premiums, and US vs EU Cardmarket arbitrage spreads across Pokemon, Magic: The Gathering, One Piece, and Yu-Gi-Oh.

- **URL**: https://apify.com/enigmalabs/tcgplayer-pokemon-mtg-price-scraper.md
- **Developed by:** [Enigma Labs](https://apify.com/enigmalabs) (community)
- **Categories:** E-commerce, AI, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.50 / 1,000 collectible card price & arbitrage records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Extract live **TCGplayer USD Market Prices**, **Lowest Active Listings**, **Foil Premiums**, and **US vs EU (`Cardmarket` EUR -> USD) Cross-Market Arbitrage Spreads** across **Pokemon TCG, Magic: The Gathering, One Piece, Yu-Gi-Oh!, and Sealed Collectibles**. Built by **Enigma Labs** for local game stores (LGS), collectibles dealers, portfolio trackers, Whatnot/eBay sellers, and **AI Agents (`mcp.apify.com`)**.

### What does TCGplayer, Pokemon & MTG Market Price & Arbitrage API do?

Collectible card prices frequently diverge by `15%–50%+` between US marketplace listings (**TCGplayer Market vs Lowest Listing**) and European market trends (**Cardmarket EUR**). Existing scrapers rely on brittle headless browsers or fail when checking cross-Atlantic spreads.

This Actor unifies **three high-speed JSON pricing engines** in one resilient cloud feed:

| Engine | Coverage & Extracted Signals |
| :--- | :--- |
| **TCGplayer Marketplace Search** | Live US `marketPrice`, `lowestPriceWithShipping`, `totalListings`, `setName`, and `rarityName` across Pokemon, MTG, Yu-Gi-Oh!, One Piece, Lorcana, and sealed boxes. |
| **Pokemon TCG Arbitrage Feed** | Card-level `TCGplayer USD` market/low benchmarks paired directly against European `Cardmarket EUR` trend prices converted into USD (`cardmarket_usd_equiv`). |
| **Magic: The Gathering Arbitrage Feed** | Live `USD`, `USD Foil`, and `EUR` pricing with automatic cross-market percentage spread calculation (`arb_spread_pct`). |

### Why use this Actor? (Top Use Cases)

- **US <-> EU Card Arbitrage & Grading Flips**: Automatically flag singles where `TCGplayer Market USD` trades significantly above `Lowest Active Listing` or European `Cardmarket USD Equivalent` (`arb_spread_pct`).
- **Local Game Store (LGS) & Buylist Automation**: Reprice binder inventory, Shopify/eBay listings, and trade-in buylists in bulk via scheduled API runs.
- **Whatnot, Drip & Live Break Streamers**: Pull instant real-time market comps for chase cards and booster boxes before going live.
- **AI Agents & Collector Copilots (`MCP`)**: Let Claude, ChatGPT, or Discord bots answer *"What is the current TCGplayer market price vs EU Cardmarket price for Charizard ex and Sheoldred?"* in seconds.

### How much does it cost?

This Actor uses ultra-low **Pay-Per-Event (PPE)** pricing (`$0.0025` per card price record, or **$2.50 per 1,000 cards**):

- **Binder Check (100 cards)**: `$0.25`
- **Full Store Inventory Sync (1,000 cards)**: `$2.50`
- **Apify Free Plan (`$5/month` free credit)**: Price-check up to **2,000 cards every month** completely free.
- **Zero Charge on Empty Searches**: Unmatched queries return a clean diagnostic row with **$0 event charge**.

### Input parameters

- **`search_queries`** *(array of strings, default: `["Charizard", "Sheoldred"]`)*: Card names, set names, or sealed products to look up (e.g. `"Umbreon VMAX"`, `"Black Lotus"`, `"Booster Box"`).
- **`game_filter`** *(select, default: `"all"`)*: Choose `"all"`, `"pokemon"`, `"mtg"`, or `"tcgplayer_marketplace"`.
- **`max_items_per_query`** *(integer, default: `10`)*: Maximum matched cards returned per search query (`1` to `100`).
- **`eur_to_usd_rate`** *(number, default: `1.08`)*: EUR-to-USD exchange rate used to compute US vs EU Cardmarket arbitrage spreads.
- **`proxyConfiguration`** *(object, optional)*: Disabled by default (`$0` proxy cost); optional Apify Proxy available for massive catalog crawls.

#### Example Input JSON

```json
{
  "search_queries": ["Charizard", "Sheoldred"],
  "game_filter": "all",
  "max_items_per_query": 6,
  "eur_to_usd_rate": 1.08,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Output example

Every run outputs structured, sorted pricing rows (highest `arb_spread_pct` first) ready for **Excel, CSV, Google Sheets, JSON, or Webhook** consumption:

```json
[
  {
    "game": "Pokemon TCG",
    "card_name": "Charizard #1",
    "set_name": "Arceus",
    "rarity": "Holo Rare",
    "tcgplayer_market_usd": 113.45,
    "lowest_price_usd": 82.99,
    "cardmarket_usd_equiv": 53.45,
    "arb_spread_pct": 52.89,
    "source_feed": "pokemon_tcg_arbitrage",
    "url": "https://www.tcgplayer.com/search/pokemon/product?q=Charizard",
    "scraped_at": "2026-11-15T01:00:00Z"
  },
  {
    "game": "Magic: The Gathering",
    "card_name": "Sheoldred, the Apocalypse",
    "set_name": "Dominaria United",
    "rarity": "Mythic",
    "tcgplayer_market_usd": 74.85,
    "lowest_price_usd": 89.5,
    "cardmarket_usd_equiv": 69.2,
    "arb_spread_pct": 7.55,
    "source_feed": "mtg_tcgplayer_cardmarket",
    "url": "https://www.tcgplayer.com/product/282729",
    "scraped_at": "2026-11-15T01:00:00Z"
  }
]
```

### Integrations: AI Agents (MCP) & Python SDK

Ready for zero-setup AI tool calling on **`https://mcp.apify.com`** (`LIMITED_PERMISSIONS`) and programmatic Python/Node workflows:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")
run = client.actor("enigmalabs/tcgplayer-pokemon-mtg-price-scraper").call(
    run_input={"search_queries": ["Charizard", "Pikachu", "Sheoldred"], "game_filter": "all"}
)
for card in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(card["game"], card["card_name"], f"${card['tcgplayer_market_usd']}", f"Spread: {card['arb_spread_pct']}%")
```

### Frequently Asked Questions (FAQ) & Disclaimer

- **How is `arb_spread_pct` calculated?**
  It measures the percentage spread between `tcgplayer_market_usd` and the secondary benchmark (`cardmarket_usd_equiv` when EU data is available, or `lowest_price_usd` on US marketplace listings) so underpriced deals float to the top.
- **Can I query One Piece, Lorcana, or Yu-Gi-Oh cards?**
  Yes—set `game_filter` to `"all"` or `"tcgplayer_marketplace"` and enter any card or sealed product name.

*Legal Notice: Independent collectibles market intelligence tool built by Enigma Labs. Not affiliated with, endorsed by, or sponsored by TCGplayer Inc. (eBay), Wizards of the Coast, Nintendo, Creatures Inc., GAME FREAK Inc., or Cardmarket.*

# Actor input Schema

## `search_queries` (type: `array`):

Card names, sets, or sealed booster products to price-check (e.g. 'Charizard ex', 'Sheoldred', 'Umbreon VMAX', 'Booster Box').

## `game_filter` (type: `string`):

Choose 'all' to query TCGplayer Marketplace + Pokemon + MTG cross-market arbitrage feeds, or focus on one game.

## `max_items_per_query` (type: `integer`):

Maximum number of matched cards/products returned per search query.

## `eur_to_usd_rate` (type: `number`):

Exchange rate used to convert European Cardmarket EUR prices into USD for cross-market spread calculation.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy configuration for large-scale TCGplayer listing sweeps.

## Actor input object example

```json
{
  "search_queries": [
    "Pikachu",
    "Black Lotus",
    "Luffy"
  ],
  "game_filter": "all",
  "max_items_per_query": 6,
  "eur_to_usd_rate": 1.08,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Normalized TCGplayer USD market/low/foil prices, EU Cardmarket USD equivalents, and cross-market arbitrage percentages.

# 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 = {
    "search_queries": [
        "Charizard",
        "Sheoldred"
    ],
    "game_filter": "all",
    "max_items_per_query": 6,
    "eur_to_usd_rate": 1.08,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("enigmalabs/tcgplayer-pokemon-mtg-price-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 = {
    "search_queries": [
        "Charizard",
        "Sheoldred",
    ],
    "game_filter": "all",
    "max_items_per_query": 6,
    "eur_to_usd_rate": 1.08,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("enigmalabs/tcgplayer-pokemon-mtg-price-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 '{
  "search_queries": [
    "Charizard",
    "Sheoldred"
  ],
  "game_filter": "all",
  "max_items_per_query": 6,
  "eur_to_usd_rate": 1.08,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call enigmalabs/tcgplayer-pokemon-mtg-price-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,enigmalabs/tcgplayer-pokemon-mtg-price-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/x4qgcCM0mTVx13Yjc/builds/dEH1O1Yz2wUv262s7/openapi.json
