# Naukrigulf Jobs Scraper (`automation-lab/naukrigulf-jobs-scraper`) Actor

Search public Naukrigulf jobs and export normalized job, employer, location, experience, date, description, skills, and source records for Gulf recruiting research.

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

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Naukrigulf Jobs Scraper

Extract current **naukrigulf jobs** for Gulf recruiting and labor-market research.
Search by role and location, or supply an existing Naukrigulf search URL, then export
normalized job, employer, experience, location, posting-date, and source records.
Optional detail enrichment adds descriptions, skills, salary metadata, education,
industry, work mode, and public recruiting fields when the employer discloses them.

### What does Naukrigulf Jobs Scraper do?

Naukrigulf Jobs Scraper turns public search results into analysis-ready records.
It can:

- search one or more job keywords;
- filter searches by a Gulf city or country;
- process configured Naukrigulf result URLs;
- paginate through up to 1,000 unique jobs per run;
- enrich each result with its public detail record;
- preserve useful search-card data if one detail request fails;
- deduplicate jobs by Naukrigulf job ID;
- export results as JSON, CSV, Excel, XML, or through the Apify API.

The Actor uses Naukrigulf's public structured web services. It does not require a
Naukrigulf account, applicant profile, employer login, or third-party API key.

### Who is this Naukrigulf jobs scraper for?

#### Recruiting teams

Refresh a list of open roles by specialty and market. Use employer, experience,
skills, and location fields to prioritize sourcing work.

#### Labor-market analysts

Collect comparable snapshots for Dubai, the UAE, Saudi Arabia, Qatar, Kuwait,
Oman, and Bahrain. Store scheduled-run datasets in a warehouse to compare hiring
activity over time.

#### Staffing and sales teams

Identify companies advertising roles in a target discipline. Use the canonical
job URL to verify a listing before outreach.

#### Data teams

Feed normalized job records into dashboards, spreadsheets, databases, or an ATS.
Use `jobId` as the stable source key for downstream deduplication.

### Why use this Actor?

- **Two input routes:** keyword/location searches and existing search URLs.
- **Full details on demand:** choose rich records or faster search-card scans.
- **Typed output:** dates, experience bounds, salary bounds, arrays, and booleans.
- **Safe partial enrichment:** a failed detail lookup does not discard its job card.
- **Bounded pagination:** `maxItems` is respected across all supplied searches.
- **No residential fallback:** the Actor uses the lower-cost Apify datacenter route.
- **Pay per result:** empty searches and duplicate records do not trigger item events.

### What Naukrigulf data can I extract?

| Field | Meaning |
| --- | --- |
| `jobId` | Stable Naukrigulf job identifier |
| `title` | Published job title |
| `companyName`, `companyId` | Hiring employer identity |
| `location` | Published city/country text |
| `experienceMin`, `experienceMax` | Structured experience bounds when available |
| `experienceText` | Experience text from the result card |
| `description`, `descriptionHtml` | Plain-text and source HTML descriptions |
| `desiredCandidateProfile` | Desired-candidate requirements |
| `skills` | Parsed list of skills and keywords |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Disclosed salary metadata |
| `salaryHidden` | Whether the employer hid the salary |
| `vacancies` | Published vacancy count |
| `postedAt` | ISO 8601 posting timestamp |
| `education` | Education requirement |
| `employmentType` | Full-time or other published employment type |
| `workMode` | On-site or other published location mode |
| `industry`, `functionalArea` | Source classification fields |
| `nationality`, `gender` | Published candidate requirements |
| `recruiterName`, `recruiterTitle`, `recruiterEmail` | Public recruiting fields when disclosed |
| `companyProfile`, `companyLogoUrl` | Employer profile and logo |
| `jobUrl` | Canonical public job URL |
| `sourceQuery`, `searchedLocation` | Search provenance |
| `scrapedAt` | Extraction timestamp |

Missing source values are returned as `null` or an empty array. Recruiter email is
returned only when Naukrigulf marks it as visible; hidden contact values are not
exposed.

### How to scrape Naukrigulf jobs

1. Open the Actor in Apify Console.
2. Enter one or more search queries, such as `software engineer`.
3. Enter a location, such as `Dubai`, `UAE`, `Riyadh`, or `Qatar`.
4. Choose how many jobs to save.
5. Keep **Include full job details** enabled for rich records, or disable it for a
   faster recurring scan.
6. Click **Start**.
7. Open the **Jobs** dataset to inspect or export the results.

A useful first input is:

```json
{
  "queries": ["software engineer"],
  "location": "Dubai",
  "maxItems": 20,
  "includeDetails": true
}
```

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `queries` | string array | `['software engineer']` | Titles, skills, or keywords; up to 20 |
| `location` | string | `Dubai` | Optional city or country used for every query |
| `searchUrls` | URL array | none | Existing public Naukrigulf search-result URLs |
| `maxItems` | integer | `100` | Unique jobs saved across all searches; 1–1,000 |
| `includeDetails` | boolean | `true` | Fetch rich public detail data for every job |

Provide at least one non-empty query or one supported search URL. When both routes
are supplied, the Actor processes both and deduplicates overlapping jobs.

### Use an existing Naukrigulf search URL

Pass a result page when a search is already configured:

```json
{
  "searchUrls": [
    { "url": "https://www.naukrigulf.com/software-engineer-jobs-in-dubai" }
  ],
  "maxItems": 50,
  "includeDetails": false
}
```

The Actor extracts `software engineer` and `Dubai` from this URL. Unsupported hosts
and non-search paths fail with a clear input error rather than silently changing
scope.

### Example output

A detail-enriched row resembles this shortened real-output shape:

```json
{
  "jobId": "270726000350",
  "title": "Commercial Drone Pilot & Geospatial Data Analyst",
  "companyName": "BARARI NATURAL RESOURCES LLC",
  "location": "Dubai - United Arab Emirates (UAE)",
  "experienceMin": 3,
  "experienceMax": 5,
  "skills": ["GIS", "Remote Sensing", "Aerial Surveying"],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": "AED",
  "salaryHidden": true,
  "vacancies": 1,
  "postedAt": "2026-07-27T04:00:00.000Z",
  "education": "Bachelor of Technology/Engineering(Aviation)",
  "employmentType": "Full Time",
  "workMode": "On Site",
  "industry": "Defence / Military / Government",
  "functionalArea": "IT Software",
  "jobUrl": "https://www.naukrigulf.com/commercial-drone-pilot-geospatial-data-analyst-jobs-in-dubai-uae-in-barari-natural-resources-llc-3-to-5-years-n-cd-131843-jid-270726000350",
  "sourceQuery": "data analyst",
  "searchedLocation": "Dubai"
}
```

Fields not shown above remain available in the dataset schema.

### Fast scan or full details?

Set `includeDetails` to `true` when descriptions, skills, education, salary,
industry, candidate profile, or recruiting fields matter. This mode makes one
additional bounded request for each accepted job.

Set it to `false` for frequent title/company/location scans. Search cards still
include the stable ID, title, employer, location, experience text, snippet,
posting timestamp, and canonical URL. This mode is faster and cheaper to run.

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

The Actor uses pay-per-event pricing: one small `start` event per run and one
`item` event per unique saved job. Item prices decrease across Apify pricing tiers.
The current price is displayed in the Actor's **Pricing** tab before you start.

At the Free-tier rate of $0.00092 per item plus a $0.00005 start event:

- 20 jobs cost about **$0.01845**;
- 100 jobs cost about **$0.09205**;
- 1,000 jobs cost about **$0.92005**.

These examples describe Actor charges. Actual platform usage can vary with detail
mode, run time, and proxy transfer. No item event is emitted for an empty search,
a duplicate job, or a failed detail request that cannot produce a valid row.

### Schedule recurring Gulf hiring searches

Save a working input as an Apify Task and schedule it daily or weekly. For example:

```json
{
  "queries": ["data engineer", "cyber security"],
  "location": "UAE",
  "maxItems": 100,
  "includeDetails": false
}
```

Each run produces a current snapshot. Compare `jobId` values in your database,
spreadsheet, or automation to identify additions and removals. The Actor does not
itself claim that every listing changed; downstream comparison controls that rule.

### Export Naukrigulf jobs to a spreadsheet

From the run dataset:

1. choose **Export**;
2. select CSV or Excel;
3. select all fields or a saved view;
4. download the file.

For recurring exports, connect the dataset to Google Sheets, Make, Zapier, or a
webhook-driven data pipeline.

### Integrations and workflow ideas

- Append weekly snapshots to BigQuery or PostgreSQL for hiring-trend analysis.
- Send newly observed `jobId` values to an internal recruiting channel.
- Group results by `companyName` to spot employers with multiple active roles.
- Count `skills` across datasets to track role requirements.
- Route canonical `jobUrl` values to a human verification queue.
- Use rich detail mode for research and fast mode for frequent refreshes.

### Run through the Apify API with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/naukrigulf-jobs-scraper').call({
  queries: ['data analyst'],
  location: 'Dubai',
  maxItems: 50,
  includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run through the Apify API with Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/naukrigulf-jobs-scraper").call(run_input={
    "queries": ["data analyst"],
    "location": "Dubai",
    "maxItems": 50,
    "includeDetails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Run through the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~naukrigulf-jobs-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": ["sales manager"],
    "location": "Riyadh",
    "maxItems": 25,
    "includeDetails": true
  }'
```

Fetch the resulting dataset with the `defaultDatasetId` returned by the run API.

### Use Naukrigulf Jobs Scraper with MCP

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/naukrigulf-jobs-scraper"
```

**Claude Desktop:** add this server under `mcpServers` in Claude's configuration.

**Cursor:** open MCP settings and add the same server URL.

**VS Code:** add the server URL through your MCP extension or workspace MCP configuration.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/naukrigulf-jobs-scraper"
    }
  }
}
```

Example prompts:

- “Find 30 data analyst jobs in Dubai on Naukrigulf and summarize required skills.”
- “Export current cyber security jobs in the UAE with employer and experience.”
- “Run a fast scan of this Naukrigulf search URL and group jobs by company.”

### Limits and responsible use

- Results depend on jobs currently exposed by Naukrigulf's public services.
- The Actor supports a maximum of 1,000 saved jobs per run.
- Location matching follows Naukrigulf's own search behavior.
- Some employers omit salary, education, recruiter, or work-mode fields.
- Hidden recruiter email is returned as `null`.
- Detail enrichment adds requests and run time.
- The Actor does not apply to jobs, log in, or access private candidate data.
- Use reasonable schedules and comply with applicable law and source terms.

### Failure and retry behavior

Transient network failures and temporary upstream server errors are retried once.
A failed detail request logs a warning and keeps the valid search card. A failed
search page fails the run so users do not mistake an upstream outage for a real
empty market. Unsupported URLs and malformed limits fail before scraping starts.

### Is it legal to scrape Naukrigulf?

This Actor extracts information exposed on public job pages and public web-service
responses. Scraping law and contractual requirements vary by jurisdiction and use.
You are responsible for your purpose, retention, redistribution, and compliance.
Avoid using job or recruiter data for spam, discrimination, or decisions that
violate privacy and employment law. Review Naukrigulf's current terms and Apify's
responsible scraping guidance before production use.

### FAQ

#### Why did I receive fewer jobs than `maxItems`?

The source may have fewer matches, multiple searches may overlap, or the source may
end pagination early. `maxItems` is a ceiling, not a promise of inventory.

#### Why are detail fields null?

The employer may not have disclosed them, or an individual detail request may have
failed while its search card remained valid. Check the run log for an enrichment
warning.

#### Why did the run fail instead of returning zero rows?

The Actor distinguishes a valid empty result from an unavailable search response.
A network timeout, challenge page, or invalid content type fails visibly to prevent
false monitoring conclusions.

#### Can I search several countries in one run?

Use separate search URLs, or run separate Tasks per country. A single `location`
value is applied consistently to every item in `queries`.

#### Does the Actor monitor changes by itself?

It produces consistent current snapshots. Schedule Tasks and compare stable
`jobId` values in your spreadsheet, database, or automation to define “new” or
“removed” for your workflow.

### Related automation-lab Actors

- [Google Jobs Scraper](https://apify.com/automation-lab/google-jobs-scraper) for broader multi-source job discovery.
- [LinkedIn Jobs Scraper](https://apify.com/automation-lab/linkedin-jobs-scraper) for LinkedIn-specific job research.
- [Greenhouse Jobs Scraper](https://apify.com/automation-lab/greenhouse-jobs-scraper) for employer-hosted Greenhouse boards.

Naukrigulf Jobs Scraper is not affiliated with Naukrigulf or its parent company.
Source fields and availability can change without notice.

# Actor input Schema

## `queries` (type: `array`):

Job titles, skills, or keywords to search. Each query is paginated independently.

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

Optional Gulf country or city applied to every query, such as Dubai, UAE, Riyadh, Qatar, Kuwait, Oman, or Bahrain.

## `searchUrls` (type: `array`):

Optional existing naukrigulf.com result URLs. Their keyword and location are extracted automatically.

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

Maximum number of unique job records saved across all searches.

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

Fetch each job page's public API record for descriptions, skills, education, salary, industry, and disclosed recruiting details. Disable for faster recurring scans.

## Actor input object example

```json
{
  "queries": [
    "software engineer"
  ],
  "location": "Dubai",
  "maxItems": 20,
  "includeDetails": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing the extracted Naukrigulf job records.

# 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 = {
    "queries": [
        "software engineer"
    ],
    "location": "Dubai",
    "maxItems": 20,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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 = {
    "queries": ["software engineer"],
    "location": "Dubai",
    "maxItems": 20,
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/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 '{
  "queries": [
    "software engineer"
  ],
  "location": "Dubai",
  "maxItems": 20,
  "includeDetails": true
}' |
apify call automation-lab/naukrigulf-jobs-scraper --silent --output-dataset

```

## MCP server setup

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