# Bayt.com Jobs Scraper — Middle East & Gulf Job Listings (`corvuslab/bayt-jobs-scraper`) Actor

Scrape jobs from Bayt.com across the UAE, Saudi Arabia, Egypt, Qatar and 11 more markets. Get titles, companies, locations, salaries, skills, full descriptions and candidate requirements as structured JSON — with incremental monitoring and notifications.

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

## Pricing

from $0.99 / 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?

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 Bayt.com Jobs Scraper do?

Extract job listings from **[Bayt.com](https://www.bayt.com/)** — the largest job board in the Middle East — as clean, structured **JSON, CSV or Excel**. Every record can include **structured salary with USD normalization**, skills, career levels, full descriptions, contact details and social profiles, ready for analysis, lead generation or AI pipelines. No Bayt account, no code, no API key required.

Give it a search keyword (e.g. `software engineer`) and a country, and it returns every matching job as a typed record. Each listing includes the title, company, location, salary range, employment type, career level, AI-generated summary and posting dates. Turn on **Fetch full details** to also pull the complete description (text, HTML and Markdown), skills list, candidate requirements, apply URL, contact information and social profiles extracted from the description.

You can also paste any Bayt.com search URL — with filters already applied in your browser — or individual job URLs into **Start URLs**.

> 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** — listing-only mode skips detail fetches entirely, so large discovery runs stay cheap.
- 🧾 **Rich, typed records** — 65+ 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, WhatsApp or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### Key features

- 🔎 **Search or URL scraping** — run a keyword + country search, or paste Bayt.com search/job URLs directly.
- 🌍 **15 markets** — UAE, Saudi Arabia, Egypt, Kuwait, Qatar, Bahrain, Oman, Jordan, Lebanon, Iraq, Morocco, Pakistan, India, USA, or **International** (all at once).
- 💰 **Structured salary** — native-currency min/max plus **USD-normalized** values for cross-market comparison.
- 🎚️ **Rich filters** — country, city/location, employment type (full-time, part-time, contractor, freelance, internship), career level (student to management), date posted, Easy Apply only, **minimum salary (USD)**, and sort order — all applied before detail fetches so filtered jobs cost nothing.
- 💵 **Salary floor** — set a **minimum USD/month salary** and only get jobs that publish compensation above your threshold — essential for salary benchmarking and comp research.
- 🏢 **Company targeting** — whitelist or blacklist companies by name (`onlyCompanies` / `excludeCompanies`) — perfect for competitive intel, account-based recruiting and lead-gen.
- 🎯 **Keyword relevance scoring** — provide a list of skills or keywords and every record gets a **matchScore (0–100)** plus the list of matched keywords — rank and filter by relevance without any post-processing.
- 🧠 **Full details** — descriptions in text, HTML and Markdown, skills, candidate requirements (experience, degree, nationality, gender, residence, citizenship), AI summary, and apply URL.
- 📇 **Contact extraction** — emails, phone numbers (strict or lenient mode), URLs and **social profiles** (LinkedIn, Twitter/X, GitHub, Facebook) pulled from each description for lead generation.
- 🏠 **Remote work detection** — `isRemote` flag and remote-work text for hybrid and remote listings.
- ♻️ **Incremental monitoring** — schedule it and get only NEW, UPDATED or EXPIRED jobs; unchanged items are skipped before their page is even fetched. Optional **repost filtering** drops recycled postings. Tracks `firstSeenAt`, `lastSeenAt` and `expiredAt` timestamps.
- 🔔 **Notifications** — push new jobs to **Telegram, Slack, Discord, WhatsApp Business** or any webhook (n8n, Make, Zapier). Use **notifyOnlyChanges** to suppress alerts for unchanged records.

***

### 🚀 How to scrape Bayt.com

1. Open the actor and enter a **search keyword** (e.g. `accountant`) and pick a **country** — or paste a Bayt.com URL into **Start URLs**.
2. Set **Max results** and choose whether to **Fetch full details** (on by default).
3. Optionally add filters: **city/location**, **employment type**, **career level**, **date posted** or **Easy Apply only**.
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start** — 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` | Job keywords (comma-separate for multiple searches, merged and de-duplicated). |
| `country` | Market to search: UAE, Saudi Arabia, Egypt, Kuwait, Qatar and 10 more — or International for all. |
| `location` | City or region, e.g. "Dubai" or "Riyadh" — narrows results to that area. |
| `startUrls` | Scrape specific Bayt.com search or job detail URLs. |
| `employmentType` | Full time, part time, contractor, freelance or internship. |
| `careerLevel` | Student, fresh graduate, entry level, mid career or management. |
| `easyApplyOnly` | Keep only jobs with Bayt's one-click Easy Apply. |
| `searchMinSalary` | Minimum salary in USD/month — also excludes jobs without published salary. |
| `datePosted` | Posted within the last 24 hours, 3, 7, 14 or 30 days, or any time. |
| `onlyCompanies` | Whitelist — only return jobs from these companies. |
| `excludeCompanies` | Blacklist — exclude jobs from these companies. |
| `matchKeywords` | Score each record against these keywords (adds `matchScore` 0–100). |
| `includeDetails` | Fetch each job's page for descriptions, skills and requirements. |
| `compact` | Core fields only — ideal for AI agents and MCP clients. |
| `incrementalMode` | Emit only what changed since the last run (NEW / UPDATED / EXPIRED). |
| `notifyOnlyChanges` | Only send notifications for NEW/UPDATED records. |
| `maxResults` | Cap the number of records (0 = unlimited). |

...and **38 inputs** in total — the table shows the essentials; the rest cover notification channels (Telegram, Slack, Discord, WhatsApp, webhook), output tuning (description format, truncation, drop-empty, phone extraction mode), incremental options (skip reposts, emit unchanged/expired, state key) and advanced settings, all in the visual editor.

#### Example inputs

**Basic keyword search**

```json
{ "query": "software engineer", "country": "uae", "maxResults": 100 }
```

**Filtered search — mid-career, full-time roles in Riyadh**

```json
{
  "query": "accountant",
  "country": "saudi-arabia",
  "location": "Riyadh",
  "employmentType": "full-time",
  "careerLevel": "mid",
  "datePosted": "7d",
  "maxResults": 200
}
```

**Relevance-scored search — rank accountants by your required skills**

```json
{
  "query": "accountant",
  "country": "uae",
  "searchMinSalary": 2000,
  "matchKeywords": ["SAP", "tax", "audit", "CPA", "Excel"],
  "maxResults": 100
}
```

**Incremental monitoring with Telegram notifications**

```json
{
  "query": "data analyst",
  "country": "international",
  "incrementalMode": true,
  "skipReposts": true,
  "notifyOnlyChanges": true,
  "telegramToken": "<your-bot-token>",
  "telegramChatId": "<your-chat-id>"
}
```

***

### Output

Each item in the dataset is one job listing. Every record includes the core fields; enabling **Fetch full details** (on by default) adds the full description, skills, candidate requirements, salary details and contact information. Here is a representative record:

```json
{
  "id": "5479161",
  "title": ".NET Integration Engineer",
  "url": "https://www.bayt.com/en/uae/jobs/net-integration-engineer-5479161/",
  "company": "Emagine Solutions FZE",
  "companyUrl": "https://www.bayt.com/en/company/emagine-solutions-fze-1792817/",
  "companyIndustry": "Accounting",
  "companySize": "100-499 Employees",
  "location": "Dubai, UAE",
  "city": "Dubai",
  "country": "UAE",
  "isRemote": false,
  "careerLevel": "Mid career",
  "experienceText": "Mid career",
  "employmentType": "FULL_TIME",
  "employmentTypeText": "Full time",
  "citizenshipRequirement": "GCC Nationals preferred",
  "easyApply": true,
  "salaryText": "AED 15,000 - 25,000",
  "salaryCurrency": "AED",
  "salaryMin": 15000,
  "salaryMax": 25000,
  "salaryPeriod": "MONTH",
  "salaryUsdMin": 4085.0,
  "salaryUsdMax": 6808.33,
  "skills": [".NET Engineer", "online trading", "financial trading"],
  "aiSummary": "Elevate your career as a .NET Integration Engineer in Dubai...",
  "descriptionMarkdown": "**About the Role**\n\nWe are looking for an experienced .NET Engineer...",
  "totalOpenings": 1,
  "datePosted": "2026-08-27",
  "postedAt": "2026-08-27T09:52:05+00:00",
  "validThrough": "2026-10-26T00:00:00Z",
  "applyUrl": "https://www.bayt.com/en/job/apply/index/5479161/",
  "extractedEmails": ["careers@emagine.ae"],
  "extractedPhones": [],
  "socialProfiles": {
    "linkedin": "https://www.linkedin.com/company/emagine-solutions",
    "twitter": null,
    "github": null,
    "facebook": null
  },
  "matchScore": 60,
  "matchedKeywords": ["SAP", "tax", "audit"],
  "source": "bayt.com",
  "scrapedAt": "2026-08-28T09:24:36.248403+00:00"
}
```

Each record can also include `descriptionHtml` and `description` (plain text) — choose the format with the **Description format** input. When incremental mode is on, records carry a `changeType` field (`NEW` / `UPDATED` / `EXPIRED`) and tracking timestamps.

#### Data fields

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

- **Core** — `id`, `title`, `url`, `company`, `location`, `city`, `country`, `employmentType`, `careerLevel`, `isRemote`, `easyApply`, `aiSummary`, `postedAt`, `datePosted`, `source`, `scrapedAt`.
- **Salary** — `salaryText`, `salaryCurrency`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryUsdMin`, `salaryUsdMax`.
- **Matching** — `matchScore` (0–100), `matchedKeywords` (which of your keywords were found).
- **Details** (with `includeDetails`) — `description`, `descriptionHtml`, `descriptionMarkdown`, `skills`, `yearsOfExperience`, `degree`, `nationality`, `gender`, `residenceLocation`, `citizenshipRequirement`, `age`, `jobRole`, `totalOpenings`.
- **Company** — `companyUrl`, `companyId`, `companyLogoUrl`, `companySize`, `companyIndustry`.
- **Contacts** — `extractedEmails`, `extractedPhones`, `extractedUrls`, `socialProfiles` (LinkedIn, Twitter/X, GitHub, Facebook).
- **Application** — `applyUrl`, `directApply`, `easyApply`, `isExternal`, `isAggregated`.
- **Dates** — `postedAt`, `postedTimestamp`, `postedRelative`, `datePosted`, `validThrough`.
- **Incremental** — `changeType`, `firstSeenAt`, `lastSeenAt`, `expiredAt`, `isRepost`, `repostOfId`, `repostDetectedAt`.

***

### 💡 What can you do with Bayt.com data?

- **Recruitment & sourcing** — track new roles by title, company or market in real time across the Middle East.
- **Market & salary research** — analyse hiring demand and compensation ranges with USD-normalized salary data for cross-market comparison.
- **Lead generation** — surface hiring companies and extract contact details (emails, phones, LinkedIn profiles) from job descriptions.
- **Job boards & aggregators** — feed structured listings into a downstream platform with incremental updates.
- **Compliance & workforce planning** — monitor citizenship requirements, career levels and employment types across Gulf markets.
- **AI agents & pipelines** — compact JSON drops straight into LLM/MCP workflows for automated job matching or enrichment.

***

### ♻️ 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 also filter out recycled postings (same title under a new job ID).

**Example: monitoring 1,000 jobs daily ($0.99/1,000 results + $0.0005/start)**

| Daily churn | Changed records billed | Cost per run | Monthly (30 runs) | vs full re-scrape |
|---|---|---|---|---|
| 5 % | 50 | $0.05 | **$1.51** | save 95 % |
| 15 % | 150 | $0.15 | **$4.52** | save 85 % |
| 30 % | 300 | $0.30 | **$9.02** | save 70 % |
| 100 % (full) | 1,000 | $1.00 | **$30.02** | baseline |

The first run seeds the baseline and bills in full; every run after that bills only the delta. Each record carries `firstSeenAt`, `lastSeenAt` and (when it disappears) `expiredAt` timestamps so you can track how long a position stayed open.

***

### 💰 How much does it cost to scrape Bayt.com?

This Actor uses the **pay-per-event** pricing model. Platform compute is included — you pay only for what you get.

- **Run start:** $0.0005 per run
- **Per result:** $0.99 per 1,000 records ($0.00099 each)

#### One-off scraping

| What you're doing | Records | Cost |
|---|---|---|
| Quick test | 10 | **~$0.01** |
| One role in one country | 100 | **~$0.10** |
| Multiple roles or a broad search | 500 | **~$0.50** |
| Full market scan | 1,000 | **~$1.00** |
| Large multi-keyword sweep | 5,000 | **~$4.95** |

#### Daily monitoring (scheduled runs)

| Scenario | Records/run | Runs/month | Monthly cost |
|---|---|---|---|
| Niche role, one country (incremental, ~10 % churn) | ~25 | 30 | **~$0.76** |
| Mid-volume search (incremental, ~15 % churn) | ~150 | 30 | **~$4.52** |
| Broad search, full re-scrape daily | 500 | 30 | **~$14.87** |
| Heavy monitoring, 3 queries × 1,000 (incremental, ~10 %) | ~300 | 30 | **~$8.92** |

#### Tips to keep costs low

- **Use filters** — `datePosted`, `searchMinSalary`, `employmentType`, `careerLevel`, `easyApplyOnly`, `onlyCompanies` all reduce the result count before any detail fetch.
- **Turn off details for discovery** — set `includeDetails` to false for fast, listing-only sweeps; only enable details when you need descriptions and skills.
- **Use incremental mode** for recurring runs — unchanged jobs are skipped entirely.
- **Set `maxResults`** to cap what you pay per run.

***

### 🔌 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 — 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": "software engineer",
    "country": "uae",
    "maxResults": 50,
}

run = client.actor("corvuslab/bayt-jobs-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 — it runs out of the box with no Bayt account, no API key and no proxy configuration.

**Which countries are supported?** UAE, Saudi Arabia, Egypt, Kuwait, Qatar, Bahrain, Oman, Jordan, Lebanon, Iraq, Morocco, Pakistan, India, USA, and International (all markets at once).

**Can I get only new jobs on a schedule?** Yes — turn on incremental mode and schedule the actor; each run emits only what changed and can notify your channel via Telegram, Slack, Discord, WhatsApp or webhook.

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

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly and keeps token usage small.

**How many records can I get?** Set `maxResults` to cap the output, or leave it at 0 for unlimited (bounded by how many jobs the search returns).

**Does it extract salary data?** Yes — when salary information is published on a listing, the scraper extracts the native-currency range and normalizes it to USD for easy cross-market comparison. You can also set a **minimum salary** to only get jobs above a threshold.

**Can I filter by company?** Yes — use `onlyCompanies` to whitelist specific companies, or `excludeCompanies` to blacklist them. Both are case-insensitive and applied before detail fetches.

**Can I rank jobs by relevance to specific skills?** Yes — provide keywords in `matchKeywords` and every record gets a `matchScore` (0–100) showing how many of your keywords were found in the title, description and skills.

**Can it notify me when new jobs appear?** Yes — add a Telegram, Slack, Discord, WhatsApp Business or generic webhook target under Notifications, and combine with incremental mode so you only get pinged about new and updated jobs. Use `notifyOnlyChanges` to suppress alerts for unchanged records.

**Is scraping Bayt.com legal?** This actor collects only **publicly available** data on Bayt.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 Bayt.com or its parent company.

***

**Keywords:** bayt scraper · bayt.com scraper · bayt jobs scraper · bayt api · bayt data extractor · middle east jobs scraper · middle east jobs api · gulf jobs scraper · gulf jobs data · MENA jobs API · MENA job listings · UAE jobs scraper · Saudi Arabia jobs scraper · Dubai jobs scraper · Abu Dhabi jobs scraper · Qatar jobs scraper · Doha jobs · Bahrain jobs · Kuwait jobs · Egypt jobs scraper · Oman jobs · Jordan jobs · Pakistan jobs scraper · India jobs · bayt salary data · bayt salary scraper · salary benchmarking middle east · salary comparison gulf · job listings export · recruitment data · lead generation · job market research · hiring trends MENA · remote jobs gulf · export to CSV · export to Excel · export to JSON · job board scraper · job aggregator data · company hiring data · contact extraction · email extraction · phone extraction · linkedin extraction · social profiles · MCP tool for AI agents · LLM job data · no-code scraper · incremental job monitoring · job alerts telegram · job alerts slack · job alerts whatsapp

# Actor input Schema

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

Job keywords, e.g. "software engineer". Separate multiple searches with commas — each runs on its own and results are merged and de-duplicated. Leave empty to scrape all jobs (newest first).

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

Which Bayt market to search. "International" spans every country.

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

Paste Bayt.com search/listing URLs (with any filters already applied in the browser) or individual job URLs. These are scraped in addition to the keyword search above.

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

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

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

Result ordering.

## `datePosted` (type: `string`):

Only include jobs posted within this window (applied on the listing, so filtered jobs cost nothing).

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

City or region, e.g. "Dubai" or "Riyadh". Narrows results to that area.

## `employmentType` (type: `string`):

Filter by employment type.

## `careerLevel` (type: `string`):

Filter by career level.

## `easyApplyOnly` (type: `boolean`):

Only include jobs with Bayt's direct Easy Apply button (drops before any detail fetch).

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

Only include jobs that publish a salary at or above this USD/month threshold. Jobs without salary data are excluded when this is set.

## `onlyCompanies` (type: `array`):

Whitelist — only return jobs from these companies (case-insensitive). Leave empty for all companies.

## `excludeCompanies` (type: `array`):

Blacklist — exclude jobs from these companies (case-insensitive).

## `matchKeywords` (type: `array`):

Score each job by how many of these keywords appear in its title, description and skills. Adds matchScore (0–100) and matchedKeywords to every record — ideal for ranking relevance.

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

Open each job's page for the full description, skills, requirements and apply URL. Turn off for the fastest, cheapest listing-only runs.

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

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

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

Truncate each description to at most this many characters (0 or empty = no limit).

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

Emit only the core fields (id, title, url, company, location, dates, AI summary). Ideal for AI agents and MCP clients.

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

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

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

Track state between runs and tag every job with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED). Unchanged jobs are skipped before any detail fetch, so recurring runs stay cheap.

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

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

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

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

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

Emit jobs that were present last run but have since disappeared.

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

Filter out recycled postings (same title, new job id). Only effective in incremental mode.

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

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

WhatsApp Business API access token (from Meta for Developers).

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

WhatsApp Business phone number ID.

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

Recipient phone number in international format (e.g. "971501234567").

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

Any HTTPS endpoint. Receives a JSON POST with the matched jobs — 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 jobs to include in each notification message.

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

When incremental mode is on, only send notifications for NEW and UPDATED jobs — not the full batch.

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

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

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

Strict catches standard international numbers (7–15 digits). Lenient catches shorter local numbers too (5+ digits).

## Actor input object example

```json
{
  "query": "accountant, sales manager",
  "country": "international",
  "maxResults": 25,
  "sortBy": "newest",
  "datePosted": "any",
  "employmentType": "",
  "careerLevel": "",
  "easyApplyOnly": false,
  "includeDetails": true,
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "maxRequestRetries": 3,
  "phoneExtractionMode": "strict"
}
```

# 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/bayt-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 = { "query": "software engineer" }

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

```

## MCP server setup

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