# Bayt Jobs Scraper — Jobs, Salaries & Company Details (`vero-api/bayt-jobs-scraper`) Actor

Scrape Bayt.com job listings across the Middle East & North Africa: titles, companies, salaries, locations, dates, skills, and full descriptions. Filter by date, job type, remote, or few-applicant roles. Export clean JSON, CSV, or Excel — no login or API key needed.

- **URL**: https://apify.com/vero-api/bayt-jobs-scraper.md
- **Developed by:** [VeroAPIs](https://apify.com/vero-api) (community)
- **Categories:** Agents, Jobs, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job listings

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

## Bayt Jobs Scraper

Bayt Jobs Scraper **extracts job listings from Bayt.com** — title, company, location, salary, posting date, full description, skills, experience, career level, and company details — across the **Middle East & North Africa**, and downloads them as **JSON, CSV, Excel, or XML**. It runs in the cloud, needs no coding, and **no Bayt login or API key**.

Try it right away: type what you're searching for, pick a country, click **Start**, and watch the dataset fill up with structured job data.

### What data does it extract?

Each result is **one job listing**:

| Data | Details |
|---|---|
| 💼 **Job** | title, posting URL, apply URL, posting date, employment type, career level |
| 🏢 **Company** | nested `company` object: name, logo, banner, industry, size, and description |
| 📍 **Location** | formatted location plus structured city, area, and country |
| 💰 **Salary** | pay range with currency and interval (usually monthly), listed by the board or parsed from the description |
| 🧰 **Extras** | skill tags, experience range, and emails found in the description |
| 🏠 **Remote** | a flag marking remote roles |
| 📝 **Description** | a snippet from search, or the full description (Markdown, HTML, or plain text) with extra job info |

> The full description, apply URL, skills, employment type, company details, and labelled salary come from each job's detail page — filled when **Fetch extra job info** is enabled. Without it, you get a fast result with a short description snippet.

### How do I scrape Bayt jobs?

1. **Say what you want** — enter *Search keywords* (a job title or skill).
2. **Pick a country** — choose a Middle East / North Africa market (UAE, Saudi Arabia, Egypt, Qatar…).
3. **Narrow it down** *(optional)* — filter by job type, date posted, remote, easy apply, or jobs with **few applicants**, and turn on *Fetch extra job info* for the full description and company details.
4. **Set how many** — choose *Maximum jobs*, or use `0` for as many as Bayt returns.
5. **Click Start** — then download the results from the **Storage** tab in any format, or send them anywhere with integrations.

### Input example

```json
{
    "keywords": "accountant",
    "country": "ae",
    "maxItems": 100,
    "jobType": "fulltime",
    "datePosted": "7",
    "fetchExtraJobInfo": true,
    "descriptionFormat": "markdown"
}
```

### Output example (abridged)

```json
{
    "id": "5464405",
    "title": "Senior Accountant",
    "url": "https://www.bayt.com/en/uae/jobs/senior-accountant-5464405/",
    "applyUrl": "https://www.bayt.com/en/uae/jobs/senior-accountant-5464405/",
    "company": {
        "name": "Noor Deira Steel Trading",
        "logo": "https://secure.b8cdn.com/images/logo/12/2305812_logo.png",
        "bannerPhoto": "https://secure.b8cdn.com/bayt/assets/.../Group2.png",
        "employeeCount": "50-99 Employees",
        "industry": "Steel & Metals"
    },
    "location": { "formatted": "Dubai, UAE", "city": "Dubai", "country": "UAE" },
    "isRemote": false,
    "postedDate": "2026-06-23",
    "jobType": ["Full-time"],
    "salary": { "min": 14690, "max": 18363, "currency": "AED", "interval": "monthly", "source": "direct" },
    "jobLevel": "Management",
    "skills": ["IFRS", "Financial Reporting", "VAT", "ERP"],
    "experienceRange": "7 - 15 years",
    "searchTerm": "accountant",
    "description": "## Job Summary\nNoor Deira Steel is seeking an experienced Senior Accountant…"
}
```

Only the fields a posting actually has are included, so records stay clean.

### Input reference

| Field | Type | Description |
|---|---|---|
| `keywords` | string | Job title, skill, or company to search for. Leave empty to browse the latest jobs. |
| `country` | string | MENA country code from the dropdown (e.g. `ae`, `sa`, `eg`, `qa`). Default `ae`. |
| `maxItems` | integer | Total jobs to return. `0` = no limit. Default `25`. |
| `jobType` | string | `fulltime`, `parttime`, `contract`, `internship`, or `temporary`. Empty = any. |
| `datePosted` | string | How recently the job was posted: empty = all time, `7` = past 7 days, `30` = past 30 days. |
| `isRemote` | boolean | Return only remote roles. Default `false`. |
| `easyApply` | boolean | Only Bayt-native jobs (excludes aggregated postings). Default `false`. |
| `fewApplicants` | boolean | Only jobs that still have few applicants (less competition). Default `false`. |
| `fetchExtraJobInfo` | boolean | Open each job's detail page for the full description, apply URL, skills, employment type, company details, and salary. Slower. Default `false`. |
| `descriptionFormat` | string | `markdown`, `html`, or `text`. Default `markdown`. |
| `offset` | integer | Skip the first N results. |

### Why scrape Bayt jobs?

- **Middle East market research** — track demand for roles and skills across the region.
- **Recruiting & sourcing** — see who's hiring across MENA, with company details and contact emails.
- **Salary benchmarking** — gather pay ranges with currency and interval, straight from the board.
- **Lead generation** — find companies actively hiring in your space.
- **Job hunting** — surface fresh roles with few applicants, where your application stands out.

### Pricing

You pay only for the jobs you get — no subscriptions, no surprises. A small fee covers each run's start, then a flat fee per job delivered, so you stay in control: set *Maximum jobs* to cap your spend.

### Notes

- Bayt.com is the **leading job site in the Middle East & North Africa** — pick a regional country for the most results.
- Reads Bayt's **public** job listings — the same ones anyone can browse — so there's no login to set up.
- Turn on **Fetch extra job info** for the full description and company details; leave it off for faster, lighter runs.

# Actor input Schema

## `keywords` (type: `string`):

The job title, skill, or company to search for — exactly what you'd type into Bayt's search box (e.g. <code>software engineer</code>, <code>accountant</code>, <code>sales manager</code>). Leave empty to browse the latest jobs for the chosen country.

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

Which Middle East / North Africa country to search. Bayt.com is the region's leading job site; pick the market you want.

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

How many job listings to return in total. Use <code>0</code> for no limit — the scraper then pulls every result Bayt returns for the search.

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

Filter by employment type. Leave as <code>Any</code> to include all types.

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

How recently the job was posted. Choose the last 7 or 30 days, or leave as <code>All time</code> for any date.

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

How to format the job description text. <code>Markdown</code> is clean and readable; <code>HTML</code> preserves original styling; <code>Plain text</code> strips all markup. The full description is only fetched when <b>Fetch extra job info</b> is on; otherwise a short snippet is returned.

## `offset` (type: `integer`):

Skip the first N results — useful for paging through a large result set across runs.

## `isRemote` (type: `boolean`):

Return only jobs Bayt tags as remote / work-from-home.

## `easyApply` (type: `boolean`):

Only return Bayt-native jobs you can apply to directly on Bayt (excludes aggregated postings that send you to an external site).

## `fewApplicants` (type: `boolean`):

Only return jobs that still have few applicants — great for finding roles where you'll face less competition.

## `fetchExtraJobInfo` (type: `boolean`):

Open each job's detail page for richer data the search results omit: the full description, apply URL, skills, employment type, employer industry, a labelled salary range, and company details (description, logo, banner, size). Adds one request per job, so it's slower.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "country": "ae",
  "maxItems": 25,
  "jobType": "",
  "datePosted": "",
  "descriptionFormat": "markdown",
  "isRemote": false,
  "easyApply": false,
  "fewApplicants": false,
  "fetchExtraJobInfo": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job listing.

# 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 = {
    "keywords": "software engineer",
    "country": "ae"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vero-api/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 = {
    "keywords": "software engineer",
    "country": "ae",
}

# Run the Actor and wait for it to finish
run = client.actor("vero-api/bayt-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": "software engineer",
  "country": "ae"
}' |
apify call vero-api/bayt-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=vero-api/bayt-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uD5XPiLqXYMhyOEO3/builds/Yqc71M0o4U4XfH45l/openapi.json
