# Market Movers (Sports Card Investor) Scraper (`rl1987/marketmovers-api-scraper`) Actor

Scrape public Sports Card Investor / Market Movers data via the app's anonymous tRPC API — card catalogue + market-price stats, keyword search, completed sales (comps), live marketplace listings, deals, daily price stats, market indices, and reference lists. Read-only, no account.

- **URL**: https://apify.com/rl1987/marketmovers-api-scraper.md
- **Developed by:** [R.L.](https://apify.com/rl1987) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 dataset rows

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Market Movers Scraper 🏀🃏 — sports-card catalogue, market prices, sales comps & live listings

Reads **Sports Card Investor / Market Movers**' own mobile API directly (the app's anonymous tRPC
backend), so it's fast and complete — no HTML scraping, no login. Read-only public data. Export to
**JSON, CSV, Excel, or an API**.

#### Modes

- **`search`** (default) — search the card/item catalogue by keyword and filters. Every result carries
  the card's attributes (player, set, sport, grade, variation, rookie, image) **plus market-price
  stats** across `last7 / last30 / last90 / last365 / all` windows (avg/min/max, sales count, change).
- **`completedSales`** — completed **sales comps** for one or more collectible ids (final price, date,
  platform, seller, bids, sale URL).
- **`activeSales`** — **live marketplace listings** (eBay, Goldin, MySlabs, …) for collectible ids
  (buy-it-now/auction price, marketplace, end time).
- **`dailyStats`** — per-collectible **daily price stats** for collectible ids.
- **`deals`** — the app's "great deal" listings feed.
- **`marketIndices`** — curated market indices (SCI 500, …); set `indexId` (+ `startDateISO`) to also
  pull that index's stats series.
- **`reference`** — lookup lists: sports, grades, sale platforms, and platform-wide totals.

```jsonc
// search LeBron cards (with market-price stats)
{ "mode": "search", "query": "lebron james", "sportIds": ["2"], "maxItems": 50 }
// -> { "type":"collectible", "title":"2003 Upper Deck Hardcourt LeBron James Floor", "player":"LeBron James",
//      "sport":"Basketball", "grade":"Raw", "price_all_avg":45.04, "price_last30_avg":68.5, "collectible_id":2823287 }

// completed-sale comps for a collectible
{ "mode": "completedSales", "collectibleIds": ["2823287"] }
// -> { "type":"completed_sale", "final_price":72.0, "sale_platform":"eBay", "sale_date":"...", "url":"https://www.ebay.com/itm/..." }

// live listings for a collectible
{ "mode": "activeSales", "collectibleIds": ["2823287"] }
// -> { "type":"active_listing", "marketplace":"ebay", "sale_price":65.0, "buy_it_now_price":80.0, "url":"..." }

// reference lists (sports, grades, platforms, totals)
{ "mode": "reference" }
// -> { "type":"sport", "id":2, "name":"Basketball" } , { "type":"grade", "name":"PSA 10" } , ...
```

Every row shares one flat schema with a `type` discriminator, so a mixed export stays a single table;
fields that don't apply to a row type are `null`. Prices are **USD dollars** as returned by the API.

### ⚙️ Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` · `completedSales` · `activeSales` · `deals` · `dailyStats` · `marketIndices` · `reference`. |
| `query` | string | – | Search mode — keyword. |
| `sportIds` / `playerIds` / `gradeIds` / `setYears` | array | – | Search filters. |
| `isRookie` / `isGradedOnly` | boolean | false | Search filters. |
| `sortBy` / `sortDirection` | string | – | Search sort. |
| `collectibleIds` | array | – | Completed sales / Active listings / Daily stats — the `id` from Search. |
| `collectibleType` | string | `sports-card` | Sales/deals/stats collectible type. |
| `marketplaces` | array | – | Active listings — optional marketplace filter. |
| `indexId` / `startDateISO` | string | – | Market indices — pull one index's stats. |
| `dateRangeInDays` | integer | 30 | Reference — platform-totals window. |
| `maxItems` | integer | 200 | 0 = all. Only Search paginates. |
| `proxyConfiguration` | object | Apify datacenter | On by default; the API is not geo-gated. |

### 📤 Output

A flat record per item with a `type` discriminator. Collectible rows carry `player`, `set_name`,
`set_year`, `sport`, `grade`, `set_variation`, `price_*_avg`, `population_count` and the full nested
`stats`. Sale rows carry `final_price`/`sale_price`, `sale_platform`/`marketplace`, `sale_date`,
`seller_name`, `url`. Reference rows carry `name`/`id`. Shapes that vary (deals, daily stats, index
stats, platform totals) also include the raw object under `data`.

### 📌 Good to know

- **No login.** The app's `public.*` API is anonymous; this is exactly the public market data the app
  shows a signed-out user. There is no request signing or API key on this surface.
- **Prices are the app's own compiled market data.** Market Movers itself aggregates sales from eBay,
  Goldin and other auction houses; this actor reads the app's API rather than those upstream sources
  (which sit behind Akamai/Cloudflare bot walls). Values are point-in-time.
- **Proxy.** Apify datacenter proxy is on by default to keep requests off the run's shared IP; the API
  is not geo-gated, so datacenter is enough (no residential needed).

# Actor input Schema

## `mode` (type: `string`):

What to scrape from the app's public (no-account) sports-card market API.

## `query` (type: `string`):

Search mode. Keyword to search the card/item catalogue, e.g. "lebron james".

## `sportIds` (type: `array`):

Optional filter — sport ids (see Reference mode's sports). e.g. 2 = Basketball.

## `playerIds` (type: `array`):

Optional filter — player ids.

## `gradeIds` (type: `array`):

Optional filter — grade ids (see Reference mode's grades).

## `setYears` (type: `array`):

Optional filter — set years, e.g. 2003.

## `isRookie` (type: `boolean`):

Search mode. Keep only rookie cards.

## `isGradedOnly` (type: `boolean`):

Search mode. Keep only professionally graded cards.

## `sortBy` (type: `string`):

Optional sort field the app supports (e.g. a price/change field). Leave blank for relevance.

## `sortDirection` (type: `string`):

Search mode. Sort direction for results.

## `collectibleIds` (type: `array`):

Completed sales / Active listings / Daily stats modes. One or more collectible ids (the `id` from Search mode).

## `collectibleType` (type: `string`):

Collectible type for sales/deals/stats. Default sports-card.

## `marketplaces` (type: `array`):

Active listings mode — optional marketplace filter (e.g. ebay, goldin).

## `indexId` (type: `string`):

Market indices mode. Optionally set an index id (from the listed indices) to also pull that index's stats.

## `startDateISO` (type: `string`):

Market indices mode — start date (ISO, e.g. 2026-01-01) for the index stats series.

## `dateRangeInDays` (type: `integer`):

Reference mode — window (days) for the platform-wide totals.

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

Stop after this many records (0 = all). Only Search mode paginates.

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

Apify Proxy (datacenter) is on by default. The API is not geo-gated; a proxy keeps requests off the run's shared IP. Datacenter is enough.

## Actor input object example

```json
{
  "mode": "search",
  "isRookie": false,
  "isGradedOnly": false,
  "sortDirection": "",
  "collectibleType": "sports-card",
  "dateRangeInDays": 30,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rl1987/marketmovers-api-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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    } }

# Run the Actor and wait for it to finish
run = client.actor("rl1987/marketmovers-api-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call rl1987/marketmovers-api-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rl1987/marketmovers-api-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/swCvnwtunyvYeaYOT/builds/rxu4Zdqhgg4bz46oA/openapi.json
