# MENA Jobs Scraper: UAE, Saudi & Egypt Tech Jobs (`alfhar/mena-jobs-scraper`) Actor

Scrape open jobs in Dubai, Abu Dhabi, Riyadh, Cairo and the wider Middle East from company career pages on Greenhouse, Lever, Ashby, SmartRecruiters and Recruitee, using their official public APIs.

- **URL**: https://apify.com/alfhar/mena-jobs-scraper.md
- **Developed by:** [Alfhar Development](https://apify.com/alfhar) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 96.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## MENA Jobs Scraper: UAE, Saudi Arabia, Egypt and Gulf tech jobs

Get **open jobs in Dubai, Abu Dhabi, Riyadh, Jeddah, Cairo, Doha, Kuwait City, Manama, Muscat, Amman, Casablanca and the rest of the Middle East and North Africa** as clean, structured data. The Actor reads the official public job-board APIs that companies such as Careem, Tamara, Binance, OKX, Bybit, Deliveroo, Ziina, Aldar and Unifonic publish for their career pages on **Greenhouse, Lever, Ashby and Recruitee**, then filters them by country and keyword.

Use it for a MENA job board, a hiring-trends report, recruiter lead lists (companies that are hiring in the Gulf right now), salary research or a daily Slack/Telegram alert for new roles.

### Why this Actor

- **MENA first.** Pick UAE, Saudi Arabia, Egypt, Qatar, Kuwait, Bahrain, Oman, Jordan, Lebanon, Morocco, Tunisia, Algeria or Iraq. Cities such as Dubai, Riyadh, Jeddah, Cairo, Giza, Doha, Muscat or Amman are recognised, and regional roles posted as "MENA", "GCC" or "Middle East" can be included.
- **Official public APIs, no login, no browser, no proxy.** Fast, stable and cheap. It does not scrape Wuzzuf, Bayt, LinkedIn or Indeed.
- **Pre-built company list.** About 23 companies that hire in the Gulf and Egypt are included. Add any other company by pasting its careers link.
- **Same fields for every source.** Title, company, location, department, employment type, workplace type, remote flag, salary range when the company publishes one, posting date, job link, apply link and the plain-text description.
- **No personal data.** Only job postings, no recruiter or candidate details.

### Input

| Field | Meaning | Example |
|---|---|---|
| `countries` | MENA countries to keep. Empty means worldwide. | `["UAE", "Saudi Arabia", "Egypt"]` |
| `keywords` | Words in the job title, department or team | `["engineer", "data"]` |
| `includeRegionalRoles` | Also keep jobs located "MENA", "GCC", "Middle East" or "EMEA" | `true` |
| `usePresetCompanies` | Use the built-in company list | `true` |
| `companies` | Extra careers links, `provider:slug` pairs or plain slugs | `["https://jobs.lever.co/acme", "ashby:acme"]` |
| `postedWithinDays` | Only jobs published in the last N days (0 = no limit) | `30` |
| `includeDescription` | Add the full plain-text description | `true` |
| `maxJobs` | Stop after this many jobs | `100` |

Example input:

```json
{
  "countries": ["UAE", "Saudi Arabia"],
  "keywords": ["engineer", "product"],
  "companies": ["https://jobs.lever.co/binance", "ashby:ziina"],
  "postedWithinDays": 60,
  "maxJobs": 200
}
```

Accepted company formats: `https://boards.greenhouse.io/acme`, `https://job-boards.greenhouse.io/acme`, `https://jobs.lever.co/acme`, `https://jobs.ashbyhq.com/acme`, `https://acme.recruitee.com`, `greenhouse:acme`, or just `acme` to try every provider.

### Output

One row per job. Example rows (real output, trimmed):

| Job title | Company | Location | Type | Posted | Source |
|---|---|---|---|---|---|
| Senior Data Scientist II - Personalization | Careem | Dubai, United Arab Emirates | - | 2026-07-07 | greenhouse |
| Backend Engineer, Payments Platform | ziina | Dubai | FullTime | 2026-08-12 | ashby |
| Assistant Vice President – Data Science | aldar | Abu Dhabi | Experienced hires | 2026-09-25 | lever |
| Product Manager - Data & Insights | Unifonic | Remote job | fulltime permanent | 2026-10-01 | recruitee |

Full JSON item:

```json
{
  "id": "8620289002",
  "title": "Senior Data Scientist II - Personalization",
  "company": "Careem",
  "location": "Dubai, United Arab Emirates",
  "locations": ["Dubai, United Arab Emirates"],
  "department": null,
  "employmentType": null,
  "workplaceType": null,
  "remote": null,
  "postedAt": "2026-07-07T04:36:13-04:00",
  "updatedAt": "2026-09-29T04:06:01-04:00",
  "url": "https://boards.greenhouse.io/careem/jobs/8620289002",
  "applyUrl": "https://boards.greenhouse.io/careem/jobs/8620289002",
  "description": "Careem is building the Everything App for the greater Middle East ...",
  "ats": "greenhouse",
  "companySlug": "careem",
  "countries": ["UAE"],
  "mena": true,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryInterval": null,
  "scrapedAt": "2026-10-07T15:45:48Z"
}
```

`countries` lists the MENA countries found in the job's locations. `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryInterval` are filled only when the company publishes a pay range (Lever, Ashby and Recruitee do for some roles).

### How to use

1. Open the Actor, keep the default countries or pick your own, and press **Start**.
2. Download the dataset as JSON, CSV, Excel or HTML, or call it from the API.
3. Schedule it daily and compare datasets to get only new jobs, or send the results to Google Sheets, Slack, Make or n8n.

### Use cases

- Job boards and newsletters for Gulf and Egyptian tech talent.
- Hiring-trend and market reports: who is hiring in Dubai, Riyadh and Cairo, in which teams and at what pace.
- Sales and recruiting agencies: a live list of companies with open roles in the region.
- Relocation and remote-work research for engineers looking at the UAE or Saudi Arabia.

### Pricing

Pay per event: a small fee when a run starts plus a fee for every job returned. Set a maximum cost per run and the Actor stops at your limit. See the pricing panel on this page for the current rates.

### Limitations

- Coverage is the companies you list plus the built-in list. A company that uses another applicant tracking system (for example Workday, SmartRecruiters or a custom site) is not covered. SmartRecruiters is left out on purpose because its API robots.txt disallows bots. Open the **Issues** tab to suggest more providers or companies.
- Country detection uses the location text the company publishes. A location such as "Jordan Valley, USA" can be mistaken for Jordan. Check the `location` field if you need to be strict.
- Salary is not published for most roles.
- Job data belongs to the hiring companies. Respect their terms when you republish it.

### Support

Missing a company or a field? Use the **Issues** tab of this Actor.

# Actor input Schema

## `countries` (type: `array`):

Keep jobs located in these countries (matched on city and country names such as Dubai, Riyadh, Cairo). Leave empty for jobs worldwide.

## `keywords` (type: `array`):

Keep jobs whose title, department or team contains any of these words, for example engineer, product, sales, data. Leave empty for all jobs.

## `includeRegionalRoles` (type: `boolean`):

Also keep jobs whose location only says MENA, Middle East, GCC or EMEA, when you filter by country.

## `usePresetCompanies` (type: `boolean`):

About 23 companies that hire in the Gulf and Egypt (Careem, Tamara, Binance, Deliveroo, Ziina, Aldar, Unifonic and more).

## `companies` (type: `array`):

Add careers-page links (jobs.lever.co/acme, boards.greenhouse.io/acme, jobs.ashbyhq.com/acme, acme.recruitee.com), 'provider:slug' pairs such as lever:acme, or just a slug to try every provider.

## `postedWithinDays` (type: `integer`):

Keep only jobs published in the last N days. 0 means no limit.

## `includeDescription` (type: `boolean`):

Adds the plain-text job description. Turn off for a faster, lighter run.

## `maxJobs` (type: `integer`):

Stop after this many jobs.

## Actor input object example

```json
{
  "countries": [
    "UAE",
    "Saudi Arabia",
    "Egypt"
  ],
  "keywords": [
    "engineer"
  ],
  "includeRegionalRoles": true,
  "usePresetCompanies": true,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobs": 100
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the default dataset.

# 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 = {
    "countries": [
        "UAE",
        "Saudi Arabia",
        "Egypt"
    ],
    "keywords": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfhar/mena-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 = {
    "countries": [
        "UAE",
        "Saudi Arabia",
        "Egypt",
    ],
    "keywords": ["engineer"],
}

# Run the Actor and wait for it to finish
run = client.actor("alfhar/mena-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 '{
  "countries": [
    "UAE",
    "Saudi Arabia",
    "Egypt"
  ],
  "keywords": [
    "engineer"
  ]
}' |
apify call alfhar/mena-jobs-scraper --silent --output-dataset

```

## MCP server setup

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