# Archidekt Deck Scraper: MTG Decklists, Cards & Prices (`uber_byte/archidekt-scraper`) Actor

Scrape public Archidekt Magic: The Gathering decks: name, format, owner, views, colors, categories and full decklists with card quantities and prices.

- **URL**: https://apify.com/uber\_byte/archidekt-scraper.md
- **Developed by:** [Marlon Lee](https://apify.com/uber_byte) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 decks

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

## Archidekt Deck Scraper

Archidekt Deck Scraper collects public Magic: The Gathering decks from Archidekt: deck name, format, owner, views, colors and the full decklist with card quantities and prices from TCGplayer, Card Kingdom, Star City Games, Cardmarket and MTGO. Search decks by name, format or owner, or paste deck links. Built for metagame research, deck price tracking and MTG content. No account or API key.

### What you get

One row per deck, with:

- **Deck:** Archidekt deck ID and URL, name, format, owner username, view count, colors, EDH bracket, tags, description, created and updated dates, featured image
- **Categories:** each deck category (Commander, Sideboard, Maybeboard and so on) with whether Archidekt counts it in the deck and in the price
- **Totals:** card count and total deck price in USD
- **Cards:** every card with quantity, categories, in-deck flag, set name and code, collector number, rarity, finish, mana cost, mana value, types, color identity and Scryfall ID
- **Card prices:** TCGplayer, Card Kingdom and Star City Games in USD, Cardmarket in EUR and MTGO in tix, with foil prices for foil cards

### Use cases

- **Metagame and Commander research:** see which cards and commanders the most-viewed decks run.
- **Deck price tracking:** find out what popular decks cost and which cards drive the price.
- **Content creation:** pull decklists for articles, videos and deck techs.
- **Card recommendation and machine learning:** build a dataset of real, human-built decks.
- **Store and inventory planning:** see which cards show up in popular builds.

### How to use

1. Open the Actor in Apify Console.
2. Search by **Format**, deck name and/or **Owner username**, and pick a sort order: most viewed, recently updated or newest.
3. Or paste **Deck URLs or IDs**. When you do, the Actor ignores the search fields.
4. Set **Max decks**, and turn off **Include decklists** if you only need summary rows.
5. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

### Input example

```json
{
  "format": "Modern",
  "orderBy": "-viewCount",
  "maxItems": 100,
  "includeCards": true
}
```

Scrape specific decks instead:

```json
{ "deckUrls": ["https://archidekt.com/decks/12028998", "3045150"] }
```

| Field | Description |
|---|---|
| `deckUrls` | Deck links or numeric IDs. When set, the search fields are ignored. |
| `search` | Deck name contains this text. |
| `format` | One of Archidekt's 25 formats, e.g. `Commander / EDH`, `Modern`, `Pioneer`, `Pauper`. |
| `ownerUsername` | Only decks by this Archidekt user (exact username). |
| `orderBy` | `-viewCount` (default), `-updatedAt` or `-createdAt`. |
| `maxItems` | Maximum decks to return (default 50). |
| `includeCards` | Fetch the full decklist (default `true`). Off gives faster summary rows only. |

### Output example

One item per deck (card list shortened):

```json
{
  "deckId": 3045150,
  "url": "https://archidekt.com/decks/3045150",
  "name": "Modern Artifact Burn",
  "format": "Modern",
  "formatId": 2,
  "owner": "TLo7",
  "views": 24004,
  "colors": ["B", "R"],
  "edhBracket": null,
  "tags": [],
  "description": null,
  "createdAt": "2022-07-30T15:20:24.950022Z",
  "updatedAt": "2026-03-08T03:00:37.535598Z",
  "image": "https://storage.googleapis.com/archidekt-card-images/f17/74843584-d6b1-4ee6-bedb-999ab0a42bb9_art_crop.jpg",
  "categories": [
    { "name": "Maybeboard", "includedInDeck": false, "includedInPrice": false, "isPremier": false },
    { "name": "Sideboard", "includedInDeck": true, "includedInPrice": true, "isPremier": false }
  ],
  "cardCount": 75,
  "totalPriceUsd": 172.15,
  "cards": [
    {
      "cardName": "Shrapnel Blast",
      "quantity": 4,
      "categories": ["Instant"],
      "inDeck": true,
      "set": "Magic 2015",
      "setCode": "M15",
      "number": "161",
      "rarity": "uncommon",
      "finish": "Normal",
      "manaCost": "{1}{R}",
      "cmc": 2,
      "types": ["Instant"],
      "colorIdentity": ["R"],
      "scryfallId": "e0798cec-aaa3-4a52-99f8-d000ca7d59db",
      "marketPrice": 0.25,
      "currency": "USD",
      "prices": { "tcgplayer": 0.25, "cardKingdom": 0.35, "starCityGames": 0.29, "cardmarketEur": 0.28, "mtgoTix": 0.03 }
    }
  ],
  "scrapedAt": "2026-09-29T21:19:27.081Z"
}
```

### Pricing

You pay per deck saved to the dataset. Failed requests and skipped private decks cost nothing. Set a maximum cost per run in Apify Console, and the Actor stops cleanly when it reaches that limit.

### FAQ

**Is it legal to scrape Archidekt?** The Actor reads only public decks through Archidekt's public JSON API, at no more than 60 requests per minute. It never outputs email addresses. You are responsible for using the data in line with Archidekt's terms and the laws that apply to you.

**Do I need an Archidekt account or a proxy?** No account. The proxy is off by default because the public API doesn't need one. Turn on Apify Proxy for large runs if you see errors.

**Can it scrape private or unlisted decks?** No. The Actor skips private decks with a warning.

**How many decks can I get?** Archidekt's search returns at most 1,000 decks per query. Narrow by format, owner or name to reach more.

**Can I search by card name?** No. Search matches deck names only.

**Why is `owner` sometimes `null`?** Some people use their email address as their Archidekt username. The Actor replaces those usernames with `null`.

**What does `cardCount` include?** Every card in a category Archidekt marks as "included in deck". On many decks that includes the Sideboard, and it never includes the Maybeboard. Each card's `categories` and `inDeck` fields let you split it yourself.

**Are prices live?** They are the prices Archidekt shows at scrape time. `marketPrice` is the TCGplayer USD price for the card's finish. `totalPriceUsd` sums `marketPrice` times quantity over the categories Archidekt includes in the price, so cards without a TCGplayer price are left out of the total.

**How are `colors` worked out?** From the color identity of the cards in the deck, or from Archidekt's color counts when **Include decklists** is off.

**Are custom cards included?** No. Custom (non-Magic) cards are not included in `cards`.

# Actor input Schema

## `deckUrls` (type: `array`):

Specific decks to scrape, e.g. https://archidekt.com/decks/12028998 or 12028998. When set, search options are ignored.

## `search` (type: `string`):

Search public decks by name, e.g. "dragon".

## `format` (type: `string`):

Only decks in this format.

## `ownerUsername` (type: `string`):

Only decks by this Archidekt user (exact username).

## `orderBy` (type: `string`):

Sort by.

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

Archidekt search returns at most 1,000 decks per query.

## `includeCards` (type: `boolean`):

Fetch each deck's full card list with prices and categories (one extra request per deck). Off = search summary only.

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

Proxy settings. Apify Proxy is recommended for larger runs.

## Actor input object example

```json
{
  "deckUrls": [],
  "format": "Modern",
  "orderBy": "-viewCount",
  "maxItems": 50,
  "includeCards": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "deckUrls": [],
    "format": "Modern"
};

// Run the Actor and wait for it to finish
const run = await client.actor("uber_byte/archidekt-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 = {
    "deckUrls": [],
    "format": "Modern",
}

# Run the Actor and wait for it to finish
run = client.actor("uber_byte/archidekt-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 '{
  "deckUrls": [],
  "format": "Modern"
}' |
apify call uber_byte/archidekt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,uber_byte/archidekt-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/cgquGsyfnDwmocaVo/builds/P95bqw6h0MQJM0lCV/openapi.json
