# NaukriGulf Jobs Scraper $0.8💰 (`corvuslab/naukrigulf-jobs-scraper`) Actor

From 💰$0.8/1K. Scrape job listings from naukrigulf.com across the Gulf — UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain — with salaries, nationality and contact data, filters and incremental monitoring. For recruitment analysis, market research, and HR analytics and much more.

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

## Pricing

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 & Monitor — Gulf Job Board

Scrape job listings from **naukrigulf.com**, the Gulf region's largest job board, covering the
**UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain**. Every record comes back as clean,
structured JSON: salary ranges with currency, nationality and gender requirements, education,
recruiter contact details, full job descriptions and company metadata.

Built for recurring use — run it once for a dataset, or point it at a search and let
**incremental mode** send you only what changed since yesterday.

---

### ✨ Key features

- **⚡ Fast and reliable** — built for large searches and repeat runs. Results stream straight
  into your dataset as they are found, and you pay for results, not for waiting.
- **♻️ Incremental mode** — recurring runs emit only new, updated and reappeared jobs.
  Unchanged jobs are skipped *before* they cost anything, so a quiet day can cost nothing at all.
- **💰 Structured salary** — numeric `salaryMin` / `salaryMax` with `salaryCurrency` (AED, SAR,
  QAR …), plus the display text, so you can sort and filter without parsing strings.
- **🌍 Gulf-specific fields** — `nationality`, `gender`, `education` and `localities`, the
  fields that actually decide who a Gulf posting is aimed at.
- **📧 Contact extraction** — recruiter name, designation and email from the posting, plus
  emails, phone numbers, URLs and social profiles pulled out of the description text.
- **📄 Descriptions always included** — every job carries its full description, whether or not
  detail enrichment is switched on.
- **🎚️ Real filters** — experience, salary band, date posted, industry, nationality and gender
  are applied by the job board itself, so you download only what you asked for.
- **🔗 Paste-mode** — drop naukrigulf.com URLs straight from your browser: search pages, SEO
  listing pages or individual job pages.
- **📦 Compact mode** — trimmed payloads for AI agents and MCP clients.
- **✂️ Description truncation** — cap description length to control LLM prompt costs.
- **🔔 Notifications** — Telegram, Slack, Discord, WhatsApp Cloud API and generic webhooks
  (n8n, Make, Zapier).
- **📤 Export anywhere** — JSON, CSV or Excel download, or stream via the Apify API.

---

### 🎯 Use cases

- **🧲 Recruitment & staffing agencies** — find employers hiring right now and reach the person
  posting the role: recruiter name, designation and email come attached to the record. Filter by
  industry, experience and location to build a qualified call list.
- **📊 Salary & market intelligence** — numeric salary ranges with currency, experience bands,
  nationality and education requirements make Gulf compensation benchmarking possible without
  parsing free text. Track how demand shifts by title, city or industry over time.
- **🛰️ Hiring monitors & alerts** — point incremental mode at a saved search and get a daily
  change feed delivered to Telegram, Slack, Discord, WhatsApp or your own webhook. Ideal for
  watching a competitor, a client account or a single job title.
- **🧱 Job boards & aggregators** — `NEW`, `UPDATED` and `EXPIRED` change types let you upsert
  into your own database instead of re-ingesting the whole board on every sync.
- **🤖 AI agents & LLM pipelines** — compact mode plus description truncation keeps payloads and
  token usage predictable for AI agents and MCP clients.

---

### 🚀 How to use it

1. Open the Actor and put a keyword in **🔑 Search keywords** — for example `accountant`.
2. Optionally set **📍 Location** (`dubai`, `riyadh`, `qatar`, or leave empty for the whole Gulf).
3. Set **🔢 Max results**.
4. Click **Start** and download the dataset when it finishes.

No accounts, keys or proxy setup — enter a keyword and press Start.

---

### 📥 Input

Only one of *query*, *location*, *startUrls* or *jobUrls* is required. Everything else is optional.

| Input | Type | What it does |
|---|---|---|
| 🎯 `mode` | string | `search` (keyword + filters) or `jobUrls` (a fixed list of jobs). |
| 🔑 `query` | string | Job keywords. Comma-separate for several searches in one run. |
| 📍 `location` | string | City or country, e.g. `dubai`, `abu dhabi`, `riyadh`. Empty = all Gulf. |
| 🔢 `maxResults` | integer | How many jobs to fetch. `0` = unlimited. |
| 🔗 `jobUrls` | array | Specific job-page URLs (or bare job IDs) to scrape. |
| 📋 `startUrls` | array | naukrigulf.com search or listing URLs, pasted from the browser. |
| 🧑‍💼 `experienceLevel` | array | Experience band: `0-1`, `2-5`, `6-10`, `11-15`, `16-20`, `20+`. |
| 📈 `experienceYears` | integer | Only jobs accepting this many years of experience. |
| 💰 `salaryBand` | array | Monthly salary band in USD, e.g. `1000-2000`. |
| 🗓️ `datePosted` | array | Posted within the last `1`, `3`, `7`, `15`, `30` or `60` days. |
| 🏭 `industryIds` | array | Industry filter (IT, Construction, Hospitality, Medical …). |
| 🌍 `nationality` | array | Nationality preference: `gcc`, `arab`, `indian`, `filipino`, `european`, `anglophone`, `any`. |
| ⚧ `gender` | array | Gender stated in the posting. |
| ⚡ `easyApplyOnly` | boolean | Only jobs you can apply to on-site. |
| ↕️ `sortBy` | string | `relevance` or `date` (newest first). |
| 🔬 `includeDetails` | boolean | Fetch detail pages for salary, nationality, contact data. Default `true`. |
| 📝 `descriptionFormat` | string | `all`, `text`, `html` or `markdown`. |
| ✂️ `descriptionMaxLength` | integer | Truncate descriptions to N characters. `0` = no limit. |
| 📦 `compact` | boolean | Core fields only. |
| 🧹 `excludeEmptyFields` | boolean | Drop null and empty fields from output. |
| 🚀 `detailConcurrency` | integer | Parallel detail requests (1–20, default 8). |
| ♻️ `incrementalMode` | boolean | Emit only what changed since the previous run. |
| 🗝️ `stateKey` | string | Names the tracked search. Auto-derived when empty. |
| 🔁 `emitUnchanged` | boolean | Also emit unchanged jobs. |
| 🗑️ `emitExpired` | boolean | Emit jobs that have disappeared since last run. |
| 🚫 `skipReposts` | boolean | Drop reposts of previously seen jobs. |
| 🔔 notifications | various | `telegramToken` + `telegramChatId`, `slackWebhookUrl`, `discordWebhookUrl`, WhatsApp Cloud API fields, `webhookUrl` + `webhookHeaders`. |
| 🌐 `proxyConfiguration` | object | Optional. Not needed for normal use. |

---

### 📤 Output

One dataset item per job. Sample record (trimmed):

```json
{
  "jobId": "260726001535",
  "title": "Office Assistant",
  "summary": "Manage daily office operations, provide customer service, maintain records...",
  "company": "Confidential Company",
  "companyId": "311727",
  "companyType": "Corporate",
  "location": "Dubai , Abu Dhabi , Sharjah - United Arab Emirates (UAE)",
  "jobCountry": "United Arab Emirates (UAE)",
  "localities": ["Dubai", "Abu Dhabi", "Sharjah"],
  "salary": "AED 3,500 - 4,000",
  "salaryMin": 3500,
  "salaryMax": 4000,
  "salaryCurrency": "AED",
  "isSalaryHidden": false,
  "experienceMin": 0,
  "experienceMax": 2,
  "experienceText": "0-2 Years",
  "education": "Secondary School, Any Graduation",
  "nationality": "Any Nationality",
  "gender": "Any",
  "industry": "Accounting & Auditing",
  "functionalArea": "Administration",
  "vacancies": 2,
  "keywords": ["Receptionist", "Customer Service", "Office Management"],
  "description": "Manage and organize daily office operations...",
  "descriptionHtml": "<ul><li>Manage and organize daily office operations...</li></ul>",
  "descriptionMarkdown": "* Manage and organize daily office operations...",
  "desiredCandidate": "High school diploma or equivalent...",
  "contactName": "Vihar",
  "contactDesignation": "Owner",
  "contactEmail": "info@example.com",
  "extractedEmails": ["info@example.com"],
  "extractedPhones": ["+971501234567"],
  "socialProfiles": { "linkedin": "https://www.linkedin.com/company/example" },
  "isEasyApply": true,
  "postedAt": "2026-07-26T19:14:03+00:00",
  "url": "https://www.naukrigulf.com/office-assistant-jobs-in-dubai-uae-...-jid-260726001535",
  "source": "naukrigulf.com",
  "scrapedAt": "2026-07-26T19:39:00+00:00",
  "detailFetched": true
}
````

**Incremental fields** (added when `incrementalMode` is on): `changeType`
(`NEW` / `UPDATED` / `UNCHANGED` / `EXPIRED`), `contentHash`, `isRepost`, `repostOfId`,
`repostDetectedAt`.

***

### ♻️ Incremental monitoring

Turn on `incrementalMode` and the Actor remembers what it saw last time. On the next run it
compares each job against that state and:

- emits `NEW` and `UPDATED` jobs,
- **skips unchanged jobs before they cost you anything**,
- optionally reports `EXPIRED` jobs that have come off the board.

Because unchanged jobs are identified and set aside before they are ever processed, a day with
no movement in your search can produce **zero billable results**.

Use `maxResults` to set how many jobs of the search to *examine* each run. Point it at your
search once a day and you get a clean change feed instead of the same 200 rows over and over.

***

### 💵 What you pay for

Pay-per-event: a small fee per run, plus a fee per job delivered to your dataset. **Current
prices are shown on this Actor's pricing panel** — there is no separate plan or subscription,
and no charge for proxy, compute or storage.

You are billed for **records delivered**, not work done. That means:

- jobs suppressed by incremental mode are **never billed**,
- filters applied by the job board reduce what you download *and* what you pay,
- a run that finds nothing new bills only the run fee.

#### Incremental mode, in billable records

Watching a 100-job search once a day, where *churn* is the share of the search that is new or
changed since yesterday:

| Daily churn | Billed per run, full re-scrape | Billed per run, incremental | Fewer billed records |
|---|---|---|---|
| 5 % | 100 | 5 | **95 %** |
| 15 % | 100 | 15 | **85 %** |
| 30 % | 100 | 30 | **70 %** |

The first run has nothing to compare against, so it bills in full and seeds the state; every run
after that bills only the delta. Over a 30-day month at 5 % churn that is **245 billable records
instead of 3,000** — about 92 % fewer.

***

### ❓ FAQ

**Do I need a proxy?** No — it runs fine out of the box. Apify Proxy is available under
**⚙️ Advanced** if your setup requires it.

**Can I get jobs from the whole Gulf at once?** Yes — leave `location` empty. Searching with
no keyword and no location returns the full board (tens of thousands of jobs).

**Are descriptions included without detail enrichment?** Yes. Turning `includeDetails` off
still gives you the full description; you lose salary, nationality, education and contact
fields, and the run gets faster.

**Why is `salary` sometimes null?** Many Gulf employers hide the salary. When they do,
`isSalaryHidden` is `true` and the salary fields are null.

**How do I scrape one specific job?** Put its URL in `jobUrls`, or paste it into `startUrls`.

**Can I connect this to Slack / Sheets / n8n?** Yes — use the built-in notification channels,
or Apify's integrations and webhooks.

**Is scraping this legal?** The Actor collects only publicly visible job postings. You are
responsible for how you use the data, including GDPR-style obligations when it contains
personal contact details.

***

### 🔌 Integration

Run it from the Apify Console, on a schedule, via the REST API, or from the JavaScript and
Python clients. It also works as an MCP tool for AI agents — `compact` mode plus
`descriptionMaxLength` keeps token usage small.

# Actor input Schema

## `mode` (type: `string`):

How jobs are discovered: run a keyword/location search, or scrape a fixed list of job URLs.

## `query` (type: `string`):

Job keywords, e.g. "accountant" or "software developer". Separate multiple searches with commas — each runs as its own search and results are merged and de-duplicated.

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

City or country filter, e.g. "dubai", "abu dhabi", "riyadh", "qatar", "uae". Leave empty to search the entire Gulf region.

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

Maximum number of job records to return. Set 0 for unlimited (bounded only by how many jobs the search has).

## `jobUrls` (type: `array`):

Scrape specific jobs. Paste full naukrigulf.com job-page URLs (or bare job IDs) straight from your browser.

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

Paste naukrigulf.com search or listing URLs (e.g. https://www.naukrigulf.com/accountant-jobs-in-dubai). Job-page URLs work here too.

## `ignoreUrlFailures` (type: `boolean`):

Skip URLs that cannot be interpreted instead of failing the whole run.

## `experienceLevel` (type: `array`):

Filter by years-of-experience band.

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

Keep only jobs that accept a candidate with this many years of experience.

## `salaryBand` (type: `array`):

Filter by the job's monthly salary band, in US dollars.

## `datePosted` (type: `array`):

Only jobs posted within this many days.

## `industryIds` (type: `array`):

Filter by the employer's industry.

## `nationality` (type: `array`):

Filter by the nationality the employer is hiring for.

## `gender` (type: `array`):

Filter by the gender stated in the posting (many Gulf postings specify one).

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

Only return jobs you can apply to directly on the site (no external application form).

## `includeSponsored` (type: `boolean`):

Include promoted/sponsored postings in the results.

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

Result ordering. "Newest first" is best for monitoring; relevance is best for broad discovery.

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

Fetch each job's detail page to add salary, nationality, education, gender, industry, contact details and localities. Turn off for the fastest, cheapest runs.

## `descriptionFormat` (type: `string`):

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters — handy for keeping LLM prompt costs down. 0 means no truncation.

## `compact` (type: `boolean`):

Emit only the core fields (id, title, company, location, salary, posted date, URL). Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `detailConcurrency` (type: `integer`):

How many job details to fetch in parallel. Higher is faster; lower is gentler on the site.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit jobs that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for jobs that were present last run but have since disappeared.

## `skipReposts` (type: `boolean`):

Drop jobs that look like a repost of a previously seen posting (same title and company).

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `whatsappPhoneNumberId` (type: `string`):

WhatsApp Business phone number ID from the Meta Cloud API (the ID, not the phone number).

## `whatsappAccessToken` (type: `string`):

Meta Cloud API token with the whatsapp\_business\_messaging scope.

## `whatsappTo` (type: `string`):

Recipient phone number in E.164 format, e.g. +971501234567.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched jobs — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many jobs to include in each notification message.

## `notifyOnlyChanges` (type: `boolean`):

In incremental mode, only notify about NEW, UPDATED or REAPPEARED jobs.

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

Optional. The scraper works without a proxy; enable Apify Proxy if you run at high volume or see the site refusing requests.

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

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "mode": "search",
  "query": "software developer",
  "location": "dubai",
  "maxResults": 25,
  "jobUrls": [
    "https://www.naukrigulf.com/software-developer-jobs-in-dubai-uae-in-example-company-5-to-10-years-n-cd-123456-jid-060726000574"
  ],
  "ignoreUrlFailures": true,
  "easyApplyOnly": false,
  "includeSponsored": true,
  "sortBy": "relevance",
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "detailConcurrency": 8,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

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

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/naukrigulf-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call corvuslab/naukrigulf-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=corvuslab/naukrigulf-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NaukriGulf Jobs Scraper $0.8💰",
        "description": "From 💰$0.8/1K. Scrape job listings from naukrigulf.com across the Gulf — UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain — with salaries, nationality and contact data, filters and incremental monitoring. For recruitment analysis, market research, and HR analytics and much more.",
        "version": "0.1",
        "x-build-id": "hVvYRSZrN5ZdZ0nab"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/corvuslab~naukrigulf-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-corvuslab-naukrigulf-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/corvuslab~naukrigulf-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-corvuslab-naukrigulf-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/corvuslab~naukrigulf-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-corvuslab-naukrigulf-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "🎯 Mode",
                        "enum": [
                            "search",
                            "jobUrls"
                        ],
                        "type": "string",
                        "description": "How jobs are discovered: run a keyword/location search, or scrape a fixed list of job URLs.",
                        "default": "search"
                    },
                    "query": {
                        "title": "🔑 Search keywords",
                        "type": "string",
                        "description": "Job keywords, e.g. \"accountant\" or \"software developer\". Separate multiple searches with commas — each runs as its own search and results are merged and de-duplicated."
                    },
                    "location": {
                        "title": "📍 Location",
                        "type": "string",
                        "description": "City or country filter, e.g. \"dubai\", \"abu dhabi\", \"riyadh\", \"qatar\", \"uae\". Leave empty to search the entire Gulf region."
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of job records to return. Set 0 for unlimited (bounded only by how many jobs the search has).",
                        "default": 25
                    },
                    "jobUrls": {
                        "title": "🔗 Job URLs",
                        "type": "array",
                        "description": "Scrape specific jobs. Paste full naukrigulf.com job-page URLs (or bare job IDs) straight from your browser.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "📋 Start URLs",
                        "type": "array",
                        "description": "Paste naukrigulf.com search or listing URLs (e.g. https://www.naukrigulf.com/accountant-jobs-in-dubai). Job-page URLs work here too.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "ignoreUrlFailures": {
                        "title": "⏭️ Ignore URL failures",
                        "type": "boolean",
                        "description": "Skip URLs that cannot be interpreted instead of failing the whole run.",
                        "default": true
                    },
                    "experienceLevel": {
                        "title": "🧑‍💼 Experience level",
                        "type": "array",
                        "description": "Filter by years-of-experience band.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "0-1",
                                "2-5",
                                "6-10",
                                "11-15",
                                "16-20",
                                "20+"
                            ],
                            "enumTitles": [
                                "0 – 1 year",
                                "2 – 5 years",
                                "6 – 10 years",
                                "11 – 15 years",
                                "16 – 20 years",
                                "Above 20 years"
                            ]
                        }
                    },
                    "experienceYears": {
                        "title": "📈 Minimum years of experience",
                        "minimum": 0,
                        "maximum": 40,
                        "type": "integer",
                        "description": "Keep only jobs that accept a candidate with this many years of experience."
                    },
                    "salaryBand": {
                        "title": "💰 Monthly salary (USD)",
                        "type": "array",
                        "description": "Filter by the job's monthly salary band, in US dollars.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "<500",
                                "500-1000",
                                "1000-2000",
                                "2000-3000",
                                "3000-4000",
                                "4000-5000",
                                "5000-6000",
                                "6000-7000",
                                "7000+"
                            ],
                            "enumTitles": [
                                "Less than $500",
                                "$501 – $1,000",
                                "$1,001 – $2,000",
                                "$2,001 – $3,000",
                                "$3,001 – $4,000",
                                "$4,001 – $5,000",
                                "$5,001 – $6,000",
                                "$6,001 – $7,000",
                                "Above $7,000"
                            ]
                        }
                    },
                    "datePosted": {
                        "title": "🗓️ Date posted",
                        "type": "array",
                        "description": "Only jobs posted within this many days.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "3",
                                "7",
                                "15",
                                "30",
                                "60"
                            ],
                            "enumTitles": [
                                "Last 24 hours",
                                "Last 3 days",
                                "Last 7 days",
                                "Last 15 days",
                                "Last 30 days",
                                "Last 60 days"
                            ]
                        }
                    },
                    "industryIds": {
                        "title": "🏭 Industry",
                        "type": "array",
                        "description": "Filter by the employer's industry.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "25",
                                "10",
                                "20",
                                "30",
                                "59",
                                "7",
                                "15",
                                "61",
                                "42",
                                "36",
                                "12",
                                "41",
                                "23",
                                "6",
                                "13",
                                "43",
                                "2",
                                "39",
                                "53",
                                "11",
                                "37",
                                "55",
                                "63",
                                "31",
                                "16"
                            ],
                            "enumTitles": [
                                "IT",
                                "Construction",
                                "Hospitality",
                                "Medical",
                                "Consulting",
                                "Banking and Finance",
                                "Education",
                                "Engineering",
                                "Recruitment",
                                "Oil and Gas",
                                "FMCG",
                                "Real Estate",
                                "E-commerce",
                                "Automobile",
                                "Logistics",
                                "Retail",
                                "Advertising",
                                "Power Generation",
                                "Catering",
                                "Consumer Durables",
                                "Pharmaceutical",
                                "Accounting",
                                "Facility Management",
                                "Steel Fabrication",
                                "Trading"
                            ]
                        }
                    },
                    "nationality": {
                        "title": "🌍 Nationality preference",
                        "type": "array",
                        "description": "Filter by the nationality the employer is hiring for.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "gcc",
                                "arab",
                                "indian",
                                "filipino",
                                "european",
                                "anglophone",
                                "any"
                            ],
                            "enumTitles": [
                                "GCC nationals",
                                "Arab nationals",
                                "Indians",
                                "Filipinos",
                                "Europeans / CIS",
                                "Anglophones",
                                "Any nationality"
                            ]
                        }
                    },
                    "gender": {
                        "title": "⚧ Gender preference",
                        "type": "array",
                        "description": "Filter by the gender stated in the posting (many Gulf postings specify one).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "any",
                                "male",
                                "female",
                                "not_mentioned"
                            ],
                            "enumTitles": [
                                "Any",
                                "Male",
                                "Female",
                                "Not mentioned"
                            ]
                        }
                    },
                    "easyApplyOnly": {
                        "title": "⚡ Easy-apply jobs only",
                        "type": "boolean",
                        "description": "Only return jobs you can apply to directly on the site (no external application form).",
                        "default": false
                    },
                    "includeSponsored": {
                        "title": "📢 Include sponsored jobs",
                        "type": "boolean",
                        "description": "Include promoted/sponsored postings in the results.",
                        "default": true
                    },
                    "sortBy": {
                        "title": "↕️ Sort by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Result ordering. \"Newest first\" is best for monitoring; relevance is best for broad discovery.",
                        "default": "relevance"
                    },
                    "includeDetails": {
                        "title": "🔬 Fetch full job details",
                        "type": "boolean",
                        "description": "Fetch each job's detail page to add salary, nationality, education, gender, industry, contact details and localities. Turn off for the fastest, cheapest runs.",
                        "default": true
                    },
                    "descriptionFormat": {
                        "title": "📝 Description format",
                        "enum": [
                            "all",
                            "text",
                            "html",
                            "markdown"
                        ],
                        "type": "string",
                        "description": "Which representation(s) of the job description to include.",
                        "default": "all"
                    },
                    "descriptionMaxLength": {
                        "title": "✂️ Truncate description",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cut descriptions to this many characters — handy for keeping LLM prompt costs down. 0 means no truncation.",
                        "default": 0
                    },
                    "compact": {
                        "title": "📦 Compact records",
                        "type": "boolean",
                        "description": "Emit only the core fields (id, title, company, location, salary, posted date, URL). Ideal for AI agents and MCP clients.",
                        "default": false
                    },
                    "excludeEmptyFields": {
                        "title": "🧹 Drop empty fields",
                        "type": "boolean",
                        "description": "Remove null, empty-string and empty-array fields from each record.",
                        "default": false
                    },
                    "detailConcurrency": {
                        "title": "🚀 Detail concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many job details to fetch in parallel. Higher is faster; lower is gentler on the site.",
                        "default": 8
                    },
                    "incrementalMode": {
                        "title": "♻️ Incremental mode",
                        "type": "boolean",
                        "description": "Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).",
                        "default": false
                    },
                    "stateKey": {
                        "title": "🗝️ State key",
                        "type": "string",
                        "description": "Stable name for the tracked search. Leave empty to derive one automatically from your search settings."
                    },
                    "emitUnchanged": {
                        "title": "🔁 Include unchanged jobs",
                        "type": "boolean",
                        "description": "Also emit jobs that have not changed since the previous run.",
                        "default": false
                    },
                    "emitExpired": {
                        "title": "🗑️ Include expired jobs",
                        "type": "boolean",
                        "description": "Emit records for jobs that were present last run but have since disappeared.",
                        "default": false
                    },
                    "skipReposts": {
                        "title": "🚫 Skip reposts",
                        "type": "boolean",
                        "description": "Drop jobs that look like a repost of a previously seen posting (same title and company).",
                        "default": false
                    },
                    "telegramToken": {
                        "title": "💬 Telegram bot token",
                        "type": "string",
                        "description": "Bot token from @BotFather."
                    },
                    "telegramChatId": {
                        "title": "🆔 Telegram chat ID",
                        "type": "string",
                        "description": "Chat or channel ID, e.g. \"-100123456789\" or \"@yourchannel\"."
                    },
                    "slackWebhookUrl": {
                        "title": "💼 Slack webhook URL",
                        "type": "string",
                        "description": "Slack incoming-webhook URL."
                    },
                    "discordWebhookUrl": {
                        "title": "🎮 Discord webhook URL",
                        "type": "string",
                        "description": "Discord incoming-webhook URL."
                    },
                    "whatsappPhoneNumberId": {
                        "title": "📱 WhatsApp phone number ID",
                        "type": "string",
                        "description": "WhatsApp Business phone number ID from the Meta Cloud API (the ID, not the phone number)."
                    },
                    "whatsappAccessToken": {
                        "title": "🔐 WhatsApp access token",
                        "type": "string",
                        "description": "Meta Cloud API token with the whatsapp_business_messaging scope."
                    },
                    "whatsappTo": {
                        "title": "📞 WhatsApp recipient",
                        "type": "string",
                        "description": "Recipient phone number in E.164 format, e.g. +971501234567."
                    },
                    "webhookUrl": {
                        "title": "🪝 Webhook URL",
                        "type": "string",
                        "description": "Any HTTPS endpoint. Receives a JSON POST with the matched jobs — works with n8n, Make and Zapier."
                    },
                    "webhookHeaders": {
                        "title": "🧾 Webhook headers",
                        "type": "object",
                        "description": "Extra headers for the webhook request, e.g. {\"Authorization\": \"Bearer xyz\"}."
                    },
                    "notificationLimit": {
                        "title": "🔢 Jobs per notification",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many jobs to include in each notification message.",
                        "default": 5
                    },
                    "notifyOnlyChanges": {
                        "title": "🆕 Notify on changes only",
                        "type": "boolean",
                        "description": "In incremental mode, only notify about NEW, UPDATED or REAPPEARED jobs.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy configuration",
                        "type": "object",
                        "description": "Optional. The scraper works without a proxy; enable Apify Proxy if you run at high volume or see the site refusing requests.",
                        "default": {
                            "useApifyProxy": false
                        }
                    },
                    "maxRequestRetries": {
                        "title": "🔄 Max request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a failed request before giving up on it.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
