# Naukrigulf Job Scraper — UAE / Saudi / Gulf · $1/1k (`memo23/naukrigulf-jobs-scraper`) Actor

Scrape Naukrigulf.com (UAE / Saudi / Qatar / wider GCC) — paste any naukrigulf.com URL or build a search from keyword + city + experience + salary + employment type. Structured rows: company, parsed MinCtc/MaxCtc salary, work mode, skills, apply link. Pure HTTP, no browser, $1/1k.

- **URL**: https://apify.com/memo23/naukrigulf-jobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job 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

## Naukrigulf Job Scraper — UAE / Saudi / Qatar / Gulf

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/logo-naukrigulf.png" alt="Naukrigulf Job Scraper logo" width="180" /></p>

**Scrape every job on Naukrigulf.com — UAE, Saudi Arabia, Qatar, Egypt, Bahrain, Oman, Kuwait — at $0.99 per 1,000 results.** Paste any naukrigulf.com URL, or build a search from keyword + city + experience + salary + employment type. Structured rows: company, parsed `MinCtc`/`MaxCtc` salary, work mode, skills, apply link.

| Input | Row(s) emitted |
|---|---|
| Naukrigulf listing URL (e.g. `/jobs-in-dubai?freshness=15&ctc=10,12,30`) | One row per job, full pagination walked |
| Direct Naukrigulf job-detail URL | One row for that job |
| Search by filters (no `startUrls`) — `searchQuery` + `location` + `experienceLevel` + `salaryFilter` + `jobType` | Actor builds the search URL, then scrapes |

> **Pure HTTP. No headless browser, no third-party CF-bypass service.** Uses Naukrigulf's internal JSON search endpoint via Apify Residential proxy. That's why this runs at **$0.99 / 1,000 results** instead of $2.99 like most Gulf-only scrapers on the Store.

***

### How it works

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-naukrigulf.png" alt="How the Naukrigulf Jobs Scraper works" width="900" /></p>

1. **Classify** each input URL — listing vs detail. When `startUrls` is empty, the filter form builds a Naukrigulf search URL for you.
2. **Fetch** the listing via Naukrigulf's internal JSON search endpoint (no DOM scraping, no JS execution).
3. **Walk pagination** until `maximumJobs` is reached or results run out.
4. **Hit each detail page** to enrich with full description, key skills, and the apply URL.
5. **Apply optional post-filters** (`timeFilter`, `minSalary`) and output shaping (`includeDescription`, `cleanHtml`).
6. **Emit one row per job** to the default dataset. Pay-per-event meter charges $0.99/1,000 only on rows you keep.

***

### ✨ Why use this scraper?

- **$0.99 per 1,000** — undercuts the Gulf-only competition (other actors on Apify Store list at $1.00, $2.99, even $4.99 per 1K).
- **Full pagination.** Most Gulf-only scrapers cap at the first page. This one walks every page until `maximumJobs`.
- **Structured salary fields** — `Compensation.MinCtc` / `MaxCtc` / `Country` parsed cleanly. Other Gulf scrapers return salary as a raw string or skip it entirely.
- **Two input modes.** Option A — paste any naukrigulf.com URL. Option B — build a search from keyword + city + experience + salary filters (no URL needed).
- **Post-filter on time + salary.** Drop stale or below-threshold rows server-side so your dataset arrives pre-filtered.
- **Output shaping.** `includeDescription: false` strips heavy description fields for lighter exports; `cleanHtml: true` returns plain text instead of HTML.
- **Pure HTTP.** No browser, no CAPTCHA solver, no third-party bypass services. That's why we hit $0.99/1k.
- **Actively maintained** — sibling of the broader [`memo23/naukri-scraper`](https://apify.com/memo23/naukri-scraper) (4.2★, 176 monthly users), which covers India + Gulf in one actor. This standalone is for buyers who only need Gulf coverage.

***

### What makes this richer than the competition

Apify Store has 5 active Naukrigulf-only scrapers as of May 2026. Here's the comparison:

| Capability | Other Gulf-only scrapers | This actor |
|---|---|---|
| **Pricing** | Free up to $4.99 / 1K | **$0.99 / 1,000** |
| **Pagination** | Often capped at page 1 | Full walk to `maximumJobs` cap |
| **Salary parsing** | Raw string or omitted | `MinCtc` / `MaxCtc` / `Country` parsed |
| **Post-filters** | Not offered | `timeFilter` + `minSalary` |
| **Output shaping** | Single fixed schema | `includeDescription` + `cleanHtml` toggles |
| **Input flexibility** | URL only **OR** filter only | Listing URL **OR** direct job URL **OR** filter builder |
| **Dual-region sibling** | Not available | Pair with [`memo23/naukri-scraper`](https://apify.com/memo23/naukri-scraper) for India + Gulf in one dataset |

***

### 🎯 Use cases

| Team | Typical use |
|---|---|
| **Recruiters in UAE / Saudi / Qatar** | Source candidates by city + experience band. Schedule daily runs against `/jobs-in-{city}` URLs. |
| **Cross-border BD targeting Gulf companies** | Build a target list of companies actively hiring (signal of growth) with their Naukrigulf profile for outreach context. |
| **Gulf-region salary benchmarking** | Parsed `Compensation.MinCtc` / `MaxCtc` gives you a salary distribution by role and city. |
| **Workforce planning / labour-market research** | Track hiring volume by Gulf city and industry. Naukrigulf is the largest Gulf-focused jobs board. |
| **HR-tech aggregators** | Mirror Naukrigulf into your platform with normalised fields. Schedule cron runs for fresh inventory. |
| **Job-seekers / careers tools** | Build a job-alert pipeline filtering by `searchQuery` + `location` + `salaryFilter`. |

***

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | string\[] | yes (or use filters) | Naukrigulf URLs. Paste listing URLs, search URLs, or direct job-detail URLs. |
| `searchQuery` | string | no (filter mode) | Job keyword (e.g. `developer`, `accountant`, `nurse`). |
| `location` | string | no (filter mode) | Gulf city (`dubai`, `abu-dhabi`, `riyadh`, `doha`, `jeddah`, `manama`, `muscat`, `kuwait-city`). |
| `experienceLevel` | integer | no | Minimum years of experience. |
| `salaryFilter` | string | no | Naukrigulf `ctc` comma-separated values (e.g. `10,15,20`). |
| `jobType` | string | no | Optional employment-type filter. |
| `maximumJobs` | integer | no (default 10000) | Hard cap on jobs collected. |
| `timeFilter` | string | no (default any) | Post-filter on `PostedDate`. `""` / `"24h"` / `"7d"` / `"30d"` / `"90d"`. |
| `minSalary` | integer | no (default 0) | Post-filter — keep rows where `Compensation.MinCtc >= minSalary`. Permissive on missing. |
| `includeDescription` | boolean | no (default `true`) | Strip description fields when `false`. |
| `cleanHtml` | boolean | no (default `false`) | Plain text only — drops HTML markup. |
| `maxConcurrency` / `minConcurrency` / `maxRequestRetries` | integer | no | Run-time settings. |
| `proxy` | object | no (default RESIDENTIAL) | Apify proxy config. RESIDENTIAL recommended. |

#### Quick start

```jsonc
// Dubai-only, first 100 jobs
{ "startUrls": ["https://www.naukrigulf.com/jobs-in-dubai"], "maximumJobs": 100 }

// Build a search from filters — accountant jobs in Riyadh, 5+ years
{ "searchQuery": "accountant", "location": "riyadh", "experienceLevel": 5, "maximumJobs": 50 }

// Multiple Gulf cities at once
{ "startUrls": [
    "https://www.naukrigulf.com/jobs-in-dubai",
    "https://www.naukrigulf.com/jobs-in-abu-dhabi",
    "https://www.naukrigulf.com/jobs-in-doha"
  ], "maximumJobs": 300 }

// Post-filter: only fresh jobs with parsed salary ≥ 10,000
{ "startUrls": ["https://www.naukrigulf.com/jobs-in-dubai"], "timeFilter": "7d", "minSalary": 10000 }
```

***

### Output

One row per job. Naukrigulf returns rich JSON; the actor preserves the platform's original keys (`PascalCase`) so the dataset is downstream-faithful. Highlights:

- **Identifiers**: `JobId`, `JdURL` (canonical detail URL), `staticUrl`
- **Job info**: `JobTitle`, `Description`, `MinExp` / `MaxExp`, `EmploymentType`, `Function`, `RoleId`
- **Company**: `Company.Name`, `Company.LogoPath`, `Company.WebSite`, `Company.Description`
- **Geography**: `Location` (free-form), `City`, `Country`, `Region`
- **Compensation**: `Compensation.MinCtc` / `MaxCtc` / `Currency`
- **Skills**: `KeySkills[]` (array of strings)
- **Dates**: `PostedDate` (unix epoch), `CreatedDate`
- **Meta**: `scrapedAt`, `url`, `source: "naukrigulf"`

***

### FAQ

**Q. Why a Gulf-only actor when you also have a Naukri + Naukrigulf bundle?**
Two reasons. (1) SEO — buyers searching "Naukrigulf scraper" on Apify Store rank exact-match titles first; the standalone slug captures that traffic. (2) Lighter UX — buyers who only need Gulf coverage don't have to wade through India-only filter fields. The combined `memo23/naukri-scraper` is still available for buyers who want both regions in one dataset.

**Q. What cities does Naukrigulf cover?**
Primary: Dubai, Abu Dhabi, Sharjah (UAE), Riyadh, Jeddah, Dammam (Saudi), Doha (Qatar), Manama (Bahrain), Muscat (Oman), Kuwait City, Cairo (Egypt). Naukrigulf also returns occasional listings from neighbouring regions; filter by `location` to constrain.

**Q. How accurate is the salary data?**
`Compensation.MinCtc` / `MaxCtc` are populated when the employer disclosed salary on the source listing — roughly 50–60% of jobs based on our smoke tests. The rest have `null` / `0`. The `minSalary` post-filter is permissive: jobs with no listed salary are KEPT (not dropped), so you don't lose half the dataset.

**Q. Can I run this in parallel with the dual-region actor?**
Yes. They share zero state. Many buyers run both — the standalone for daily Gulf-only cron runs, the combined actor for ad-hoc cross-region comparisons.

**Q. Why $0.99/1k?**
Pure-HTTP pipeline + the actor's pay-per-event meter. We don't pay for browser instances or proxy bypass services. Most competitors at $2.99–$4.99/1k are pricing for browser-based scrapers; we don't need that.

**Q. How fresh is the data?**
Each run hits Naukrigulf live — no caching. `scrapedAt` is the per-row timestamp.

***

### Support

- File issues or feature requests via the **Issues** tab on the actor page in Apify Console.
- For custom integrations (different output shape, scheduled feeds into a warehouse), open an issue describing the use case.

***

### Additional Services

- **Custom output schemas** — alternative field names, flattened nested structures, filtered subsets for warehouse loaders.
- **Webhook delivery** — push new Gulf jobs to Slack, Discord, your CRM, or any HTTP endpoint.
- **Scheduled feeds** — daily / weekly cron into Postgres, BigQuery, Snowflake, S3, or Google Sheets.

Reach out via [Apify Issues](https://apify.com/memo23) or [memo23 on Apify](https://apify.com/memo23).

***

### Explore More Scrapers

- [**Naukri + Naukrigulf (combined)**](https://apify.com/memo23/naukri-scraper) — Dual-region in one actor (4.2★, 176 monthly users)
- [**LinkedIn Jobs Scraper**](https://apify.com/memo23/linkedin-jobs-scraper) — Public LinkedIn job listings by keyword + location
- [**Stepstone Search Scraper**](https://apify.com/memo23/stepstone-search-cheerio-ppr) — DACH + EU jobs
- [**HiringCafe Scraper**](https://apify.com/memo23/apify-hiring-cafe-scraper) — All HiringCafe job postings
- [**WeWorkRemotely Jobs Scraper**](https://apify.com/memo23/weworkremotely-jobs-scraper) — Remote jobs with country-eligibility lists + parsed salary

***

### ⚠️ Disclaimer

This Actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Naukrigulf.com, Info Edge (India) Limited, or any of their subsidiaries or related entities**. "Naukrigulf" and related trademarks are the property of their respective owners and are used here solely for descriptive purposes — to identify the public website from which this scraper extracts data.

This Actor accesses only publicly available job-listing pages on `naukrigulf.com`. **You are solely responsible** for ensuring that your use of the data complies with Naukrigulf's Terms of Service, applicable copyright law, GDPR / UAE data-protection regulations (where applicable), and any other regulations that may apply to your jurisdiction or use case. Do not use this Actor to bulk-republish copyrighted content, harass employers or candidates, circumvent rate-limiting or technical protection measures, or enable unsolicited recruiter outreach in violation of local consent laws.

The author provides this Actor "as is", without warranty of any kind, and disclaims any liability for damages arising from its use.

***

### SEO Keywords

naukrigulf scraper, naukrigulf.com scraper, naukrigulf jobs scraper, uae jobs scraper, dubai jobs scraper, saudi arabia jobs scraper, riyadh jobs scraper, qatar jobs scraper, doha jobs scraper, abu dhabi jobs scraper, bahrain jobs scraper, oman jobs scraper, kuwait jobs scraper, gulf jobs scraper, gcc jobs scraper, mena jobs scraper, gulf recruitment data, gulf hiring analytics, naukrigulf json export, naukrigulf csv export, pay-per-result naukrigulf, apify naukrigulf actor, $0.99 per 1000 gulf jobs

***

### License

ISC. See [`package.json`](package.json).

# Actor input Schema

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

Naukrigulf job list / search URLs. Non-empty = only these URLs are used. Prefill is empty so new runs default to the filter form below.

## `platform` (type: `string`):

This actor targets Naukrigulf only (Gulf-region jobs). For Naukri.com (India) coverage, use the combined <a href='https://apify.com/memo23/naukri-scraper'>memo23/naukri-scraper</a>.

## `searchQuery` (type: `string`):

Job keyword or role (filter mode only).

## `location` (type: `string`):

Gulf city or region (filter mode only) — e.g. <code>dubai</code>, <code>abu-dhabi</code>, <code>riyadh</code>, <code>doha</code>, <code>jeddah</code>.

## `maximumJobs` (type: `integer`):

Cap on jobs per run.

## `experienceLevel` (type: `integer`):

Minimum years of experience (filter mode).

## `salaryFilter` (type: `string`):

Comma-separated Naukrigulf <code>ctc</code> values (e.g. <code>5,6,7,8,9,10</code>).

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

Optional employment-type filter.

## `timeFilter` (type: `string`):

Drop rows whose <code>PostedDate</code> is older than this window. Rows without a parseable date are kept.

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

Drop rows whose parsed <code>Compensation.MinCtc</code> is below this. Permissive — rows without salary are kept.

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

When OFF, the actor strips <code>description</code> / <code>Description</code> / <code>jobDescription</code> from every row.

## `cleanHtml` (type: `boolean`):

When ON, strip HTML tags from description fields. Ignored when <code>includeDescription</code> is OFF.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each employer by discovering the company's website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

## `maxConcurrency` (type: `integer`):

Maximum parallel pages / requests.

## `minConcurrency` (type: `integer`):

Minimum parallel workers.

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

Retries per failed request before giving up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.naukrigulf.com/jobs-in-dubai",
    "https://www.naukrigulf.com/procurement-engineer-manager-senior-construction-civil-project-site-mep-commercial-estimator-quantity-surveyor-cost-contracts-jobs-in-dubai?companyType=1&ctc=5,6,7,8,9,10,11,12,13,30&freshness=15&industryType=10,59&xz=1_2_5,1_3_5,1_22_5,1_4_5"
  ],
  "platform": "naukrigulf",
  "searchQuery": "developer",
  "location": "dubai",
  "maximumJobs": 10000,
  "timeFilter": "",
  "minSalary": 0,
  "includeDescription": true,
  "cleanHtml": false,
  "enrichEmails": false,
  "qualifyByPayment": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10
}
```

# Actor output Schema

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

One row per job: title, company, location, salary bracket, skills, apply link.

# 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 = {
    "startUrls": [
        "https://www.naukrigulf.com/jobs-in-dubai",
        "https://www.naukrigulf.com/procurement-engineer-manager-senior-construction-civil-project-site-mep-commercial-estimator-quantity-surveyor-cost-contracts-jobs-in-dubai?companyType=1&ctc=5,6,7,8,9,10,11,12,13,30&freshness=15&industryType=10,59&xz=1_2_5,1_3_5,1_22_5,1_4_5"
    ],
    "platform": "naukrigulf",
    "searchQuery": "developer",
    "location": "dubai",
    "maximumJobs": 10000
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/naukrigulf-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 = {
    "startUrls": [
        "https://www.naukrigulf.com/jobs-in-dubai",
        "https://www.naukrigulf.com/procurement-engineer-manager-senior-construction-civil-project-site-mep-commercial-estimator-quantity-surveyor-cost-contracts-jobs-in-dubai?companyType=1&ctc=5,6,7,8,9,10,11,12,13,30&freshness=15&industryType=10,59&xz=1_2_5,1_3_5,1_22_5,1_4_5",
    ],
    "platform": "naukrigulf",
    "searchQuery": "developer",
    "location": "dubai",
    "maximumJobs": 10000,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/naukrigulf-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 '{
  "startUrls": [
    "https://www.naukrigulf.com/jobs-in-dubai",
    "https://www.naukrigulf.com/procurement-engineer-manager-senior-construction-civil-project-site-mep-commercial-estimator-quantity-surveyor-cost-contracts-jobs-in-dubai?companyType=1&ctc=5,6,7,8,9,10,11,12,13,30&freshness=15&industryType=10,59&xz=1_2_5,1_3_5,1_22_5,1_4_5"
  ],
  "platform": "naukrigulf",
  "searchQuery": "developer",
  "location": "dubai",
  "maximumJobs": 10000
}' |
apify call memo23/naukrigulf-jobs-scraper --silent --output-dataset

```

## MCP server setup

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