# GulfTalent GCC Job Listings Scraper (`jungle_synthesizer/gulftalent-gcc-job-listing-scraper`) Actor

Extracts job listings from GulfTalent across UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt and Jordan. Pulls title, company, location, salary, job function, nationality preference and full description/requirements text from each listing's detail page.

- **URL**: https://apify.com/jungle\_synthesizer/gulftalent-gcc-job-listing-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (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.80 / 1,000 record scrapeds

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/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 GCC Job Listings Scraper

Extract structured job listings from [GulfTalent](https://www.gulftalent.com), the Gulf region's
leading white-collar and executive hiring board. This GulfTalent scraper covers all eight of the
site's country sections — UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt, and Jordan —
and enriches every listing with the full detail page: salary, nationality preference, job
function, company description, and the complete description/requirements text. Every record comes
out as clean, consistent JSON ready for recruitment sourcing, expat salary benchmarking, or
Gulf/Levant labor-market research.

***

### What You Get

Each job record contains up to 18 fields:

| Field | Description |
|-------|-------------|
| `job_id` | Numeric GulfTalent job posting id |
| `country` | Section the listing was crawled from: `uae`, `saudi-arabia`, `qatar`, `kuwait`, `oman`, `bahrain`, `egypt`, `jordan` |
| `title` | Job title |
| `company_name` | Hiring company or agency name (a placeholder string when the employer withholds its identity) |
| `company_is_confidential` | `true` when the employer's identity is withheld |
| `location_city` | City/locality from the job posting's address |
| `location_country` | Country from the job posting's address |
| `sector` | Company industry / sector |
| `job_function` | Job function category |
| `employment_type` | Employment type (e.g. Full Time, Part Time) |
| `nationality_preference` | Stated nationality preference, when specified |
| `salary_text` | Salary as displayed on the listing (often "Not Specified") |
| `description_text` | Job description text |
| `requirements_text` | Job requirements text, when the posting separates it from the description |
| `company_description` | About-the-company text, when provided |
| `posted_at` | ISO date the job was posted |
| `job_url` | Canonical URL of the job detail page |
| `scraped_at` | ISO timestamp this record was scraped |

***

### Quick Start

Default run — crawls all eight country sections, returns up to 25 records:

```json
{
  "maxItems": 25
}
```

Scope to one or more countries:

```json
{
  "countries": ["uae", "saudi-arabia"],
  "maxItems": 500
}
```

#### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `countries` | array | all eight | Country sections to crawl: `uae`, `saudi-arabia`, `qatar`, `kuwait`, `oman`, `bahrain`, `egypt`, `jordan`. Leave empty to crawl all of them. |
| `maxItems` | integer | `25` | Maximum number of job records to scrape across all selected countries. |

***

### Sample Output

```json
{
  "job_id": "623302",
  "country": "jordan",
  "title": "Guest Experience Expert",
  "company_name": "Marriott International",
  "company_is_confidential": false,
  "location_city": "Amman",
  "location_country": "Jordan",
  "sector": "Travel, Hotel & Tourism",
  "job_function": "Customer Service",
  "employment_type": "Full Time",
  "nationality_preference": "Any Nationality",
  "salary_text": "Not Specified",
  "description_text": "Our jobs aren't just about giving guests a smooth check-in and check-out...",
  "requirements_text": "No matter what position you are in, there are a few things that are critical to success...",
  "company_description": "Marriott International is the world's largest hotel company based in Bethesda, Maryland, USA...",
  "posted_at": "2026-08-19T00:00:00+00:00",
  "job_url": "https://www.gulftalent.com/jordan/jobs/guest-experience-expert-623302",
  "scraped_at": "2026-08-20T06:06:31.049Z"
}
```

***

### Use Cases

- **Recruitment agencies and staffing firms** — Source live GCC/Levant vacancies by sector, job
  function, or country without manually paging through eight separate country boards.
- **Expat salary benchmarking** — Aggregate `salary_text`, `job_function`, and `location_city`
  across sectors to calibrate compensation packages for Gulf and Levant relocations.
- **Market-entry and labor-market research** — Track hiring volume and role mix by country and
  sector to gauge demand before entering a new Gulf or Levant market.
- **HR-tech and job aggregator platforms** — Ingest a normalized GulfTalent feed alongside other
  regional boards without hand-rolling a parser per country section.
- **Job alert and matching services** — Seed a keyword-matching pipeline with fresh GCC/Levant
  listings, refreshed on a schedule.

***

### How It Works

1. Select one or more country sections, or leave `countries` empty to crawl all eight.
2. The scraper works through each section's listing pages (25 jobs per page) and queues every
   job's detail page.
3. Each detail page carries the full posting: title, company, salary, dates, location, and the
   complete description and requirements text, plus fields the listing card doesn't show —
   nationality preference, job function, and about-the-company text.
4. Confidential postings (employer identity withheld) are flagged via `company_is_confidential`
   rather than dropped.
5. Records are written to the dataset as they're collected. `maxItems` caps the total across all
   selected countries.

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a big crawl stops before it finishes —
because it hit `maxItems`, a spend cap, or was aborted — you can pick up where it left off:
start a new run with **the same input** plus that `resumeCursor`. The crawl continues from the
queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly the 10 most
  recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### Limitations

- **Salary coverage is partial** — Most postings show "Not Specified" for `salary_text`; only a
  minority of employers publish a salary range.
- **`nationality_preference` and `job_function` are sometimes empty** — GulfTalent doesn't require
  posters to fill in every field.
- **Eight country sections** — Coverage is UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt,
  and Jordan, matching GulfTalent's own country picker. Other Gulf/Levant boards are not included.

***

### FAQ

**How do I scrape only one country?**
Set `countries` to a single-item array, e.g. `{"countries": ["qatar"]}`.

**Does it get the full job description, not just the listing snippet?**
Yes. Every record visits the job's detail page and returns the complete description and
requirements text, not just what's shown on the listing card.

**What does `company_is_confidential` mean?**
Some employers post through GulfTalent without revealing their identity. On those postings,
`company_name` is a placeholder string and `company_is_confidential` is `true` so you can filter
them out or handle them separately.

**How do I export GulfTalent job data to JSON, CSV, or Excel?**
Every run writes to an Apify dataset you can download as JSON, CSV, or Excel, or pull through the
Apify API.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

GCC/Levant country sections to crawl. Leave empty to crawl all eight.

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

Maximum number of job records to scrape across all selected countries

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "countries": [],
  "maxItems": 25
}
```

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/gulftalent-gcc-job-listing-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/gulftalent-gcc-job-listing-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 25
}' |
apify call jungle_synthesizer/gulftalent-gcc-job-listing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/gulftalent-gcc-job-listing-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/lew01AehyjJ6Kcf8C/builds/edEpkhiQU3UvKFffc/openapi.json
