# Cardmarket Scraper - Card Prices, Trends, Sellers & Reviews (`abotapi/cardmarket-com-scraper`) Actor

Scrape Cardmarket trading cards by keyword or URL. Extract price guides, trends, 30/7/1-day averages, daily price history, seller offers and prices. Includes seller ratings and customer feedback for market research, price monitoring and trading card analysis.

- **URL**: https://apify.com/abotapi/cardmarket-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 card, offer or seller records

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

## Cardmarket Scraper

Scrape Cardmarket, Europe's largest trading-card marketplace (Pokemon, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Lorcana), by keyword or URL. Every product row carries the full price guide (trend, 30/7/1-day averages, daily chart series) and the seller offer table; seller records carry aggregate ratings and customer feedback entries.

### Why This Scraper?

- **Price guide + offers in one row.** The product page's own price data (trend, 30-day, 7-day and 1-day averages, the daily sell-price series and up to 50 seller offers with condition, language, seller country and sales count) lands on the product record.
- **Every link shape routed.** Paste product pages, expansion listings, search-result links, seller profiles or a seller's Offers page; the actor walks each the way the site does, paginating search and expansion results and seller offer pages.
- **Seller feedback included.** Seller profiles ship aggregate evaluation percentages per category plus the individual feedback entries (buyer, country, transaction value band, date, per-category ratings, comment text).
- **Recurring updates built in.** Incremental mode labels every record NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED across scheduled runs of the same scope, so a price monitor only pays for what actually moved.
- **All five games.** Pokemon, Magic, YuGiOh, OnePiece and Lorcana share the same grammar; pick the game section for keyword search, or paste links from any section.

### Use Cases

- **Who:** Trading-card stores tracking competitor prices across conditions and sellers.
- **Who:** Collectors watching a watchlist of cards with trend and 30/7/1-day averages and the cheapest current offers.
- **Who:** Market analysts measuring price history per expansion from the daily sell-price series.
- **Who:** Sellers monitoring their own (or competitors') customer feedback over time.

### Data You Get

| Field | Example |
|---|---|
| `title` | Sample Hydra Card (SMP 001) |
| `game` | Pokemon |
| `expansion` | 151 |
| `rarity` | Holo Rare |
| `url` | https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200 |
| `priceTrend` | 4.56 |
| `avg30` | 5.01 |
| `avg7` | 4.78 |
| `avg1` | 4.62 |
| `fromPrice` | 1.23 |
| `availableCount` | 321 |
| `chart30d` | \[{"date": "01.01.2026", "price": 4.4}, ...] |
| `chart14d` | \[{"date": "15.01.2026", "price": 4.51}, ...] |
| `offersCount` | 12 |
| `offers` | \[{"sellerName": "sample_seller_store", "conditionCode": "NM", "language": "English", "price": 3.99}, ...] |
| `sellerName` | sample_seller_store |
| `sellerType` | Private |
| `memberSince` | 2024 |
| `positivePct` | 99.2 |
| `overallLabel` | Very Good |
| `ratingCategories` | \[{"category": "Overall Evaluation", "pct": 99.2}, ...] |
| `feedback` | \[{"buyer": "sample_buyer", "date": "01.01.2026", "overall": "Very Good", "comment": "..."}, ...] |
| `condition` / `language` / `quantity` / `price` | NM / English / 1 / 3.99 |
| `sellerComment` | perfekt fuer Binder (the seller's own note on an offer) |
| `changeType` / `changedFields` | UPDATED / \["priceTrend"] (incremental mode) |

> Sample shape: values are illustrative placeholders, not from a live record. Records are distinguished by the `kind` field: `product` (price guide + nested offers), `offer` (one row per offer from a seller's stock page) and `seller` (profile + nested feedback).

### How to Use

#### Search mode

1. Pick the game section (Pokemon, Magic, YuGiOh, OnePiece, Lorcana).
2. Add one or more keywords to Search strings; each walks the site's own result pages (30 cards per page).
3. Keep Fetch price guide per card on to read every found card's price-guide page; turn it off for fast card rows only.

**Search by keyword:**

```json
{
  "mode": "search",
  "game": "Pokemon",
  "searchStrings": ["Blastoise ex", "Charizard"],
  "fetchDetails": true,
  "maxOffers": 20,
  "maxItems": 50
}
```

#### URL mode

Paste any mix of links: every shape the site emits is routed. Product pages read the price guide and offer table; expansion and search links walk their result pages; seller profiles collect ratings and feedback; Offers pages emit one row per offer.

| Link | Walk |
|---|---|
| `.../Products/Singles/<Expansion>/<Card>` | Product page: price guide + offer table |
| `.../Products/Singles/<Expansion>` | Expansion listing, paginated |
| `.../Products/Search?searchString=<q>` | Search results, paginated |
| `.../Users/<Seller>` | Seller profile + feedback entries |
| `.../Users/<Seller>/Offers/<Category>` | One row per offer, paginated |

**Paste links (URL mode):**

```json
{
  "mode": "urls",
  "urls": [
    "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
    "https://www.cardmarket.com/en/Pokemon/Users/thenutworldwide"
  ],
  "fetchSellerFeedback": true,
  "maxFeedback": 20,
  "maxItems": 20
}
```

**Incremental price monitor over scheduled runs:**

```json
{
  "mode": "search",
  "game": "Magic",
  "searchStrings": ["Uro, Titan of Nature's Wrath"],
  "fetchDetails": true,
  "maxOffers": 50,
  "maxItems": 100,
  "incrementalMode": true,
  "stateKey": "tcg-watchlist"
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/cardmarket-com-scraper").call(run_input={
    "mode": "search",
    "game": "Pokemon",
    "searchStrings": ["Blastoise ex"],
    "fetchDetails": True,
    "maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

JavaScript:

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/cardmarket-com-scraper').call({
    mode: 'search',
    game: 'Pokemon',
    searchStrings: ['Blastoise ex'],
    fetchDetails: true,
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### How `maxItems` shapes a run

`maxItems` stops the run after that many records; 0 means unlimited. Incremental suppression does not consume budget: a scheduled run where nothing changed pushes 0 rows and costs no dataset-item events.

#### Resume and recurring updates

Turn on Incremental mode and put the run on a schedule. Every run of the same scope compares against the previous one: unchanged records are suppressed (and never billed), card-level moves (from-price, title, expansion) are labelled UPDATED, disappeared records can be emitted as EXPIRED tombstones, and `resumeFromRunId` continues one interrupted run without re-collecting what it already pushed.

### Send results into your apps (MCP connectors)

Results land in the run dataset as clean JSON. To pipe them straight into an AI agent or automation, add MCP connectors in the input's export section, and the run exports each connector's slice after the walk finishes. `Max items to export per connector` bounds each slice; a Notion connector also takes a `Notion parent page`.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | Select | search | `search` walks keyword results; `urls` walks the links you paste |
| `game` | Select | Pokemon | Game section for search mode (Pokemon, Magic, YuGiOh, OnePiece, Lorcana) |
| `searchStrings` | List | Blastoise ex | Keywords for search mode |
| `urls` | List | three sample links | Product, expansion, search or seller links for URL mode |
| `fetchDetails` | Boolean | true | Read each found card's price-guide page (trend, averages, chart, offers) |
| `maxOffers` | Number | 20 | Seller offers embedded per product record (the page carries up to 50) |
| `fetchSellerFeedback` | Boolean | true | Collect customer feedback entries on seller profiles |
| `maxFeedback` | Number | 20 | Feedback entries per seller (20 per page) |
| `maxItems` | Number | 20 | Stop after this many records (0 = unlimited) |
| `resumeFromRunId` | String | (empty) | Continue one interrupted run |
| `incrementalMode` | Boolean | false | Label records NEW/UPDATED/UNCHANGED/EXPIRED across scheduled runs |
| `emitUnchanged` | Boolean | false | Also emit records whose data did not change |
| `emitExpired` | Boolean | false | Tombstone records that disappeared from a complete scan |
| `stateKey` | String | (empty) | Stable name for one monitoring campaign's incremental state |
| `ignoreFieldsForChanges` | List | (empty) | Fields excluded from the change comparison |
| `proxyConfiguration` | Proxy | Apify Proxy | Connection settings; the backup connection engages automatically when the site refuses the default |
| `mcpConnectors` | JSON | (empty) | MCP connector export targets |
| `maxNotifyListings` | Number | 50 | Max items exported per MCP connector |
| `notionParentPageUrl` | String | (empty) | Notion parent page (Notion connector only) |

### Output Example

Browse the run dataset through the Output tabs: **Overview** (all records), **Products** (price guide + nested offers), **Offers** (one row per offer), **Sellers** (profiles with feedback) and **Changes** (incremental runs only). Export to CSV/Excel/JSON/XML from any tab.

> Sample shape: values are illustrative placeholders, not from a live record. Records are distinguished by the `kind` field: `product` (price guide + nested offers), `offer` (one row per offer from a seller's stock page) and `seller` (profile + nested feedback).

```json
{
  "id": "product:Pokemon:ABC123",
  "kind": "product",
  "title": "Sample Hydra Card (SMP 001) 151 - Singles",
  "game": "Pokemon",
  "expansion": "151",
  "url": "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
  "fromPrice": 1.23,
  "priceTrend": 4.56,
  "avg30": 5.01,
  "avg7": 4.78,
  "avg1": 4.62,
  "availableCount": 321,
  "chart30d": [{"date": "01.01.2026", "price": 4.4}],
  "offers": [{"offerId": "0000000001", "sellerName": "sample_seller_store", "condition": "Near Mint", "conditionCode": "NM", "language": "English", "sellerCountry": "Germany", "salesCount": 42, "quantity": 1, "price": 3.99}],
  "offersCount": 12,
  "detailFetched": true
}
```

**Product record with the price guide and offer table (sample shape)**

### Plan Requirement

The site refuses ordinary datacenter and residential connections, so the actor automatically rides its backup connection once the default one has been refused. That backup lane is available on paid Apify plans; on free plans the run fails with a clear message rather than returning silent-empty results. Bring-your-own proxy URLs are honored as-is (the backup lane never overrides them).

### FAQ

#### How much does a run cost?

Costs scale with what comes back: the primary event bills per record, the price-guide event bills once per product whose page was read (detail enrichment is on by default, turn it off for fast, cheap card rows), and the seller feedback event bills once per seller that delivered feedback. Check the Pricing tab for exact rates.

#### Is it legal to scrape Cardmarket?

The actor reads only publicly accessible pages (product listings, public price data and public seller profiles) without any login. Use the data in line with Cardmarket's terms and your local regulations.

#### Can I schedule recurring runs?

Yes. Turn on Incremental mode and put the run on a schedule: every run of the same scope is compared against the previous one, unchanged records are suppressed (and not billed), card-level moves (from-price, title, expansion) are labelled UPDATED, and enriched rows refresh their full price-guide data. Note the site's own result feed re-orders between requests: a scheduled keyword run capped below the result count legitimately classifies mostly NEW (a rotated slice of the same cards), while URL-mode watchlists (pasted product or seller links) suppress deterministically.

#### Why did a run return 0 records?

A pasted link that no longer exists (removed listing or expired sale) is skipped with a warning, and a run whose links all point at removed pages ends honestly with no records. If every page read was refused, the run fails with a connection message instead. Relax the search string, check the game section, or paste a fresher link.

#### Can I use it with AI agents or MCP?

Yes. Results land in the default dataset as clean JSON, and the MCP connectors input forwards a condensed summary per record to your Apify MCP server setup for direct use in AI agents.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏷️ <a href="https://apify.com/abotapi/vinted-marketplace-scraper"><b>Vinted Scraper</b></a><br>Scrape Vinted across 27 country marketplaces by keyword, filters, item or seller URL...</td><td>🛒 <a href="https://apify.com/abotapi/reverb-scraper"><b>Reverb Music Gear and Sold Price Guide Scraper</b></a><br>Scrape reverb.com music gear: guitars, amps, synths, pedals, drums and pro audio. Search...</td></tr>
<tr><td>🧩 <a href="https://apify.com/abotapi/webtoons-com-scraper"><b>WEBTOON Scraper</b></a><br>Scrape the WEBTOON catalog into structured data. Extract series, genres, rankings and...</td><td>🛒 <a href="https://apify.com/abotapi/mercari-jp-scraper"><b>Mercari Japan Scraper</b></a><br>Scrape Mercari Japan listings, sellers and reviews at scale. Extract names, prices...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/vinted-fr-scraper"><b>Vinted France Scraper</b></a><br>Scrape Vinted.fr second-hand fashion listings by keyword, brand, price, condition, sort...</td><td>🚗 <a href="https://apify.com/abotapi/trademe-co-nz-scraper"><b>Trade Me NZ Scraper</b></a><br>Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/cardmarket-com-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

Search mode walks the site's own keyword results for each entry in Search strings. URL mode walks the links you paste in URLs (product, expansion, search or seller pages).

## `game` (type: `string`):

Which game section to search. In URL mode the pasted link's own game section wins over this setting.

## `searchStrings` (type: `array`):

Keyword search walk. Search mode needs at least one entry; each keyword walks the site's own result pages (30 cards per page).

## `urls` (type: `array`):

URL mode: paste product pages (price guide + offer table), expansion listings, search-result links or seller pages (profile with feedback, or an Offers page). Every link shape the site emits is routed; links the actor cannot route are skipped with a warning, never misread.

## `fetchDetails` (type: `boolean`):

Search/expansion results then read each card's own page for the full price guide (trend, 30/7/1-day averages, daily chart series) and the seller offer table. Off = fast card rows only. Charged once per card whose page was actually read.

## `maxOffers` (type: `integer`):

How many of the product page's seller offers (condition, language, seller, price) to embed in each product record. The page carries up to 50.

## `fetchSellerFeedback` (type: `boolean`):

For seller profile links: collect the customer feedback entries (buyer, date, per-category ratings, comments) nested in the seller record. Charged once per seller record that delivered feedback.

## `maxFeedback` (type: `integer`):

How many feedback entries to collect per seller (20 per page; extra pages are read when you raise this). 0 skips feedback collection.

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

Stop the run after this many records. 0 or blank means no limit.

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

Apify Proxy settings. The site refuses ordinary datacenter and residential exits, so the actor automatically rides its backup connection when the default one is refused - on any paid plan that includes it. You can also bring your own proxy URLs.

## `resumeFromRunId` (type: `string`):

Continue one interrupted run: records the previous run already collected are skipped and not billed again. Cannot be combined with Incremental mode.

## `incrementalMode` (type: `boolean`):

Recurring-update mode: remember the previous run of the same scope and label every record NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. Unchanged records are suppressed (not re-emitted, not re-billed) unless Emit unchanged records is on.

## `emitUnchanged` (type: `boolean`):

Incremental mode only: also emit records whose price data did not change since the previous run, labelled UNCHANGED.

## `emitExpired` (type: `boolean`):

Incremental mode only: after a complete scan, emit a tombstone row (EXPIRED) for every previously-seen record that has disappeared from the source.

## `stateKey` (type: `string`):

Advanced: a stable name for this monitoring campaign's incremental state. Leave blank to key the state on the run scope automatically. Use separate keys to run differently-configured schedules that must not share a baseline.

## `ignoreFieldsForChanges` (type: `array`):

Advanced: field names (top-level, or dotted paths like offers.price) that must never mark a record UPDATED. The run-scoped fields (source, position, scrapedAt, image URLs, fetched markers) are already ignored by default.

## `mcpConnectors` (type: `array`):

Optional. Each selected connector receives a condensed summary per record; the full record always stays in the dataset. Leave empty to skip.

## `maxNotifyListings` (type: `integer`):

How many records each MCP connector export carries.

## `notionParentPageUrl` (type: `string`):

Parent page URL when a Notion MCP connector is selected.

## Actor input object example

```json
{
  "mode": "search",
  "game": "Pokemon",
  "searchStrings": [
    "Blastoise ex"
  ],
  "urls": [
    "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
    "https://www.cardmarket.com/en/Pokemon/Users/thenutworldwide/Offers/Singles",
    "https://www.cardmarket.com/en/Pokemon/Products/Singles/151"
  ],
  "fetchDetails": true,
  "maxOffers": 20,
  "fetchSellerFeedback": true,
  "maxFeedback": 20,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "mcpConnectors": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

All records: product cards with price-guide data, seller offer rows and seller profiles with feedback.

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

Product cards with the full price guide (trend, averages, chart series) and the seller offer table.

## `offers` (type: `string`):

One row per seller offer (from a product page's offer table or a seller's stock page).

## `sellers` (type: `string`):

Seller profiles with aggregate evaluation and nested customer feedback.

## `changes` (type: `string`):

Incremental runs only: NEW/UPDATED/EXPIRED records with changedFields.

# 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 = {
    "mode": "search",
    "game": "Pokemon",
    "searchStrings": [
        "Blastoise ex"
    ],
    "urls": [
        "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
        "https://www.cardmarket.com/en/Pokemon/Users/thenutworldwide/Offers/Singles",
        "https://www.cardmarket.com/en/Pokemon/Products/Singles/151"
    ],
    "maxOffers": 20,
    "maxFeedback": 20,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "mcpConnectors": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/cardmarket-com-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 = {
    "mode": "search",
    "game": "Pokemon",
    "searchStrings": ["Blastoise ex"],
    "urls": [
        "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
        "https://www.cardmarket.com/en/Pokemon/Users/thenutworldwide/Offers/Singles",
        "https://www.cardmarket.com/en/Pokemon/Products/Singles/151",
    ],
    "maxOffers": 20,
    "maxFeedback": 20,
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
    "mcpConnectors": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/cardmarket-com-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 '{
  "mode": "search",
  "game": "Pokemon",
  "searchStrings": [
    "Blastoise ex"
  ],
  "urls": [
    "https://www.cardmarket.com/en/Pokemon/Products/Singles/151/Blastoise-ex-V3-MEW200",
    "https://www.cardmarket.com/en/Pokemon/Users/thenutworldwide/Offers/Singles",
    "https://www.cardmarket.com/en/Pokemon/Products/Singles/151"
  ],
  "maxOffers": 20,
  "maxFeedback": 20,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "mcpConnectors": []
}' |
apify call abotapi/cardmarket-com-scraper --silent --output-dataset

```

## MCP server setup

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