# Naukrigulf Scraper — Gulf Jobs, Salaries, Companies & Contacts (`logiover/naukrigulf-scraper`) Actor

Naukrigulf.com jobs scraper: export Gulf & Middle East jobs (UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt) with full descriptions, salary, industry, experience, education, nationality and employer details. Search or export all ~40,000 jobs. No login. Not affiliated with Naukrigulf.

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

## Pricing

from $1.00 / 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.
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

## Naukrigulf Scraper

**Export every job on Naukrigulf.com — the Gulf and Middle East job board — as clean, analysis-ready data: salaries, industries, experience, education, nationality requirements, employers and their public contact details, for the UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt and beyond.**

**Naukrigulf Scraper** is a fast, reliable **Naukrigulf API alternative** that lets you **scrape naukrigulf.com** without a login, without cookies and without a browser. Search by keyword, city or country, filter by posting date, experience, industry, functional area, salary band, employer type or Easy Apply — or export the **whole Naukrigulf board (40,197 jobs on 2026-10-18) in one run**. It works as a **UAE jobs scraper**, a **Dubai jobs scraper**, a **Saudi Arabia jobs scraper**, a **Qatar, Kuwait, Oman and Bahrain jobs scraper**, and as the simplest way to build a **Middle East jobs dataset** you can **export to CSV, Excel or JSON**, push to Google Sheets or pull through the Apify API.

Every row is a complete job record: title, Naukrigulf job id and link, the **full job description** (plain text and HTML), the employer (name, id, page, logo, company profile, website), city and country (normalised, with ISO country code), **required experience in years**, **monthly salary with currency and its US-dollar equivalent** when the employer publishes it, vacancies, posting date, **industry**, **functional area**, **employment type** (full-time, contract, part-time), **workplace** (on-site, remote, hybrid), **education**, **gender and nationality requirements**, the desired-candidate profile, job highlights, keywords, the employer's public **contact block** (contact name, role, office address), the external apply link and employer flags. It is built for **Gulf jobs data** at scale: recruitment and manpower agencies, B2B sales teams that sell to hiring companies, job aggregators, salary-benchmarking and labour-market analysts, relocation and visa consultancies, HR-tech products and AI pipelines.

> Independent tool. Not affiliated with, endorsed by, or sponsored by Naukrigulf.com or Info Edge (India) Ltd. "Naukrigulf" is a trademark of its owner and is used here only to describe the website this Actor reads.

***

### Table of contents

1. [At a glance](#at-a-glance)
2. [What you get](#what-you-get)
3. [Who uses it — and how](#who-uses-it--and-how)
4. [How it works](#how-it-works)
5. [Cookbook: ready-to-run inputs](#cookbook-ready-to-run-inputs)
6. [Tutorial: your first run in the Apify Console](#tutorial-your-first-run-in-the-apify-console)
7. [Tutorial: run it through the API](#tutorial-run-it-through-the-api)
8. [Input reference](#input-reference)
9. [Output data dictionary](#output-data-dictionary)
10. [Output example](#output-example)
11. [Scale, speed and coverage](#scale-speed-and-coverage)
12. [What you pay](#what-you-pay)
13. [Integrations](#integrations)
14. [Performance tips](#performance-tips)
15. [Troubleshooting](#troubleshooting)
16. [Limits](#limits)
17. [Compared with searching by hand](#compared-with-searching-by-hand)
18. [FAQ](#faq)
19. [Glossary](#glossary)
20. [Legal and data protection](#legal-and-data-protection)
21. [Changelog](#changelog)
22. [Support](#support)

***

### At a glance

| | |
|---|---|
| **Source** | naukrigulf.com — Gulf / Middle East / North Africa job board |
| **Countries** | United Arab Emirates, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt, Lebanon, Jordan, Iraq, Algeria, Morocco, Tunisia, Libya, India and more (see [coverage](#coverage-by-country)) |
| **Size of the board** | 40,197 jobs exported in one run on 2026-10-18 |
| **Fields per job** | 59 columns: job, employer, location, experience, salary, requirements, description, contact block, apply link, flags |
| **Search modes** | Keywords × locations, countries, companies, Naukrigulf search URLs, single job URLs, the whole board |
| **Filters** | Posted within (1–60 days), years of experience, experience bands, industries (69), functional areas (59), salary bands (USD / month), employer type (company / consultant), Easy Apply |
| **Speed (measured)** | First rows within 2 seconds; 1,000 jobs with details in 59 s; the whole board in 27 minutes |
| **De-duplication** | By Naukrigulf job id, across all searches of a run — 0 duplicates in the whole-board run |
| **Output** | Apify dataset → JSON, CSV, Excel, XML, RSS, HTML table; API; integrations |
| **Login / cookies / browser** | None needed |
| **Price** | Fixed price per job saved, from $1.00 per 1,000 jobs — compute and proxies included |

***

### What you get

Fields are grouped below with real example values from a run on 2026-10-18. The full list with types and measured fill rates is in the [data dictionary](#output-data-dictionary).

**The job**

- `jobId` — `"151026000227"` (Naukrigulf's own job id; stable, used for de-duplication)
- `url` — the job page on naukrigulf.com
- `title` — `"HSEO / HSE Officer – Oil & Gas"`
- `postedAt` — `"2026-10-15T04:00:00.000Z"` (posting or last-refresh date, ISO 8601, UTC)
- `vacancies` — `1` (number of openings — manpower agencies love this one; bulk requisitions of 10, 20 or 50 are common)
- `summary` — one-line teaser Naukrigulf shows in search results
- `jobHighlights` — `"ADNOC HSE requirements, PTW and JSA | Incident investigation and emergency response | …"`
- `keywords` — `"Safety Audits | Emergency Response | Safety Engineer | …"`
- `description` / `descriptionHtml` — the complete job description as clean text (line breaks and bullets kept) and as the original HTML

**The employer**

- `companyName` — `"SIBCA ELECTRONIC EQUIPMENT COMPANY LIMITED"`, `companyId` — `"200495"`
- `companyUrl` — the company's Naukrigulf page, `companyLogo` — logo image URL
- `employerType` — `"Company"` (direct employer) or `"Consultant"` (recruitment agency)
- `confidentialCompany` — `true` when the employer hides its name ("Confidential Company")
- `companyProfile` — the "about the company" text shown on the job page
- `companyWebsite` — `"http://www.sibca.com"`

**Location**

- `location` — `"Abu Dhabi - United Arab Emirates (UAE)"` exactly as Naukrigulf writes it
- `city` — `"Abu Dhabi"`, `cities` — all cities of a multi-city job (`"Ajman | Dubai | Sharjah"`)
- `country` — `"United Arab Emirates"`, `countryCode` — `"AE"`, `countries` — all countries of the job
- `workplaceType` — `"On-site"`, `"Remote"` or `"Hybrid"`

**Requirements**

- `experienceMin` / `experienceMax` — `2` / `5` (years, as numbers)
- `education` — `"Bachelor of Technology/Engineering (Chemical)"`
- `gender` — `"Any"`, `"Male"` or `"Female"` (the employer's stated requirement; empty when not mentioned)
- `nationality` — `"Any Nationality"`, `"Indian, Filipino"`, `"Any GCC National"`, `"Emirati (UAE)"` …
- `desiredCandidateProfile` — the employer's "desired candidate" section as text
- `employmentType` — `"Full-time"`, `"Contract"`, `"Part-time"`, `"Internship"`
- `industry` / `industryId` — `"Industrial Products / Heavy Machinery"` / `"21"`
- `functionalArea` / `functionalAreaId` — `"HSE (Health / Safety / Environment)"` / `"53"`

**Pay** (when the employer publishes a salary)

- `salaryMin` / `salaryMax` — `5000` / `8000`
- `salaryCurrency` — `"AED"` (ISO code: AED, SAR, QAR, KWD, OMR, BHD, USD, EUR, GBP, INR …)
- `salaryPeriod` — `"month"` (Naukrigulf salaries are monthly)
- `salaryText` — `"AED 5,000 – 8,000 per month"`
- `salaryMinUsd` / `salaryMaxUsd` — `1351` / `2161` (Naukrigulf's own conversion to US dollars — compare salaries across currencies directly)
- `otherBenefits` — `"Accommodation, Medical Insurance, Transportation"` when listed

**Contact and apply**

- `contactName` — `"Ms. Lubna"`, `contactDesignation` — `"Member of hiring team"`, `contactAddress` — the office address shown on the job page
- `contactEmail` / `contactEmails` — the hiring contact's e-mail, e.g. `"hr@greenarcslimousine.com"` (on 26.8% of recent jobs), plus any address written into the job text; `contactPhone` where the employer gave one
- `easyApply` — `true` when the job takes one-click applications on Naukrigulf
- `applyOnCompanySite` — `true` when applications go to the employer's own careers site; `applyUrl` — that site's link

**Flags and run metadata**

- `recruiterActive`, `premiumJob`, `topEmployer`, `featuredEmployer`, `sponsored`
- `detailsIncluded` — `true` when the job-detail record was read (default)
- `searchTerm`, `searchLocation` — which of your searches found the row
- `scrapedAt` — when the row was collected

***

### Who uses it — and how

#### Recruitment agencies in the UAE and Saudi Arabia

**Workflow:** run the keywords you place (`"civil engineer"`, `"staff nurse"`, `"hse officer"`) with `countries: ["AE", "SA"]` and `postedWithin: "7"` every Monday. Sort the export by `postedAt`, filter `employerType = Company` to reach direct employers (not competing agencies), and use `contactName`, `contactDesignation`, `contactAddress` and `companyWebsite` to open the conversation with the hiring team. `experienceMin/Max` and `nationality` tell you immediately which of your candidates fit.

#### Manpower supply and staffing companies

**Workflow:** blue-collar and hospitality hiring in the Gulf is done in bulk. Export `functionalAreas` such as *Chefs / F\&B / Housekeeping / Front Desk*, *Transport / Driving* or *Installation / Maintenance / Operations / Repair*, keep rows with `vacancies ≥ 10`, and you have a ranked list of employers recruiting at volume this month — with their location and the nationalities they accept.

#### B2B sales teams selling to companies that are hiring

**Workflow:** a company that posts jobs is a company that is growing. HR software, payroll, PEO, visa and immigration services, relocation, staff accommodation, insurance and training providers use the export as a lead list: group by `companyId`, count open jobs per employer, attach `companyWebsite` and `industry`, and prioritise employers with many fresh postings. The whole board in one run gives the complete map of hiring employers in the region.

#### Job boards and aggregators

**Workflow:** schedule a daily run with `postedWithin: "1"` (or a small `maxItems` with the default relevance order for niche boards), map `title`, `descriptionHtml`, `city`, `country`, `salaryText`, `employmentType` and `url` into your import, and de-duplicate on `jobId`. Use `applyUrl` to send applicants straight to the employer when the job is applied for on the company's own site.

#### Labour-market researchers and economists

**Workflow:** export the whole board monthly and track openings by `country`, `industry`, `functionalArea`, `experienceMin` and `education`. `nationality` exposes how many jobs are reserved for nationals (Emiratisation, Saudisation, Qatarisation) and how many are open to any nationality; `gender` shows how often a requirement is stated at all.

#### Salary benchmarking and compensation analysis

**Workflow:** keep rows with `salaryMin` (11% of all listed jobs publish a salary, 36% of recent postings), compare `salaryMinUsd/salaryMaxUsd` across countries and currencies, and break them down by `functionalArea`, `industry`, `experienceMin` and `city`. Use the `salaryRanges` filter to pull only a band, e.g. jobs paying $3,001–5,000 a month.

#### Relocation, visa and immigration consultancies

**Workflow:** filter on `nationality` (e.g. jobs open to "Indian", "Filipino", "Pakistani" or "Any Nationality") and `country`, then advise clients on where demand for their profile is — or offer relocation packages to the employers hiring internationally.

#### HR-tech and ATS products

**Workflow:** enrich a talent-intelligence feature or a job-matching engine with structured Gulf job data: titles, keywords, education, experience bands and functional areas are already normalised into columns, and `industryId` / `functionalAreaId` are Naukrigulf's own taxonomy ids.

#### AI, RAG and LLM pipelines

**Workflow:** feed `description`, `desiredCandidateProfile`, `keywords` and the structured columns into a vector store for semantic job search, a career assistant or a skill-gap model. Through the Apify MCP server an AI agent can call the Actor as a tool ("find remote data engineer jobs in the UAE posted this week") and receive structured rows.

#### Universities, bootcamps and career services

**Workflow:** export `experienceLevels: ["0"]` (0–1 year) or `functionalAreas: ["7"]` (*Fresh Graduates / Management Trainee / Intern*) in the countries your graduates target, and publish a weekly list of entry-level jobs with the required degrees from the `education` column.

#### Competitive and market intelligence

**Workflow:** follow specific employers with the `companies` input (e.g. a competitor's name or Naukrigulf company page) and a weekly schedule: new job titles, new cities and new functional areas reveal expansion plans long before a press release.

#### Journalists and data reporters

**Workflow:** a single whole-board export answers questions such as "which Gulf industry is hiring most right now?", "what share of jobs publish a salary?" or "how many jobs require a specific nationality?" — with the date of the snapshot and the numbers to back it.

#### Job-alert and job-matching services

**Workflow:** run small, frequent searches (`maxItems: 50`, relevance order, `postedWithin: "1"`) per alert profile, de-duplicate on `jobId` across runs, and notify users only about new ids.

***

### How it works

1. **Searches.** The Actor calls the same public JSON search interface naukrigulf.com's own web pages use, 50 jobs per request. Each search already carries the full job description, so even the fastest mode returns complete descriptions.
2. **Order.** Keyword searches are read in Naukrigulf's **relevance** order by default, because Naukrigulf's search is semantic: it also returns related titles further down the list, and relevance keeps the closest matches first. Searches without a keyword (a country, a company, the whole board) are read **newest first**. Relevance paging on Naukrigulf is not perfectly stable between requests (measured on 2026-10-18: paging through all 6,447 results of "accountant" in relevance order repeated 161 jobs and skipped as many; the date order repeated none), so whenever a search is read to the end, the Actor pages it in date order and gets the complete set.
3. **Large searches.** One Naukrigulf search returns at most 45,000 results. The whole board is below that today, but if a search ever grows past it the Actor splits it automatically along Naukrigulf's own filters — employer type and gender requirement (exact partitions), experience bands, then country, industry and functional area — and de-duplicates the slices.
4. **Job details.** With **Include job details** on (the default), each job's detail record is read in parallel for salary, industry, functional area, employment type, workplace, education, gender and nationality requirement, desired-candidate profile, company profile, contact block and external apply link.
5. **Delivery.** Rows stream into the dataset as they are ready (first rows within about 2 seconds), de-duplicated by job id across all searches of the run.
6. **Honest endings.** Every run writes a `SUMMARY` record (searches, totals Naukrigulf reported, pages and details read, duplicates skipped, stop reason) and ends with a plain-language status message. A run that could not reach Naukrigulf fails with the reason instead of returning an empty "success".

***

### Cookbook: ready-to-run inputs

Copy any of these into the **JSON** tab of the input form (or send it as the API body). Every field not shown keeps its default.

#### 1. A keyword in one country

Accountant jobs anywhere in Saudi Arabia, best matches first:

```json
{
  "searchTerms": ["accountant"],
  "countries": ["SA"],
  "maxItems": 500
}
```

#### 2. A keyword in a city

Nurses in Dubai and Abu Dhabi (each location is its own search; results are de-duplicated):

```json
{
  "searchTerms": ["staff nurse", "registered nurse"],
  "locations": ["Dubai", "Abu Dhabi"],
  "maxItems": 1000
}
```

#### 3. Every job in one country

No keyword: the country filter alone returns every open job there (UAE ≈ 18,524 jobs on 2026-10-18), newest first:

```json
{
  "countries": ["AE"],
  "maxItems": 0
}
```

If a country ever grows past Naukrigulf's 45,000-results-per-search limit, the Actor splits it automatically — nothing to configure.

#### 4. The whole Naukrigulf board

Everything Naukrigulf lists, all countries:

```json
{
  "maxItems": 0
}
```

Measured on 2026-10-18: 40,197 unique jobs with full details in 27 minutes. Without job details (`"includeDetails": false`) the same export takes 3 minutes.

#### 5. Experience bands (fresh graduates, seniors)

Entry-level jobs (0–1 year) in Qatar, Kuwait and Oman:

```json
{
  "countries": ["QA", "KW", "OM"],
  "experienceLevels": ["0"],
  "maxItems": 0
}
```

Bands: `0` = 0–1 year, `1` = 2–5, `2` = 6–10, `3` = 11–15, `4` = 16–20, `5` = above 20. A job matches when its required range overlaps the band. For a single number of years use `experienceYears` (e.g. `8` = jobs whose range includes 8 years).

#### 6. Industries

Oil & gas and construction jobs in the GCC posted in the last 30 days:

```json
{
  "countries": ["AE", "SA", "QA", "KW", "OM", "BH"],
  "industries": ["36", "70", "71", "72", "10"],
  "postedWithin": "30",
  "maxItems": 0
}
```

The industry ids are listed in the input form (69 industries, Naukrigulf's own taxonomy).

#### 7. Functional areas

Sales and business-development roles in the UAE:

```json
{
  "countries": ["AE"],
  "functionalAreas": ["26"],
  "maxItems": 2000
}
```

#### 8. Daily monitoring of fresh jobs

Every job posted in the last 24 hours, all countries — schedule it every morning:

```json
{
  "postedWithin": "1",
  "maxItems": 0
}
```

Combine with a webhook or the Google Sheets integration to receive only the new jobs each day; de-duplicate on `jobId` if you keep history.

#### 9. A company's jobs

All open jobs of specific employers — by name, Naukrigulf company page or company id:

```json
{
  "companies": [
    "Al Futtaim",
    "https://www.naukrigulf.com/nmc-hospital-jobs-cid-54690",
    "264078"
  ],
  "maxItems": 0
}
```

The run log shows how each entry was resolved, e.g. *Company "Al Futtaim" = Naukrigulf company id 120015 (Al Futtaim Private Company (LLC), 423 open jobs)*.

#### 10. Jobs that publish a salary band

Jobs paying $3,001–5,000 a month in the UAE (Naukrigulf's salary filter, in US dollars):

```json
{
  "countries": ["AE"],
  "salaryRanges": ["5", "6"],
  "maxItems": 0
}
```

Naukrigulf's salary filter also matches jobs whose employer entered a salary but chose not to show it; those rows come without a salary amount. To keep only published salaries, filter the dataset on `salaryMin`.

#### 11. Recruitment-agency (consultant) jobs only

```json
{
  "searchTerms": ["driver"],
  "countries": ["SA", "AE"],
  "employerType": "consultant",
  "maxItems": 1000
}
```

Use `"employerType": "company"` for the opposite: only jobs posted by the hiring company itself.

#### 12. Paste Naukrigulf search pages

Any search page you built on naukrigulf.com, with its filters:

```json
{
  "startUrls": [
    { "url": "https://www.naukrigulf.com/accountant-jobs-in-dubai?industryType=55&freshness=30" },
    { "url": "https://www.naukrigulf.com/jobs-in-qatar" }
  ],
  "maxItems": 2000
}
```

Supported page types: `/<keyword>-jobs`, `/jobs-in-<location>`, `/<keyword>-jobs-in-<location>` with Naukrigulf's filter parameters (`country`, `citysrp`, `industryType`, `fa`, `freshness`, `experience`, `ctc`, `companyType`, `nationalityCluster`, `titles`, `sort`).

#### 13. Enrich a list of job links

```json
{
  "startUrls": [
    { "url": "https://www.naukrigulf.com/1-no-architect-engineer-and-1-no-structural-engineer-jobs-in-abu-dhabi-uae-in-itar-engineering-consulting-1-to-2-years-n-cd-379074-jid-181026000057" }
  ]
}
```

Each job URL (anything ending in `-jid-<number>`) becomes a full row.

#### 14. Fastest bulk export (search data only)

```json
{
  "countries": ["SA"],
  "includeDetails": false,
  "maxItems": 0
}
```

Rows still include the full description, title, employer, city, country, experience, vacancies, posting date, highlights, keywords, Easy Apply and the employer flags; salary, industry, functional area, education, nationality, contact block and apply link need the details.

#### 15. Remote jobs

Naukrigulf's own "remote jobs" page is a keyword search for *remote* (about 1,100 jobs on 2026-10-18). Jobs posted directly on Naukrigulf also carry the employer's `workplaceType` (98% of the newest 12,000 jobs; listings Naukrigulf imports from other sources usually have none). Run the keyword search, then keep rows with `workplaceType = "Remote"` for jobs explicitly marked remote:

```json
{
  "searchTerms": ["remote", "work from home"],
  "maxItems": 0
}
```

***

### Tutorial: your first run in the Apify Console

1. Open the Actor and click **Try for free** (or **Start** if you already use it).
2. In **Search terms**, type what you are looking for — a job title, a skill or a profession (`accountant`, `civil engineer`, `nurse`). Leave it empty to export every job.
3. In **Locations**, add cities or countries as you would type them on Naukrigulf (`Dubai`, `Riyadh`, `Saudi Arabia`). Or use the **Countries** selector for an exact country filter.
4. Optional filters: **Posted within**, **Years of experience** or **Experience bands**, **Industries**, **Functional areas**, **Monthly salary (USD)**, **Employer type**, **Easy Apply only**, **Companies**.
5. Set **Max results** (`0` = everything that matches). Keep **Include job details** on for salary, industry, education, nationality and contact fields.
6. Click **Start**. Rows appear in the **Output** tab within seconds; the status line shows progress ("Saved 1,250/5,000 jobs · …").
7. When the run finishes, open **Export** and download **CSV**, **Excel** or **JSON** — or switch between the prepared views: *Overview*, *Job details*, *Salaries*, *Employers & contacts*.
8. To repeat the run automatically, open **Schedules** and create a schedule (daily or weekly) with the same input.

### Tutorial: run it through the API

**1. Get your API token** from *Settings → Integrations* in the Apify Console.

**2. Start a run and wait for the data** (synchronous, best for up to a few thousand rows):

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~naukrigulf-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN&format=json" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["accountant"],"locations":["Dubai"],"maxItems":200}'
```

**3. For big exports, start asynchronously and fetch the dataset later:**

```bash
## start
curl -X POST "https://api.apify.com/v2/acts/logiover~naukrigulf-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"maxItems":0}'
## poll the run (status SUCCEEDED), then download all rows as CSV
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&clean=true&token=YOUR_TOKEN" -o naukrigulf-jobs.csv
```

**4. Node.js (apify-client):**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/naukrigulf-scraper').call({
    searchTerms: ['civil engineer'],
    countries: ['AE', 'SA'],
    postedWithin: '7',
    maxItems: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const job of items) {
    console.log(job.title, '|', job.companyName, '|', job.city, job.countryCode, '|', job.salaryText ?? 'salary not published');
}
```

**5. Python (apify-client):**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/naukrigulf-scraper").call(run_input={
    "countries": ["QA"],
    "postedWithin": "30",
    "maxItems": 0,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["jobId"], job["title"], job["industry"], job["salaryMinUsd"], job["nationality"])
```

**6. Read the run summary** (totals, stop reason, pages read, duplicates skipped):

```bash
curl "https://api.apify.com/v2/key-value-stores/KEY_VALUE_STORE_ID/records/SUMMARY?token=YOUR_TOKEN"
```

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | array of strings | `[]` | Keywords, job titles or skills. Each term is one Naukrigulf search. Empty (with no locations or companies) = every job. |
| `locations` | array of strings | `[]` | Cities or countries as typed on Naukrigulf (`Dubai`, `Riyadh`, `Saudi Arabia`, `UAE`). Every term is combined with every location. Unknown places return nothing — they never widen silently to all locations. |
| `companies` | array of strings | `[]` | Company names, Naukrigulf company page URLs or company ids. Each company is its own search, combined with terms and locations. |
| `countries` | array (select) | `[]` | Exact country filter by ISO code (`AE`, `SA`, `QA`, `KW`, `OM`, `BH`, `EG`, `LB`, `JO`, `IQ`, `DZ`, `MA`, `TN`, `LY`, `PS`, `YE`, `SY`, `IN`, `PK`, …). Alone, it exports every job in those countries. |
| `postedWithin` | string (select) | `"any"` | `1`, `3`, `7`, `15`, `30` or `60` days. |
| `experienceYears` | integer | — | Jobs whose required experience range includes this many years. |
| `experienceLevels` | array (select) | `[]` | Experience bands `0`–`5` (0–1, 2–5, 6–10, 11–15, 16–20, 20+ years). |
| `industries` | array (select) | `[]` | Naukrigulf industry ids (69). |
| `functionalAreas` | array (select) | `[]` | Naukrigulf functional-area ids (59). |
| `salaryRanges` | array (select) | `[]` | Monthly salary bands in USD (`1` = under $500 … `15` = above $50,000). |
| `employerType` | string (select) | `"any"` | `company` (direct employer) or `consultant` (recruitment agency). |
| `easyApplyOnly` | boolean | `false` | Only jobs with one-click apply on Naukrigulf. |
| `startUrls` | array of URLs | `[]` | Naukrigulf search pages (with filters), company pages or job pages. URLs alone = only the URLs are scraped. |
| `sortBy` | string (select) | `"relevance"` | `relevance` or `newest`. Searches without a keyword are always read newest-first. Complete reads return the same set either way. |
| `maxItems` | integer | `1000` | Maximum unique jobs per run, across all searches. `0` = no limit. |
| `includeDetails` | boolean | `true` | Read each job's detail record (salary, industry, functional area, employment type, workplace, education, gender, nationality, candidate profile, company profile, contact block, apply link). |
| `proxyConfiguration` | object | Apify Proxy | Fallback only — see [Do I need proxies?](#do-i-need-proxies-for-naukrigulf). |

Form filters (countries, industries, …) apply to the searches built from `searchTerms`, `locations` and `companies`. Pasted search URLs carry their own filters.

***

### Output data dictionary

Fill rates below are for the whole board, old listings included. Recent postings are much richer — on the newest 12,000 jobs (2026-10-18) workplace, employment type and gender were filled for 98–99%, job highlights for 95% and city for 97.5%, against about 29% / 29% / 30% / 29% / 83% across the whole board, because many older listings were imported by Naukrigulf from other sources with fewer fields. Measured on the whole-board run of 2026-10-18 (40,197 jobs, job details on). A field is empty only when Naukrigulf has no value for that job — for example, most employers do not publish a salary.

| Field | Type | Meaning | Filled | Example |
|---|---|---|---|---|
| `jobId` | string | Naukrigulf job id (unique, stable) | 100% | `"151026000227"` |
| `url` | string (URL) | Job page on naukrigulf.com | 100% | `"https://www.naukrigulf.com/…-jid-151026000227"` |
| `title` | string | Job title as posted | 100% | `"HSEO / HSE Officer – Oil & Gas"` |
| `companyName` | string | Employer (or "Confidential Company") | 100% | `"SIBCA Electronic Equipment …"` |
| `companyId` | string | Naukrigulf company id (use with `companies`) | 100% | `"200495"` |
| `companyUrl` | string (URL) | Employer's Naukrigulf page | 43.0% | `"https://www.naukrigulf.com/…-cid-70836"` |
| `companyLogo` | string (URL) | Employer logo image | 56.8% | `"https://static.naukimg.com/…_srp.gif"` |
| `employerType` | string | `Company` (direct) or `Consultant` (agency) | 100% | `"Company"` |
| `confidentialCompany` | boolean | Employer name hidden | 100% | `false` |
| `location` | string | Location exactly as Naukrigulf writes it | 100% | `"Dubai , Sharjah - United Arab Emirates (UAE)"` |
| `city` | string | First city of the job | 83.0% | `"Dubai"` |
| `cities` | string | All cities, " | "-joined | 83.0% | `"Dubai | Sharjah"` |
| `country` | string | Country (normalised name) | 100% | `"United Arab Emirates"` |
| `countryCode` | string | ISO 3166-1 alpha-2 code | 100% | `"AE"` |
| `countries` | string | All countries of the job | 100% | `"United Arab Emirates"` |
| `workplaceType` | string | `On-site`, `Remote` or `Hybrid` \* | 29.4% | `"On-site"` |
| `experienceMin` | number | Minimum experience, years | 100% | `2` |
| `experienceMax` | number | Maximum experience, years | 100% | `5` |
| `salaryMin` | number | Monthly salary, minimum (published only) \* | 10.8% | `5000` |
| `salaryMax` | number | Monthly salary, maximum \* | 10.8% | `8000` |
| `salaryCurrency` | string | ISO currency code \* | 10.8% | `"AED"` |
| `salaryPeriod` | string | Always `month` when a salary is published \* | 10.8% | `"month"` |
| `salaryText` | string | Readable salary \* | 10.8% | `"AED 5,000 – 8,000 per month"` |
| `salaryMinUsd` | number | Minimum in USD (Naukrigulf's conversion) \* | 10.8% | `1351` |
| `salaryMaxUsd` | number | Maximum in USD \* | 10.8% | `2161` |
| `otherBenefits` | string | Benefits listed by the employer \* | 2.7% | `"Accommodation, Medical Insurance"` |
| `vacancies` | number | Number of openings | 100% | `1` |
| `postedAt` | string (ISO 8601) | Posted or last refreshed (UTC) | 100% | `"2026-10-15T04:00:00.000Z"` |
| `employmentType` | string | Full-time, Contract, Part-time, Internship \* | 29.3% | `"Full-time"` |
| `industry` | string | Industry (Naukrigulf taxonomy) \* | 100% | `"Industrial Products / Heavy Machinery"` |
| `industryId` | string | Industry id (use in `industries`) \* | 100% | `"21"` |
| `functionalArea` | string | Job function \* | 100% | `"HSE (Health / Safety / Environment)"` |
| `functionalAreaId` | string | Function id (use in `functionalAreas`) \* | 100% | `"53"` |
| `education` | string | Required education \* | 99.8% | `"Bachelor of Technology/Engineering (Chemical)"` |
| `gender` | string | Stated requirement: Any, Male, Female \* | 29.5% | `"Any"` |
| `nationality` | string | Stated nationality requirement \* | 99.9% | `"Any Nationality"` |
| `summary` | string | Naukrigulf's one-line teaser | 100% | `"Seeking candidates with ADNOC Offshore …"` |
| `jobHighlights` | string | Highlights, " | "-joined | 28.5% | `"Incident investigation and emergency response | …"` |
| `keywords` | string | Skills / keywords, " | "-joined | 100% | `"Safety Audits | Emergency Response | …"` |
| `description` | string | Full description, plain text | 100% | `"• Relevant Oil & Gas HSE experience …"` |
| `descriptionHtml` | string | Full description, original HTML | 100% | `"<ul><li><p>Relevant Oil & Gas …"` |
| `desiredCandidateProfile` | string | "Desired candidate" section, text \* | 87.8% | `"ADNOC Offshore experience is …"` |
| `companyProfile` | string | "About the company" text \* | 44.2% | `"From humble beginnings in 1977, SIBCA …"` |
| `companyWebsite` | string (URL) | Employer's website from the job page \* | 4.6% | `"http://www.sibca.com"` |
| `contactName` | string | Contact person shown on the job page \* | 13.6% | `"Ms. Lubna"` |
| `contactDesignation` | string | Contact's role \* | 10.3% | `"Member of hiring team"` |
| `contactAddress` | string | Office address shown on the job page \* | 14.9% | `"Behind Etisalat T A, Khalidiya Abu Dhabi …"` |
| `contactEmail` | string | Hiring contact's e-mail (first of `contactEmails`) \* | 26.8% † | `"hr@greenarcslimousine.com"` |
| `contactEmails` | array | Every e-mail of the hiring contact and in the job text, de-duplicated \* | 26.8% † | `["meimei@cnqc-uae.com"]` |
| `contactPhone` | string | Mobile / landline of the hiring contact, when given \* | rare | `"+971 4 …"` |
| `easyApply` | boolean | One-click apply on Naukrigulf | 100% | `true` |
| `applyOnCompanySite` | boolean | Applications go to the employer's site | 100% | `false` |
| `applyUrl` | string (URL) | Employer's apply link (when applyOnCompanySite) \* | 2.6% | `"https://careers.penspen.com/vacancy/…"` |
| `recruiterActive` | boolean | Recruiter recently active on Naukrigulf | 100% | `false` |
| `topEmployer` | boolean | Naukrigulf top-employer flag | 100% | `false` |
| `featuredEmployer` | boolean | Featured-employer flag | 100% | `false` |
| `premiumJob` | boolean | Premium job listing | 100% | `false` |
| `sponsored` | boolean | Sponsored listing | 100% | `false` |
| `detailsIncluded` | boolean | Job-detail record was read | 100% | `true` |
| `searchTerm` | string | Your search term that found the row (keyword searches only) | per search | `"accountant"` |
| `searchLocation` | string | Your location that found the row (location searches only) | per search | `"Dubai"` |
| `scrapedAt` | string (ISO 8601) | When the row was collected | 100% | `"2026-10-18T20:30:11.700Z"` |

† measured on 600 recent UAE/Saudi Arabia/Qatar jobs, 2026-10-20.

\* needs **Include job details** (on by default).

**Types:** numbers are JSON numbers (never strings); `postedAt` and `scrapedAt` are ISO 8601 UTC; URLs are absolute; lists (`cities`, `countries`, `jobHighlights`, `keywords`) are joined with `" | "` so they stay readable in CSV and Excel; `description` and the profile fields are plain text with line breaks, `descriptionHtml` keeps the original formatting.

***

### Output example

A real row from a platform run on 2026-10-18 (description shortened for this page):

```json
{
  "jobId": "181026000157",
  "url": "https://www.naukrigulf.com/account-officer-jobs-in-muscat-oman-in-al-nab-3-to-8-years-n-cd-39537-jid-181026000157",
  "title": "Account Officer",
  "companyName": "Al Naba Al Nabaa Services Company LLC",
  "companyId": "39537",
  "companyUrl": "https://www.naukrigulf.com/al-naba-supplies-&-catering-services-jobs-cid-82841",
  "companyLogo": "https://static.naukimg.com/ni/nipjp/39537/39537_srp.gif",
  "employerType": "Company",
  "confidentialCompany": false,
  "location": "Muscat - Oman",
  "city": "Muscat",
  "cities": "Muscat",
  "country": "Oman",
  "countryCode": "OM",
  "countries": "Oman",
  "workplaceType": "On-site",
  "experienceMin": 3,
  "experienceMax": 8,
  "salaryMin": 250,
  "salaryMax": 300,
  "salaryCurrency": "OMR",
  "salaryPeriod": "month",
  "salaryText": "OMR 250 – 300 per month",
  "salaryMinUsd": 650,
  "salaryMaxUsd": 780,
  "otherBenefits": null,
  "vacancies": 1,
  "postedAt": "2026-10-18T11:56:23.000Z",
  "employmentType": "Full-time",
  "industry": "Construction / Civil Engineering",
  "industryId": "10",
  "functionalArea": "Accounts / Taxation / Audit / Company Secretary",
  "functionalAreaId": "1",
  "education": "Bachelor of Commerce (Commerce)",
  "gender": "Any",
  "nationality": "Indian",
  "summary": "Manage high-value client accounts, develop strategic plans for revenue growth, and analyze client needs in finance and accounting.",
  "jobHighlights": "Manage a portfolio of high-value client accounts | Develop account plans to drive revenue growth | Identify upsell and cross-sell opportunities | Conduct in-depth client needs analysis",
  "keywords": "Accounts | Accounting | Finance",
  "description": "• Manage and nurture a portfolio of high-value client accounts, acting as their primary point of contact and trusted advisor.\n• Develop and execute strategic account plans to drive revenue growth, client retention, and deepen customer relationships.\n• Identify and capitalize on upsell and cross-sell opportunities …",
  "descriptionHtml": "<ul><li>Manage and nurture a portfolio of high-value client accounts, acting as their primary point of contact and trusted advisor.</li><li>Develop and execute strategic account plans to drive …",
  "desiredCandidateProfile": "• Bachelor's degree in Business, Finance, Marketing, or a related field.\n• Minimum of 3-5 years of proven experience in account management, client relations, or sales, preferably within the [Specific …",
  "companyProfile": "Al Nab’a Holding is a leading brand in the Sultanate of Oman comprising of 4 group companies serving various verticals in the blooming market of the Sultanate & other GCC countries.",
  "companyWebsite": "https://www.alnabaservices.com",
  "contactName": "Mr Rajesh Rajesh",
  "contactDesignation": "Manager HR",
  "contactAddress": "PO Box 725, PC 112, Oman, Muscat, Oman",
  "easyApply": true,
  "applyOnCompanySite": false,
  "applyUrl": null,
  "recruiterActive": true,
  "topEmployer": false,
  "featuredEmployer": false,
  "premiumJob": false,
  "sponsored": false,
  "detailsIncluded": true,
  "searchTerm": null,
  "searchLocation": null,
  "scrapedAt": "2026-10-18T21:10:56.444Z"
}
```

A few more real rows from a platform run on 2026-10-20 (contact fields only):

```json
[
  {
    "jobId": "201026000287",
    "title": "Civil Site Engineer",
    "companyName": "CNQC MIDDLE EAST CONTRACTING LLC",
    "employerType": "Company",
    "contactName": null,
    "contactDesignation": null,
    "contactEmail": "meimei@cnqc-uae.com",
    "contactEmails": [
      "meimei@cnqc-uae.com"
    ],
    "contactPhone": null
  },
  {
    "jobId": "121026000226",
    "title": "Electrician",
    "companyName": "Alpha Data PJSC",
    "employerType": "Company",
    "contactName": "zaikaben",
    "contactDesignation": "Hr Head",
    "contactEmail": "zak@alpha.ae",
    "contactEmails": [
      "zak@alpha.ae"
    ],
    "contactPhone": null
  },
  {
    "jobId": "151026000288",
    "title": "F2F Interview - AC Technician",
    "companyName": "Alpha Data PJSC",
    "employerType": "Company",
    "contactName": "zaikaben",
    "contactDesignation": "Hr Head",
    "contactEmail": "zak@alpha.ae",
    "contactEmails": [
      "zak@alpha.ae"
    ],
    "contactPhone": null
  }
]
```

**CSV / Excel columns, in order:** `jobId`, `url`, `title`, `companyName`, `companyId`, `companyUrl`, `companyLogo`, `employerType`, `confidentialCompany`, `location`, `city`, `cities`, `country`, `countryCode`, `countries`, `workplaceType`, `experienceMin`, `experienceMax`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`, `salaryMinUsd`, `salaryMaxUsd`, `otherBenefits`, `vacancies`, `postedAt`, `employmentType`, `industry`, `industryId`, `functionalArea`, `functionalAreaId`, `education`, `gender`, `nationality`, `summary`, `jobHighlights`, `keywords`, `description`, `descriptionHtml`, `desiredCandidateProfile`, `companyProfile`, `companyWebsite`, `contactName`, `contactDesignation`, `contactAddress`, `contactEmail`, `contactEmails`, `contactPhone`, `easyApply`, `applyOnCompanySite`, `applyUrl`, `recruiterActive`, `topEmployer`, `featuredEmployer`, `premiumJob`, `sponsored`, `detailsIncluded`, `searchTerm`, `searchLocation`, `scrapedAt`.

***

### Scale, speed and coverage

All numbers below were measured on the Apify platform on **2026-10-18** with default settings unless stated.

| Run | Result | Time |
|---|---|---|
| Prefill (accountant in Dubai, 50 jobs, details on) | 50 jobs, 49 of them saved after 2 s | **6.1 s** |
| 1,000 jobs, default settings (details on) | 1,000 jobs, 0 duplicates | **59 s** |
| 12,000 newest jobs, details on | 12,000 jobs, 0 duplicates, 100% with details | **641 s** |
| **The whole board, details on** | **40,197 unique jobs, 0 duplicates** (Naukrigulf reported 40,427 at start) | **1,617 s** (27 min) |
| The whole board, search data only (`includeDetails: false`) | 40,340 unique jobs of 40,369 reported (99.93%), 0 duplicates | **208 s** |
| Budget stop: `Maximum cost per run` = $0.05 | 37 jobs saved = 37 charged, run **Succeeded** | 5 s |

Notes:

- Naukrigulf's list moves while a long export reads it (new postings arrive, others expire), which can make a page boundary skip a job. In the details-on whole-board run above, 40,197 of the 40,427 jobs reported at the start were saved (99.4%) over 27 minutes. The released version therefore reads the list quickly, ahead of the detail calls, and sweeps it a second time right after: in the whole-board run without details, 40,340 of the 40,369 reported jobs were saved (99.93%), the second sweep adding 103 jobs that had moved. The `SUMMARY` record of every complete read shows this as `secondSweep`.
- With details on, the Actor reads about 20–30 job records per second; without details about 190 jobs per second.

#### Coverage by country

Jobs per country in the whole-board export of 2026-10-18 (primary country of each job):

| Country | Jobs | Share |
|---|---|---|
| United Arab Emirates (AE) | 18,524 | 46.1% |
| Saudi Arabia (SA) | 6,842 | 17.0% |
| Egypt (EG) | 4,393 | 10.9% |
| Lebanon (LB) | 2,621 | 6.5% |
| Qatar (QA) | 2,004 | 5.0% |
| Algeria (DZ) | 976 | 2.4% |
| Morocco (MA) | 950 | 2.4% |
| Oman (OM) | 929 | 2.3% |
| Kuwait (KW) | 765 | 1.9% |
| Jordan (JO) | 663 | 1.6% |
| Bahrain (BH) | 611 | 1.5% |
| Tunisia (TN) | 316 | 0.8% |
| Iraq (IQ) | 227 | 0.6% |
| India (IN) | 128 | 0.3% |
| Libya (LY) | 41 | 0.1% |
| Palestine (PS) | 26 | 0.1% |
| Other countries | 181 | 0.5% |

Cities with the most jobs in the same export: Dubai (10,399), Abu Dhabi (4,956), Riyadh (3,118), Cairo (2,590), Doha (1,482), Beirut (1,435), Sharjah (1,014), Al Madina Al Munawarah (721), Algiers (647), Muscat (645), Eastern Province (596), Al Kuwait (593).

#### Big runs need a big enough "Maximum cost per run"

Apify stops every pay-per-result run at its **Maximum cost per run** (set in the run options; Apify also applies a default). The Actor reads that limit when it starts, stops cleanly when it is reached and tells you so: *"Saved 37 jobs — this run's maximum cost ($0.05) covers 37 results at the current price. Raise "Maximum cost per run" to get more."* The run still ends as **Succeeded**, the `SUMMARY` record says `stoppedBy: MAX_COST`, and you pay only for the jobs saved. For a whole-board export, raise the limit to cover about 40,000 results.

***

### What you pay

**A fixed price per job in the dataset.** Compute, proxies and the job-detail requests are included — no monthly rental, no charge for duplicates (they are dropped before saving) and none for jobs that a filter removed.

| Apify plan | Price per 1,000 jobs | 1,000 jobs | 10,000 jobs | 100,000 jobs |
|---|---|---|---|---|
| Free | $1.50 | $1.50 | $15.00 | $150.00 |
| Bronze | $1.33 | $1.33 | $13.33 | $133.33 |
| Silver | $1.17 | $1.17 | $11.67 | $116.67 |
| Gold, Platinum, Diamond | $1.00 | $1.00 | $10.00 | $100.00 |

For scale: one whole-board export is about 40,000 jobs; a daily feed of jobs posted in the last 24 hours is typically a few hundred to a few thousand jobs a day; 100,000 jobs is roughly two full exports plus a month of daily updates.

**Maximum cost per run.** Every run carries a spending limit (the *Maximum cost per run* in the run options). The Actor never goes past it: it calculates how many jobs the limit covers, stops at that number with a clear status message, and the run still succeeds. Set the limit to `number of jobs you want × price per job` (for example $15 for 10,000 jobs on the Free plan) and you know the cost in advance.

***

### Integrations

#### API (curl)

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~naukrigulf-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["electrician"],"countries":["QA"],"maxItems":300}'
```

#### Node.js and Python

Use the official `apify-client` packages as shown in the [API tutorial](#tutorial-run-it-through-the-api). `iterate_items()` / pagination with `offset` and `limit` handle exports of any size.

#### Make, Zapier and n8n

Use the Apify app (Make, Zapier) or the Apify node (n8n): **Run an Actor** with `logiover/naukrigulf-scraper` and your input, then **Get dataset items** and map the fields into your next step — a CRM, a spreadsheet, Slack, e-mail or a database.

#### Google Sheets

Use Apify's Google Sheets integration on the Actor (or a task) to append each run's rows to a sheet; with `postedWithin: "1"` and a daily schedule the sheet becomes a live list of new Gulf jobs.

#### Airtable

Send the dataset to Airtable through Make, Zapier or n8n; use `jobId` as the primary field so repeated runs update existing records instead of duplicating them.

#### CRM via webhooks (HubSpot, Salesforce, Pipedrive, Zoho)

Add a webhook on **Run succeeded**; your endpoint receives the run and dataset ids, downloads the rows and creates or updates *companies* from `companyId`, `companyName`, `companyWebsite`, `industry` and `country`, and *deals or tasks* from the open jobs.

#### Scheduling

Save your input as a **task** and attach a **schedule** (cron syntax, any time zone). Typical set-ups: every morning `postedWithin: "1"`; every Monday a 7-day export per country; monthly the whole board for research.

#### MCP and AI agents

The Actor works through the Apify MCP server, so Claude, ChatGPT or your own agent can call it as a tool and receive structured job rows — for example "list engineering jobs in Riyadh posted this week with their salary".

#### Data warehouses and BI

Download the dataset as CSV or JSON from the API on a schedule and load it into BigQuery, Snowflake, Redshift, PostgreSQL or a data lake; all ids and numbers have stable types, so the schema stays the same from run to run.

***

### Performance tips

- **Leave job details on** unless you only need titles, employers, locations, experience, posting dates and descriptions — details add salary, industry, functional area, education, nationality, contact block and apply link.
- **Need speed above all?** `includeDetails: false` reads the whole board in 3 minutes instead of 27.
- **Use `countries` for exact country filtering.** Free-text `locations` follow Naukrigulf's own place matching (great for cities); the country selector is Naukrigulf's exact country filter.
- **Several searches in one run** are fair-shared: with `maxItems: 1000` and four searches, each gets about 250 before any search may use the rest. Duplicates between searches are dropped for free.
- **Monitoring:** use `postedWithin: "1"` with a daily schedule rather than re-exporting everything.
- **Relevance vs newest:** for "the best 100 matches" keep relevance; for "everything posted this week" any order works — complete reads always return the same set.

***

### Troubleshooting

Every run ends with one of these outcomes (also stored as `outcome` in the `SUMMARY` record):

| Outcome / status message | Run status | What it means | What to do |
|---|---|---|---|
| `Saved N jobs (max results reached) in T s.` | Succeeded | You got exactly `maxItems` jobs. | Raise `maxItems` for more. |
| `Saved N jobs (every matching job read) in T s.` | Succeeded | Naukrigulf had no more matching jobs. | — |
| `Saved N jobs — this run's maximum cost ($X) covers N results at the current price. Raise "Maximum cost per run" to get more.` | Succeeded | The run hit your spending limit (`stoppedBy: MAX_COST`). | Raise *Maximum cost per run* in the run options. |
| `No jobs matched on Naukrigulf — the search ran fine but returned 0 results. …` | Succeeded (`EMPTY_RESULT`) | The search is valid but empty; the message includes notes such as an unknown company. | Broaden the terms, check spelling, remove filters. |
| `Saved N jobs (stopped at the run time limit)` | Succeeded | The run timeout was reached; everything collected is saved. | Increase the run timeout or split the input. |
| `PARTIAL` in `SUMMARY` | Succeeded | Some pages or a noticeable share of job details could not be read; rows without details have `detailsIncluded: false`. | Re-run later; the rows you have are valid. |
| `No jobs collected: no page could be fetched …` (`BLOCKED` / `FETCH_FAILED`) | Failed | Naukrigulf could not be reached at all (outage or refusal on every route). | Re-run later; keep the default proxy setting. |
| `Nothing to scrape: …` (`BAD_INPUT`) | Failed | The URLs were not Naukrigulf pages, or nothing usable was given. | Use search, company or job pages from naukrigulf.com. |

Warnings in the log you may see: *"Unknown country …"*, *"Unknown industry …"* (a value that is not in Naukrigulf's list is ignored), *"Company … was not found among Naukrigulf's open jobs"*, *"Naukrigulf refused the direct connection …; switching to the datacenter proxy"* (handled automatically).

***

### Limits

- **Public jobs only.** The Actor reads what any visitor sees on naukrigulf.com; it does not log in, apply to jobs or read candidate data.
- **Salary:** 11% of all listed jobs (36% of the newest 12,000) publish a salary amount; the rest are "not disclosed" by the employer. Amounts are monthly, as Naukrigulf states them.
- **Contact block:** names, roles and addresses appear where the employer published them (15% of jobs). E-mail addresses come from Naukrigulf's job data — including ones the job page only reveals through its apply flow — and from the job text: 26.8% of 600 recent UAE/Saudi/Qatar jobs carried one (2026-10-20). Phone numbers are rare.
- **45,000 results per search** is Naukrigulf's limit; the Actor splits bigger searches automatically. If a split ever cannot isolate a slice below the limit, the run says so in `SUMMARY.jobsInUnsplittableQueries`.
- **Free-text locations** follow Naukrigulf's matching ("UAE" and "United Arab Emirates" both work; unknown places return nothing).
- **Search is semantic.** A keyword search returns related titles too — that is how Naukrigulf searches. Relevance order keeps the closest matches first; filter `title` if you need strict title matches.
- **Posting date** is the date the job was posted or last refreshed on Naukrigulf.
- **Company search** finds employers through their open jobs; a company with no open jobs on Naukrigulf returns an empty result.

***

### Compared with searching by hand

| | This Actor | Searching on the website |
|---|---|---|
| Jobs per request | 50, with full description | ~30 per page, description one click away |
| Whole board | 40,197 jobs in one run | Not practical |
| Salary in a sortable column, with USD conversion | Yes | Read job by job |
| Industry, functional area, education, nationality as columns | Yes | Read job by job |
| De-duplication across searches | Automatic, by job id | Manual |
| Export to CSV / Excel / JSON, API, schedules | Yes | No |
| Large searches past 45,000 results | Split automatically | Not reachable |
| Login or cookies | Not needed | Not needed |

***

### FAQ

#### What is Naukrigulf Scraper?

An Apify Actor that exports job listings from Naukrigulf.com — the Gulf and Middle East job board — as structured data: title, employer, city, country, experience, salary, industry, functional area, education, nationality requirement, full description, contact block and apply link, in JSON, CSV or Excel.

#### Is there an official Naukrigulf API?

Naukrigulf does not offer a public jobs API for third parties. This Actor reads the same public pages data the website shows every visitor and turns it into a clean dataset — a practical Naukrigulf API alternative with a documented, stable output.

#### How do I scrape Naukrigulf jobs into Excel or CSV?

Run the Actor with your search, then click **Export** on the run and choose **Excel** or **CSV** — or download `.../datasets/DATASET_ID/items?format=csv` through the API.

#### Can I export all jobs from Naukrigulf?

Yes. Leave search terms, locations and companies empty and set `maxItems` to `0`. On 2026-10-18 that was 40,197 unique jobs in one run.

#### How do I scrape jobs in Dubai from Naukrigulf?

Put `Dubai` in **Locations** and your keywords in **Search terms**, or use `countries: ["AE"]` for the whole UAE. See [recipe 2](#2-a-keyword-in-a-city).

#### How do I get all jobs in Saudi Arabia?

`{"countries": ["SA"], "maxItems": 0}` — every open job in Saudi Arabia on Naukrigulf, newest first.

#### Does it cover Qatar, Kuwait, Oman and Bahrain?

Yes — every country Naukrigulf lists jobs in. See [coverage by country](#coverage-by-country) for the measured counts.

#### Can I scrape Naukrigulf without logging in?

Yes. No account, cookies, CV or API key of yours is needed.

#### Do I need proxies for Naukrigulf?

No. Proxies are included in the price. The Actor uses a direct connection where it works and switches to Apify datacenter proxies automatically when Naukrigulf refuses it (it does at volume); your proxy setting is only a further fallback. Keep the default.

#### How fast is it?

First rows within 2 seconds; 1,000 jobs with full details in about 59 seconds; the whole board with details in about 27 minutes, or 3 minutes without details.

#### How much does it cost to scrape Naukrigulf?

$1.00–$1.50 per 1,000 jobs depending on your Apify plan, everything included. See [What you pay](#what-you-pay).

#### How do I get only jobs posted today?

`"postedWithin": "1"`. Schedule it daily for a fresh feed.

#### Can I get the salary of each job?

Yes, when the employer publishes it (11% of all listed jobs, 36% of recent postings): `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryText` and the US-dollar values `salaryMinUsd` / `salaryMaxUsd`. Naukrigulf salaries are monthly.

#### Why are some salary fields empty?

Most employers on Naukrigulf choose not to disclose the salary. The Actor never guesses: an empty salary means it was not published.

#### Can I filter jobs by salary?

Yes, with Naukrigulf's own salary bands (`salaryRanges`, monthly USD). Keep in mind the filter also matches jobs whose salary is set but hidden — filter on `salaryMin` afterwards to keep published amounts only.

#### Can I get the recruiter's or employer's contact details?

Yes. Every row carries the hiring contact's name, role and office address where published (15% of jobs), the company website, and the contact's e-mail address(es) from Naukrigulf's job data and the job text — 26.8% of 600 recent UAE/Saudi/Qatar jobs had at least one (measured 2026-10-20), e.g. `hr@greenarcslimousine.com`. Phone numbers appear only when the employer gave one.

#### Can I scrape all jobs from one company?

Yes — put the company name, its Naukrigulf company page or its company id into `companies`. See [recipe 9](#9-a-companys-jobs).

#### How do I find jobs open to my nationality?

Export the country you target and filter the `nationality` column (e.g. "Any Nationality", "Indian", "Filipino", "Any Arab National"). It is the employer's stated requirement.

#### Can I get only jobs from direct employers, not agencies?

Yes: `"employerType": "company"`. Use `"consultant"` for recruitment-agency jobs only. Every row also carries `employerType`.

#### Can I scrape fresher or entry-level jobs?

Yes: `experienceLevels: ["0"]` (0–1 year), or the functional area *Fresh Graduates / Management Trainee / Intern* (id `7`).

#### Does it return remote jobs?

Jobs posted directly on Naukrigulf carry `workplaceType` (`On-site`, `Remote` or `Hybrid`) — 98% of the newest 12,000 jobs on 2026-10-18; older listings imported from other sources usually do not. Filter the dataset on it, or see [recipe 15](#15-remote-jobs).

#### What does "Easy Apply" mean?

Naukrigulf's one-click application. `easyApply: true` marks those jobs; `easyApplyOnly: true` keeps only them.

#### How are duplicates handled?

Every job is saved once per run, keyed by Naukrigulf's job id, even when several of your searches find it. Duplicates are never charged.

#### Can I monitor new jobs every day?

Yes — create a schedule with `postedWithin: "1"` (or `3` for a safety margin) and de-duplicate on `jobId` across runs.

#### Why does my keyword return jobs with other titles?

Naukrigulf's search is semantic: it matches related titles, skills and industries. With the default relevance order the closest matches come first; filter the `title` column if you need exact titles.

#### Can I paste a search page from naukrigulf.com?

Yes — put it in `startUrls`. Its keyword, location and filters (industry, country, city, freshness, experience, salary band, employer type) are applied. Company pages and job pages work too.

#### What happens if Naukrigulf is down or blocks the run?

The Actor retries, moves stalled or refused requests to a new route automatically, and if Naukrigulf cannot be reached at all it **fails** with the reason — it never reports an empty dataset as a successful search.

#### Does it scrape the Arabic version of the site?

It reads Naukrigulf's English data. Jobs written in Arabic come through in Arabic (title, description), exactly as posted.

#### How many jobs does Naukrigulf have?

On 2026-10-18 the board listed about 40,427 open jobs; 46% of them in United Arab Emirates, 17% of them in Saudi Arabia, 11% of them in Egypt.

#### Can I use the data in Google Sheets, Airtable or my CRM?

Yes — see [Integrations](#integrations).

#### Can an AI agent use this Actor?

Yes, through the Apify MCP server or the API; rows are structured and typed, ideal for tools and RAG.

#### Why did my run stop before Max results?

Either Naukrigulf had no more matching jobs (status: "every matching job read") or the run reached its maximum cost per run (status says so and shows how many results the limit covers).

#### I need a field or a filter that is missing. Can you add it?

Yes — open an issue on the Actor's **Issues** tab and describe what you need.

***

### Glossary

- **Job id (`jobId`)** — Naukrigulf's numeric id of a job; unique and stable, used for de-duplication.
- **Relevance order** — Naukrigulf's ranking of jobs by how well they match the keyword.
- **Newest first** — Naukrigulf's date order (posting or refresh date).
- **Industry** — the hiring company's sector in Naukrigulf's taxonomy (69 values).
- **Functional area** — the job function in Naukrigulf's taxonomy (59 values).
- **Experience band** — Naukrigulf's experience filter ranges (0–1, 2–5, 6–10, 11–15, 16–20, 20+ years).
- **Consultant** — a recruitment agency posting jobs on behalf of a client; **Company** — the employer posting directly.
- **Confidential company** — an employer that hides its name on the job.
- **Easy Apply** — one-click application on Naukrigulf.
- **Apply on company site** — applications go to the employer's own careers page (`applyUrl`).
- **Emiratisation / Saudisation / Qatarisation** — national workforce programmes; visible in the `nationality` requirement of jobs reserved for nationals.
- **GCC** — Gulf Cooperation Council: UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain.
- **Maximum cost per run** — the spending limit of an Apify run; the Actor stops cleanly at it.
- **SUMMARY** — the run's key-value record with totals, outcome and stop reason.

***

### Legal and data protection

This Actor reads publicly available job advertisements — the same information any visitor sees on naukrigulf.com without logging in. Job postings are business information published to be seen; the Actor does not collect candidate data, does not log in and does not bypass access controls.

Some rows contain **business contact details of the hiring team** (a contact name, role, office address and e-mail address) as the employer supplied them with the job advertisement. If you store or use them, you are the data controller and must comply with the laws that apply to you — for example the **UAE Personal Data Protection Law** (Federal Decree-Law No. 45 of 2021), the **Saudi Personal Data Protection Law**, Qatar's and Bahrain's data-protection laws and, where EU residents are concerned, the **GDPR**: have a legitimate purpose, keep only what you need, honour objections and deletion requests, and do not use the data for unsolicited marketing where that is not allowed. E-mail addresses that Naukrigulf hides on the job page are never exported.

You are responsible for using the data in line with Naukrigulf's terms, applicable laws and your own policies. If in doubt, consult a lawyer.

**Legal and trademark disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Naukrigulf.com, Info Edge (India) Ltd. or any of their subsidiaries. All trademarks are the property of their respective owners.

***

### Changelog

- **1.0 (2026-10-18)** — First release. Naukrigulf search interface with 50 jobs per request and full descriptions in every row; relevance order for keyword searches with a complete date-ordered read for exports; automatic splitting past Naukrigulf's 45,000-results-per-search limit; job-detail records (salary with USD conversion, industry, functional area, employment type, workplace, education, gender and nationality requirements, candidate profile, company profile, public contact block, external apply link); company search by name, page or id; search-page and job-page URLs; filters for posting date, experience (years and bands), industries, functional areas, salary bands, employer type and Easy Apply; de-duplication by job id; clean stop at the run's maximum cost; plain-language outcomes and a SUMMARY record.

***

### Support

Questions, a bug or a feature request? Open an issue on the **Issues** tab — we reply **within 24 hours**. If a run did something unexpected, include the run link so we can see its log and `SUMMARY`.

*Not affiliated with Naukrigulf.com or Info Edge (India) Ltd.*

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/naukrigulf-scraper/changelog.md

# Actor input Schema

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

Keywords, job titles or skills, e.g. "accountant", "civil engineer", "nurse", "sales executive". Each term is one Naukrigulf search. Leave empty (and give no locations) to export every job on Naukrigulf (about 40,000).

## `locations` (type: `array`):

Optional. City or country as you would type it on Naukrigulf: "Dubai", "Abu Dhabi", "Riyadh", "Doha", "Saudi Arabia", "UAE". Every search term is combined with every location. Empty = all locations.

## `companies` (type: `array`):

Optional. Get the open jobs of specific employers: a company name as shown on Naukrigulf ("Al Futtaim", "NMC"), its Naukrigulf company page URL, or its Naukrigulf company id. Each company is its own search (combined with the search terms and locations).

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

Optional. Keep only jobs located in these countries (Naukrigulf's own country filter — exact, unlike free-text locations). Works with or without search terms: countries alone = every job in those countries.

## `postedWithin` (type: `string`):

Only jobs posted or refreshed in this window (Naukrigulf's freshness filter).

## `experienceYears` (type: `integer`):

Optional. Only jobs whose required experience range includes this many years (like the experience box on Naukrigulf). Empty = any.

## `experienceLevels` (type: `array`):

Optional. Naukrigulf's experience filter bands. A job matches a band when its required experience range overlaps it.

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

Optional. Naukrigulf industry of the hiring company. Empty = all.

## `functionalAreas` (type: `array`):

Optional. Naukrigulf functional area (job function). Empty = all.

## `salaryRanges` (type: `array`):

Optional. Naukrigulf's salary filter, monthly salary in US dollars. It also matches jobs whose employer entered a salary but chose not to show it — those rows come without a salary amount.

## `employerType` (type: `string`):

Jobs posted by the hiring company itself or by recruitment consultants.

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

Only jobs that can be applied to on Naukrigulf in one click.

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

Optional. Paste Naukrigulf pages: search results with their filters (https://www.naukrigulf.com/accountant-jobs-in-dubai?industryType=55\&freshness=7), company pages (…-careers-cid-264078 or …-jobs-cid-54690) or single job pages (…-jid-181026000057). If you give only URLs, only the URLs are scraped.

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

Relevance (Naukrigulf's default) puts the closest matches first — recommended, because Naukrigulf's search is semantic and also returns related titles further down. Newest first follows Naukrigulf's date order. Searches without a keyword are always read newest-first. Either way, asking for every result returns the same complete set.

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

Stop after this many unique jobs across all searches. 0 = no limit (every matching job; the whole board is about 40,000).

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

Reads each job's detail record: salary (amount, currency, USD), industry, functional area, employment type (full-time / contract / part-time), workplace (on-site / remote / hybrid), education, gender and nationality requirement, desired-candidate profile, company profile, the employer's public contact name / address / website and the external apply link. Turn off for the fastest export (search data incl. full description only).

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

Used only as a fallback. The scraper talks to Naukrigulf over a direct connection first (no proxy cost); if that is refused it switches to Apify datacenter proxies and then to this proxy.

## Actor input object example

```json
{
  "searchTerms": [
    "accountant"
  ],
  "locations": [
    "Dubai"
  ],
  "companies": [],
  "countries": [],
  "postedWithin": "any",
  "experienceLevels": [],
  "industries": [],
  "functionalAreas": [],
  "salaryRanges": [],
  "employerType": "any",
  "easyApplyOnly": false,
  "startUrls": [],
  "sortBy": "relevance",
  "maxItems": 50,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All jobs collected in this run.

# 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"
    ],
    "locations": [
        "Dubai"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/naukrigulf-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"],
    "locations": ["Dubai"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/naukrigulf-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"
  ],
  "locations": [
    "Dubai"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/naukrigulf-scraper --silent --output-dataset

```

## MCP server setup

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