# 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
- **Features:** Limited permissions
- **Stats:** 194 total users, 27 monthly users, 98.9% 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 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
{
    "id": "2383218",
    "title": "Full Stack Developer",
    "companyName": "WORLDORF Ventures LLC.",
    "companyUrl": "https://www.bayt.com/en/company/worldorf-ventures-llc-2302096/",
    "locationCity": "Dubai",
    "locationCountry": "AE",
    "postedDateText": "2026-05-21",
    "applyUrl": "https://www.bayt.com/en/job/apply/index/5456949/",
    "applyButtonText": null,
    "descriptionText": "We are a startup building a prediction market platform...",
    "skills": [
        "Strong full stack experience with a track record of shipping production apps.",
        "Native mobile development experience with Swift for iOS and Kotlin for Android."
    ],
    "careerLevel": "Mid career",
    "yearsOfExperience": null,
    "employmentType": "Full Time",
    "jobRole": null,
    "monthlySalaryRange": "USD 2000.00 - 3000.00 per month",
    "numberOfVacancies": "1",
    "companyIndustry": null,
    "companyType": null,
    "workStyle": null,
    "residenceLocation": null,
    "gender": null,
    "nationality": null,
    "degree": null,
    "age": null,
    "salary": {
        "raw": "USD 2000.00 - 3000.00 per month",
        "currency": "USD",
        "min": 2000,
        "max": 3000,
        "period": "month",
        "usdMin": 2000,
        "usdMax": 3000,
        "isEstimate": false
    },
    "contacts": {
        "emails": [],
        "phones": [],
        "links": [],
        "socialProfiles": []
    },
    "companyLogo": "https://secure.b8cdn.com/58x58/images/logo/96/2302096_logo_264x120_1779113782_n.png",
    "datePosted": "2026-05-21",
    "expiryDate": "2026-06-20T00:00:00Z",
    "KVImages": [
        "https://api.apify.com/v2/key-value-stores/.../records/2383218-0.png"
    ]
}
```

#### Field Descriptions

##### Job Information

- **id**: Unique identifier for the job listing on Bayt.com.
- **title**: The job title (e.g., "Full Stack Developer").
- **descriptionText**: Full job description text.
- **skills**: Array of required skills, qualifications, and requirements.
- **careerLevel**: Seniority level of the role (e.g., "Mid career", "Entry level").
- **yearsOfExperience**: Required years of experience (null if not specified).
- **employmentType**: Type of employment (e.g., "Full Time", "Part Time", "Contract").
- **jobRole**: The job function/role classification (null if not specified).
- **numberOfVacancies**: Number of open positions for this listing.
- **workStyle**: Work arrangement (e.g., on-site, remote, hybrid; null if not specified).
- **postedDateText**: Posting date as shown on the listing.
- **datePosted**: Normalized posting date (format: YYYY-MM-DD).
- **expiryDate**: Date the listing expires (ISO 8601 timestamp).

##### Company Information

- **companyName**: Name of the hiring company.
- **companyUrl**: URL to the company's profile page on Bayt.com.
- **companyLogo**: URL to the company logo image.
- **companyIndustry**: Industry classification of the company (null if not specified).
- **companyType**: Type/category of the company (null if not specified).

##### Location Information

- **locationCity**: City where the job is located (e.g., "Dubai").
- **locationCountry**: Two-letter country code (e.g., "AE" for United Arab Emirates).
- **residenceLocation**: Required residence location of the candidate (null if not specified).

##### Salary Information

- **monthlySalaryRange**: Raw salary range text as shown on the listing.
- **salary**: Object with parsed salary details.
  - **raw**: Original salary string.
  - **currency**: Salary currency code (e.g., "USD").
  - **min**: Minimum salary value.
  - **max**: Maximum salary value.
  - **period**: Pay period (e.g., "month").
  - **usdMin**: Minimum salary converted to USD.
  - **usdMax**: Maximum salary converted to USD.
  - **isEstimate**: Boolean indicating whether the salary is an estimate.

##### Candidate Requirements

- **degree**: Required education/degree level (null if not specified).
- **gender**: Preferred candidate gender, if stated (null if not specified).
- **age**: Preferred candidate age range, if stated (null if not specified).
- **nationality**: Preferred candidate nationality, if stated (null if not specified).

##### Application & Contacts

- **applyUrl**: Direct URL to apply to the job.
- **applyButtonText**: Label of the apply button, if present (null otherwise).
- **contacts**: Object with any contact details extracted from the listing.
  - **emails**: Array of email addresses.
  - **phones**: Array of phone numbers.
  - **links**: Array of external links.
  - **socialProfiles**: Array of social media profiles.

##### Media

- **KVImages**: Array of URLs to job/company images stored in the key-value store.

***

### 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>

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/bayt-scraper`).

**Purpose:** Extract job listings from Bayt.com (Middle East / MENA job portal) as structured rows, either from listing/detail URLs or by building a search from filters.

**Minimal input:**

```json
{
    "startUrls": [{ "url": "https://www.bayt.com/en/uae/jobs/software-engineer-jobs/" }],
    "maxItems": 25
}
```

Or omit `startUrls` and set `searchJobKeyword` plus `searchCountryRegion` (e.g. `"uae"`) to have the actor build the listing URL.

**Output:** one row per job — id, title, companyName, companyUrl, locationCity, locationCountry, postedDateText, applyUrl, applyButtonText, descriptionText, skills, careerLevel, yearsOfExperience, employmentType, jobRole, monthlySalaryRange, numberOfVacancies, companyIndustry, companyType, workStyle, nationality, degree, salary, contacts, companyLogo, datePosted, expiryDate, KVImages.

**Behaviors an agent should know:**

- Always set `maxItems` (default 100); enable `moreResults` to page past the ~500-item listing cap.
- If any `startUrls` entry has a URL, the Search-by-filters fields are ignored for the entry URL. With no URL, set `searchCountryRegion` (or `searchJobKeyword` / `searchLocation`) so a region can be chosen.
- Set `includeListingDetails: true` to fetch each job's detail page for the full description and extra fields.
- Incremental: `onlyNewOrChanged` (needs a `storeName`) dedups across runs and adds a `changeType` field; `emitUnchanged` / `emitExpired` / `skipReposts` tune what is emitted.
- `enrichEmails` adds employer contactEmail / contactWebsite (billed per email found, only on a hit); `qualifyByPayment` adds payment-stack flags at no extra charge.
- Billing: Pay-per-event billing — see the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Bayt.com, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available job-listing pages — no authenticated endpoints, paid features, or content behind the Bayt.com login wall. Users are responsible for ensuring their use complies with Bayt.com's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

bayt scraper, scrape Bayt, Bayt.com scraper, bayt jobs scraper, Bayt API, Apify Bayt, middle east jobs scraper, mena jobs scraper, gulf jobs data, uae jobs scraper, saudi arabia jobs scraper, dubai jobs data, job listings scraper, recruitment data scraper, salary benchmark data, job market analysis, hr lead generation, employment data mena, career listings export

# 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/Fya4s6i1gyRGTTBer/openapi.json
