# Tennis Abstract Players & Elo Ratings Scraper (`confidential_gnat/tennis-abstract-players-scraper`) Actor

Scrape Tennis Abstract (tennisabstract.com) ATP and WTA Elo ratings and player profiles: Elo by surface, rankings, recent results, career and last 52 weeks splits, serve and return stats and head-to-heads. Export JSON, CSV or Excel.

- **URL**: https://apify.com/confidential_gnat/tennis-abstract-players-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

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

## Tennis Abstract Players & Elo Ratings Scraper

**Scrape tennis players and Elo ratings from Tennis Abstract (tennisabstract.com)**: the ATP and WTA Elo leaderboards with Elo per surface, and a full profile for each player with ranks, **recent results**, season and career splits, serve and return stats and **head-to-heads**. Export as **JSON, CSV or Excel** or call it as an **API**. Paste an Elo page or type a player name and press Start.

**Target website:** [tennisabstract.com](https://www.tennisabstract.com)

### ✨ Features of this Tennis Abstract players scraper

- **Elo ratings extraction** — ATP and WTA leaderboards with overall, hard, clay and grass Elo, their ranks, peak Elo and the official ranking.
- **Player profiles** — country, handedness, backhand, birth date, height, current and peak ranking, and the ATP or WTA tour.
- **Match and season stats** — recent results with serve and return stats, tour and challenger seasons, recent finals and year-end rankings.
- **Splits and head-to-heads** — career and last 52 weeks splits by surface, round and more, and every head-to-head record.
- **Look up by name** — type a player name and get the profile, ATP or WTA.
- **Proxy support** — optional; runs work without one.
- **No browser required** — plain requests keep runs fast and cheap.

### 🚀 How to scrape Tennis Abstract players in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (an Elo ratings page, a player page or player names).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing for the Tennis Abstract scraper

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests instead of a browser, so it costs significantly less to run than browser-based scrapers.
- The proxy is off by default, which keeps runs cheapest.

### 🔧 Tennis Abstract scraper input configuration

The input form starts with the Tennis Abstract URLs and player names, then the player limit and the details switch. The proxy settings are last.

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Tennis Abstract URLs (`startUrls`) | array | — | the ATP Elo ratings page | Elo ratings pages (ATP or WTA) or player pages. |
| Player names (`playerNames`) | array | — | — | Players to look up by name, for example Coco Gauff. Each one returns the full profile. |
| Max players per URL (`maxItems`) | integer | — | 5 | Maximum players saved for each Elo ratings page, taken from the top of the list. |
| Scrape player details (`scrapeDetails`) | boolean | — | false | For players from an Elo page, also open the player page for the profile, results, splits and head-to-heads. Player URLs and names always get the details. |
| Proxy configuration (`proxyConfiguration`) | object | — | no proxy | Turn on Apify Proxy if your runs get blocked. |

**Supported URL types:**

- ATP Elo ratings: `https://www.tennisabstract.com/reports/atp_elo_ratings.html`
- WTA Elo ratings: `https://www.tennisabstract.com/reports/wta_elo_ratings.html`
- A player: `https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner`

### 📦 Tennis Abstract scraper output data

Every player is one flat record with the keys `type`, `id`, `url`, `name`, `tour`, `country`, `hand`, `backhand`, `dateOfBirth`, `age`, `heightCm`, `currentRank`, `peakRank`, `peakRankDate`, `officialRank`, `eloRank`, `elo`, `hEloRank`, `hElo`, `cEloRank`, `cElo`, `gEloRank`, `gElo`, `peakElo`, `peakEloMonth`, `eloVsRankDiff`, `twitter`, `atpId`, `recentResults`, `tourSeasons`, `challengerSeasons`, `recentFinals`, `yearEndRankings`, `careerSplits`, `last52Splits`, `headToHeads`, `source`, `scrapedAt`. Every record has all keys; a value the page does not carry is `null`, for example the profile and the tables are `null` for a player taken from an Elo page without **Scrape player details**. The tables (`recentResults`, `tourSeasons`, `challengerSeasons`, `recentFinals`, `yearEndRankings`, `careerSplits`, `last52Splits`, `headToHeads`) are arrays of rows keyed by Tennis Abstract's own column names. The dataset has 1 view:

- **Players** — a compact table of Elo rank, player, tour, country, age, Elo by surface, official rank and the player page.

**Output at a glance:**

| Elo rank | Player | Tour | Country | Age | Elo | Hard | Clay | Grass |
| -------- | ------ | ---- | ------- | --- | --- | ---- | ---- | ----- |
| 1 | [Jannik Sinner](https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner) | atp | ITA | 25 | 2297 | 2234.3 | 2186.8 | 2100.5 |
| 2 | [Carlos Alcaraz](https://www.tennisabstract.com/cgi-bin/player.cgi?p=CarlosAlcaraz) | atp | ESP | 23 | 2150 | 2086.2 | 2088.1 | 2015.7 |
| 3 | [Alexander Zverev](https://www.tennisabstract.com/cgi-bin/player.cgi?p=AlexanderZverev) | atp | GER | 29 | 2107 | 2047.7 | 2054.5 | 1953.4 |
| 4 | [Novak Djokovic](https://www.tennisabstract.com/cgi-bin/player.cgi?p=NovakDjokovic) | atp | SRB | 39 | 2063 | 2015.2 | 1961 | 1939.9 |
| 5 | [Rafael Jodar](https://www.tennisabstract.com/cgi-bin/player.cgi?p=RafaelJodar) | atp | ESP | 20 | 2019 | 1948.1 | 1964.9 | 1738.6 |

**Sample output (raw JSON):**

```json
[
  {
    "type": "player",
    "id": "JannikSinner",
    "url": "https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner",
    "name": "Jannik Sinner",
    "tour": "atp",
    "country": "ITA",
    "hand": "right",
    "backhand": "two-handed",
    "dateOfBirth": "2001-08-16",
    "age": 25,
    "heightCm": 191,
    "currentRank": 1,
    "peakRank": 1,
    "peakRankDate": "2024-06-10",
    "officialRank": 1,
    "eloRank": 1,
    "elo": 2297,
    "hEloRank": 1,
    "hElo": 2234.3,
    "cEloRank": 1,
    "cElo": 2186.8,
    "gEloRank": 1,
    "gElo": 2100.5,
    "peakElo": 2339.8,
    "peakEloMonth": "2026-05",
    "eloVsRankDiff": 0,
    "twitter": "janniksin",
    "atpId": "S0AG",
    "recentResults": [
      {
        "date": "29-Jun-2026",
        "tournament": "Wimbledon",
        "surface": "Grass",
        "rd": "F",
        "rk": "1",
        "vrk": "3",
        "column7": "(1)Sinner d. (2)Alexander Zverev [GER]",
        "score": "6-7(7) 7-6(2) 6-3 6-4",
        "dr": "1.24",
        "a": "11.0%",
        "df": "1.5%",
        "1stin": "64.0%",
        "1st": "80.5%",
        "2nd": "65.3%",
        "bpsvd": "1/1",
        "time": "3:46"
      }
    ],
    "tourSeasons": [
      {
        "year": "2026",
        "m": "47",
        "w": "44",
        "l": "3",
        "win": "93.6%",
        "setWL": "105-15",
        "set": "87.5%",
        "gameWL": "712-439",
        "game": "61.9%",
        "tbWL": "14-5",
        "tb": "73.7%",
        "ms": "45",
        "hld": "94.4%",
        "brk": "29.1%",
        "a": "14.2%",
        "df": "2.1%",
        "1stin": "64.8%",
        "1st": "81.4%",
        "2nd": "59.1%",
        "spw": "73.6%",
        "rpw": "40.7%",
        "tpw": "56.2%",
        "dr": "1.54",
        "best": "W (6x)"
      }
    ],
    "challengerSeasons": [
      {
        "year": "2020",
        "m": "3",
        "w": "1",
        "l": "2",
        "win": "33.3%",
        "setWL": "3-4",
        "set": "42.9%",
        "gameWL": "31-31",
        "game": "50.0%",
        "tbWL": "1-0",
        "tb": "100.0%",
        "ms": "3",
        "hld": "74.2%",
        "brk": "23.3%",
        "a": "7.7%",
        "df": "2.2%",
        "1stin": "57.5%",
        "1st": "75.0%",
        "2nd": "50.6%",
        "spw": "64.6%",
        "rpw": "40.1%",
        "tpw": "51.5%",
        "dr": "1.13",
        "best": "R16 (Indian Wells)"
      }
    ],
    "recentFinals": [
      {
        "date": "29-Jun-2026",
        "tournament": "Wimbledon",
        "surface": "Grass",
        "rd": "F",
        "rk": "1",
        "vrk": "3",
        "column7": "(1)Sinner d. (2)Alexander Zverev [GER]",
        "score": "6-7(7) 7-6(2) 6-3 6-4",
        "dr": "1.24",
        "a": "11.0%",
        "df": "1.5%",
        "1stin": "64.0%",
        "1st": "80.5%",
        "2nd": "65.3%",
        "bpsvd": "1/1",
        "time": "3:46"
      }
    ],
    "yearEndRankings": [
      {
        "year": "Current (2026-10-26)",
        "atpRank": "1",
        "points": "10450",
        "eloRank": "1",
        "elo": "2332",
        "heloRank": "1",
        "helo": "2269",
        "celoRank": "1",
        "celo": "2222",
        "geloRank": "1",
        "gelo": "2135",
        "doublesATPRank": null,
        "points2": null,
        "dLoRank": null,
        "dLo": null
      }
    ],
    "careerSplits": [
      {
        "split": "Hard",
        "m": "308",
        "w": "251",
        "l": "57",
        "win": "81.5%",
        "setWL": "564-177",
        "set": "76.1%",
        "gameWL": "4168-2986",
        "game": "58.3%",
        "tbWL": "84-31",
        "tb": "73.0%",
        "ms": "297",
        "hld": "87.8%",
        "brk": "27.8%",
        "a": "8.9%",
        "df": "2.5%",
        "1stin": "60.8%",
        "1st": "76.6%",
        "2nd": "55.6%",
        "spw": "68.4%",
        "rpw": "40.4%",
        "tpw": "54.0%",
        "dr": "1.28"
      }
    ],
    "last52Splits": [
      {
        "split": "Hard",
        "m": "56",
        "w": "51",
        "l": "5",
        "win": "91.1%",
        "setWL": "117-15",
        "set": "88.6%",
        "gameWL": "781-450",
        "game": "63.4%",
        "tbWL": "15-1",
        "tb": "93.8%",
        "ms": "56",
        "hld": "93.1%",
        "brk": "31.5%",
        "a": "12.5%",
        "df": "2.1%",
        "1stin": "64.3%",
        "1st": "81.3%",
        "2nd": "57.4%",
        "spw": "72.8%",
        "rpw": "41.7%",
        "tpw": "56.5%",
        "dr": "1.53"
      }
    ],
    "headToHeads": [
      {
        "mtgs": "18",
        "opponent": "Carlos Alcaraz [ESP]",
        "w": "7",
        "l": "11",
        "win": "38.9%",
        "tb": "16",
        "w2": "7",
        "l2": "9",
        "tb2": "43.8%",
        "first": "2019",
        "last": "2026",
        "ms": "18",
        "dr": "0.99",
        "a": "4.3%",
        "df": "3.6%",
        "1stin": "56.3%",
        "1st": "69.4%",
        "2nd": "51.5%",
        "spw": "61.6%",
        "rpw": "37.8%",
        "bpsvd": "64.5%",
        "bpcnv": "47.3%"
      }
    ],
    "source": "https://www.tennisabstract.com/reports/atp_elo_ratings.html",
    "scrapedAt": "2026-10-29T17:37:28.006Z"
  }
]
```

### 🐍 How to scrape Tennis Abstract with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/tennis-abstract-players-scraper").call(run_input={
    "startUrls": [{"url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"}],
    "playerNames": ["Coco Gauff"],
    "maxItems": 20,
    "scrapeDetails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/tennis-abstract-players-scraper').call({
    startUrls: [{ url: 'https://www.tennisabstract.com/reports/atp_elo_ratings.html' }],
    playerNames: ['Coco Gauff'],
    maxItems: 20,
    scrapeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~tennis-abstract-players-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"}], "playerNames": ["Coco Gauff"], "maxItems": 20, "scrapeDetails": true}'
```

### 💡 What you can use Tennis Abstract player data for

- Building tennis rating models and match predictions from Elo by surface.
- Comparing player form with the last 52 weeks splits against career numbers.
- Scouting opponents with head-to-head records and serve and return stats.
- Tracking Elo versus official ranking to find under- and overrated players.
- Feeding tennis media, newsletters and betting research with up-to-date ratings.

The data is typically used by sports analysts, data scientists, betting researchers, fantasy platforms and sports publishers.

### ⚠️ Limitations of the Tennis Abstract scraper

- **Slow by design** — Tennis Abstract slows down fast clients, so the actor waits between requests and a run with details for many players takes a while.
- **Top of the list only** — an Elo page lists the players with enough recent matches, and **Max players per URL** takes them from the top.
- **No live scores or odds** — the actor returns ratings, profiles and historical stats, not live matches.
- **Column names** — the tables keep Tennis Abstract's own column names, for example `1stin` and `setWL`.

### ❓ Tennis Abstract scraper FAQ

#### Can I scrape Tennis Abstract legally?

The actor only collects data that is already publicly visible on Tennis Abstract, with no login, paywall or private content. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with the site's Terms of Service and applicable laws.

#### What data does the Tennis Abstract scraper return?

Each player has Elo and Elo rank overall and for hard, clay and grass, peak Elo and the official rank. With details switched on you also get the profile (country, hand, backhand, birth date, height, current and peak rank) and the tables of recent results, seasons, finals, year-end rankings, career and last 52 weeks splits and head-to-heads.

#### How many players can I scrape from one Elo page?

**Max players per URL** limits the saved players for each Elo ratings page, taken from the top of the Elo list. Each player URL or name returns one player.

#### Do I need a proxy to scrape tennisabstract.com?

No. The input defaults to no proxy and runs worked without one in testing. The site answers fast clients with a temporary "too many requests" error, which the actor handles by waiting and retrying. Turn on Apify Proxy only if your runs get blocked.

#### How do I scrape Tennis Abstract with Python?

Use the Python example above: it starts the actor with your input and iterates over the dataset items.

#### Can I run this Tennis Abstract scraper on a schedule?

Yes. Create an Apify Schedule for the actor, for example weekly, because Tennis Abstract updates the Elo ratings about once a week.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why are some profile fields empty?

Tennis Abstract does not know every player's handedness or height, and young players may have no results in some tables. Missing values are `null`.

### 🔗 Relevant actors for tennis and sports data

| Scraper | Description |
| ------- | ----------- |
| [📊 StatMuse Sports Stats Scraper](https://apify.com/confidential_gnat/statmuse-sports-scraper) | StatMuse answers to natural-language sports questions plus player stats. |
| [📈 Covers.com Odds, Line History & Betting Trends Scraper](https://apify.com/confidential_gnat/covers-odds-trends-scraper) | Covers.com odds, line history and betting trends for NFL, NBA, MLB and NHL. |
| [🎯 Action Network Odds & Public Betting Scraper](https://apify.com/confidential_gnat/action-network-odds-scraper) | Sportsbook odds, public betting splits and line movement. |
| [🏈 FantasyPros Player News & Expert Rankings Scraper](https://apify.com/confidential_gnat/fantasypros-news-projections-scraper) | FantasyPros player news, expert rankings and projections. |
| [🏀 FanDuel Odds, Player Props & Same Game Parlay Scraper](https://apify.com/confidential_gnat/fanduel-odds-sgp-scraper) | FanDuel odds, player props and same game parlays. |

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [🥾 AllTrails Scraper — Hiking, Biking & Running Trails](https://apify.com/confidential_gnat/alltrails-scraper) | Hiking, biking and running trails by park, city or state. |
| [📌 Pinterest Pins, Boards & Profiles Scraper](https://apify.com/confidential_gnat/pinterest-pins-scraper) | Pins, videos, boards and profiles from Pinterest searches and URLs. |
| [💼 Dice Jobs Scraper](https://apify.com/confidential_gnat/dice-jobs-scraper) | Tech job listings from Dice by keyword or URL. |
| [🔮 Kalshi Markets Scraper](https://apify.com/confidential_gnat/kalshi-markets-scraper) | Prediction market prices, implied probability and volume from Kalshi. |
| [🍷 Vivino Wine Scraper](https://apify.com/confidential_gnat/vivino-wine-scraper) | Wine data from Vivino: name, winery, vintage and ratings. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/tennis-abstract-players-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

## `startUrls` (type: `array`):

An Elo ratings page (https://www.tennisabstract.com/reports/atp_elo_ratings.html or the wta\_ one) lists the players by Elo rank. A player page (https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner) returns that player with the full profile.

## `playerNames` (type: `array`):

Players to look up by name, for example Coco Gauff. Each one returns the full profile, ATP or WTA.

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

Maximum players saved for each Elo ratings page (taken from the top of the Elo list).

## `scrapeDetails` (type: `boolean`):

For players from an Elo ratings page, also open the player page: profile (country, hand, birth date, height, ranks), recent results, seasons, finals, career and last 52 weeks splits, and head-to-heads. Players from player URLs and names always get the details.

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

No proxy is needed in normal use. Turn on Apify Proxy if your runs get blocked.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"
    }
  ],
  "maxItems": 5,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/tennis-abstract-players-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 = { "startUrls": [{ "url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html" }] }

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/tennis-abstract-players-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 '{
  "startUrls": [
    {
      "url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"
    }
  ]
}' |
apify call confidential_gnat/tennis-abstract-players-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/tennis-abstract-players-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/SrnnXGCNEaMn7xjSc/builds/NjTHWN9dlchgjFelt/openapi.json
