# Indeed Jobs Scraper (`parsebird/indeed-jobs-scraper`) Actor

Scrape Indeed job listings and company data by search URL or by keyword, country, location, radius, job type, experience level, remote status, and date posted. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/indeed-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 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

### Indeed Jobs Scraper

Scrape structured job data from Indeed — the world's largest job site — by pasting search URLs or by building a search from a keyword, country, location, and filters. Get job titles, salaries, full descriptions, company profiles, benefits, locations with coordinates, and apply links as clean JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #2557A7;padding:12px 16px;font-weight:600">
Search 60+ Indeed country editions by keyword, location, radius, job type, experience level, remote status, and date posted — or drop in ready-made Indeed search and company URLs — and export 40+ fields per job including structured salary, company size, revenue, industry, CEO, and benefits.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.

```
Actor: parsebird/indeed-jobs-scraper (Apify). Scrapes Indeed job listings. Call it with ApifyClient.
Two input modes:
  Option A (URLs): { "urls": ["https://www.indeed.com/jobs?q=developer&l=Austin%2C+TX", "https://www.indeed.com/cmp/Google/jobs"], "maxRowsPerUrl": 50 }
  Option B (search): { "query": "data analyst", "country": "us", "location": "New York, NY", "radius": "25", "jobType": "fulltime", "level": "senior_level", "remote": "remote", "sort": "date", "fromDays": "7", "maxRows": 100, "enableUniqueJobs": false }
`query` + `country` are required for Option B. `country` is a 2-letter code (us, uk, ca, de, fr, in, au, ...). Enums:
  radius: 0,5,10,15,25,35,50,100 | jobType: fulltime,parttime,contract,internship,temporary,permanent,seasonal,freelance
  level: entry_level,mid_level,senior_level (US only) | sort: relevance,date | fromDays: 1,3,7,14 | remote: remote,hybrid
Output: one dataset item per job — title, companyName, companyUrl, companyLogoUrl, salary{salaryMin,salaryMax,salaryType,salaryCurrency,salarySource},
location{city,admin1Code,postalCode,latitude,longitude,formattedAddressLong}, descriptionText, descriptionHtml, jobType[], isRemote,
benefits[], occupation[], attributes[], hiringDemand{isUrgentHire,isHighVolumeHiring}, datePublished, age, postedToday, expired,
companyNumEmployees, companyRevenue, companyIndustry, companyCeo, companyLinks, emails[], jobUrl, applyUrl, jobKey, language, locale.
Pricing: pay-per-result. API docs: https://apify.com/parsebird/indeed-jobs-scraper/api  Token: https://console.apify.com/account/integrations
```

### What does Indeed Jobs Scraper do?

This Actor extracts job postings and the company data attached to them from [Indeed](https://www.indeed.com). It uses Indeed's own mobile data source, so results are structured and complete — no brittle HTML parsing, no missing fields.

- 🔎 **Two ways to search** — paste Indeed search/company URLs (Option A), or set a keyword plus filters and let the Actor build the search (Option B).
- 🌍 **60+ country editions** — `us`, `uk`, `ca`, `de`, `fr`, `in`, `au`, `nl`, `es`, `it`, `br`, `mx`, `jp`, and more.
- 🧰 **Full filter set** — job title keyword, location, radius, job type, experience level, remote/hybrid, posted-within-N-days, and relevance/date sorting.
- 💸 **Structured salary** — minimum, maximum, pay period, currency, and whether the figure is employer-stated or an Indeed estimate.
- 🏢 **Company enrichment on every job** — logo, header image, size, revenue, industry, short description, CEO, corporate website.
- 📍 **Geocoded locations** — city, state code, postal code, latitude, longitude, and a formatted full address.
- 🧾 **Rich job metadata** — benefits, occupation categories, skill attributes, shift & schedule, urgent/high-volume hiring flags, expired status.
- 🧹 **Deduplication** — skips repeated job keys automatically, and optionally repostings of the same title at the same company.

#### How is this different from copying Indeed by hand?

Indeed shows ~15 jobs per page and hides most structured data behind the job detail view. This Actor returns hundreds of fully-enriched jobs per run, each with a plain-text and an HTML description, a parsed salary object, and a full company profile — ready for a spreadsheet, a database, or a model.

### Input parameters

`query` and `country` are required unless you provide `urls`. When `urls` is set, all Option B parameters are ignored.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| urls | array | Option A | `[]` | Indeed search URLs (`.../jobs?q=...&l=...`) or company URLs (`.../cmp/<Company>/jobs`). Filters embedded in the URL are applied. |
| maxRowsPerUrl | integer | No | 50 | Max jobs to scrape per URL in `urls`. |
| query | string | Option B | — | Job title, skill, or company keyword, e.g. `"data analyst"`. |
| country | string | Option B | `us` | Indeed country edition. 2-letter code — `ar, au, at, bh, be, br, ca, cl, cn, co, cr, cz, dk, ec, eg, fi, fr, de, gr, hk, hu, in, id, ie, il, it, jp, kw, lu, my, mx, ma, nl, nz, ng, no, om, pk, pa, pe, ph, pl, pt, qa, ro, sa, sg, za, kr, es, se, ch, tw, th, tr, ua, ae, uk, us, uy, ve, vn`. |
| location | string | No | — | City, state, or postal code, e.g. `"San Francisco, CA"`. |
| radius | string | No | `25` | Miles from `location`: `0, 5, 10, 15, 25, 35, 50, 100`. |
| jobType | string | No | — | `fulltime, parttime, contract, internship, temporary, permanent, seasonal, freelance`. |
| level | string | No | — | `entry_level, mid_level, senior_level`. United States edition only. |
| remote | string | No | — | `remote` or `hybrid`. |
| sort | string | No | `relevance` | `relevance` or `date`. |
| fromDays | string | No | — | Only jobs posted within `1, 3, 7, 14` days. |
| maxRows | integer | No | 100 | Max jobs to scrape for the Option B search (hard cap 5000). |
| enableUniqueJobs | boolean | No | false | Also drop repostings of the same title at the same company. |
| proxyConfiguration | object | No | Apify Proxy | Proxy settings. Apify Proxy (automatic) is recommended and sufficient. |

#### Input example (URL-based)

```json
{
  "urls": [
    "https://www.indeed.com/jobs?q=developer&l=Remote",
    "https://www.indeed.com/cmp/Google/jobs"
  ],
  "maxRowsPerUrl": 50
}
```

#### Input example (search parameters)

```json
{
  "query": "data analyst",
  "country": "us",
  "location": "New York, NY",
  "radius": "25",
  "jobType": "fulltime",
  "sort": "date",
  "fromDays": "7",
  "remote": "remote",
  "maxRows": 100
}
```

### Output example

```json
{
  "title": "Senior Data Analyst",
  "isRemote": true,
  "jobType": ["Full-time", "Remote"],
  "companyName": "Acme Analytics",
  "companyUrl": "https://www.indeed.com/cmp/Acme-Analytics",
  "companyLogoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/abc123",
  "companyHeaderUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/def456",
  "emails": ["talent@acme.example"],
  "companyAddresses": ["Dallas, TX"],
  "companyNumEmployees": "1,001 to 5,000",
  "companyRevenue": "$500M to $1B (USD)",
  "companyIndustry": "Information Technology",
  "companyDescription": "Acme Analytics helps teams turn raw data into decisions.",
  "companyBriefDescription": "Acme Analytics helps teams turn raw data into decisions.",
  "companyLinks": { "corporateWebsite": "https://acme.example" },
  "companyCeo": { "name": "Jordan Lee", "photoUrl": "https://.../ceo.jpg", "startDate": null },
  "location": {
    "countryCode": "US",
    "country": "United States",
    "city": "Dallas",
    "admin1Code": "TX",
    "postalCode": "75201",
    "latitude": 32.7810,
    "longitude": -96.7969,
    "streetAddress": "500 Main St",
    "formattedAddressShort": "Dallas, TX",
    "formattedAddressLong": "Dallas, TX 75201",
    "fullAddress": "500 Main St, Dallas, TX 75201"
  },
  "benefits": ["Health insurance", "401(k)", "Paid time off"],
  "occupation": ["Data & Database Occupations", "Technology Occupations"],
  "attributes": ["SQL", "Python", "Tableau", "Bachelor's degree", "5 years"],
  "shiftAndSchedule": ["Monday to Friday"],
  "descriptionText": "We are hiring a Senior Data Analyst to ...",
  "descriptionHtml": "<p>We are hiring a Senior Data Analyst to ...</p>",
  "salary": {
    "salaryText": null,
    "salaryType": "yearly",
    "salaryMin": 110000.0,
    "salaryMax": 140000.0,
    "salarySource": "EXTRACTION",
    "salaryCurrency": "USD"
  },
  "age": "Just posted",
  "postedToday": true,
  "datePublished": "2026-08-28",
  "hiringDemand": { "isUrgentHire": false, "isHighVolumeHiring": true },
  "expired": false,
  "scrapingInfo": { "page": 0, "index": 3 },
  "source": "Acme Analytics",
  "jobUrl": "https://www.indeed.com/viewjob?jk=1e6e49448374145b",
  "applyUrl": "https://acme.example/careers/senior-data-analyst",
  "jobKey": "1e6e49448374145b",
  "language": "en",
  "locale": "en_US"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| title | string | Job title. |
| isRemote | boolean | Whether the job is remote-eligible (from attributes and location). |
| jobType | string\[] | Human labels Indeed applied, e.g. `Full-time`, `Contract`, plus `Remote` / `Hybrid`. |
| companyName | string | Employer name. |
| companyUrl | string | Indeed company profile URL. |
| companyLogoUrl / companyHeaderUrl | string | Company images. |
| emails | string\[] | Emails found in the job description. |
| companyAddresses | string\[] | Employer addresses from the company profile. |
| companyNumEmployees | string | Employee count band, e.g. `1,001 to 5,000`. |
| companyRevenue | string | Revenue band, e.g. `$500M to $1B (USD)`. |
| companyIndustry | string | Industry label. |
| companyDescription / companyBriefDescription | string | Company summary. |
| companyLinks | object | `corporateWebsite` when available. |
| companyCeo | object | `name`, `photoUrl`, `startDate`. |
| location | object | `countryCode`, `country`, `city`, `admin1Code`, `postalCode`, `latitude`, `longitude`, `streetAddress`, `formattedAddressShort`, `formattedAddressLong`, `fullAddress`. |
| benefits | string\[] | Benefits detected in the job attributes. |
| occupation | string\[] | Indeed occupation categories. |
| attributes | string\[] | All skill / qualification / tag attributes. |
| shiftAndSchedule | string\[] | Shift and schedule attributes. |
| descriptionText / descriptionHtml | string | Job description, plain text and HTML. |
| salary | object | `salaryText`, `salaryType`, `salaryMin`, `salaryMax`, `salarySource` (`EXTRACTION` = employer-stated, `ESTIMATION` = Indeed estimate), `salaryCurrency`. `null` when no salary is shown. |
| age | string | Relative age, e.g. `Just posted`, `3 days ago`, `30+ days ago`. |
| postedToday | boolean | Posted today. |
| datePublished | string | `YYYY-MM-DD`. |
| hiringDemand | object | `isUrgentHire`, `isHighVolumeHiring`. |
| expired | boolean | Listing no longer active. |
| scrapingInfo | object | `page` and `index` where the job was found. |
| source | string | Where the listing originated (ATS / job board / company). |
| jobUrl | string | Indeed job URL. |
| applyUrl | string | Direct apply / view URL when available. |
| jobKey | string | Indeed job identifier. |
| language / locale | string | Job language and locale, e.g. `en`, `en_US`. |

### Use cases

- **Job market research** — track salary ranges, hiring volume, and in-demand skills by role, city, or industry.
- **Recruiting & sourcing** — monitor competitor job openings and build talent-market maps.
- **Job boards & aggregators** — ingest fresh, structured listings for a niche vertical.
- **Lead generation** — companies that are hiring are companies that are spending; enrich them with size, revenue, and website.
- **AI & LLM pipelines** — feed clean job descriptions and structured salary data into embeddings, RAG, or fine-tuning sets.
- **Alerting** — schedule the Actor and get notified when new jobs match a saved search.

### How it works

1. You provide either a list of Indeed URLs or an Option B search (keyword + country + filters).
2. For each task, the Actor queries Indeed's mobile job-search data source for the chosen country edition.
3. Job type, remote/hybrid, and date filters are applied — server-side where Indeed allows it, otherwise on the returned results.
4. Company URLs are matched by company name; only that company's listings are kept.
5. Results are paginated until `maxRows` (or `maxRowsPerUrl`) is reached, deduplicated by job key, transformed into the output schema, and pushed to the dataset.
6. Export from the Apify Console or API as JSON, CSV, Excel, or feed them straight into your integrations.

### Using the Actor via API

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "query": "registered nurse",
    "country": "us",
    "location": "Dallas, TX",
    "radius": "25",
    "sort": "date",
    "maxRows": 100,
}

run = client.actor("parsebird/indeed-jobs-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "—", item["companyName"], "—", item.get("salary"))
```

#### JavaScript

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

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

const input = {
    urls: ['https://www.indeed.com/jobs?q=software+engineer&l=Remote'],
    maxRowsPerUrl: 50,
};

const run = await client.actor('parsebird/indeed-jobs-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

The Actor runs on the [Apify platform](https://apify.com), so you also get scheduling, a full REST API, webhooks, and native integrations with Make, Zapier, Google Sheets, Slack, and more. Results export as JSON, CSV, Excel, XML, or RSS.

### Pricing

This Actor uses the **pay-per-result** pricing model — you are charged per job scraped, regardless of compute time.

| Plan | Price per job | Price per 1,000 jobs |
|------|---------------|----------------------|
| Free | $0.003 | **$3.00** |
| Bronze | $0.0027 | **$2.70** |
| Silver | $0.0025 | **$2.50** |
| Gold | $0.0023 | **$2.30** |

A job is counted when it is pushed to the dataset. Scraping 1,000 jobs on the Free plan costs about $3.00. Runs that return no data cost nothing beyond a few seconds of platform usage.

### FAQ

**Do I need Indeed login credentials or an API key?**
No. You only need an Apify account.

**Which countries are supported?**
60+ Indeed country editions — see the `country` list in the input table. Use the 2-letter code for the edition you want.

**Can I scrape a specific company's jobs?**
Yes. Put the company URL (e.g. `https://www.indeed.com/cmp/Google/jobs`) in `urls`. The Actor keeps only listings from that company.

**How fresh are the results?**
Live — every run queries Indeed directly. Use `fromDays` and `sort: "date"` to focus on the newest postings.

**Why is `salary` sometimes `null`?**
Many Indeed postings do not display a salary. When present, `salarySource` tells you whether the figure is employer-stated (`EXTRACTION`) or an Indeed estimate (`ESTIMATION`).

**Why do some jobs have an empty `benefits` or `companyCeo`?**
Indeed only attaches that data to some postings and some companies. Fields with no data are returned empty or `null` rather than guessed.

**Can I filter by experience level outside the US?**
Indeed only exposes the entry/mid/senior filter on its United States edition, so `level` is applied for `country: "us"` only.

**Can I schedule recurring runs?**
Yes. Use Apify's [scheduler](https://docs.apify.com/platform/schedules) to run the Actor hourly, daily, or on any cron expression, and connect a webhook or integration to route new jobs onward.

**How large can a run be?**
Up to 5,000 jobs per run. For more, split the work across multiple searches (by location, role, or date window) and schedule them.

### Related Actors

- [Hiring.cafe Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — aggregated tech and startup jobs with 20+ filters.
- [We Work Remotely Jobs Scraper](https://apify.com/parsebird/wwr-jobs-scraper) — remote-only job board.
- [Wellfound Jobs Scraper](https://apify.com/parsebird/wellfound-jobs-scraper) — startup jobs from Wellfound (AngelList Talent).
- [Naukri Jobs Scraper](https://apify.com/parsebird/naukri-jobs-scraper) — India's largest job portal.
- Browse the full [ParseBird publisher page](https://apify.com/parsebird) for more scrapers.

### Legal and compliance

This Actor collects only publicly available job listings and company information from Indeed — data that any visitor can view without logging in. It does not access private data or bypass authentication. You are responsible for using the scraped data in accordance with Indeed's terms, applicable laws (including the GDPR and CCPA where relevant), and the purpose limitations that apply to personal data. Do not use the output to spam candidates or employers. If you plan to scrape at scale or for commercial redistribution, seek legal advice first.

# Actor input Schema

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

Indeed search URLs (e.g. https://www.indeed.com/jobs?q=developer\&l=Austin%2C+TX) or company URLs (e.g. https://www.indeed.com/cmp/Google/jobs). When set, all Option B parameters are ignored. Filters embedded in the URL (job type, date posted, remote, radius, sort) are applied.

## `maxRowsPerUrl` (type: `integer`):

Maximum number of jobs to scrape for each URL in the list above.

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

Job title, skill, or company to search for. Example: "data analyst". Required for Option B (unless you use URLs).

## `country` (type: `string`):

Indeed country edition to search. Required for Option B.

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

City, state, or postal code to search near. Example: "San Francisco, CA". Leave empty to search the whole country.

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

Distance from the location to include. Ignored when no location is set.

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

Filter by employment type.

## `level` (type: `string`):

Filter by seniority. Supported on the United States edition only.

## `remote` (type: `string`):

Keep only remote or only hybrid jobs.

## `sort` (type: `string`):

Order results by relevance or by most recent.

## `fromDays` (type: `string`):

Only include jobs posted within this many days.

## `maxRows` (type: `integer`):

Maximum number of jobs to scrape for the Option B search. Start low for a quick, cheap test run.

## `enableUniqueJobs` (type: `boolean`):

Drop repostings of the same role (same title + company) in addition to exact duplicate job keys.

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

Proxy used for Indeed API requests. Apify Proxy (automatic) is recommended and enough for this Actor.

## Actor input object example

```json
{
  "urls": [],
  "maxRowsPerUrl": 50,
  "query": "data analyst",
  "country": "us",
  "location": "New York, NY",
  "radius": "25",
  "jobType": "",
  "level": "",
  "remote": "",
  "sort": "relevance",
  "fromDays": "",
  "maxRows": 50,
  "enableUniqueJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "urls": [],
    "maxRowsPerUrl": 50,
    "query": "data analyst",
    "country": "us",
    "location": "New York, NY",
    "maxRows": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/indeed-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 = {
    "urls": [],
    "maxRowsPerUrl": 50,
    "query": "data analyst",
    "country": "us",
    "location": "New York, NY",
    "maxRows": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/indeed-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 '{
  "urls": [],
  "maxRowsPerUrl": 50,
  "query": "data analyst",
  "country": "us",
  "location": "New York, NY",
  "maxRows": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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