# Totaljobs Scraper 💰 $1.35/1K — UK Jobs, Salaries & Contacts (`corvuslab/totaljobs-scraper`) Actor

Extract UK job listings, salaries, company details and contact info from totaljobs.com. 8 server-side filters, incremental monitoring with repost detection, and Slack/Telegram/Discord alerts. Lead-gen ready — filter to only jobs with an email or phone.

- **URL**: https://apify.com/corvuslab/totaljobs-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.35 / 1,000 results

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

### What does Totaljobs Scraper do?

Totaljobs Scraper extracts structured job listings from [totaljobs.com](https://www.totaljobs.com), the UK's largest independent job board. Enter a keyword like `data analyst` and a location like `Manchester` — or paste any Totaljobs search or detail URL — and get back clean, typed records with salary breakdowns, company details, posting dates, geo coordinates, descriptions in three formats (text, HTML, Markdown) and extracted contact information. Use the built-in **lead-gen filter** to keep only listings with an email or phone, turning every run into a ready-made outreach list. Export to JSON, CSV, Excel or pull from the API — no code required.

> New to Apify? You can sign up for free and use the included monthly platform credit to try this Actor.

**Why this scraper**

- ⚡ **Fast & low-cost** — lightweight requests with no browser overhead, so large runs stay cheap.
- 🧾 **Rich, typed records** — 60 structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### Key features

- 🔎 **Search or URL scraping** — run a keyword + location search, or paste Totaljobs search and detail URLs directly.
- 🎚️ **8 server-side filters** — job type, company type (direct / agency), posted within, sort order, radius, minimum salary (annual / daily / hourly) and exclude-sponsored — all applied on the site so you only download what you need.
- 🧾 **Structured salary** — the human-readable salary string plus a parsed breakdown (min, max, currency, period) when the listing provides it.
- 📝 **3 description formats** — plain text, HTML and Markdown, with optional length truncation to control LLM prompt cost.
- 📇 **Contacts & lead gen** — emails, phones, URLs and social profiles extracted from every listing. Use the built-in **require-contact filter** to keep only leads with a verified email, phone or both — every run is a ready-made outreach list with no post-processing.
- ♻️ **Incremental monitoring with repost detection** — schedule it and get only NEW, UPDATED and EXPIRED records; unchanged items are skipped before their page is even fetched. The repost detector flags jobs that reappear after expiring, so you never double-count a recycled vacancy.
- 🔔 **4 notification channels** — Telegram, Slack, Discord or any generic webhook (n8n / Make / Zapier). Combine with incremental mode to get pinged only about genuinely new or changed jobs.
- 🤖 **AI-ready** — compact mode + drop-empty output keep payloads small for LLMs and MCP tool chains.
- 🚫 **Exclude sponsored** — strip promoted listings for cleaner organic results.

***

### 🚀 How to scrape Totaljobs

1. Open the actor and enter a **search keyword** (e.g. `data analyst`) and optionally a **location** (e.g. `London`) — or paste a Totaljobs URL.
2. Pick any combination of the **8 filters** (job type, company type, posted within, sort, radius, minimum salary + period, exclude sponsored).
3. Set **Max results** and choose whether to **fetch full details**.
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start**.
6. Download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search (comma-separate for multiple searches). |
| `location` | City, town or region (e.g. London, Manchester). Leave empty for all UK. |
| `startUrls` | Scrape specific Totaljobs search or detail URLs directly. |
| `jobType` | Filter: permanent, contract, part-time, temporary or work from home. |
| `companyType` | Filter: direct employer or agency. |
| `postedWithin` | Filter: last 24 hours, 3, 7 or 14 days. |
| `sortBy` | Sort by relevance, date or salary (high / low). |
| `radius` | Search radius: 5, 10, 20 or 30 miles from the location. |
| `minSalary` | Minimum salary filter (period set by `salaryPeriod`). |
| `salaryPeriod` | Salary period: annual (default), daily rate, or hourly rate. |
| `excludeSponsored` | Skip promoted / sponsored listings. |
| `includeDetails` | Fetch each job's detail page for description, salary breakdown and coordinates. |
| `requireContact` | Keep only listings with an email, phone or both — built-in lead-gen filter. |
| `outputFields` | Pick exactly which fields to include (e.g. `["title", "url", "salary"]`). Overrides compact. |
| `compact` | Return only core fields — ideal for AI agents and MCP clients. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of records (0 = unlimited). |

...and **35 inputs** in total — the table shows the essentials; the rest cover notification channels, output/AI modes, repost detection and advanced tuning, all in the visual editor.

#### Example inputs

**Basic keyword search**

```json
{ "query": "software engineer", "location": "London", "maxResults": 100 }
```

**Filtered search — recent permanent roles above a salary floor**

```json
{
  "query": "data analyst",
  "location": "Manchester",
  "jobType": "permanent",
  "postedWithin": "7",
  "minSalary": 35000,
  "sortBy": "salary_high",
  "maxResults": 200
}
```

**Incremental monitoring with Slack alerts**

```json
{
  "query": "devops engineer",
  "location": "Bristol",
  "incrementalMode": true,
  "skipReposts": true,
  "notifyOnlyChanges": true,
  "slackWebhookUrl": "https://hooks.slack.com/services/T.../B.../xxx",
  "maxResults": 0
}
```

***

### Output

Each item in the dataset is one job listing. **Fetch full details** is on by default and enriches every record with the full description, structured salary, geo coordinates, benefits, company ratings and extracted contacts. Here is a real detail-enriched record:

```json
{
  "id": "107882681",
  "title": "Software Engineer",
  "url": "https://www.totaljobs.com/job/software-engineer/hackajob-ltd-job107882681",
  "companyId": "1461528",
  "companyName": "Hackajob Ltd",
  "companyUrl": "https://www.totaljobs.com/jobs/hackajob-ltd?cmpId=1461528&cmp=1",
  "companyLogoUrl": "https://tjgliveassets.s3.eu-west-1.amazonaws.com/company-logos/01a731a76abe4ee4b5f58b72600d5a61.png",
  "companyWebsite": "https://hackajob.co",
  "companyRating": null,
  "location": "St James, South West London (SW1), SW1A",
  "postCode": "SW1A",
  "datePosted": "2026-08-21T15:09:05.95Z",
  "workFromHome": "2",
  "remoteType": "hybrid",
  "salary": "£40k - £70k per year",
  "salaryMin": 40000,
  "salaryMax": 70000,
  "salaryCurrency": "GBP",
  "salaryPeriod": "year",
  "description": "We are looking for a Software Engineer to join our team...",
  "descriptionHtml": "<p>We are looking for a Software Engineer...</p>",
  "descriptionMarkdown": "We are looking for a **Software Engineer**...",
  "employmentType": "FULL_TIME",
  "industry": "IT",
  "benefits": ["Pension", "Private healthcare", "25 days holiday"],
  "validThrough": "2026-10-02T15:09:05.95Z",
  "latitude": 51.5014,
  "longitude": -0.1419,
  "country": "GB",
  "region": "London",
  "directApply": true,
  "extractedEmails": ["careers@hackajob.co"],
  "socialProfiles": { "linkedin": "https://linkedin.com/company/hackajob" },
  "textSnippet": "hackajob is partnering directly with BAE Systems Digital Intelligence...",
  "skills": ["Python", "AWS", "Docker"],
  "isSponsored": false,
  "publishFromDate": "2026-08-21T15:09:05.95Z",
  "publishToDate": "2026-10-02T15:09:05.95Z",
  "source": "totaljobs",
  "searchKeyword": "software engineer",
  "scrapedAt": "2026-08-24T12:52:14.173Z",
  "detailFetched": true
}
```

Descriptions come as plain text, HTML and Markdown — choose the format with the **Description format** input, or truncate with **Description max length** to control LLM prompt cost.

When **incremental mode** is on, records carry a `changeType` field (`NEW` / `UPDATED` / `EXPIRED`) and repost-detection fields (`isRepost`, `repostOfId`, `repostDetectedAt`).

#### Data fields

- **Core** — id, title, url, location, postCode, datePosted, salary, textSnippet, skills, labels, isSponsored, publishFromDate, publishToDate, harmonisedId, source, searchKeyword, scrapedAt.
- **Details** (with `includeDetails`) — description, descriptionHtml, descriptionMarkdown, employmentType, industry, benefits, validThrough, salaryMin, salaryMax, salaryCurrency, salaryPeriod, latitude, longitude, country, region, streetAddress, directApply, workFromHome, remoteType.
- **Contacts & signals** — extractedEmails, extractedPhones, extractedUrls, socialProfiles, phoneNumber, applyEmail, contactName.
- **Company** — companyId, companyName, companyUrl, companyLogoUrl, companyWebsite, companyRating.
- **Incremental** — changeType, contentHash, isRepost, repostOfId, repostDetectedAt.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads. Use **`outputFields`** to pick exactly the fields you need. With **`excludeEmptyFields`** enabled, null/empty fields are omitted entirely.

***

### 📇 Built-in lead-gen filter — no post-processing

Most scrapers dump everything and leave filtering to you. This one has a **require-contact filter** built in: set `requireContact` to `email`, `phone`, `either` or `both` and only listings with verified contact details make it into your dataset. Every run is a ready-made outreach list — no spreadsheet cleanup, no extra tools.

Combine it with incremental mode to get notified only when a **new** job with contact details appears:

```json
{
  "query": "sales manager",
  "requireContact": "email",
  "incrementalMode": true,
  "notifyOnlyChanges": true,
  "slackWebhookUrl": "https://hooks.slack.com/services/T.../B.../xxx"
}
```

***

### 💡 What can you do with Totaljobs data?

- **Lead generation** — filter for listings with emails or phone numbers and feed them straight into your CRM or outreach tool.
- **Market & salary research** — track salary ranges, employment types and in-demand skills across UK regions and industries.
- **Vacancy monitoring** — schedule it with incremental mode + notifications for a live feed of new, updated and expired jobs in your niche.
- **Recruitment intelligence** — spot which companies are hiring, how long their postings stay live and whether they repost expired roles.
- **Enrichment & aggregation** — merge clean Totaljobs records with data from other boards into a single warehouse or spreadsheet.
- **AI agents & pipelines** — compact output plugs straight into LLM/MCP workflows for automated job matching, summarization or alerting.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** records — unchanged items are skipped *before* their detail page is fetched, so a daily watch costs a fraction of a full re-scrape.

Enable **Skip reposts** to automatically detect jobs that reappear after expiring — recycled vacancies are flagged rather than counted as new, giving you a cleaner change feed.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta.

***

### 💰 How much does it cost to scrape Totaljobs?

This Actor uses the **pay-per-event** pricing model: a small fee at run start plus a per-record fee. It runs on lightweight HTTP requests with no browser overhead, so the underlying platform cost is minimal.

| Records | Event cost | Typical total |
|---|---|---|
| 10 | ~$0.02 | ~$0.03 |
| 25 | ~$0.04 | ~$0.05 |
| 100 | ~$0.15 | ~$0.16 |
| 500 | ~$0.69 | ~$0.71 |
| 1,000 | ~$1.36 | ~$1.39 |

*Event cost = $0.01 run start + $0.00135 per record. Total includes estimated compute and residential proxy.*

**Incremental mode slashes recurring costs.** Unchanged records are skipped before their detail page is fetched, so a daily monitoring run bills only the delta — see the [savings table above](#️-incremental-monitoring--pay-for-changes-not-repeats). New Apify accounts get $5 in monthly credit — enough to run several hundred jobs with no credit card.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents via the Apify MCP server at `https://mcp.apify.com` — compact mode keeps token usage small.

***

### 🔗 Using the API

You can run this Actor from your own code. Example with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "query": "data analyst",
    "location": "Manchester",
    "jobType": "permanent",
    "maxResults": 50,
}

run = client.actor("corvuslab/totaljobs-scraper").call(run_input=run_input)

print("Results: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

The Actor also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

***

### ❓ FAQ

**Do I need a proxy or login?** No login — it runs out of the box with residential proxy (included in the default config). No setup needed.

**Can I get only new jobs on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

**What are the 8 filters?** Job type, company type (direct / agency), posted within, sort order, search radius, minimum salary (annual / daily / hourly), and exclude sponsored. All are applied on the site itself so you only download matching results.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly and you can truncate descriptions to control token cost.

**How does repost detection work?** When incremental mode is on, the actor remembers expired listings. If a job reappears with the same content, it is flagged as a repost rather than counted as new — so your change feed stays clean.

**How many records can I get?** As many as the search returns — set `maxResults` to cap the volume (0 = unlimited).

**Can it notify me when new jobs appear?** Yes — add a Telegram, Slack, Discord or generic webhook target under Notifications, and combine with incremental mode so you only get pinged about new and updated jobs.

**Is scraping Totaljobs legal?** This actor collects only **publicly available** data on totaljobs.com. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by Totaljobs or the StepStone Group.

***

**Keywords:** totaljobs scraper · totaljobs api · totaljobs.com scraper · UK job scraper · UK job board scraper · totaljobs data extraction · job listings scraper · scrape totaljobs · totaljobs salary data · UK recruitment data · job monitoring · job vacancy tracker · lead generation jobs UK · export totaljobs to CSV · export totaljobs to Excel · no-code job scraper · MCP tool for AI agents · totaljobs job alerts

# Actor input Schema

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

Job title or keywords to search for. Separate multiple searches with commas — each runs independently and results are merged.

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

City, town, or region (e.g. London, Manchester, Bristol). Leave empty to search across the whole UK.

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

Paste Totaljobs search or listing URLs to scrape directly. Detail-page URLs (e.g. /job/...) work here too. When provided, keyword and location are ignored.

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

Maximum number of records to return. Set 0 for unlimited (bounded by how many the search has).

## `ignoreUrlFailures` (type: `boolean`):

Skip URLs that cannot be interpreted instead of failing the whole run.

## `jobType` (type: `string`):

Filter by employment type.

## `companyType` (type: `string`):

Filter by employer type.

## `postedWithin` (type: `string`):

Only show jobs posted within this many days.

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

Sort order for results.

## `radius` (type: `string`):

Search radius around the location (UK miles). Only 5, 10, 20 and 30 are supported; other values default to 30. Requires a location.

## `minSalary` (type: `integer`):

Minimum salary filter. The period is set by Salary period (annual by default).

## `salaryPeriod` (type: `string`):

Period for the minimum salary filter.

## `excludeSponsored` (type: `boolean`):

Skip sponsored/promoted listings.

## `requireContact` (type: `string`):

Keep only records that include a contact. off = keep everything; email / phone = require that channel; either = at least one; both = email and phone. Screened at emit time, so it also trims what you're billed for.

## `includeDetails` (type: `boolean`):

Fetch each job's detail page for full description, ISO dates, salary, and geo coordinates. Slower but much richer data.

## `descriptionFormat` (type: `string`):

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Truncate description fields to this many characters (0 = no truncation). Controls LLM prompt cost and dataset size.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `outputFields` (type: `array`):

Select specific fields to include in each record. Leave empty to include all fields. Overrides compact mode when set.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

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

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

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

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

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

Also emit records that have not changed since the previous run.

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

Emit records for jobs present last run but gone now.

## `skipReposts` (type: `boolean`):

In incremental mode, skip jobs that appear to be reposts of a previously-expired listing.

## `notifyOnlyChanges` (type: `boolean`):

With incremental mode on, only send notifications for NEW / UPDATED / REAPPEARED jobs.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

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

Residential proxy is required — the site blocks datacenter IPs. The default works out of the box.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "query": "data analyst",
  "maxResults": 25,
  "ignoreUrlFailures": true,
  "jobType": "",
  "companyType": "",
  "postedWithin": "",
  "sortBy": "relevance",
  "radius": "",
  "salaryPeriod": "annual",
  "excludeSponsored": false,
  "requireContact": "off",
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "outputFields": [
    "id",
    "title",
    "url",
    "companyName",
    "salary",
    "location"
  ],
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notifyOnlyChanges": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  },
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": "software engineer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/totaljobs-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 = { "query": "software engineer" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/totaljobs-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 '{
  "query": "software engineer"
}' |
apify call corvuslab/totaljobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/totaljobs-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/WPDiMwgEiFfEU83kx/builds/38yHlGUCvyNcJ4Udh/openapi.json
