# Bayt.com Jobs Scraper (`solidcode/bayt-scraper`) Actor

\[💰 $0.8 / 1K] Extract job listings from Bayt.com, the Middle East's largest job board — UAE, Saudi Arabia, Egypt, Qatar, Kuwait, Jordan, Lebanon, Bahrain, Oman & Morocco. Search by keyword, country and city in English or Arabic. Get title, company, location, posting date, description & apply link.

- **URL**: https://apify.com/solidcode/bayt-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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.
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.com Jobs Scraper

Pull job postings from Bayt.com — the Middle East's largest job board — across 11 country markets, in English or Arabic, with full descriptions, application deadlines, exact posting timestamps, and direct apply links. Every filter is applied by Bayt before results come back, so a narrower search is a cheaper search. Built for recruiters, talent-acquisition teams, job-market analysts, and HR-tech platforms who need fresh Gulf hiring data without maintaining a fragile in-house pipeline.

### Why This Scraper?

- **11 country markets, down to the city** — United Arab Emirates, Saudi Arabia, Egypt, Qatar, Kuwait, Jordan, Lebanon, Bahrain, Oman, Morocco, plus an "International & worldwide" surface that spans them all. Narrow to Dubai, Abu Dhabi, Riyadh, Cairo or Doha, with or without a keyword.
- **Genuine Arabic coverage, not an English mirror** — switch the language to Arabic and jobs come back as clean Arabic text with identical field coverage, surfacing local-language postings an English-only search never reaches.
- **Five filters plus a sort order, all applied at the source** — date posted (past 24 hours / 7 days / 30 days), career level, employment type, work-from-home and Easy Apply are handled by Bayt itself, and you choose whether results come back Most relevant or Most recent. Filtering cuts your bill instead of inflating it: a 254-job search drops to 14 jobs with the 24-hour filter, 29 with work-from-home, 9 with Easy Apply.
- **38 typed fields per job** — 14 from the results page plus 19 more from the posting's own page (full description in HTML and plain text, application deadline, employment type, exact address, vacancy count, job category), plus 5 run-metadata fields stamped on every row.
- **Exact posting timestamps, not "28 days ago"** — every row carries a true ISO 8601 `postedAt` next to the human-readable relative date, so you can sort, diff, and de-duplicate reliably across daily runs.
- **Up to 10,000 jobs per search** — reaches Bayt's own per-search ceiling with clean pagination and job-ID de-duplication, so a long run never ends in repeated rows.
- **Native and syndicated postings are labelled** — each job tells you whether it was posted directly on Bayt or aggregated from another board, and whether you can apply in one click on Bayt or get redirected to an external careers site.
- **Search links and job links in the same run** — paste Bayt search URLs and individual job URLs together; both are collected, merged, and de-duplicated into one dataset.
- **From $0.80 per 1,000 jobs** — flat pay-per-result, no monthly rental, no per-contact surcharges, and nothing billed for rows you filtered out.

### Use Cases

**Recruitment & Candidate Sourcing**

- Build a live pipeline of open roles in your specialism across the whole GCC
- Spot which employers are hiring at volume by tracking vacancy counts per posting
- Filter to Easy Apply roles to see where candidates convert with the least friction
- Monitor work-from-home openings as a distinct, fast-growing segment

**Job Market & Hiring Research**

- Measure hiring demand by country, city, and job category month over month
- Track how quickly roles are posted and expire using posting dates and deadlines
- Compare the mix of full-time versus part-time hiring across Gulf markets
- Quantify how much of a market is native Bayt hiring versus syndicated listings

**Competitive & Employer Intelligence**

- Watch a competitor's headcount plans through their live job postings
- Detect market entries and office openings from first postings in a new city
- Benchmark job titles, categories, and role levels against your own openings

**HR Tech & Job Aggregation**

- Feed a job board or aggregator with structured Middle East listings
- Enrich an ATS or CRM with fresh employer and role data on a schedule
- Power job-matching and recommendation models with typed, consistent records

**Relocation, Education & Policy**

- Advise relocating professionals on where demand for their skills is concentrated
- Align training and curriculum programmes with the roles employers actually advertise
- Study labour-market shifts across Arabic- and English-language postings

### Getting Started

#### Simple Keyword Search

The minimum input — a keyword and a country:

```json
{
    "searchKeyword": "software engineer",
    "country": "uae",
    "maxResults": 50
}
```

#### Fresh Remote Roles Only

Jobs posted in the past 24 hours, work-from-home only, newest first:

```json
{
    "searchKeyword": "project manager",
    "country": "saudi-arabia",
    "datePosted": "3",
    "remoteOnly": true,
    "sortBy": "d",
    "maxResults": 200
}
```

#### Arabic Listings in a Single City

Read the Arabic version of Bayt and narrow to one city:

```json
{
    "searchKeyword": "محاسب",
    "country": "egypt",
    "city": "Cairo",
    "language": "ar",
    "maxResults": 100
}
```

#### Everything, Filtered — Full Advanced Run

Full-time management roles posted in the last 7 days, with complete job details:

```json
{
    "searchKeyword": "finance manager",
    "country": "qatar",
    "city": "Doha",
    "language": "en",
    "datePosted": "2",
    "careerLevel": "3",
    "employmentType": "1",
    "easyApplyOnly": true,
    "sortBy": "d",
    "fetchJobDetails": true,
    "maxResults": 0
}
```

#### Paste Your Own Bayt Links

Mix a tuned search page with individual job pages — both work in one run:

```json
{
    "startUrls": [
        "https://www.bayt.com/en/uae/jobs/software-engineer-jobs-in-dubai/",
        "https://www.bayt.com/en/international/jobs/data-analyst-jobs/"
    ],
    "fetchJobDetails": true,
    "maxResults": 500
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchKeyword` | string | `"software engineer"` | Job title or keyword to search for (e.g. `"accountant"`, `"nurse"`, `"sales manager"`). Leave blank to collect every job in the selected country. |
| `country` | string | `"uae"` | Which Bayt.com country site to search: United Arab Emirates, Saudi Arabia, Egypt, Qatar, Kuwait, Jordan, Lebanon, Bahrain, Oman, Morocco, or International & worldwide. |
| `city` | string | `""` | Narrow the search to a single city (e.g. `"Dubai"`, `"Abu Dhabi"`, `"Riyadh"`, `"Cairo"`, `"Doha"`). Leave blank to search the whole country. |
| `startUrls` | array | `[]` | Paste Bayt.com job-search links or individual job links. Each link is collected as its own task and results are merged and de-duplicated. When you use this, the keyword, country and city above are ignored — the link already carries its own search. |
| `language` | string | `"en"` | Which language version of Bayt.com to read: English or Arabic (العربية). Arabic returns the same jobs with Arabic page content where the employer provided it. |

#### Filters

All of these are applied by Bayt.com itself before results are returned, so narrowing here genuinely lowers how many jobs you pay for. Leave any of them blank to skip that filter.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `datePosted` | string | — | Only collect jobs posted within this window: Past 24 hours, Past 7 days, or Past 30 days. |
| `careerLevel` | string | — | Only collect jobs advertised at this career level: Entry Level, Mid Career, Management, or Senior Executive. Most employers leave this blank on Bayt, so this filter can return very few jobs. |
| `employmentType` | string | — | Only collect Full time or Part time roles. Many employers leave this blank on Bayt, so this filter can return far fewer jobs than the unfiltered search. |
| `remoteOnly` | boolean | `false` | Only collect jobs Bayt flags as remote / work from home. |
| `easyApplyOnly` | boolean | `false` | Only collect jobs you can apply to directly on Bayt.com, skipping listings that redirect to an external careers site. |
| `sortBy` | string | `"r"` | How Bayt orders the results before they are collected: Most relevant or Most recent. |

#### Output Detail & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `fetchJobDetails` | boolean | `true` | Open each job to collect the complete description, application deadline, employment type, career level, company ID and exact address. Turn this off for a faster, lighter run that keeps only the summary shown in the search results. On very large runs a small number of jobs may skip the full details; those rows still arrive with everything from the search results page, and the run reports exactly how many. |
| `maxResults` | integer | `50` | Hard cap on how many jobs to collect. Set to `0` to collect everything that matches. Results arrive in pages of 30 and the run always keeps the whole page it is on, so the number you receive rounds up to the next multiple of 30 — ask for 1 and you get 30, ask for 50 and you get 60. Set a multiple of 30 for an exact count. |

### Output

Each record is one job posting with 38 typed fields:

```json
{
    "jobId": "5241785",
    "title": "Senior Software Engineer",
    "url": "https://www.bayt.com/en/uae/jobs/senior-software-engineer-5241785/",
    "summary": "Design, build and maintain backend services for a fast-growing fintech platform.",
    "position": 7,
    "jobCategory": "Information Technology",
    "jobRoleId": "420",
    "isAggregated": false,
    "companyName": "Emirates Digital Solutions",
    "companyId": "2382908",
    "companyUrl": "https://www.bayt.com/en/uae/companies/emirates-digital-solutions-3891044/",
    "logoUrl": "https://img.bayt.com/images/logos/3891044.png",
    "city": "Dubai",
    "country": "United Arab Emirates",
    "addressLocality": "Dubai",
    "addressRegion": "Dubai",
    "addressCountry": "AE",
    "jobLocationType": "TELECOMMUTE",
    "employmentType": "FULL_TIME",
    "postedAt": "2026-07-28T09:14:03+00:00",
    "postedAgo": "3 days ago",
    "datePosted": "2026-07-28",
    "validThrough": "2026-08-27",
    "easyApply": true,
    "directApply": true,
    "totalJobOpenings": 2,
    "description": "<p>We are looking for a Senior Software Engineer to join our platform team...</p>",
    "descriptionText": "We are looking for a Senior Software Engineer to join our platform team...",
    "careerLevel": "Mid Career",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryPeriod": null,
    "searchKeyword": "software engineer",
    "searchCountry": "uae",
    "searchCity": null,
    "language": "en",
    "scrapedAt": "2026-07-31T11:02:47+00:00"
}
```

#### Job Basics

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Bayt's own identifier for the posting — stable, and the key used to de-duplicate rows. |
| `title` | string | Job title as advertised. |
| `url` | string | Direct link to the job page on Bayt.com. |
| `summary` | string | null | Short snippet shown on the search results card. |
| `position` | integer | 1-based rank of this job within its search. |
| `jobCategory` | string | null | Category assigned by Bayt (e.g. "Information Technology"). Not set on every posting. |
| `jobRoleId` | string | null | Bayt's internal role identifier, useful for grouping similar titles. |
| `isAggregated` | boolean | null | `false` for jobs posted natively on Bayt, `true` for listings syndicated from another board. |

#### Company

| Field | Type | Description |
|-------|------|-------------|
| `companyName` | string | Hiring company, or "Confidential Company" when the employer stays anonymous. |
| `companyId` | string | null | Bayt's internal company identifier. Published on most directly-posted jobs and a small share of syndicated ones. It is a different identifier from the number inside `companyUrl` — the two usually do not match, so join on `companyUrl` if you need the profile page. |
| `companyUrl` | string | null | Link to the employer's Bayt company profile. Published on directly-posted jobs; syndicated postings rarely carry one. |
| `logoUrl` | string | null | Company logo image URL. |

#### Location & Work Setting

| Field | Type | Description |
|-------|------|-------------|
| `city` | string | null | City shown on the search results card. |
| `country` | string | null | Country shown on the search results card. |
| `addressLocality` | string | null | City as declared by the employer on the job page. |
| `addressRegion` | string | null | Region or emirate as declared by the employer. |
| `addressCountry` | string | null | Two-letter country code (e.g. `AE`, `SA`, `EG`). |
| `jobLocationType` | string | null | Set to `TELECOMMUTE` when the employer flags the role as remote. |
| `employmentType` | string | null | Employer-declared type, e.g. `FULL_TIME` or `PART_TIME`. |

#### Dates & Application

| Field | Type | Description |
|-------|------|-------------|
| `postedAt` | string | null | Exact ISO 8601 posting timestamp — the field to sort and diff on. |
| `postedAgo` | string | null | Human-readable relative date exactly as Bayt shows it (e.g. "3 days ago"). |
| `datePosted` | string | null | Publication date declared by the employer on the job page. |
| `validThrough` | string | null | Application deadline, when the employer publishes one. |
| `easyApply` | boolean | `true` when the search card carries Bayt's Easy Apply badge. |
| `directApply` | boolean | null | `true` when the job page confirms you can apply on Bayt rather than an external site. |
| `totalJobOpenings` | integer | null | Number of vacancies for this posting. Published on native postings only. |

#### Description, Level & Pay

| Field | Type | Description |
|-------|------|-------------|
| `description` | string | null | Full job description with the employer's original HTML formatting. |
| `descriptionText` | string | null | Same description as clean plain text, ready for analysis or search indexing. |
| `careerLevel` | string | null | Entry Level, Mid Career, Management or Senior Executive. Optional — around 10% of employers fill it in. |
| `salaryMin` | number | null | Lower bound of the published salary range. Optional — Gulf employers rarely publish pay, so expect this on only a small share of rows. |
| `salaryMax` | number | null | Upper bound of the published salary range. Optional, same low publication rate. |
| `salaryCurrency` | string | null | Currency of the published range (e.g. `AED`, `SAR`). Optional. |
| `salaryPeriod` | string | null | Period the range refers to, e.g. monthly or yearly. Optional. |

#### Run Metadata

| Field | Type | Description |
|-------|------|-------------|
| `searchKeyword` | string | null | The keyword that produced this row. |
| `searchCountry` | string | null | The country market this row came from. |
| `searchCity` | string | null | The city narrowing applied, if any. |
| `language` | string | `en` or `ar` — which language version produced the row. |
| `scrapedAt` | string | ISO 8601 timestamp of when the row was collected. |

Detail fields (`description` through `salaryPeriod`, plus `companyId`, the address fields, `validThrough`, `directApply`, `totalJobOpenings` and `jobLocationType`) are populated only when `fetchJobDetails` is on. With it off, those columns stay empty and the run finishes several times faster.

### Tips for Best Results

- **Run daily monitoring with the 24-hour window** — set `datePosted` to Past 24 hours and `sortBy` to Most recent, then schedule the run each morning. You get only what appeared since yesterday, so cost stays flat as the market grows.
- **Split a big search by city to beat the 10,000-job ceiling** — Bayt never serves more than about 10,000 jobs for a single search. A nationwide query that hits the ceiling can be reproduced in full by running it once per major city (Dubai, Abu Dhabi, Sharjah…) and merging the results.
- **Search in Arabic to find postings English misses** — many regional employers advertise only in Arabic. Setting `language` to Arabic with an Arabic keyword returns a different pool of jobs, not a translation of the same one.
- **Go wide with "International & worldwide"** — it is by far the largest surface and pulls from every country at once. Use it for broad market studies, then re-run per country when you need clean geographic segmentation.
- **Be careful with `careerLevel` and `employmentType`** — most Bayt employers leave both blank, so these filters can cut a healthy result set down to a handful of jobs. Collect unfiltered and segment afterwards when you need volume.
- **Turn off `fetchJobDetails` for reconnaissance runs** — the search card alone gives you title, company, city, exact posting time, Easy Apply status and the job link. Switch details back on once you know which searches are worth the full description.
- **Tune your search in the browser, then paste the link** — anything you can filter on Bayt.com's own site can be dropped straight into `startUrls`, and you can mix search pages and individual job pages in the same run.

### Pricing

**From $0.80 per 1,000 results** — flat pay-per-job, below the usual Middle East job-data rates, with no per-contact surcharges. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.095 | $0.090 | $0.085 | $0.080 |
| 1,000 | $0.95 | $0.90 | $0.85 | $0.80 |
| 10,000 | $9.50 | $9.00 | $8.50 | $8.00 |
| 100,000 | $95.00 | $90.00 | $85.00 | $80.00 |

A "result" is one job posting row in your dataset, whether or not you enable full job details. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger your own systems when a run completes
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects job postings that Bayt.com publishes openly for candidates to browse. It is intended for legitimate recruitment, labour-market research, and business intelligence. You are responsible for complying with applicable laws and Bayt.com's Terms of Service, and for handling any personal data in the results — including named contacts inside job descriptions — in line with regulations such as GDPR and local data-protection law. Do not use collected data for spam, harassment, discriminatory hiring practices, or any unlawful purpose.

# Actor input Schema

## `searchKeyword` (type: `string`):

Job title or keyword to search for (e.g. 'software engineer', 'accountant', 'nurse', 'sales manager'). Leave blank to collect every job in the selected country.

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

Which Bayt.com country site to search. Choose 'International & worldwide' for the widest pool of listings.

## `city` (type: `string`):

Narrow the search to a single city (e.g. 'Dubai', 'Abu Dhabi', 'Riyadh', 'Cairo', 'Doha'). Leave blank to search the whole country.

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

Paste Bayt.com job-search links (e.g. https://www.bayt.com/en/uae/jobs/software-engineer-jobs/) or individual job links. Each link is collected as its own task and results are merged and de-duplicated. When you use this, the keyword, country and city above are ignored — the link already carries its own search. Any filters you set below are still applied, unless the link already specifies them.

## `language` (type: `string`):

Which language version of Bayt.com to read. Arabic returns the same jobs with Arabic page content where the employer provided it.

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

Only collect jobs posted within this time window. Leave blank to include jobs of any age.

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

Only collect jobs advertised at this career level. Note that most employers leave this blank on Bayt, so this filter can return very few jobs.

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

Only collect full-time or part-time roles. Note that many employers leave this blank on Bayt, so this filter can return far fewer jobs than the unfiltered search.

## `remoteOnly` (type: `boolean`):

Only collect jobs Bayt flags as remote / work from home.

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

Only collect jobs you can apply to directly on Bayt.com, skipping listings that redirect to an external careers site.

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

How Bayt orders the results before they are collected. 'Most recent' is useful when you want the newest postings first and are also setting a maximum.

## `fetchJobDetails` (type: `boolean`):

Open each job to collect the complete description, application deadline, employment type, career level, company ID and exact address. Turn this off for a faster, lighter run that keeps only the summary shown in the search results. On very large runs a small number of jobs may skip the full details; those rows still arrive with everything shown on the search results page, and the run tells you exactly how many were affected.

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

Hard cap on how many jobs to collect. Default 50 — increase for bigger runs, or set to 0 to collect everything that matches. Results arrive from Bayt in pages of 30, and the run always keeps the whole page it is on when the cap is reached, so the number you actually receive rounds up to the next multiple of 30 (ask for 1 and you get 30, ask for 50 and you get 60). Set a multiple of 30 if you want an exact count. Bayt itself never serves more than about 10,000 jobs for a single search, so to go deeper split your run by city or by the filters above.

## Actor input object example

```json
{
  "searchKeyword": "software engineer",
  "country": "uae",
  "startUrls": [],
  "language": "en",
  "sortBy": "r",
  "fetchJobDetails": true,
  "maxResults": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of jobs with the most useful fields — title, company, city, country, employment type, posting date and link.

## `details` (type: `string`):

Full per-job rows with descriptions, company IDs, exact address, work setting, career level, category, vacancies, salary range where published, and application deadline.

# 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 = {
    "searchKeyword": "software engineer",
    "country": "uae",
    "city": "",
    "startUrls": [],
    "language": "en",
    "remoteOnly": false,
    "easyApplyOnly": false,
    "sortBy": "r",
    "fetchJobDetails": true,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "searchKeyword": "software engineer",
    "country": "uae",
    "city": "",
    "startUrls": [],
    "language": "en",
    "remoteOnly": False,
    "easyApplyOnly": False,
    "sortBy": "r",
    "fetchJobDetails": True,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/bayt-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 '{
  "searchKeyword": "software engineer",
  "country": "uae",
  "city": "",
  "startUrls": [],
  "language": "en",
  "remoteOnly": false,
  "easyApplyOnly": false,
  "sortBy": "r",
  "fetchJobDetails": true,
  "maxResults": 50
}' |
apify call solidcode/bayt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/0H9mXhmgthokzfriB/builds/jBzTXQfYEf5d3Rk3o/openapi.json
