# Naukrigulf Jobs Scraper - Gulf Jobs, Salaries & Details (`dami_studio/naukrigulf-jobs-scraper`) Actor

Search Naukrigulf by job title or skill, country, city, experience and posting date. Each job comes with company, place, experience, skills and summary, plus the full description, monthly salary when shown, industry and requirements. A job only comes back if it has every word you searched for.

- **URL**: https://apify.com/dami\_studio/naukrigulf-jobs-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 job returneds

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/actors/running/actors-in-store.md#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 Jobs Scraper

Search Naukrigulf the way you would on the site, by job title or skill, and get the jobs back as rows: title, company, city and country, the experience the employer asks for, skills, a short summary and the posting date. Leave details on and each row also carries the full description, the monthly salary when the employer shows it, industry, job function, employment type, work mode and what the employer wants from a candidate.

The filters on Naukrigulf's own search page are all here: industry, job function, monthly salary, experience, company or recruitment consultant, the nationality and gender the employer asks for, Easy Apply and posting date. Work mode is here too, although the site's search can't filter on it.

It covers the whole site: the UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain, and Naukrigulf's jobs in Egypt, Lebanon, Jordan, Iraq and North Africa.

### Read this first

A job only comes back when every word you searched for is in it: in the title, the skills, the summary, the company name or the place. Naukrigulf itself is looser. When it can't match a search it fills the page with whatever is close, and a made-up search still returns hundreds of jobs. Those looser matches are left out, and you don't pay for them.

That cuts both ways. "python developer" won't bring back a job titled "Senior Python Engineer" unless the word developer shows up somewhere in it. If you want every Python job, search for python on its own. "QA engineer" misses "Quality Assurance Engineer", so add "quality assurance engineer" as a second search if you want both.

Word forms count as the same word: accountant finds "Accounting", nurse finds "Nursing". Short words such as HR, QA and IT, and words with symbols such as C++ and .NET, have to match as written.

### What it doesn't do

- **Some industries and job functions aren't in the lists.** For 23 of Naukrigulf's industries and 21 of its job functions, the site's own filter also brings back jobs from another one. On 13 September 2026, picking Accounting returned 1,596 Banking and Finance jobs alongside 502 accounting ones, and Software Development came with 2,886 IT Software jobs. You would be paying for the wrong jobs, so those choices are left out. Search words cover them: accountant, software developer.
- **No recruiter names, phone numbers or email addresses.** Some Naukrigulf jobs show a contact block. This leaves it out.
- **English searches only.** The jobs are written in English, and Naukrigulf's own Arabic search swaps Arabic words for English ones, so an Arabic search is turned away with a note rather than quietly returning nothing.
- **Nothing older than about 60 days.** That is as far back as Naukrigulf keeps jobs.
- **Salary only when the employer shows it.** A hidden salary comes back empty, with `salaryHidden` set to true.
- It doesn't apply to jobs, sign in, or see anything that needs a Naukrigulf account.

### Input

```json
{
  "keywords": ["accountant", "civil engineer"],
  "country": "AE",
  "city": "Dubai",
  "industries": ["10", "41"],
  "salaryBands": ["4", "5"],
  "employerType": "1",
  "postedWithinDays": "7",
  "maxResults": 200,
  "includeDetails": true
}
```

In the JSON, industries, job functions and bands take Naukrigulf's own ids. The Input tab shows their names.

- **Search words** (`keywords`). One search per line, up to 20 in a run. Leave it empty and use the filters to get the newest jobs that fit them.
- **Country** (`country`). A two-letter code: AE, SA, QA, KW, OM, BH, EG, LB, JO, IQ, MA, DZ, TN or LY. Leave it on Anywhere for the whole site.
- **City** (`city`). In English, the way Naukrigulf writes it: Dubai, Abu Dhabi, Sharjah, Riyadh, Jeddah, Doha, Muscat, Manama, Cairo, Amman. Only jobs in that city come back.
- **Industry** (`industries`) and **Job function** (`functionalAreas`). Naukrigulf's own lists, less the ones it mixes up (see above). Pick one or more and a job in any of them comes back. If Naukrigulf ever starts mixing another industry into one that is offered, that search stops before anything is charged and the status message names what came back with it.
- **Years of experience** (`experienceYears`). Jobs whose experience range includes this number: 3 keeps a 2-5 years job and drops a 6-10 years one.
- **Experience band** (`experienceBands`). Naukrigulf's own experience filter. A job counts in every band its range reaches, so a 4-8 years job sits in both 2-5 and 6-10.
- **Monthly salary** (`salaryBands`). Naukrigulf's bands, in US dollars a month, whatever currency the job pays in. A job whose range reaches into a band you pick comes back. Be aware that Naukrigulf also files a salary the employer hid: of the first 30 jobs it gave for $2,001-$3,000 in the UAE on 13 September 2026, 17 had the salary hidden. Those rows come back with the salary fields empty and `salaryHidden` set to true. Not mentioned is for jobs with no salary on record at all.
- **Posted by** (`employerType`). 1 for the hiring company itself, 2 for a recruitment consultant. With details on, the job's own page gets the last word, and a job it files the other way is left out, uncharged. Naukrigulf's search and its job pages disagreed on 5 of the 17 jobs in one search on 13 September 2026.
- **Work mode** (`workMode`). On-site or Remote. Naukrigulf's search has no such filter, so each job's own page is opened to check, and the details come with it. About a quarter of the jobs checked while this was built didn't state a work mode at all, and those are left out.
- **Nationality asked for** (`nationalities`). Naukrigulf's groups: GCC nationals, Arab nationals, Anglophones, Europeans and CIS, Indians, Filipinos and other nationalities, plus Any nationality for jobs open to everyone.
- **Gender asked for** (`genders`). Male, Female, Any (the employer says either is fine) or Not mentioned.
- **Easy Apply only** (`easyApplyOnly`). Jobs you apply for on Naukrigulf itself.
- **Posted within** (`postedWithinDays`). 1, 3, 7, 15 or 30 days.
- **Maximum jobs** (`maxResults`). 100 unless you change it, up to 50,000 in a run, counted across all your searches.
- **Full job details** (`includeDetails`). On by default. Off gives you the search-result fields only, which is several times faster.

An empty run, with no search and no filter, returns one sample job from the top of Naukrigulf's list, marked `"_sample": true`. It isn't charged.

### Output

One row per job. A job that comes up more than once, in two of your searches or twice in one search's results, comes back once, under the search that found it first.

| Field | Example | Notes |
|---|---|---|
| `title` | Senior Python Developer, AI and Machine Learning | |
| `company` | CYBER CREW TECHNOLOGY L.L.C | |
| `location` | Dubai - United Arab Emirates (UAE) | as the site writes it |
| `cities`, `country` | \["Dubai"], United Arab Emirates (UAE) | split out of `location` |
| `experienceMin`, `experienceMax` | 6, 12 | years |
| `skills` | \["Python", "AI/ML", "SQL"] | the employer's keywords |
| `summary` | Lead the design and deployment of AI and machine learning models... | Naukrigulf's short summary of the job |
| `postedAt` | 2026-08-24T04:00:00.000Z | the posting date Naukrigulf shows |
| `vacancies` | 1 | |
| `url` | https://www.naukrigulf.com/senior-python-developer-...-jid-240826001175 | the job on Naukrigulf |
| `jobId` | 240826001175 | |
| `description` | We are looking for a senior Python developer with real depth in data science... | with details |
| `salaryMin`, `salaryMax`, `salaryCurrency` | 8000, 12000, AED | monthly, with details |
| `salaryText` | AED 8,000 - 12,000 | as the site shows it |
| `salaryHidden` | false | true when the employer hid the salary |
| `industry`, `jobFunction` | IT - Software Services, Software Development / Application Development (IT Software) | with details |
| `employmentType`, `workMode` | Full-time, On-site | with details |
| `education`, `nationality`, `gender` | Bachelor of Technology/Engineering(Computers)..., Any Nationality, Any | what the employer asks for, with details |
| `candidateProfile`, `companyProfile` | Strong Python across data analysis, machine learning... | with details |
| `recruitmentAgency` | false | true when a recruitment agency posted the job, with details |
| `featuredEmployer`, `topEmployer`, `sponsored` | false | Naukrigulf's own flags |
| `detailsIncluded` | true | false when details were switched off |
| `searchKeyword`, `searchCountry`, `searchCity` | python developer | which of your searches found the job |

A job's `industry` is Naukrigulf's finer label for it, so a job found under the IT industry reads "IT - Software Services".

The run also writes `RUN_REPORT` to the key-value store. For each search it lists how many jobs Naukrigulf claimed, how many came back, how many looser matches and jobs outside your filters were left out, and why the search stopped.

### What you pay

You pay for each job row you get. You don't pay for the looser matches described above, for jobs outside the country, city, work mode or other filters you picked, for a job a second search found again, or for a job whose full page didn't load when you asked for details (it's left out and the status message says how many). If you set a maximum charge for the run, it stops when that is reached, and every row you get has been paid for. The price is on the Pricing tab.

### Limits

- 20 searches and 50,000 jobs in one run.
- Naukrigulf shows at most 45,000 results for a single search. Split a bigger search by country or city.
- Naukrigulf mixes its looser matches in with the close ones, so a page with nothing useful on it doesn't mean the end. A search only stops reading after ten pages in a row, 300 jobs, with nothing that has your words in it. With a work mode set, a job in another work mode counts as nothing useful too.
- If a page of results still doesn't load after a few tries, that search stops there and the status message says so.

### Questions

**Why did I get fewer jobs than the site says?** The site's count includes its looser matches. `RUN_REPORT` shows, for each search, the site's count next to what came back and what was left out.

**Can I get only jobs posted directly by employers?** Set Posted by to Companies.

**Why is a job's date older than when I saw it on the site?** `postedAt` is the date Naukrigulf keeps for the job. If the site shows "today" for a job it has just refreshed, the two can differ.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills, one per line, up to 20. Each line is its own search, and a job only comes back when it has every word of the line in its title, skills, summary, company or place. Leave this empty and use the filters below to get the newest jobs that fit them.

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

Only jobs in this country.

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

Only jobs in this city, written the way Naukrigulf writes it: Dubai, Abu Dhabi, Sharjah, Riyadh, Jeddah, Doha, Muscat, Manama, Cairo, Amman. Leave it empty for the whole country.

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

Only jobs in these industries, as Naukrigulf files them. A job in any of the ones you pick comes back. Some of Naukrigulf's newer industries, Accounting and Consulting among them, aren't in the list: its own filter for those also brings back jobs from another industry.

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

Only jobs in these job functions, as Naukrigulf files them. A job in any of the ones you pick comes back. The narrower functions Naukrigulf added later, such as Software Development or Drilling, aren't in the list: its own filter for those also brings back the broader function's jobs.

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

Only jobs whose experience range includes this many years: 3 keeps a 2-5 years job and drops a 6-10 years one. Leave it empty for any.

## `experienceBands` (type: `array`):

Naukrigulf's own experience filter: jobs whose experience range reaches into any band you pick. A 4-8 years job counts as both 2-5 and 6-10.

## `salaryBands` (type: `array`):

Naukrigulf's own salary filter, in US dollars a month whatever currency the job pays in. A job whose salary range reaches into any band you pick comes back. Naukrigulf also files a salary the employer hid, so a band can bring back jobs whose salary you can't see; those rows say salaryHidden. Not mentioned is for jobs with no salary on record.

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

Jobs posted by the hiring company itself, or by a recruitment consultant on its behalf.

## `workMode` (type: `string`):

On-site or remote, as the job itself states it. Naukrigulf's search has no such filter, so each job's own page is opened to check, which switches details on. A job that doesn't state its work mode is left out.

## `nationalities` (type: `array`):

Jobs whose employer asks for any of these nationality groups, as Naukrigulf groups them. Any nationality is the group of jobs open to everyone.

## `genders` (type: `array`):

Jobs whose employer asks for any of these. Any means the employer says either is fine; Not mentioned means the job doesn't say.

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

Only jobs you can apply for on Naukrigulf itself.

## `postedWithinDays` (type: `string`):

Only jobs posted this recently. Naukrigulf keeps jobs for about 60 days, so any time means the last 60 days or so.

## `maxResults` (type: `integer`):

The most jobs returned in one run, across all your searches. Each job returned is charged.

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

Adds the full description, the monthly salary when the employer shows it, industry, job function, employment type, work mode and the candidate requirements. Switch it off for the search-result fields only, which is several times faster.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "country": "ANY",
  "employerType": "ANY",
  "workMode": "ANY",
  "easyApplyOnly": false,
  "postedWithinDays": "ANY",
  "maxResults": 100,
  "includeDetails": true
}
```

# Actor output Schema

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

One row per job: title, company, city and country, experience range, skills, summary, posting date and link, and with details on the full description, monthly salary when shown, industry, job function and requirements. A run with no search returns one sample job, marked \_sample, not charged.

## `report` (type: `string`):

For each search: how many jobs the site claimed, how many came back, how many looser matches were left out and why the search stopped.

# 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 = {
    "keywords": [
        "accountant"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 = { "keywords": ["accountant"] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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 '{
  "keywords": [
    "accountant"
  ]
}' |
apify call dami_studio/naukrigulf-jobs-scraper --silent --output-dataset

```

## MCP server setup

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