# GulfTalent Job Scraper — Salaries & 40+ Fields, 10 Markets (`corvuslab/gulftalent-scraper`) Actor

Scrape GulfTalent across 10 Gulf & Middle East markets — 40+ structured fields per job including salary, full descriptions and postal addresses. Filter by country, city, category, seniority and type; monitor new postings on a schedule.

- **URL**: https://apify.com/corvuslab/gulftalent-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Lead generation, Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 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/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

## GulfTalent Job Scraper — Gulf & Middle East Jobs & Salaries

> **Turn every live GulfTalent listing into clean, structured job data — filtered across 10 Gulf & Middle East markets, in seconds.**

### What does the GulfTalent Scraper do?

Scrape job listings from **GulfTalent** across all six GCC countries — the UAE, Saudi Arabia, Qatar, Kuwait, Bahrain and Oman — plus **Egypt, Jordan, Lebanon and Iraq**. Search by keyword and drill down with precise filters for **country, city, category, seniority and job type**, then get back rich, typed records: job title, company, location, category, **structured salary** (min, max, currency and period), full description in text / HTML / Markdown, postal address and posting dates. It runs no-code in the visual editor or via the API, exports to **JSON, CSV, Excel or AI/MCP pipelines**, and can **monitor a search on a schedule** so you only pay for what changed.

**Why this scraper**

- ⚡ **Fast & low-cost** — lightweight requests and no proxy needed at typical volumes, so large runs stay cheap.
- 🧾 **Rich, typed records** — 40+ structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### ✨ Key features

- 🌍 **10 Gulf & Middle East markets** — UAE, Saudi Arabia, Qatar, Kuwait, Bahrain, Oman, Egypt, Jordan, Lebanon and Iraq, filterable by country and by 20 major cities (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Manama, Muscat, Cairo, Amman and more).
- 🎚️ **Broad, precise filters** — combine keyword + country + city + **32 job categories** + **seniority** (graduate → director) + **job type** (full-time, part-time, contract, internship, temporary), plus remote-only, easy-apply-only and exclusive-only toggles and posting-date windows.
- 💰 **Structured salary parsing** — not just a salary string: `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` broken out as clean numbers you can sort, filter and chart.
- 🧾 **Complete job records** — title, company (with logo and profile URL), location, category, industry, seniority, employment type, posting and expiry dates, apply flags and reference.
- 🧠 **Full descriptions & address** — each job's page adds the full description in **text, HTML and Markdown**, plus street address, locality and region.
- 🔎 **Search or URL scraping** — run a keyword + filter search, or paste GulfTalent search, city-listing or job-page URLs directly.
- ♻️ **Incremental monitoring** — schedule it and get only what changed (NEW / UPDATED / EXPIRED); unchanged jobs are skipped before their page is even fetched.
- 🔔 **Notifications** — Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI-ready** — compact + drop-empty output modes keep payloads small for LLMs and MCP.

***

### 📤 Example output

```json
{
  "id": "582923",
  "title": "General Technician",
  "url": "https://www.gulftalent.com/uae/jobs/general-technician-582923",
  "company": "Al Forsan",
  "companyUrl": "https://www.gulftalent.com/companies/al-forsan-careers",
  "companyLogo": "https://www.gulftalent.com/images1/logos/listing/SE076-14130_logo-img-al-forsan-careers-jobs.png",
  "location": "Abu Dhabi, UAE",
  "city": "Abu Dhabi",
  "country": "United Arab Emirates",
  "countryCode": "uae",
  "category": "Engineering - Mechanical & Aeronautical",
  "industry": "Business Support & Outsourcing",
  "seniority": "Experienced Professional",
  "employmentType": "Full-time",
  "isRemote": false,
  "isExclusive": false,
  "easyApply": true,
  "postedDate": "2026-05-11",
  "salaryMin": 3500.0,
  "salaryMax": 3900.0,
  "salaryCurrency": "AED",
  "salaryPeriod": "MONTH",
  "salaryText": "AED 3500-3900 / month",
  "validThrough": "2026-08-09T00:00:00+00:00",
  "streetAddress": "Khalifa City",
  "addressLocality": "Abu Dhabi",
  "addressRegion": "Abu Dhabi",
  "reference": "582923",
  "source": "gulftalent.com",
  "searchKeyword": "technician",
  "scrapedAt": "2026-08-06T14:57:08Z",
  "detailFetched": true,
  "description": "Role Overview\nThe role of General Technician is to maintain and repair all Kids Park arcade games, rides, attractions… Responsibilities: Assembling, installing, repairing, troubleshooting…",
  "descriptionLength": 1990
}
```

Descriptions are also available as **HTML** (`descriptionHtml`) and **Markdown** (`descriptionMarkdown`).

### 📥 Example input

A few ready-to-run configurations — set these in the visual editor or pass them as JSON via the API:

Broad keyword search across every market:

```json
{ "query": "accountant", "maxResults": 100 }
```

Filtered — senior software roles in Dubai and Abu Dhabi, full-time only:

```json
{
  "query": "software engineer",
  "country": ["ae"],
  "city": ["dubai", "abu-dhabi"],
  "category": ["software"],
  "seniority": ["manager", "director"],
  "employmentType": ["full-time"],
  "includeDetails": true,
  "maxResults": 200
}
```

Incremental monitoring — poll new nursing jobs across the GCC on a schedule:

```json
{
  "query": "nurse",
  "country": ["ae", "sa", "qa", "kw", "bh", "om"],
  "incrementalMode": true,
  "maxAgeDays": 7
}
```

***

### 📚 What data can you extract?

- **Core** — `title`, `company`, `companyUrl`, `companyLogo`, `location`, `city`, `country`, `countryCode`, `category`, `industry`, `seniority`, `employmentType`, `postedDate`, `url`, `reference`.
- **Flags & dates** — `isRemote`, `isExclusive`, `easyApply`, `companyConfidential`, `postedAt`, `validThrough`.
- **Salary** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`.
- **Details** (with **Fetch full details**) — `description`, `descriptionHtml`, `descriptionMarkdown`, `descriptionLength`, `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`.
- **Monitoring** (with incremental mode) — `changeType`, `isRepost`, `repostOfId`, `repostDetectedAt`, `contentHash`.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads.

***

### ⚙️ Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search (comma-separate for multiple searches, merged and de-duplicated). |
| `country` | Limit to any of 10 Gulf & Middle East countries. |
| `city` | Limit to one or more of 20 major cities. |
| `category` | Limit to any of 32 job categories. |
| `seniority` | Filter by experience level (graduate → director). |
| `employmentType` | Full-time, part-time, contract, internship or temporary. |
| `startUrls` | Scrape specific GulfTalent search, city-listing or job-page URLs. |
| `includeDetails` | Fetch each job's page for description, salary and address. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of jobs (0 = unlimited). |

…and **36 inputs** in total — the table shows the essentials; the rest cover remote / easy-apply / exclusive toggles, date windows, include/exclude keywords, description format and length, compact and drop-empty output modes, notification channels and advanced tuning, all in the visual editor.

***

### 💡 Use cases

- **Recruitment & talent sourcing** — pull every matching vacancy across the Gulf, filtered by role, city and seniority, into one clean feed.
- **Salary & market research** — analyse structured pay ranges by country, category and seniority to benchmark compensation.
- **Hiring-trend monitoring** — track how many roles a company or category is posting over time across 10 markets.
- **Job-board & aggregator feeds** — enrich your own product, sheet or warehouse with fresh, de-duplicated GulfTalent listings.
- **Vacancy monitoring** — schedule it with incremental mode + notifications for a live change feed of new postings.
- **AI agents & pipelines** — compact output plugs straight into LLM/MCP workflows.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** jobs — unchanged listings are skipped *before* their detail page is fetched, so a daily watch costs a fraction of a full re-scrape.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta.

***

### 🚀 How to run it

1. Open the actor and enter a **search keyword** (e.g. `accountant`) and/or pick **country, city, category, seniority and job-type** filters — or paste a GulfTalent URL.
2. Set **Max results** and choose whether to **Fetch full details**.
3. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
4. Click **Start**.
5. Download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### ❓ FAQ

**Which countries and cities does it cover?** All six GCC states — UAE, Saudi Arabia, Qatar, Kuwait, Bahrain and Oman — plus Egypt, Jordan, Lebanon and Iraq, and 20 major cities including Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Manama, Muscat, Cairo and Amman.

**Do I need a proxy or login?** No — it runs out of the box with no login; Apify Proxy is available under Advanced for very high-volume runs.

**How does salary come back?** As structured numbers — `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` — alongside the original `salaryText`, so you can sort and analyse pay directly.

**Can I get only new jobs on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly.

**How many records can I get?** As many as the search returns — set `maxResults` (0 = unlimited).

**Is scraping this legal?** The actor collects only **publicly available** data. You are responsible for how you use it, including any personal data and GDPR-style obligations.

***

### ⚖️ Disclaimer

This actor accesses only publicly available data on GulfTalent. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by GulfTalent.

***

**Keywords:** gulftalent scraper · gulftalent.com scraper · gulftalent api · gulftalent job scraper · gulf jobs scraper · middle east jobs scraper · uae jobs scraper · dubai jobs scraper · saudi arabia jobs scraper · qatar jobs scraper · gcc job listings · job salary data · job market research · recruitment data scraper · export jobs to csv excel json · no-code job scraper · job monitoring · mcp tool for ai agents

# Actor input Schema

## `query` (type: `string`):

Job title or keywords, e.g. "accountant" or "civil engineer". Separate multiple searches with commas — each runs on its own and results are merged and de-duplicated.

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

Newest first, or most relevant to the keyword. Relevance is used automatically when you search a keyword.

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

Paste GulfTalent search, listing or job-page URLs to scrape directly (e.g. https://www.gulftalent.com/uae/jobs/city/dubai). Country / city / category are read from the URL.

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

Maximum number of jobs to return. Set 0 for unlimited (bounded by how many the search has).

## `country` (type: `array`):

Limit to one or more Gulf / Middle East countries.

## `city` (type: `array`):

Limit to one or more cities.

## `category` (type: `array`):

Limit to one or more job categories (roles).

## `seniority` (type: `array`):

Limit to one or more experience levels.

## `employmentType` (type: `array`):

Limit to one or more employment types.

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

Keep only jobs flagged as remote.

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

Keep only jobs you can apply to directly on GulfTalent (no external application).

## `exclusiveOnly` (type: `boolean`):

Keep only GulfTalent-exclusive listings.

## `maxAgeDays` (type: `integer`):

Keep only jobs posted within the last N days. 0 = no limit.

## `fromDate` (type: `string`):

Earliest posting date to keep (YYYY-MM-DD).

## `toDate` (type: `string`):

Latest posting date to keep (YYYY-MM-DD).

## `includeKeywords` (type: `array`):

Keep only jobs whose title, company, category or industry contains at least one of these words.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category or industry contains any of these words.

## `includeDetails` (type: `boolean`):

Fetch each job's page for the description, salary and postal address. Turn off for the fastest, cheapest runs.

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

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Truncate descriptions to N characters (helps control LLM cost). 0 = no cap.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

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

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit jobs that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for jobs present last run but gone now.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched jobs — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many jobs to include in each notification message.

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

Optional. This actor runs fine with no proxy (the default). Enable Apify Proxy only if you hit rate limits on very large runs.

## `maxScanPages` (type: `integer`):

Safety cap on how many listing pages one search scans while looking for matches (each page is ~50 jobs). Raise it if a very narrow filter returns fewer jobs than expected.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "query": "accountant",
  "sortBy": "date",
  "maxResults": 25,
  "remoteOnly": false,
  "easyApplyOnly": false,
  "exclusiveOnly": false,
  "maxAgeDays": 0,
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxScanPages": 200,
  "maxRequestRetries": 3
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": "accountant"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/gulftalent-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 = { "query": "accountant" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/gulftalent-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 '{
  "query": "accountant"
}' |
apify call corvuslab/gulftalent-scraper --silent --output-dataset

```

## MCP server setup

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