# MENA Startup Jobs — Gulf, Saudi & Egypt Tech Company Jobs (`hasanradi93/mena-startup-jobs`) Actor

Open jobs at Middle East and North Africa tech companies (Careem, Tamara, Salla, Foodics, Lean, Bayut…) straight from their official public job boards. Filter by country, keyword, remote and date; monitor only new jobs.

- **URL**: https://apify.com/hasanradi93/mena-startup-jobs.md
- **Developed by:** [RAZOV tech](https://apify.com/hasanradi93) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

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 Startup Jobs — Gulf, Saudi & Egypt tech company jobs

Every open job at the Middle East and North Africa's tech companies, in one clean table — Careem,
Tamara, Lean Technologies, Salla, Foodics, Bayut, Toters, Ziina, Thndr, Unifonic and more — read
straight from **each company's own public job board**. No HTML scraping, no proxies, no login.

Filter by country (UAE, Saudi Arabia, Egypt, Jordan, Lebanon, Qatar…), by keyword, remote or not,
and by how recently a job was posted. Turn on **Only new jobs** and schedule it daily to get a feed
of new openings.

### Who uses it

- **Recruiters and agencies** in the Gulf and Egypt — see who is hiring for what, the day it opens.
- **Job boards and newsletters** for the region — fill a MENA tech jobs feed without copying by hand.
- **Investors and analysts** — hiring is a growth signal: which startups are adding engineers, in
  which country, this month.
- **Job seekers and career coaches** — one search across companies instead of thirty careers pages.

### What you get

One row per job, the same shape whichever job board the company uses:

| Field | Example |
|---|---|
| `company` | Lean Technologies |
| `companyHq` | SA |
| `title` | Senior Compliance Manager |
| `department` / `team` | Business / Compliance |
| `location`, `city`, `country` | Riyadh, Saudi Arabia · Riyadh · SA |
| `countries`, `allLocations` | every country and location the job names |
| `remote` | false |
| `employmentType` | FullTime |
| `salary` | when the company publishes one |
| `postedAt`, `updatedAt` | 2026-09-10T12:08:35.611Z |
| `url`, `applyUrl` | the job's page and its application form |
| `description` | full plain text, when you ask for it |
| `ats`, `id`, `scrapedAt` | where it came from, a stable id, when it was read |

```json
{
  "id": "ashby:leantech:b32337e5-d3a0-4f35-be2a-b2646a86c7c1",
  "company": "Lean Technologies",
  "companyHq": "SA",
  "ats": "ashby",
  "title": "Senior Compliance Manager",
  "department": "Business",
  "team": "Compliance",
  "location": "Riyadh, Saudi Arabia",
  "country": "SA",
  "city": "Riyadh",
  "remote": false,
  "employmentType": "FullTime",
  "salary": null,
  "postedAt": "2026-09-10T12:08:35.611Z",
  "url": "https://jobs.ashbyhq.com/leantech/b32337e5-d3a0-4f35-be2a-b2646a86c7c1",
  "applyUrl": "https://jobs.ashbyhq.com/leantech/b32337e5-d3a0-4f35-be2a-b2646a86c7c1/application",
  "scrapedAt": "2026-10-24T06:37:44.551Z"
}
```

Download it as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Input

| Option | What it does |
|---|---|
| **Countries** | `AE`, `SA`, `EG`, `JO`, `LB`, `QA`, `BH`, `KW`, `OM`, `MA`, `TN`, `IQ`… or names. A job matches when any of its locations is in one of them (`country` shows its first). Empty = all, including jobs these companies post abroad. |
| **Keywords** | Any of these words in the title, department or team, e.g. `engineer`, `product`, `data`. |
| **Remote jobs only** | Only jobs the board marks as remote. |
| **Posted within (days)** | Only jobs first published in the last N days. |
| **Maximum jobs** | Stop after this many — you pay per job. |
| **Include job descriptions** | Adds the full text (e-mail addresses removed). |
| **Only new jobs** | Skips every job delivered to you before. Schedule it daily for a feed. |
| **Monitor name** | Keeps separate "seen" lists for separate feeds. |
| **Use the built-in MENA company list** | On by default. |
| **Add companies** | Any company on a supported board, by careers URL — see below. |

Example — Saudi and UAE engineering jobs from the last two weeks:

```json
{
  "countries": ["SA", "AE"],
  "keywords": ["engineer", "developer"],
  "postedWithinDays": 14,
  "maxJobs": 500
}
```

### Companies included

The built-in list holds MENA tech companies whose job board answered with open jobs when it was last
checked (the date is in `src/companies.json`):

Careem · Tamara · Aldar · Ziina · Thndr · Lean Technologies · Foodics · Salla · Lucidya · Tamatem
Games · Almosafer · Namshi · Brimore · Noon Academy · Yassir · Carriage · Unifonic · Sahl · Bayut ·
Bosta · NymCard · Instabug · Toters · ToYou

**Add any company yourself.** Paste its careers-page URL into *Add companies* if it uses one of
these job boards:

| Board | URL looks like |
|---|---|
| Greenhouse | `boards.greenhouse.io/<company>` or `job-boards.greenhouse.io/<company>` |
| Lever | `jobs.lever.co/<company>` |
| Ashby | `jobs.ashbyhq.com/<company>` |
| Workable | `apply.workable.com/<company>` |
| SmartRecruiters | `jobs.smartrecruiters.com/<company>` |
| Recruitee | `<company>.recruitee.com` |
| BambooHR | `<company>.bamboohr.com/careers` |

```json
{ "companies": ["https://jobs.lever.co/aldar", { "name": "Acme", "ats": "ashby", "slug": "acme" }] }
```

It works for companies anywhere, not only in the region.

### Price

**$1 per 1,000 jobs** (pay per result). A run over the whole built-in list returns a few hundred
jobs. You only pay for jobs delivered; with *Only new jobs* on, a daily run costs a few cents.

### FAQ

**Is this legal?** It reads the job boards companies publish for exactly this purpose — the same
public feeds their own careers pages use. It collects job postings only: no candidate data, no
personal data. E-mail addresses that appear inside a description are removed.

**Why are some countries outside MENA?** These companies hire abroad too (Careem in Pakistan,
Yassir in Germany). Use *Countries* to keep only the ones you want.

**A company I want is missing.** Add it by URL (above). If its careers page is on a board not
listed, write to us from the Issues tab and we will look.

**How fresh is it?** Live: every run reads the boards at that moment.

**A board failed in my run.** The run carries on with the others and lists failures in the `OUTPUT`
record of the run's key-value store. Boards rate-limit now and then; the Actor waits and retries.

# Actor input Schema

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

Keep jobs in these countries only. ISO codes (AE, SA, EG, JO, LB, QA, BH, KW, OM, MA…) or names. Empty = every country, including jobs these companies post abroad.

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

Keep jobs whose title, department or team contains any of these words (any case). Empty = all jobs.

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

Keep only jobs the board marks as remote.

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

Keep jobs first published in the last N days. 0 = no limit. Jobs a board does not date are kept.

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

Stop after this many jobs. You pay per job delivered.

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

Add each job's full text (plain text, e-mail addresses removed). Makes the run slower for a few boards.

## `onlyNew` (type: `boolean`):

Deliver only jobs this Actor has not delivered to you before. Schedule it daily to get a feed of new openings.

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

Keeps separate 'seen' lists for separate monitors (for example 'saudi-engineering'). Only used with 'Only new jobs'.

## `useBuiltInList` (type: `boolean`):

Read every company in the Actor's verified list of MENA tech companies.

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

Extra companies, as careers-page URLs on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee or BambooHR (e.g. https://jobs.lever.co/aldar), or objects {"name", "ats", "slug"}.

## Actor input object example

```json
{
  "countries": [
    "AE",
    "SA"
  ],
  "keywords": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobs": 200,
  "includeDescription": false,
  "onlyNew": false,
  "stateKey": "default",
  "useBuiltInList": true,
  "companies": []
}
```

# Actor output Schema

## `jobs` (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 = {
    "countries": [
        "AE",
        "SA"
    ],
    "maxJobs": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("hasanradi93/mena-startup-jobs").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": [
        "AE",
        "SA",
    ],
    "maxJobs": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("hasanradi93/mena-startup-jobs").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": [
    "AE",
    "SA"
  ],
  "maxJobs": 200
}' |
apify call hasanradi93/mena-startup-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hasanradi93/mena-startup-jobs"
        }
    }
}
```

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/4V5uObloeBFwkyHaK/builds/gDOcRjb0xiAeDbW7r/openapi.json
