# GulfTalent Jobs Scraper (`crawlerbros/gulftalent-scraper`) Actor

Scrape live job listings from GulfTalent.com - the Middle East's leading job board. Search by keyword, country, city, category, industry, job type, career level, nationality preference, or a specific employer's careers page, and get full job details including salary and description.

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

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## GulfTalent Jobs Scraper

Extract live job listings from [GulfTalent](https://www.gulftalent.com) — one of the Middle East's largest job boards, covering the UAE, Saudi Arabia, Qatar, Kuwait, Bahrain, Oman, Egypt, Jordan, and more. Search by keyword, or browse by country, city, job category, company industry, job type, career/seniority level, Gulf-nationality preference, or a specific employer's own careers page. Get full job details — salary, description, company info, and application deadline — with no login, cookies, or API key required.

### What this actor does

- **8 modes:** free-text `search`, plus browse-by `category`, `industry`, `jobType`, `nationality`, `careerLevel`, `company`, or fetch specific job URLs directly
- **Geography:** filter by any of GulfTalent's 16 supported countries and 29 major cities
- **Employer lookup:** pull every open role listed on a single company's own GulfTalent careers page
- **Full job details:** salary range & currency, employment type, job function, nationality/gender preference, Arabic fluency requirement, company industry, posting date, and application deadline
- **Clean output:** every field is populated with real data — no blank or placeholder values
- **Fast, lightweight mode:** turn off full-detail fetching for a quicker run with just listing-card fields (title, company, location, posting date)

### Output per job

| Field | Description |
|---|---|
| `jobId` | GulfTalent's internal numeric job ID |
| `title` | Job title |
| `companyName`, `companyUrl`, `companyLogoUrl` | Hiring company |
| `country`, `countrySlug`, `city`, `location` | Job location (full country name, GulfTalent's own country URL slug, city, and the raw "City, Country" string) |
| `area` | Finer-grained neighbourhood/district within the city, when GulfTalent discloses one (e.g. "Downtown Dubai - Dubai") |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Posted salary range, when disclosed |
| `salaryLabel` | A free-text salary note (e.g. "Negotiable"), only when GulfTalent shows text instead of a structured min/max range |
| `employmentType` | Full Time / Part Time / Contract / Temporary / Internship |
| `jobFunction` | GulfTalent's job-function taxonomy (e.g. "Accounting & Audit") |
| `careerLevel`, `vacancyCount` | Seniority level and number of open vacancies, when GulfTalent lists them for the posting |
| `isRemote` | `true` only when GulfTalent flags the posting as a remote job (mode=byCareerLevel); omitted otherwise |
| `companyIndustry` | Hiring company's industry sector |
| `nationalityPreference` | Nationalities the employer is open to, if specified |
| `genderPreference` | Gender preference, if specified |
| `arabicFluency` | Arabic-fluency requirement, if specified |
| `description`, `descriptionHtml` | Full job description (plain text and original HTML) |
| `companyDescription` | "About the company" blurb from the hiring company, when shown |
| `similarJobUrls` | URLs of related job postings GulfTalent surfaces on the same page, when shown |
| `referenceNumber` | Recruiter's internal job reference |
| `postedAt`, `validThrough` | Posting date and application deadline (ISO 8601) |
| `sourceUrl` | Canonical GulfTalent job URL |
| `recordType`, `scrapedAt` | Always `"job"`, and the UTC scrape timestamp |

Fields that GulfTalent doesn't disclose for a given job (e.g. salary, gender preference) are simply omitted rather than emitted as blank or `"N/A"`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byCategory` / `byIndustry` / `byJobType` / `byNationality` / `byCareerLevel` / `byCompany` / `byUrls` |
| `titleKeyword` | string | `accountant` | Free-text job title (mode=search) |
| `country` | select | `United Arab Emirates` | One of GulfTalent's 16 markets, or "Any country" |
| `city` | select | – | One of 29 major cities; overrides `country` to match |
| `category` | select | – | Job category (mode=byCategory) |
| `industry` | select | – | Company industry (mode=byIndustry) |
| `jobType` | select | – | Contract / Internship / Part-Time / Temporary (mode=byJobType) |
| `nationality` | select | – | Bahraini / Kuwaiti / Saudi / UAE nationals (mode=byNationality) |
| `careerLevel` | select | – | Student/Fresh Graduate, Junior Professional, Experienced Professional, Supervisor/Manager, or Top Management/Director (mode=byCareerLevel) |
| `companyUrl` | string | – | A GulfTalent company-careers page URL or slug, e.g. `hays-careers` (mode=byCompany) |
| `startUrls` | array | – | Direct GulfTalent job URLs (mode=byUrls) |
| `minSalary` | integer | – | Drop jobs below this posted salary; jobs with no posted salary are kept |
| `maxSalary` | integer | – | Drop jobs above this posted salary; jobs with no posted salary are kept |
| `employmentType` | select | – | Keep only this employment type; unknown-type jobs are kept |
| `containsKeyword` | string | – | Keep only jobs whose title/description/job-function contains this text |
| `fetchFullDetails` | boolean | `true` | Visit each job's detail page for salary, description, and preferences |
| `maxItems` | integer | `25` | Hard cap on emitted job records (1–1000) |

#### Example: search accountant jobs in Dubai

```json
{
  "mode": "search",
  "titleKeyword": "accountant",
  "city": "dubai",
  "maxItems": 50
}
```

#### Example: browse IT jobs across all markets

```json
{
  "mode": "byIndustry",
  "industry": "it",
  "maxItems": 100
}
```

#### Example: all open jobs at one employer

```json
{
  "mode": "byCompany",
  "companyUrl": "https://www.gulftalent.com/companies/hays-careers",
  "maxItems": 100
}
```

#### Example: browse director/executive-level jobs

```json
{
  "mode": "byCareerLevel",
  "careerLevel": "director",
  "maxItems": 50
}
```

#### Example: fetch specific job postings

```json
{
  "mode": "byUrls",
  "startUrls": [
    "https://www.gulftalent.com/uae/jobs/accountant-614857",
    "https://www.gulftalent.com/uae/jobs/cashier-620007"
  ]
}
```

### Use cases

- **Recruitment intelligence** — track live vacancy volume by country, industry, or job function across the GCC
- **Salary benchmarking** — aggregate posted salary ranges by role and market
- **Job aggregation** — feed a niche or regional job board with fresh Middle East listings
- **Market research** — monitor which industries and companies are hiring, and where
- **Lead generation** — identify actively-hiring companies by industry or country

### FAQ

**What's GulfTalent?** A leading job board and recruitment platform focused on the Middle East and North Africa (MENA) region, listing tens of thousands of live vacancies across the Gulf states, the Levant, and North Africa.

**Do I need a GulfTalent account or API key?** No. This actor reads publicly available job listing pages — no login, cookies, or API key needed.

**Why do some jobs have no salary?** GulfTalent lets recruiters choose whether to disclose salary. Jobs without a disclosed salary simply omit the `salaryMin`/`salaryMax` fields rather than showing a placeholder.

**Can I combine `country` and `city`?** Yes — set `city` and the matching `country` is applied automatically. If `city` and `country` conflict, `city` takes precedence.

**What's the difference between `category` and `industry`?** `category` is the job's function (what the role does, e.g. "Accounting & Audit"); `industry` is the hiring company's business sector (e.g. "Oil & Gas"). A finance job can appear under `category=finance-consulting` at an `industry=oil-gas` company.

**Why is `fetchFullDetails` on by default?** It's the only way to get salary, full description, and preference fields. Turn it off only if you need a fast run of just titles/companies/locations.

**How fresh is the data?** Real-time — every run reads GulfTalent's current live listing pages.

### A note on URL checks

GulfTalent serves a stripped-down mobile template to bare/default HTTP clients (e.g. a plain `curl` GET) instead of the full desktop page, so a quick manual `curl` check can look "broken" even for a valid link. All `sourceUrl`, `companyUrl`, and `companyLogoUrl` links returned by this actor are live and load normally (HTTP 200, following redirects) when opened in a real browser.

### Limitations

- Nationality-preference browsing is global across all markets (GulfTalent doesn't offer a per-country URL for this axis); use `country`/`city` alongside `search`, `byCategory`, `byIndustry`, or `byJobType` when you need geography plus a nationality filter combined.
- Career-level browsing (`byCareerLevel`) is likewise global across all markets; combine with `containsKeyword` if you need to narrow it further.
- `mode=byCompany` reads whichever careers-page layout GulfTalent renders for that employer; very large employers are paginated automatically, while smaller ones are listed on a single page.

# Actor input Schema

## `mode` (type: `string`):

How to find jobs.

## `titleKeyword` (type: `string`):

Free-text job title to search for, e.g. `accountant`, `software engineer`, `project manager`.

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

Restrict results to a country. Leave as "Any country" to search all of GulfTalent's markets. Used by modes: search, byCategory, byIndustry, byJobType.

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

Restrict results to a specific city. Overrides `country` with the city's own country. Used by modes: search, byCategory.

## `category` (type: `string`):

Job function / category to browse.

## `industry` (type: `string`):

Hiring company's industry sector.

## `jobType` (type: `string`):

Employment arrangement to browse.

## `nationality` (type: `string`):

Browse jobs that specifically welcome applicants of this Gulf nationality.

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

Seniority level to browse.

## `companyUrl` (type: `string`):

A GulfTalent company-careers page URL, e.g. `https://www.gulftalent.com/companies/hays-careers`. The bare slug (`hays-careers`) also works.

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

Direct GulfTalent job-posting URLs to fetch, e.g. `https://www.gulftalent.com/uae/jobs/accountant-614857`.

## `minSalary` (type: `integer`):

Drop jobs whose posted salary (in the job's own currency) is below this amount. Jobs with no posted salary are kept.

## `maxSalary` (type: `integer`):

Drop jobs whose posted salary (in the job's own currency) is above this amount. Jobs with no posted salary are kept.

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

Only keep jobs whose detail page reports this employment type. Jobs with unknown employment type are kept.

## `containsKeyword` (type: `string`):

Only keep jobs whose title/description/job-function contains this text (case-insensitive).

## `fetchFullDetails` (type: `boolean`):

Visit each job's detail page for salary, full description, nationality/gender preference, and reference number. Turn off for a faster, lighter run with only listing-card fields (title, company, location, URL, and a date-only posting date). Automatically re-enabled if `minSalary`, `maxSalary`, or `employmentType` is set, since those filters need detail-page data.

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

Hard cap on emitted job records.

## Actor input object example

```json
{
  "mode": "search",
  "titleKeyword": "accountant",
  "country": "uae",
  "city": "",
  "category": "accounting",
  "industry": "it",
  "jobType": "contract",
  "nationality": "uae",
  "careerLevel": "manager",
  "companyUrl": "https://www.gulftalent.com/companies/hays-careers",
  "startUrls": [],
  "employmentType": "",
  "fetchFullDetails": true,
  "maxItems": 25
}
```

# Actor output Schema

## `jobs` (type: `string`):

Dataset containing all scraped GulfTalent job listings.

# 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 = {
    "mode": "search",
    "titleKeyword": "accountant",
    "country": "uae",
    "city": "",
    "category": "accounting",
    "industry": "it",
    "jobType": "contract",
    "nationality": "uae",
    "careerLevel": "manager",
    "companyUrl": "https://www.gulftalent.com/companies/hays-careers",
    "startUrls": [],
    "employmentType": "",
    "fetchFullDetails": true,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/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 = {
    "mode": "search",
    "titleKeyword": "accountant",
    "country": "uae",
    "city": "",
    "category": "accounting",
    "industry": "it",
    "jobType": "contract",
    "nationality": "uae",
    "careerLevel": "manager",
    "companyUrl": "https://www.gulftalent.com/companies/hays-careers",
    "startUrls": [],
    "employmentType": "",
    "fetchFullDetails": True,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/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 '{
  "mode": "search",
  "titleKeyword": "accountant",
  "country": "uae",
  "city": "",
  "category": "accounting",
  "industry": "it",
  "jobType": "contract",
  "nationality": "uae",
  "careerLevel": "manager",
  "companyUrl": "https://www.gulftalent.com/companies/hays-careers",
  "startUrls": [],
  "employmentType": "",
  "fetchFullDetails": true,
  "maxItems": 25
}' |
apify call crawlerbros/gulftalent-scraper --silent --output-dataset

```

## MCP server setup

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