# XING Jobs Scraper - Salary Ranges & Direct Apply URLs (`webdata_labs/xing-jobs-scraper`) Actor

Scrape XING job listings with salary ranges (min, median, max), the employer's own apply URL, full job descriptions, company details and career-level filters. Covers Germany, Austria and Switzerland. No login, no API key.

- **URL**: https://apify.com/webdata\_labs/xing-jobs-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 job 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/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

## XING Jobs Scraper - salary ranges and direct apply URLs

Scrape job listings from **XING**, the largest professional network in the German-speaking market, and get back a clean row per job with the **salary range**, the **employer's own apply URL**, and the **full job description**.

No login. No API key. No cookies. Full descriptions are included at no extra charge.

**$1.50 per 1,000 jobs. No Actor start fee.**

### ✅ What you get / ❌ what this isn't

✅ Salary range on most listings: minimum, median and maximum, as numbers, not a string
✅ The employer's own career-site apply URL, not a XING page, wherever XING has one
✅ Full job description as both HTML and clean plain text
✅ Company name, XING company page and, where XING has it, the employer's website
✅ Filters for city, radius, employment type and career level
✅ Monitoring mode that returns only jobs you have not already been given
✅ Runs on 256 MB, pure HTTP, no browser

❌ Not a CV or candidate scraper. Public job listings only
❌ Not a XING profile, contact or messaging tool
❌ Not an apply bot. It returns where to apply, it does not apply

### 🔎 Why use this Actor

Most XING scrapers hand you a job card: title, company, city, link. The two fields that make the data worth having are the ones they leave out or charge extra for.

**Salary.** XING publishes a salary estimate on the large majority of its listings, and this Actor returns it as `salaryMin`, `salaryMedian` and `salaryMax` in real numbers with a currency, so you can sort, filter and average it. Measured on a sample of 60 Berlin developer jobs: 48 carried a salary range.

**Where to actually apply.** For listings that apply off-site, `applyUrl` is the employer's own career page, not the XING listing. That is the field a recruiting tool, a jobs aggregator or a lead-generation workflow needs.

**Descriptions at no surcharge.** Several Actors in this niche bill an "enriched" row at four to five times the base rate to add the description. Here it is on by default and costs the same.

### 🗂️ Coverage

XING is the professional network of the DACH region, so this Actor covers job listings in:

- Germany
- Austria
- Switzerland

Employment types you can filter by:

- Full-time (Vollzeit)
- Part-time (Teilzeit)
- Freelance / self-employed (Selbststaendig)
- Student / intern (Studierende)
- Seasonal (Saisonarbeit)
- Temporary help (Aushilfe)
- Voluntary (Ehrenamt)

Career levels you can filter by:

- Student / intern
- Entry level
- Experienced professional
- Manager
- Director / VP
- Executive / CEO

### 👥 Who it's for

- **Recruiters and staffing agencies** tracking which companies are hiring for a role, at what salary, in which city.
- **Job boards and aggregators** that need a DACH feed with apply URLs that point at the employer.
- **Compensation analysts** building salary benchmarks by role, city and seniority from `salaryMin`, `salaryMedian` and `salaryMax`.
- **Sales teams** selling to companies that are growing. A company posting five engineering roles this month is a buying signal, and `companyWebsite` gives you the domain to enrich.
- **Market researchers** measuring hiring demand across German industries over time.

### 📚 Example tasks

Ready-to-run task pages, each one already tested against the live source:

| Task | What it returns | Input |
| -- | -- | -- |
| [Python developer jobs in Berlin](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-python-developer-jobs-in-berlin) | 164 jobs, 123 with a salary range | `{"searchQueries": ["python developer"], "location": "Berlin"}` |
| [Sales manager jobs in Munich](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-sales-manager-jobs-in-munich) | 200 jobs within 30 km | `{"searchQueries": ["sales manager"], "location": "Muenchen", "radius": 30}` |
| [Part-time jobs in Hamburg](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-part-time-jobs-in-hamburg) | 200 part-time jobs, no keyword needed | `{"location": "Hamburg", "employmentType": ["PART_TIME"]}` |
| [Management jobs with salary ranges](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-management-jobs-with-salary-ranges) | 200 manager, director and executive roles | `{"searchQueries": ["manager"], "location": "Berlin", "careerLevel": ["MANAGER", "DIRECTOR", "EXECUTIVE"]}` |
| [Werkstudent and internship jobs](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-werkstudent-and-internship-jobs) | 200 student roles across DACH | `{"searchQueries": ["werkstudent"], "employmentType": ["INTERN"]}` |
| [Jobs in Vienna, Austria](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-jobs-in-vienna-austria) | 60 jobs, all in Vienna | `{"searchQueries": ["data engineer"], "location": "Wien"}` |
| [Jobs in Zurich, Switzerland](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-jobs-in-zurich-switzerland) | 68 jobs, all in Zurich | `{"searchQueries": ["controller"], "location": "Zurich"}` |
| [New jobs since your last run](https://apify.com/webdata_labs/xing-jobs-scraper/examples/xing-new-jobs-daily-monitor) | Only listings you have not been given before | `{"searchQueries": ["python developer"], "location": "Berlin", "onlyNewJobs": true}` |

Other inputs that work:

| What you want | Input |
| -- | -- |
| Several roles in one run | `{"searchQueries": ["backend developer", "devops engineer", "data engineer"], "location": "Berlin", "maxResults": 600}` |
| Paste a XING search URL | `{"startUrls": ["https://www.xing.com/jobs/search?keywords=produktmanager&location=Koeln"]}` |

### ⚙️ How it works

Give it either a list of keywords with a location, or paste XING search URLs straight from your browser. Both work, and explicit fields override anything read from a URL.

Each keyword is searched separately and paginated until XING stops returning new jobs. Every job is pushed to the dataset as soon as it is parsed, so a run you stop early still keeps everything it found.

### 🔁 Monitoring: only jobs you have not seen before

Set `onlyNewJobs` to `true` and schedule the run. The Actor remembers every job id it has delivered and returns only listings that are new since the last run, so a daily monitor does not re-deliver, and does not re-bill, the same postings.

Two things worth knowing:

- The memory belongs to the **task**, so run it as a saved task and keep using that task. A one-off run from the Actor page has a different history.
- The Actor still pages past the jobs it already knows, so a monitoring run with `maxResults: 50` gives you 50 genuinely new jobs, not 50 rows of which most are filtered out.

### 📥 Input

| Field | Type | Default | What it does |
| -- | -- | -- | -- |
| `startUrls` | array | empty | XING job search URLs pasted from your browser. Keywords, location, radius and employment type are read from each one. |
| `searchQueries` | array | `["python developer"]` | One keyword search per line. Each is crawled separately. Leave it empty and set a location or a filter to browse everything that matches, for example every part-time job in Hamburg. |
| `location` | string | `"Berlin"` | City or region. Applies to every keyword. Leave empty to search all of DACH. |
| `radius` | integer | `20` | Kilometres around the location. |
| `employmentType` | array | empty | `FULL_TIME`, `PART_TIME`, `CONTRACTOR`, `INTERN`, `SEASONAL`, `TEMPORARY`, `VOLUNTARY`. Empty means all. |
| `careerLevel` | array | empty | `STUDENT`, `ENTRY`, `EXPERIENCED`, `MANAGER`, `DIRECTOR`, `EXECUTIVE`. Empty means all. |
| `maxResults` | integer | `200` | Stop after this many jobs across all searches. It is a total budget spent keyword by keyword, so with several keywords give it room for all of them. |
| `includeDescription` | boolean | `true` | Fetch the full description, industry, career level and keywords. Free. |
| `onlyNewJobs` | boolean | `false` | Return only jobs not delivered by a previous run of the same task. |

#### Accepted input aliases

Input copied from another Actor's docs runs here without editing. `urls` and `url` are accepted for `startUrls`, `queries` and `keywords` for `searchQueries`, and `maxItems` and `maxJobs` for `maxResults`.

There is nothing to configure about proxies, concurrency or retries. Those are handled internally and are included in the price.

### 📤 Output

One row per job listing.

```json
{
  "jobId": "156675213.cbf7ea",
  "title": "Python Developer Financial Services (all genders)",
  "companyName": "Exxeta",
  "companyXingUrl": "https://www.xing.com/pages/exxetaag",
  "companyWebsite": null,
  "city": "Berlin",
  "employmentType": "Vollzeit",
  "careerLevel": "Mit Berufserfahrung",
  "industry": "Beratung, Consulting",
  "salaryCurrency": "EUR",
  "salaryMin": 59000,
  "salaryMedian": 69500,
  "salaryMax": 83500,
  "applyUrl": "https://career.exxeta.com/Python-Developer-Financial-Services-all-genders-de-j1018.html?utm_source=xing.com",
  "applyType": "EXTERNAL_URL",
  "xingUrl": "https://www.xing.com/jobs/berlin-python-developer-financial-services-all-genders-156675213",
  "refreshedAt": "2026-08-29T05:27:29Z",
  "activeUntil": "2027-01-22T21:35:50Z",
  "isPaidListing": false,
  "isTopJob": false,
  "redirectsToThirdParty": false,
  "keywords": ["python", "developer", "financial", "services"],
  "tags": ["python developer", "financial services"],
  "descriptionHtml": "<DIV><H2>Standorte: ...",
  "descriptionText": "Standorte: Karlsruhe, Berlin, ...",
  "searchQuery": "python developer",
  "scrapedAt": "2026-09-05T11:59:20Z"
}
```

#### Output fields

| Field | Type | Description |
| -- | -- | -- |
| `jobId` | string | XING's own job id. Stable, and what monitoring mode remembers. |
| `title` | string | Job title, as posted. |
| `companyName` | string | Hiring company. |
| `companyXingUrl` | string | The company's XING page. |
| `companyWebsite` | string | The employer's own website, when XING carries it. |
| `city` | string | Primary city of the role. |
| `employmentType` | string | German label as XING stores it, for example `Vollzeit`. |
| `careerLevel` | string | Seniority label, for example `Mit Berufserfahrung`. Needs `includeDescription`. |
| `industry` | string | Employer's industry. Needs `includeDescription`. |
| `salaryCurrency` | string | Currency of the salary fields, usually `EUR`. |
| `salaryMin` | number | Bottom of the salary range, per year. |
| `salaryMedian` | number | Midpoint. Present on estimated salaries, absent on plain ranges. |
| `salaryMax` | number | Top of the salary range, per year. |
| `applyUrl` | string | The employer's own apply URL. Null when the listing applies through XING. |
| `applyType` | string | `EXTERNAL_URL`, `XING` or `XING_CUSTOM`. Tells you why `applyUrl` is null. |
| `xingUrl` | string | The listing on XING. |
| `refreshedAt` | string | When XING last refreshed the listing. Sort on this for newest first. |
| `activeUntil` | string | When the listing expires. |
| `isPaidListing` | boolean | Whether the employer paid to promote it. |
| `isTopJob` | boolean | Whether XING flags it as a top job. |
| `redirectsToThirdParty` | boolean | Whether applying leaves XING. |
| `keywords` | array | XING's own keyword tags. Needs `includeDescription`. |
| `tags` | array | XING's own phrase tags. Needs `includeDescription`. |
| `descriptionHtml` | string | Full description as HTML. Needs `includeDescription`. |
| `descriptionText` | string | The same description as clean plain text. |
| `searchQuery` | string | Which of your keywords produced this row. |
| `scrapedAt` | string | UTC timestamp of the row. |

The run summary in `OUTPUT` reports how many jobs each search returned and why its pagination stopped.

### 💵 How much does it cost to scrape XING jobs?

| Jobs | Cost |
| -- | -- |
| 100 | $0.15 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |

$0.0015 per job, and nothing else. There is no Actor start fee, so a run that returns nothing costs nothing, and full descriptions are included rather than billed as a separate enrichment event.

### ⚠️ Limits and caveats

Honest numbers, measured 5 September 2026, so you do not spend a run discovering them.

- **XING serves roughly 500 to 1,000 jobs per search.** It stops returning results past a certain depth, so a broad keyword gives you a slice of the market, not all of it. A search for `developer` in Berlin returned 505 jobs and then ran out. To get more, use more specific keywords or more cities rather than a larger `maxResults`.
- **XING reports no result count.** The source does not say how many jobs match, so the Actor cannot show "x of y" progress and cannot know the size of a search in advance. It pages until nothing new comes back.
- **`applyUrl` is null on roughly 4 of 10 listings.** Those apply through XING itself rather than an employer career page, which `applyType` tells you explicitly. It is not a parsing miss, and `xingUrl` always works as a fallback.
- **Salary is XING's estimate on most listings**, not a number the employer typed. Some listings carry a plain range with no median, and some carry none at all, in which case all four salary fields are null.
- **Results come back in XING's relevance order.** XING accepts a "sort by date" instruction and then ignores it, so this Actor does not pretend to offer one. Sort the dataset on `refreshedAt` for newest first.
- **Narrow filter combinations legitimately return zero jobs.** Part-time plus manager level plus a specific city is often genuinely empty on XING. The run finishes cleanly and tells you to widen the filters.
- **Location is a strong weight, not a hard filter.** Measured over 60 rows per city: 45 of 60 for Hamburg, 54 of 60 for Cologne, 60 of 60 for Zurich. A handful of nationwide or remote listings come back with any city search.
- **Titles, employment types and career levels are German**, because that is how XING stores them. Descriptions are in whatever language the employer posted.

### 🔁 Run it on the Apify platform

Set a schedule, use monitoring mode, and pull results with the Apify API, the JavaScript client or the Python client. The dataset is available as JSON, CSV, Excel and XML.

### 🤖 Use with AI agents via MCP

This Actor is available over Apify's MCP server, so an agent can call it as a tool.

**Claude Code**

```bash
claude mcp add apify --transport http https://mcp.apify.com --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"
```

**Cursor or Claude Desktop**

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com",
      "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Then ask for what you want in words, for example: "find part-time marketing jobs in Hamburg on XING and give me the ones paying over 50,000 EUR". The agent fills `searchQueries`, `location` and `employmentType` itself, which is why this Actor keeps structured inputs alongside URL input.

### 🔗 Use this Actor in n8n

Add the **Apify** node, pick **Run Actor**, choose `webdata_labs/xing-jobs-scraper`, and paste your input JSON. Chain **Get Dataset Items** after it to pull the rows into your workflow. A common pattern is a daily schedule with `onlyNewJobs: true` feeding new listings into a spreadsheet or CRM.

### ⚖️ Is it legal to scrape XING?

This Actor reads only public job listings that XING serves to logged-out visitors. It does not log in, does not touch member profiles, and does not collect personal data.

Job listings are business information, not personal data, so GDPR concerns that apply to profile scraping do not apply here. You are still responsible for how you use the output, including any onward processing of contact details an employer chose to publish inside a job description. If you plan to republish listings, check XING's terms and your own legal position first.

### 🧩 Related Actors

- [We Work Remotely Jobs Scraper](https://apify.com/webdata_labs/weworkremotely-jobs-scraper) - remote-only postings, every live listing rather than the truncated search page.
- [ATS Jobs Scraper](https://apify.com/webdata_labs/greenhouse-lever-ashby-jobs-scraper) - pull the same roles straight from Greenhouse, Lever, Ashby and Workday boards, with no job-board middleman.
- [Company Career Page Jobs API](https://apify.com/webdata_labs/company-career-page-jobs-api) - read jobs off a company's own careers page when it is not on any board.
- [Indeed Jobs Scraper](https://apify.com/webdata_labs/indeed-jobs-scraper) - the largest general job board, for volume rather than niche.
- [Buyer Fit Brief API](https://apify.com/webdata_labs/buyer-fit-brief-api) - score a finished lead list against your ideal customer profile.

### ❓ FAQ

#### Does it need a XING login or cookies?

No. It reads only what XING serves to logged-out visitors. There is nothing to authenticate and no credential field.

#### Why do some jobs have no apply URL?

Because those listings are applied to through XING itself rather than an employer career page. `applyType` says which kind each row is, and `xingUrl` always points at the listing.

#### How many jobs can I get for one keyword?

Roughly 500 to 1,000. XING stops serving results past a certain depth. Add more keywords or more cities to go wider.

#### Can I sort by newest?

Sort the dataset on `refreshedAt`. XING accepts a sort-by-date instruction and ignores it, so no Actor can honestly promise a source-side newest-first ordering on this source.

#### Are the salary numbers real?

They are XING's own published figures for the listing, which for most postings is an estimate rather than a number the employer entered. Treat `salaryMedian` as a market estimate, not an offer.

#### Does including descriptions cost extra?

No. Descriptions, industry, career level and keywords are included at the same per-job price.

#### Does it work for Austria and Switzerland?

Yes. Set `location` to a city such as `Wien` or `Zurich`. XING covers the whole German-speaking market.

#### How does monitoring mode remember what it has seen?

It stores the job ids it has delivered in a named store that belongs to the task, so a scheduled task keeps its history across runs. Run it as a saved task rather than as one-off runs from the Actor page.

#### Why did my run return zero jobs?

Almost always a filter combination with no matches, for example one employment type plus one career level plus a small city. The run log says so and finishes cleanly. Widen the radius or drop a filter.

#### Is it charged if a run finds nothing?

No. The only charge is per job returned, and there is no start fee.

### 📝 Changelog

**0.1** - 5 September 2026. First release. Search by keyword or pasted XING URL, filters for city, radius, employment type and career level, salary range, employer apply URL, full descriptions, and monitoring mode.

### 🛠️ Support

Found a bug or a field you need? Open an issue on the Actor's Issues tab. Bug reports with the run id get fixed fastest.

### ⭐ Rate this Actor

If it saved you time, a rating on the Store helps other people find it.

# Actor input Schema

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

Paste XING job search URLs, for example https://www.xing.com/jobs/search?keywords=python%20developer\&location=Berlin. Keywords, location, radius and employment type are read from each URL. Leave empty to use the keyword fields below.

## `searchQueries` (type: `array`):

One keyword search per line, for example "python developer" or "sales manager". Each line is crawled separately and returns up to about 1,000 jobs.

## `location` (type: `string`):

City or region to search in, for example Berlin, Wien or Zurich. Applies to every keyword above. Leave empty to search all of Germany, Austria and Switzerland.

## `radius` (type: `integer`):

How far around the location to search, in kilometres. Ignored when no location is set.

## `employmentType` (type: `array`):

Keep only jobs of these types. Leave empty for all types.

## `careerLevel` (type: `array`):

Keep only jobs at these seniority levels. Leave empty for all levels.

## `maxResults` (type: `integer`):

Stop after this many jobs across all searches. XING serves roughly 500 to 1,000 jobs per keyword, so add more keywords to go beyond that.

## `includeDescription` (type: `boolean`):

Fetch the full job description, industry, career level and keywords for every job. Included at no extra charge. Turn off for a faster, lighter run.

## `onlyNewJobs` (type: `boolean`):

Return only jobs that were not returned by a previous run of the same saved task. Use this for scheduled monitoring so you are not billed twice for the same listing.

## Actor input object example

```json
{
  "startUrls": [],
  "searchQueries": [
    "python developer"
  ],
  "location": "Berlin",
  "radius": 20,
  "employmentType": [],
  "careerLevel": [],
  "maxResults": 200,
  "includeDescription": true,
  "onlyNewJobs": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per XING job listing, with salary range, apply URL and full description.

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

The same rows, trimmed to the fields most buyers scan first.

## `OUTPUT` (type: `string`):

Counts per search query, and why pagination stopped.

# 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 = {
    "searchQueries": [
        "python developer"
    ],
    "location": "Berlin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/xing-jobs-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 = {
    "searchQueries": ["python developer"],
    "location": "Berlin",
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/xing-jobs-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 '{
  "searchQueries": [
    "python developer"
  ],
  "location": "Berlin"
}' |
apify call webdata_labs/xing-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webdata_labs/xing-jobs-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/1f5YIQXlqUrJcLXsJ/builds/FcIBhZkoGeNOUR01k/openapi.json
