# Bayt Jobs Scraper — MENA Salaries, Emails & 49 Filters (`memo23/bayt-scraper`) Actor

Scrape Bayt.com — the Middle East's largest job board — across UAE, Saudi Arabia, Qatar, Egypt and more. Search by keyword, location, industry, career level or salary with 49 filters. Structured salaries, recruiter emails and phones, incremental runs and Slack/Telegram alerts. $0.90 per 1,000 jobs.

- **URL**: https://apify.com/memo23/bayt-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 81 total users, 9 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.90 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

### Overview

The **Bayt.com Scraper** is a highly effective tool designed to extract comprehensive job listings from [Bayt.com](https://www.bayt.com/), the leading job portal in the Middle East. This scraper delivers rich, structured data encompassing every critical aspect of job postings to support informed career decisions and recruitment analysis.

With this scraper, users gain access to **detailed job information** including job titles, company names, posting dates, and application deadlines. The tool captures **comprehensive location data** with full details about job locations across the Middle East region.

**Job specifications** are thoroughly extracted, including job descriptions, requirements, qualifications, experience levels, and salary information when available. Employment type (full-time, part-time, contract) and industry classifications provide additional context.

The scraper excels at capturing **company information**, including company names, profiles, and links to company pages for deeper research into potential employers.

**Application details** receive special attention with dedicated fields for application URLs, enabling users to track and apply to opportunities efficiently.

Additional **metadata and classification** includes job categories, industries, and career levels for comprehensive job market analysis.

Whether you're a recruiter analyzing job market trends, an HR professional compiling candidate databases, or a job seeker researching opportunities, this scraper provides the complete, structured dataset needed for professional-grade employment analysis and career planning.

***

### Features

- **Customizable Input Parameters**:
  - Start scraping from specific search URLs or job detail pages.
  - Limit the number of listings to scrape per session.

- **Efficient Data Extraction**:
  - Handles pagination to ensure all listings are captured.
  - Automatically retries failed requests for seamless scraping.

- **Proxy Integration**:
  - Supports proxies to ensure anonymity and reliability.

- **Detailed Data Output**:
  - Extracts job details such as job title, company name, location, description, requirements, and more.

***

### How to Use

1. **Set Up**: Ensure you have an Apify account and access to the Apify platform.
2. **Provide Input Data**: Input specific scraping parameters, such as start URLs and maximum items to scrape.
3. **Adjust Scraper Settings**: Configure settings like `maxConcurrency`, `minConcurrency`, and `maxRequestRetries` to optimize performance.
4. **Run the Scraper**: Execute the scraper on the Apify platform.
5. **Download Results**: Export the scraped data in your preferred format (JSON, CSV, Excel).

***

### Input Configuration

To use the scraper, configure the input parameters as follows:

```json
{
    "startUrls": [
        {
            "url": "https://www.bayt.com/en/uae/jobs/software-engineer-jobs/"
        },
        {
            "url": "https://www.bayt.com/en/uae/jobs/recruitment-researcher-internship-5390096/"
        }
    ],
    "maxItems": 100,
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 3,
    "proxy": {
        "useApifyProxy": true
    }
}
```

#### Input Fields Explanation

- **Start URLs** (`startUrls`): The URLs from which the scraper will begin extracting data. The scraper accepts both:
  - **Search/Listing URLs**: URLs showing multiple job listings (e.g., `https://www.bayt.com/en/uae/jobs/software-engineer-jobs/`)
  - **Individual Job URLs**: Direct links to specific job postings (e.g., `https://www.bayt.com/en/uae/jobs/recruitment-researcher-internship-5390096/`)
- **Max Items** (`maxItems`): Maximum number of listings to scrape per run. Default is `100`.
- **Max Concurrency** (`maxConcurrency`): Maximum number of pages processed simultaneously. Default is `10`.
- **Min Concurrency** (`minConcurrency`): Minimum number of pages processed simultaneously. Default is `1`.
- **Max Request Retries** (`maxRequestRetries`): Number of retries for failed requests. Default is `3`.
- **Proxy Configuration** (`proxy`): Settings for reliable and anonymous scraping. Default uses Apify's Proxy.

***

### Output Structure

The scraper produces a structured JSON output containing detailed information for each job listing.

```json
{
    "accountId": 3979147,
    "acres": 60.34,
    "address": {
        "address1": "438 NE English Ivy Trail",
        "address2": "",
        "city": "Pinetta",
        "state": 12,
        "stateAbbreviation": "FL",
        "stateName": "Florida",
        "zip": "32350"
    },
    "adTargetingPta": "farms",
    "areaLabel": "60.34 acres",
    "attachments": [
        {
            "caption": "Aerial Map",
            "docsPath": "https://files.realstack.com/uploads/.../RcjXEv4lKQ7zBkbc.pdf",
            "documentId": 5342762325,
            "documentTypeId": 20,
            "filename": "RcjXEv4lKQ7zBkbc.pdf",
            "isExternal": true,
            "uploadedAccountFileId": 0,
            "uploadedPropertyFileId": 2566093,
            "url": "https://files.realstack.com/uploads/.../RcjXEv4lKQ7zBkbc.pdf"
        }
    ],
    "auctionAddress": null,
    "auctionCity": null,
    "auctionDate": "01/01/0001, 12:00 AM",
    "auctionId": null,
    "auctionState": "UNDEFINED",
    "auctionTitle": null,
    "auctionUrl": null,
    "baths": 1,
    "beds": 1,
    "breadcrumbSchema": "{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\"}",
    "canDisplay": false,
    "canonicalUrl": "/property/438-NE-English-Ivy-Trail-Pinetta-Florida-32350/20571851/",
    "city": {
        "id": 21021,
        "countyId": 6194,
        "name": "Pinetta",
        "latitude": 30.5941,
        "longitude": -83.35237
    },
    "county": {
        "id": 6194,
        "fips": 12079,
        "name": "Madison County"
    },
    "description": [
        "Situated on beautiful rolling topography..."
    ],
    "externalLink": "https://www.mossyoakproperties.com/property...",
    "halfBaths": 0,
    "homesqft": 896,
    "imageDocumentIds": [5342842217, 5342842249],
    "imageInfo": [
        {
            "documentId": 5342842217,
            "height": 960,
            "width": 1280,
            "label": "Main Photo"
        }
    ],
    "isDiamond": false,
    "isGold": true,
    "isResidence": true,
    "latitude": 30.576742,
    "listingDate": "2024-06-04",
    "listingId": 20571851,
    "price": 1275000,
    "title": "60 Acre Homestead/Hobby Farm",
    "types": ["Farms", "Residential Property"],
    "state": {
        "stateId": 12,
        "stateAbbreviation": "FL",
        "stateName": "Florida"
    }
}
```

#### Field Descriptions

##### General Information

- **accountId**: Unique identifier for the account that owns/manages this property listing.
- **listingId**: Unique identifier for this specific property listing on Land.com.
- **title**: The title/name of the property listing (e.g., "60 Acre Homestead/Hobby Farm").
- **price**: The asking price for the property in USD.
- **listingDate**: The date when this property was listed on Land.com (format: YYYY-MM-DD).

##### Location Information

- **address**: Object containing the complete address details of the property.
  - **address1**: Primary street address line.
  - **address2**: Secondary address line (apartment, suite, etc.) - may be empty.
  - **city**: City where the property is located.
  - **state**: Numeric state identifier/code.
  - **stateAbbreviation**: Two-letter state abbreviation (e.g., "FL" for Florida).
  - **stateName**: Full name of the state.
  - **zip**: ZIP/postal code.
- **city**: Object with detailed city information.
  - **id**: Unique identifier for the city.
  - **countyId**: Reference to the county this city belongs to.
  - **name**: Name of the city.
  - **latitude**: Geographic latitude coordinate of the city center.
  - **longitude**: Geographic longitude coordinate of the city center.
- **county**: Object with county information.
  - **id**: Unique identifier for the county.
  - **fips**: Federal Information Processing Standard (FIPS) code for the county.
  - **name**: Name of the county.
- **state**: Object with state information.
  - **stateId**: Numeric identifier for the state.
  - **stateAbbreviation**: Two-letter state code.
  - **stateName**: Full name of the state.
- **latitude**: Geographic latitude coordinate of the property.
- **longitude**: Geographic longitude coordinate of the property.
- **canonicalUrl**: The canonical/permanent URL path for this property listing.

##### Property Details

- **acres**: Total size of the property in acres.
- **areaLabel**: Human-readable label showing the property size (e.g., "60.34 acres").
- **beds**: Number of bedrooms on the property.
- **baths**: Number of full bathrooms.
- **halfBaths**: Number of half bathrooms (toilet and sink only, no shower/tub).
- **homesqft**: Square footage of the home/residence on the property.
- **isResidence**: Boolean indicating whether the property includes a residential structure.
- **types**: Array of property type categories (e.g., \["Farms", "Residential Property"]).
- **description**: Array of text descriptions about the property.

##### Media and Attachments

- **attachments**: Array of related documents and files for the property.
  - **caption**: Description/title of the attachment.
  - **docsPath**: Direct URL path to the document file.
  - **documentId**: Unique identifier for this document.
  - **documentTypeId**: Numeric type identifier for the document category.
  - **filename**: Original filename of the uploaded document.
  - **isExternal**: Boolean indicating if the document is hosted externally.
  - **uploadedAccountFileId**: Internal ID for account-level file tracking.
  - **uploadedPropertyFileId**: Internal ID for property-level file tracking.
  - **url**: Direct URL to access/download the document.
- **imageDocumentIds**: Array of document IDs specifically for property images.
- **imageInfo**: Array of objects with detailed image information.
  - **documentId**: Unique identifier for the image.
  - **height**: Image height in pixels.
  - **width**: Image width in pixels.
  - **label**: Description/label for the image (e.g., "Main Photo").

##### Listing Classification

- **adTargetingPta**: Property type for ad targeting purposes (e.g., "farms").
- **isDiamond**: Boolean indicating if this is a premium "Diamond" level listing.
- **isGold**: Boolean indicating if this is a "Gold" level listing.

##### Auction Information

- **auctionAddress**: Physical address where the auction will be held (null if not an auction).
- **auctionCity**: City where the auction will take place (null if not an auction).
- **auctionDate**: Date and time of the auction (shows default date if not an auction).
- **auctionId**: Unique identifier for the auction (null if not an auction).
- **auctionState**: State of the auction listing (e.g., "UNDEFINED" if not an auction).
- **auctionTitle**: Title of the auction event (null if not an auction).
- **auctionUrl**: URL to the auction page (null if not an auction).

##### Additional Metadata

- **breadcrumbSchema**: JSON-LD schema markup for breadcrumb navigation (SEO purposes).
- **canDisplay**: Boolean flag indicating if the listing can be displayed.
- **externalLink**: URL to an external website with more property information (e.g., broker's website).

***

### Benefits of the Bayt.com Scraper

- Automates job data collection, saving hours of manual work.
- Provides detailed, accurate, and structured data for analysis.
- Customizable input options for targeted scraping.
- Reliable performance with proxy integration for anonymity.

***

### Why Choose the Bayt.com Scraper?

The Bayt.com Scraper is an indispensable tool for HR professionals, recruiters, and market researchers. It streamlines job market research by delivering high-quality, actionable data directly from Bayt.com, enabling better decision-making and saving time.

***

### Explore More Scrapers

If you found the Bayt.com Scraper useful, check out other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs.

***

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/ftbw0YFo17iTQ2qjv/issues) section of this actor.
- For further assistance, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

***

### Additional Services

- Request customization or a full dataset: <muhamed.didovic@gmail.com>
- Need other platforms scraped? Contact <muhamed.didovic@gmail.com>
- For API services of this scraper, reach out to <muhamed.didovic@gmail.com>

# Actor input Schema

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

Bayt job listing pages (e.g. …/en/uae/jobs/software-engineer-jobs/) or job detail URLs. If every URL is empty, the actor uses **Search by filters** — see the actor description for which fields are required in that case.

## `searchJobKeyword` (type: `string`):

Becomes the keyword segment in the Bayt path (e.g. “software engineer” → …/software-engineer-jobs/). Optional when using filters without URLs: use for a focused search, or leave blank for country-wide listing (still set **Country / region** or rely on its default). If **Country / region** is omitted by your client, this or **Location** must be set.

## `searchLocation` (type: `string`):

City or area name for the path (e.g. “Dubai” → …/jobs-in-dubai/ or combined with keyword).

## `searchCountryRegion` (type: `string`):

**Required when using filters without Start URLs** (unless **Job keyword** or **Location** is set — then the actor may default to `international`). Chooses the Bayt path segment: `uae`, `international`, etc. Schema default: **Middle East & international**.

## `searchPostedWithin` (type: `string`):

Maps to Bayt’s **Date posted** filter.

## `searchSortBy` (type: `string`):

Bayt sort option for the listing.

## `searchEasyApplyOnly` (type: `boolean`):

Matches Bayt’s **Easy Apply only** filter.

## `searchRemoteOnly` (type: `boolean`):

Matches Bayt’s remote-work filter.

## `searchWorkType` (type: `string`):

Bayt employment type filter.

## `searchCareerLevel` (type: `string`):

Maps to Bayt’s **Career level** facet (added to the listing URL).

## `searchLanguage` (type: `string`):

Locale segment used when building listing/detail URLs from filters: English (`/en/`) or Arabic (`/ar/`).

## `searchIndustry` (type: `string`):

Bayt industry facet ID added to the listing URL (`filters[jb_industry_id_original][]`). Accepts one ID or several comma-separated IDs (e.g. `33,25`). Find IDs in the **Industry** sidebar links on a Bayt search page.

## `searchRadiusKm` (type: `integer`):

Applied as a **post-filter** around **Location** (or **Latitude/Longitude** if set). Bayt has no radius URL param. Jobs in cities within this distance are kept; jobs in unknown cities are not dropped. Major MENA cities supported.

## `searchLatitude` (type: `string`):

Optional explicit center for **Search radius**. Overrides the city lookup from **Location**. Use together with **Center longitude** and **Search radius**.

## `searchLongitude` (type: `string`):

Optional explicit center for **Search radius**. Overrides the city lookup from **Location**. Use together with **Center latitude** and **Search radius**.

## `searchMinSalary` (type: `integer`):

Applied as a **post-filter** on the parsed salary (Bayt has no salary URL param). Jobs whose salary is below this value are dropped; jobs without a stated salary are kept. Combine with **Minimum salary currency**.

## `searchMinSalaryCurrency` (type: `string`):

Currency for **Minimum salary** (converted to USD for comparison).

## `onlyNewOrChanged` (type: `boolean`):

Skips jobs that are identical to a previous run. Requires a **Key-Value Store name** below so state persists across runs. Adds a `changeType` field (`new`/`updated`) to each result.

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

When **incremental** is on, still output jobs that did not change (tagged `changeType: "unchanged"`) instead of skipping them.

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

When **incremental** is on, emit a record (`changeType: "expired"`) for jobs that were seen in a previous run but no longer appear. Requires a **Key-Value Store name**.

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

When **incremental** is on, skip jobs whose content duplicates an already-seen job posted under a different ID (tagged internally as `repost`).

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

Which description fields to include in each result.

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

Truncate `descriptionText` / `descriptionHtml` to this many characters. Leave empty for no limit.

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

Drop heavy/nested fields (`descriptionHtml`, `basicInfo`, `preferredCandidate`, `jobDetails`) for a smaller record.

## `removeEmptyFields` (type: `boolean`):

Strip fields that are null, empty strings, empty arrays, or empty objects from each result.

## `phoneExtractionMode` (type: `string`):

Control phone numbers in the `contacts` block. **Off** removes phones, **Description** scans the description (default), **Full** also scans skills / preferred candidate / job details.

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

Maximum number of job listings to collect.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each employer by discovering the company's website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

## `moreResults` (type: `boolean`):

When enabled, keeps paginating to retrieve as many results as Bayt allows.

## `includeListingDetails` (type: `boolean`):

Fetch each job’s detail page for full description and fields.

## `downloadImages` (type: `boolean`):

Download each job’s image (the company logo) into the run’s Key-Value Store and add a `KVImages` array of stored URLs to the result.

## `maxImages` (type: `integer`):

Maximum images to store per job when **Download images** is enabled.

## `storeName` (type: `string`):

Optional named store for long-term retention of listings.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests.

## `minConcurrency` (type: `integer`):

Minimum concurrent requests.

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

Retries per failed request before giving up.

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

Incoming Slack webhook. Receives a short summary when the run finishes.

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

Discord webhook. Receives a short summary when the run finishes.

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

Generic webhook. Receives a JSON payload with the result count and incremental counts when the run finishes.

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

Optional HTTP headers sent with the **Custom webhook URL** request (e.g. an `Authorization` token).

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

Bot token for Telegram notifications. Used together with **Telegram chat ID**.

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

Target chat/channel ID for Telegram notifications. Used together with **Telegram bot token**.

## `whatsappAccessToken` (type: `string`):

WhatsApp Cloud API access token. Used with **WhatsApp phone number ID** and **WhatsApp recipient**.

## `whatsappPhoneNumberId` (type: `string`):

WhatsApp Cloud API sender phone number ID.

## `whatsappTo` (type: `string`):

Recipient phone number (E.164, e.g. 9715XXXXXXXX) for WhatsApp notifications.

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

Include up to this many sample jobs (id, title, company, apply URL) in the webhook payload. Leave empty to send only the summary.

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

With **incremental** on, only send notifications when there is at least one new or updated job.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [],
  "searchCountryRegion": "international",
  "searchPostedWithin": "anytime",
  "searchSortBy": "relevance",
  "searchEasyApplyOnly": false,
  "searchRemoteOnly": false,
  "searchWorkType": "",
  "searchCareerLevel": "",
  "searchLanguage": "en",
  "searchMinSalaryCurrency": "USD",
  "onlyNewOrChanged": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "descriptionFormat": "both",
  "compact": false,
  "removeEmptyFields": false,
  "phoneExtractionMode": "description",
  "maxItems": 100,
  "enrichEmails": false,
  "qualifyByPayment": false,
  "moreResults": false,
  "includeListingDetails": false,
  "downloadImages": false,
  "maxImages": 10,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "notifyOnlyChanges": false
}
```

# Actor output Schema

## `results` (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": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/bayt-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": [] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/bayt-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": []
}' |
apify call memo23/bayt-scraper --silent --output-dataset

```

## MCP server setup

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