# GulfTalent Scraper - Gulf & Middle East Jobs with Salaries (`scrapewise/gulftalent-jobs-scraper`) Actor

Scrape GulfTalent jobs in the UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain and Egypt without login: title, company, city, salary, seniority, job type, category, industry, nationality, posted and closing date, full description. Filter by keyword, country, city, category.

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

## Pricing

from $0.85 / 1,000 job delivereds

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/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

## GulfTalent Scraper: Gulf and Middle East jobs with salaries and full descriptions

GulfTalent Scraper collects **job posts from GulfTalent.com**, one of the main job boards for the UAE, Saudi Arabia,
Qatar, Kuwait, Oman, Bahrain, Egypt, Jordan and Lebanon, without an account, cookies or a browser. Search by keyword
and filter by country, city, job category, industry, seniority and job type, the same filters the site offers. Each
job comes back as one clean row: title, company, city and country, seniority, job type, category, industry, posting
date and, with full details on (the default), the complete description, the published salary range, the closing
date, the office address, the nationality and gender requirements, Arabic fluency and the job reference.

It is used to monitor hiring demand and salaries across the GCC, to find companies that are hiring in Dubai, Riyadh or
Doha for recruitment and B2B outreach, to feed job alerts and aggregators, and to research the Gulf labour market by
role, industry and seniority.

### At a glance

| What | Price |
|---|---|
| Job delivered (full details included) | **US$ 1.00 per 1,000 jobs** on the Free plan (US$ 0.001 each) |
| Bronze / Silver / Gold and above | US$ 0.95 / 0.90 / 0.85 per 1,000 jobs |
| Run start | US$ 0.005 per run |

- 500 accountant jobs in the UAE with full descriptions = **US$ 0.505** on the Free plan, start included.
- The job page with the description and salary is included in the same price: there is no extra event for details.
- Error rows, duplicates and closed jobs are never charged. `maxItems` is a hard cap, and a spending limit set on the
  run stops it cleanly with everything delivered so far.
- Runs on the default Apify datacenter proxy, which is enough for GulfTalent. No residential proxy cost.

### Quick start

```json
{
  "searchTerms": ["accountant"],
  "maxItems": 30
}
```

Newest civil engineering manager jobs in Saudi Arabia from the last 30 days:

```json
{
  "searchTerms": ["civil engineer"],
  "countries": ["Saudi Arabia"],
  "experienceLevel": ["manager"],
  "sortBy": "newest",
  "postedWithinDays": 30,
  "maxItems": 200
}
```

Every full-time nursing job in Dubai and Abu Dhabi, list fields only (fastest):

```json
{
  "searchTerms": ["nurse"],
  "cities": ["Dubai", "Abu Dhabi"],
  "jobType": ["full_time"],
  "includeDetails": false,
  "maxItems": 0
}
```

Use `*` as a keyword for every job that matches the filters (for example all IT jobs in Qatar). You can also paste
GulfTalent links in `startUrls`: a job page such as `https://www.gulftalent.com/uae/jobs/<title>-<id>` or a search
page such as `https://www.gulftalent.com/jobs/search?keyword=pharmacist`.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Job titles or keywords, one search per line (default `accountant`; `*` = all jobs). |
| `countries` | UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt, Jordan, Lebanon, Iraq and 28 more. |
| `cities` | Dubai, Abu Dhabi, Sharjah, Riyadh, Jeddah, Dammam, Khobar, Doha, Kuwait City, Muscat, Manama, Cairo, Amman, Beirut and the other cities GulfTalent lists. A country name typed here works as a country filter. |
| `jobCategory` | GulfTalent job roles, for example IT - Software & Web Development, Accounting & Audit, Healthcare, Sales - Retail. |
| `industries` | Industry of the hiring company, for example Construction, Banking & Financial Services, Oil & Gas / Energy. |
| `experienceLevel` | `fresh_graduate`, `junior`, `experienced`, `manager`, `director`. |
| `jobType` | `full_time`, `part_time`, `contract`, `temporary`, `internship`. |
| `remoteOnly` | Only the jobs GulfTalent lists as remote. |
| `postedWithinDays` | Only jobs posted in the last N days (0 = any date). |
| `sortBy` | `relevance` (GulfTalent's order, default) or `newest` (reads up to 3,000 matching jobs and sorts them by date). |
| `includeDetails` | On by default: opens each job page for the description, salary and key facts. Off: list fields only. |
| `startUrls` | GulfTalent job or search links. |
| `maxItems` | Cap for the whole run (default 30; 0 = no cap). |
| `proxyConfiguration` | Apify datacenter proxy by default. |

`searchQuery`, `keyword`, `keywords`, `query`, `maxResults`, `limit`, `country`, `city`, `location`, `category`,
`industry`, `seniority`, `employmentType` and `sort` are accepted too, so inputs written for other job tools keep
working. A filter value GulfTalent does not know returns a free `UNKNOWN_FILTER` row and the rest of the search runs.

### Output

| Field | What it is |
|---|---|
| `jobId`, `url` | GulfTalent job id and public job link |
| `title` | Job title as posted |
| `companyName`, `companyId`, `companyUrl`, `companyLogo` | Hiring company, its GulfTalent page and logo |
| `companyConfidential` | `true` when the employer hides its name ("A Leading Company In Saudi Arabia") |
| `location`, `city`, `country`, `isRemote` | Job location as listed, split into city and country |
| `category`, `industry`, `jobFunction` | Job role, company industry and job function |
| `seniority`, `employmentType`, `jobTypeText`, `employmentTypes` | Seniority level and job type |
| `postedAt`, `datePosted`, `validThrough` | Posting date and the closing date the employer set |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | Published salary range (AED, SAR, QAR, KWD... per month), only when the employer shows it |
| `nationality`, `gender`, `arabicFluency` | Requirements listed on the job |
| `description`, `descriptionHtml` | Full job description as plain text and as HTML |
| `addressLocality`, `addressRegion`, `addressCountry` | Office address of the job |
| `reference`, `directApply` | Employer reference and whether it is an Easy Apply job |
| `isExclusive`, `hasExternalApplication`, `isAggregated` | GulfTalent flags for exclusive jobs, jobs applied on the employer site and jobs GulfTalent collects from other boards |
| `sourceUrl`, `scrapedAt` | The keyword or link you sent, and when the row was collected |

One real row (description shortened):

```json
{
  "type": "job",
  "jobId": 602905,
  "title": "Accountant",
  "url": "https://www.gulftalent.com/saudi-arabia/jobs/accountant-602905",
  "companyName": "Moore JFC Consulting",
  "companyUrl": "https://www.gulftalent.com/companies/moore-jfc-consulting-careers",
  "location": "Riyadh, Saudi Arabia",
  "city": "Riyadh",
  "country": "Saudi Arabia",
  "category": "Accounting & Audit",
  "industry": "Audit & Accountancy",
  "seniority": "Experienced professional",
  "employmentType": "FULL_TIME",
  "postedAt": "2026-06-30T05:00:00Z",
  "salaryMin": 2500,
  "salaryMax": 4000,
  "salaryCurrency": "SAR",
  "salaryPeriod": "month",
  "salaryText": "2500 - 4000 SAR",
  "nationality": "Philippines",
  "arabicFluency": "Not Specified",
  "validThrough": "2026-09-28T00:00:00+00:00",
  "description": "We are seeking a detail-oriented and experienced Accountant to join our dynamic audit and finance consultancy team in Riyadh...",
  "reference": "SP171-47"
}
```

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not a GulfTalent job or search link |
| `INVALID_INPUT` | A number field has a wrong value |
| `UNKNOWN_FILTER` | A country, city, category, industry, level or job type GulfTalent does not have; that filter is skipped |
| `NO_RESULTS` | The search and filters match no job |
| `NOT_FOUND`, `JOB_CLOSED` | The job link no longer exists or GulfTalent shows it as closed |
| `TIMEOUT`, `NETWORK`, `HTTP_5xx` | GulfTalent did not answer after 4 tries with fresh connections; run it again |

A job whose page could not be opened after 4 tries is still delivered with its list fields and a `detailsError` code.

### Integrations, scheduling and AI agents

- **Daily job alerts:** schedule the same search every morning with `sortBy: newest` and `postedWithinDays: 1` in
  [Apify schedules](https://docs.apify.com/platform/schedules).
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Slack or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations).
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "find the newest finance manager jobs in Dubai on
  GulfTalent and compare the published salaries".

### FAQ

**Do I need a GulfTalent account?** No. Everything comes from public GulfTalent pages, without login or cookies.

**Why is the salary empty on many jobs?** GulfTalent shows the salary only when the employer chooses to publish it.
The Actor exports exactly what the job page shows and never a hidden figure.

**What does `includeDetails: false` change?** The run skips the job pages and is several times faster, but rows have
no description, salary, closing date, address or requirements. The price per job is the same.

**Does it return recruiter names or contacts?** No. Only job and company data. Emails and phone numbers written inside
descriptions are replaced with `[contact removed]`.

**Is it legal?** The Actor reads public pages only. You are responsible for how you use the data under the laws that
apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- `relevance` is GulfTalent's own ranking, which matches related titles too (a search for "civil engineer" also
  returns other engineering roles). Add a category or use precise titles to narrow it.
- `newest` sorts up to 3,000 matching jobs; very broad searches beyond that keep GulfTalent's order.
- Applying to jobs needs a GulfTalent account and is not done by the Actor. `validThrough` is the date the employer
  set; some jobs stay open after it.

### Changelog

- **16 Oct 2026:** first version: keyword search with country, city, category, industry, seniority, job type, remote
  and date filters, newest-first sorting, full job details with published salary and key facts.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles or keywords, one per line, for example accountant, civil engineer, nurse, sales manager. Each line is one GulfTalent search. Use \* for all jobs that match the filters.

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

Only jobs in these countries. Empty = all countries.

## `cities` (type: `array`):

Only jobs in these cities, for example Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Muscat, Manama, Cairo. Empty = all cities.

## `jobCategory` (type: `array`):

GulfTalent job roles (functions). Empty = all.

## `industries` (type: `array`):

Industry of the hiring company. Empty = all.

## `experienceLevel` (type: `array`):

Seniority levels to keep. Empty = all.

## `jobType` (type: `array`):

Employment types to keep. Empty = all.

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

On: only the jobs GulfTalent lists as remote.

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

Only jobs posted in the last N days. 0 = any date.

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

Newest first reads up to 3,000 matching jobs from the search and sorts them by posting date.

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

On (default): opens each job page for the full description, published salary, closing date, address, nationality, gender, Arabic fluency and reference. Off: faster list fields only (same price).

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

Optional. Job pages such as https://www.gulftalent.com/uae/jobs/<title>-<id> or search pages such as https://www.gulftalent.com/jobs/search?keyword=nurse.

## `maxItems` (type: `integer`):

Hard cap for the whole run, across all keywords. 0 = no cap.

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

The default Apify Proxy (datacenter) works for GulfTalent. Keep the default.

## Actor input object example

```json
{
  "searchTerms": [
    "accountant"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "sortBy": "relevance",
  "includeDetails": true,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchTerms": [
        "accountant"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/gulftalent-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 = {
    "searchTerms": ["accountant"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/gulftalent-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 '{
  "searchTerms": [
    "accountant"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/gulftalent-jobs-scraper --silent --output-dataset

```

## MCP server setup

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