# Card Ladder Graded Card Price Index Scraper (`jungle_synthesizer/cardladder-graded-card-price-index-scraper`) Actor

Pull trending graded sports and TCG card prices, population counts, and monthly price movement from Card Ladder's public price guide — covering Basketball, Baseball, Football, Hockey, Soccer, Pokemon, One Piece, Marvel, Wrestling, UFC, and multi-sport cards.

- **URL**: https://apify.com/jungle\_synthesizer/cardladder-graded-card-price-index-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Sports, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 record scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Card Ladder Graded Card Price Index Scraper

Scrape trending graded-card prices from [Card Ladder](https://www.cardladder.com/) — the card-investing
industry's leading price index for sports and trading-card game collectibles.

### What it does

Pulls Card Ladder's public "Ladder" price guide — the current top-trending cards per category — with real
last-sale prices, Card Ladder's own current index value, population counts, and 30-day price movement.
Covers all 11 categories Card Ladder tracks: Basketball, Baseball, Football, Hockey, Soccer, Pokemon, One
Piece, Marvel, Wrestling, UFC, and Multi-Sport.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `categories` | array | Which category ladders to scrape. Leave empty to scrape all 11 categories. |
| `maxItems` | integer | Maximum number of card records to scrape across the selected categories. |
| `resumeCursor` | string | Cursor from a previous run's Output. Supply it to continue a large crawl without re-fetching — you are not re-charged for records already received. |

**Valid category values:**
`Basketball`, `Baseball`, `Football`, `Hockey`, `Soccer`, `Pokemon`, `OnePiece`, `Marvel`, `Wrestling`, `UFC`, `MultiSport`

### Output

Each record represents one card at a specific grade:

```json
{
  "card_name": "2016 Pokemon Japanese XY-P Promos Poncho-Wearing Pikachu #230/XY-P",
  "grade": "PSA 10",
  "card_url": "https://www.cardladder.com/ladder/card/2016-pokemon-japanese-xy-p-promos-poncho-wearing-pikachu-full-art-230-xy-p-psa-10",
  "last_sale_usd": 18600,
  "pct_change_30d": 14.46,
  "population": 2292,
  "index_value": 14640,
  "sales_volume": 15
}
```

- `card_name` — full card identity: year, set, player/character, and card number.
- `grade` — the grading company + grade for this specific listing (e.g. `PSA 10`, `BGS 9.5`), or `Raw` for
  ungraded cards.
- `last_sale_usd` — the most recent recorded public sale price for this card/grade.
- `index_value` — Card Ladder's own current price index value for this card/grade. This can differ from
  `last_sale_usd` — it reflects Card Ladder's smoothed valuation rather than a single data point.
- `pct_change_30d` — percent price change over the trailing 30 days.
- `sales_volume` — number of recorded public sales within Card Ladder's free 3-month sales window.
- `population` — grading-company population count for this card/grade. `null` for ungraded (`Raw`) cards,
  which have no population count to report.

Card Ladder's 6-month / 1-year / 2-year / all-time price-change figures are gated to paid subscribers and are
not available to this actor — only the 30-day change is included.

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a run stops before finishing — because it hit `maxItems`,
a spend cap, or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue
from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly the 10 most recent runs.
- `resumeCursor` is opaque — supply it unmodified.

### Example inputs

**Scrape all categories (default):**

```json
{
  "maxItems": 100
}
```

**Scrape only Pokemon and Basketball trending cards:**

```json
{
  "categories": ["Pokemon", "Basketball"],
  "maxItems": 50
}
```

**Resume a previous run:**

```json
{
  "categories": ["Pokemon", "Basketball"],
  "maxItems": 50,
  "resumeCursor": "<paste the resumeCursor from the previous run's Output>"
}
```

### Notes

- Card Ladder's per-category ladder page surfaces a curated top-trending list (around 20 cards per category
  per run) rather than its full catalog — there is no publicly reachable pagination beyond that list.
- `population` is `null` for ungraded (`Raw`) card rows — Card Ladder does not report a population count for
  raw cards.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `categories` (type: `array`):

Which Card Ladder category ladders to scrape. Leave empty to scrape all categories.

## `maxItems` (type: `integer`):

Maximum number of card records to scrape across the selected categories.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "categories": [
    "Basketball",
    "Baseball",
    "Football",
    "Hockey",
    "Soccer",
    "Pokemon",
    "OnePiece",
    "Marvel",
    "Wrestling",
    "UFC",
    "MultiSport"
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "categories": [
        "Basketball",
        "Baseball",
        "Football",
        "Hockey",
        "Soccer",
        "Pokemon",
        "OnePiece",
        "Marvel",
        "Wrestling",
        "UFC",
        "MultiSport"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/cardladder-graded-card-price-index-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "categories": [
        "Basketball",
        "Baseball",
        "Football",
        "Hockey",
        "Soccer",
        "Pokemon",
        "OnePiece",
        "Marvel",
        "Wrestling",
        "UFC",
        "MultiSport",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/cardladder-graded-card-price-index-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "categories": [
    "Basketball",
    "Baseball",
    "Football",
    "Hockey",
    "Soccer",
    "Pokemon",
    "OnePiece",
    "Marvel",
    "Wrestling",
    "UFC",
    "MultiSport"
  ],
  "maxItems": 10
}' |
apify call jungle_synthesizer/cardladder-graded-card-price-index-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/cardladder-graded-card-price-index-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/r27qEaRZlTriVMNr3/builds/XCYodFXRhhjSCxQwh/openapi.json
