# Bayt Jobs Scraper (`shahidirfan/bayt-jobs-scraper`) Actor

Extract live job listings from Bayt.com, the MENA region's leading job board. Scrape job titles, companies, salaries, descriptions & apply links. Ideal for recruitment intelligence, salary analytics, market research & AI training datasets. Fully structured, production-ready data.

- **URL**: https://apify.com/shahidirfan/bayt-jobs-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Jobs, Developer tools, AI
- **Stats:** 516 total users, 80 monthly users, 100.0% runs succeeded, 9 bookmarks
- **User rating**: 5.00 out of 5 stars

## 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 Jobs Scraper do?

Bayt Jobs Scraper collects public job listings from Bayt.com and saves them as structured records for hiring research, job market analysis, lead generation, and recruitment monitoring. Start with the default international jobs page or provide a Bayt country, city, keyword, or filtered search URL.

The dataset can include job titles, companies, locations, posting information, career levels, experience requirements, salary details, descriptions, skills, application links, company profile links, and the source listing URL. Search either with an advanced Bayt `startUrl` or with the keyword, location, and sorting options. Download the results from Apify in JSON, CSV, Excel, or XML, or connect the dataset to an automated workflow.

### Why use Bayt Jobs Scraper?

- **Bayt-focused job data** - Collect listings from one of the main employment platforms serving the Middle East and international markets.
- **Useful hiring context** - Combine title, company, location, career level, experience, salary, skills, and description fields in one record.
- **Search URL flexibility** - Reuse public Bayt search pages for advanced filters, or generate searches from keyword and location inputs.
- **Controlled collection** - Set a maximum number of jobs and a page limit for each run.
- **Research-ready output** - Build datasets for hiring intelligence, salary research, employer monitoring, and job aggregation.
- **Automation support** - Schedule recurring runs, call the Actor through the Apify API, use webhooks, or send data to spreadsheet and no-code tools.

### What data can you extract from Bayt.com?

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | String | Bayt job identifier. |
| `title` | String | Job title. |
| `company` | String | Employer name, or `Confidential` when the listing does not publish one. |
| `companyProfileUrl` | String | Bayt company profile URL when available. |
| `location` | String | Location shown on the job listing. |
| `postedAtRelative` | String | Relative posting time, such as `2 days ago`. |
| `employmentType` | String | Employment type when published. |
| `careerLevel` | String | Career level associated with the role. |
| `experience` | String | Experience requirement when available. |
| `salary` | String | Salary text or range when published. |
| `url` | String | Bayt job detail URL. |
| `applyUrl` | String | Application URL for the job. |
| `descriptionText` | String | Plain-text job description. |
| `descriptionHtml` | String | Formatted job description when available. |
| `skillsText` | String | Plain-text skills section. |
| `skillsHtml` | String | Formatted skills section when available. |
| `preferredCandidate` | Object | Preferred candidate details when published. |
| `listingSummary` | String | Summary text from the listing card. |
| `keyword` | String | Keyword associated with the search page, when available. |
| `locationFilter` | String or Array | Location filter information returned by the source. |
| `listingPage` | Number | Result page where the job was found. |
| `listingUrl` | String | Bayt listing URL used for the record. |
| `industryId` | String or Number | Industry identifier supplied by the listing data. |
| `jobType` | String | Job type value supplied by the listing data. |
| `rawJobPost` | Object | Additional listing data returned for the job. |
| `source` | String | Source platform, returned as `bayt.com`. |
| `scrapedAt` | String | ISO timestamp for when the record was collected. |

The actor uses direct requests to Bayt's listing and job-detail data endpoints. It does not open job pages in a browser. Bayt returns the rich detail content as a small HTML fragment inside a JSON response, which the actor parses in memory to preserve descriptions, skills, and preferred-candidate data.

### How to use Bayt Jobs Scraper

1. Open Bayt Jobs Scraper in Apify Console.
2. Enter a public Bayt search URL, or use the default international jobs page.
3. Set the number of jobs, sort order, and maximum pages to process.
4. Enable proxy routing when your run needs it, especially for larger collections.
5. Start the run and review the dataset preview.
6. Download the results or connect them to your hiring, research, or data pipeline.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | `https://www.bayt.com/en/international/jobs/` | Advanced public Bayt listing or search URL. When `keyword` or `location` is provided, the generated search takes precedence. |
| `keyword` | String | No | — | Job title, skill, or company keyword, for example `software engineer`. Bayt converts it to a path such as `/software-engineer-jobs/`. |
| `location` | String | No | `international` | Bayt location slug or name, such as `international`, `uae`, `dubai`, or `abu-dhabi`. City + keyword searches use Bayt paths such as `/admin-jobs-in-dubai/`. |
| `sort_by` | String | No | `relevance` | Listing order: `relevance`, `date`, or `language`. These map to Bayt's `options[sort][]=r`, `d`, and `l` API parameter. |
| `results_wanted` | Integer | No | `20` | Maximum number of jobs to collect. The value must be at least 1. |
| `max_pages` | Integer | No | `5` | Maximum number of Bayt result pages to visit. The value must be at least 1. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": true }` | Apify Proxy settings for runs that need proxy routing. |

### Usage Examples

#### Basic international collection

Collect up to 20 jobs from Bayt's default international jobs page.

```json
{
  "startUrl": "https://www.bayt.com/en/international/jobs/",
  "results_wanted": 20,
  "max_pages": 5
}
```

#### Country-specific collection

Collect up to 100 jobs from Bayt's United Arab Emirates jobs page.

```json
{
  "startUrl": "https://www.bayt.com/en/uae/jobs/",
  "results_wanted": 100,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

#### Keyword, location, and sorting collection

Use the search options for a generated Bayt search. The actor builds the same URL structure used by Bayt's search form and preserves the selected sort order while paginating.

```json
{
  "keyword": "software engineer",
  "location": "uae",
  "sort_by": "date",
  "results_wanted": 100,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

This resolves to the Bayt search path `/en/uae/jobs/software-engineer-jobs/` and adds `options[sort][]=d`. For example, `keyword: "admin"` and `location: "dubai"` resolve to `/en/uae/jobs/admin-jobs-in-dubai/`. Use `startUrl` instead when you need an existing filtered URL with advanced Bayt parameters. If both are supplied, `keyword` and `location` intentionally generate the search URL; `sort_by` is applied to it.

### Sample Output

The following example shows one dataset item. Optional fields may be absent when Bayt.com does not publish them.

```json
{
  "source": "bayt.com",
  "jobId": "5441109",
  "url": "https://www.bayt.com/en/uae/jobs/hotel-sales-manager-5441109/",
  "title": "Hotel Sales Manager",
  "company": "Taurus Recruitment",
  "companyProfileUrl": "https://www.bayt.com/en/company/taurus-recruitment-2255833/",
  "location": "Abu Dhabi · UAE",
  "postedAtRelative": "14 minutes ago",
  "employmentType": "Full time",
  "careerLevel": "Management",
  "salary": "AED 10,000 - 14,000",
  "jobType": "native",
  "applyUrl": "https://www.bayt.com/en/job/apply/index/5441109/",
  "descriptionText": "Lead hotel sales activity and manage commercial relationships in Abu Dhabi.",
  "skillsText": "Sales management, revenue growth, hospitality, client relationships",
  "preferredCandidate": {
    "career_level": "Management"
  },
  "listingSummary": "Hotel Sales Manager in Abu Dhabi",
  "locationFilter": [],
  "listingPage": 1,
  "listingUrl": "https://www.bayt.com/en/international/jobs/",
  "rawJobPost": {
    "jobType": "native"
  },
  "scrapedAt": "2026-08-05T08:10:00.000Z"
}
```

### Tips for best results

- **Use focused searches** - Provide `keyword` and `location` for a generated search, or use `startUrl` for an existing Bayt filtered URL.
- **Choose a supported order** - Set `sort_by` to `relevance`, `date`, or `language`.
- **Start small** - Test with `results_wanted: 20` before starting a large collection.
- **Set a realistic page limit** - Increase `max_pages` when a broad search needs deeper coverage.
- **Use proxy routing when needed** - Proxy configuration can help with larger runs or limited access.
- **Review optional fields** - Salary, skills, descriptions, and company links depend on what each listing publishes.
- **Schedule repeat runs** - Recurring runs can support hiring alerts, employer monitoring, and labor-market trend reports.
- **Report source changes** - Public pages can change. Use the Actor's Issues tab if records no longer match the expected output.

### Integrations and export formats

- **Google Sheets** - Review, filter, and share job records with a hiring or research team.
- **Airtable** - Build a searchable employer and vacancy database.
- **Webhooks** - Notify another service when a run finishes.
- **Make or Zapier** - Route new job data into email, Slack, CRM, or internal workflows.
- **Apify API** - Start runs and read dataset items from your own application.
- **JSON, CSV, Excel, and XML** - Export the dataset for analysis, reporting, or data pipelines.

### Frequently Asked Questions

#### Can I scrape Bayt jobs for a specific country or city?

Yes. Set `startUrl` to the relevant public Bayt country or city jobs page, such as the UAE jobs page.

#### Can I collect only specific job roles?

Yes. Use `keyword` for a role or skill search, optionally combine it with `location`, and choose `sort_by`. You can also use a public keyword or filtered Bayt search URL in `startUrl` for advanced conditions.

#### How many jobs can I collect in one run?

Set `results_wanted` to the maximum number of records you need. The run is also limited by `max_pages` and the number of listings available on the selected pages.

#### Why are salary, skills, or descriptions missing?

Bayt.com does not publish every field for every listing. Missing values generally reflect the source listing rather than a problem with the run. The detail request is made directly and parsed in memory; no browser page visit is required.

#### Can I export Bayt job data to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats.

#### Can I schedule recurring Bayt job searches?

Yes. Create an Apify schedule to run the Actor hourly, daily, weekly, or on a custom interval, then connect the results to a webhook or another integration.

#### Is collecting Bayt.com data legal?

Public data collection can be subject to website terms, privacy requirements, and local laws. You are responsible for using the Actor lawfully and handling job data responsibly.

### Related Actors

- [Talent Job Scraper](https://apify.com/shahidirfan/talent-job-scraper) - Collect job listings from Talent.com for broader international hiring research.
- [USA Jobs Scraper](https://apify.com/shahidirfan/usa-jobs-scraper) - Collect federal job listings from USAJobs.gov.
- [Apna.co Jobs Scraper](https://apify.com/shahidirfan/apna-co-jobs-scraper) - Collect job listings, salary ranges, and company details from Apna.co.
- [Jora Jobs Scraper](https://apify.com/shahidirfan/jora-jobs-scraper) - Collect job titles, companies, locations, and descriptions from Jora.

### Support

For questions, issues, or feature requests, use the Issues tab or support section on the Actor page in Apify Console.

### Legal Notice

This Actor is intended for legitimate collection and analysis of publicly available job information. Do not use collected data for unlawful discrimination, harassment, spam, or other abusive activity. Follow Bayt.com's terms and all applicable laws and privacy rules.

# Actor input Schema

## `startUrl` (type: `string`):

Start scraping from a specific Bayt.com search URL (e.g., https://www.bayt.com/en/uae/jobs/). If not provided, defaults to international jobs.

## `keyword` (type: `string`):

Optional job title, skill, or company keyword. Bayt converts it to a search path, for example software engineer becomes /software-engineer-jobs/.

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

Optional Bayt location slug or name, such as international, uae, dubai, or abu-dhabi. If omitted, international jobs are searched.

## `sort_by` (type: `string`):

Bayt-supported listing order.

## `results_wanted` (type: `integer`):

The maximum number of jobs to collect. If omitted, defaults to 20.

## `max_pages` (type: `integer`):

A safety cap on the number of search result pages to visit.

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

Use Apify Proxy for the best results.

## Actor input object example

```json
{
  "startUrl": "https://www.bayt.com/en/uae/jobs/",
  "keyword": "software engineer",
  "location": "uae",
  "sort_by": "relevance",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.bayt.com/en/international/jobs/",
    "sort_by": "relevance",
    "results_wanted": 20,
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = {
    "startUrl": "https://www.bayt.com/en/international/jobs/",
    "sort_by": "relevance",
    "results_wanted": 20,
    "max_pages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/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 '{
  "startUrl": "https://www.bayt.com/en/international/jobs/",
  "sort_by": "relevance",
  "results_wanted": 20,
  "max_pages": 5
}' |
apify call shahidirfan/bayt-jobs-scraper --silent --output-dataset

```

## MCP server setup

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