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

Scrape Naukrigulf.com jobs in the UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain and more by keyword, location, filters or URL: full description, skills, experience, salary in local currency and USD, nationality, recruiter contact. Monitor mode. $0.63 per 1,000 jobs.

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

## Pricing

from $0.63 / 1,000 jobs

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Naukrigulf Jobs Scraper do?

**Naukrigulf Jobs Scraper** collects job postings from [Naukrigulf.com](https://www.naukrigulf.com), the Gulf job board of the Naukri group: the UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt, Lebanon, Jordan, Iraq, Morocco, Algeria and the other 25+ countries the site lists (about 41,000 open jobs). One row per job: title, company, cities and country, years of experience, Naukrigulf's summary and highlights, the **full description** (text, HTML and Markdown), skills, vacancies, exact posted time and link. Turn on the **full record** to add the salary (employer's local range, US dollars and Naukrigulf's USD band), industry, functional area, employment type, work mode, education, nationality and gender asked for, the desired candidate profile and the recruiter contact (name, designation, email, city, country, address, website) as Naukrigulf publishes them.

- 🔎 **Search like on naukrigulf.com**: keywords × locations, or paste any Naukrigulf search, job or company link
- 🎯 **Naukrigulf's own filters**: posted within, experience, salary band, industry, functional area, country, city, nationality, gender, posted by company or consultant, easy apply, standard job titles
- 📄 **Full description on every row**, even without the full record
- 💵 **Salary in local currency and USD** (AED, SAR, QAR, KWD, OMR, BHD, USD ...), monthly, plus Naukrigulf's USD band; minimum-salary filter in USD
- 🪪 **Gulf hiring criteria**: nationality and gender asked for, with filters that hide restricted jobs
- 📇 **Recruiter contact** when the posting publishes it, plus emails, phones and links written in the posting
- 🔁 **Monitor mode** for scheduled runs: only jobs you have not received yet, with Slack, Discord, Telegram, WhatsApp or webhook alerts
- 🌐 English or Arabic site
- 🔓 No Naukrigulf account, no cookies, no API key

### What data can you get from Naukrigulf?

| | | |
|---|---|---|
| 💼 Job title, `jobId`, URL | 🏢 Company, company page, logo, company id | 📍 Cities, country, ISO code |
| 🧮 Experience (min / max years) | 🔢 Vacancies | 📅 Posted time (exact) |
| 📝 Summary and highlights | 📄 Full description (text, HTML, Markdown) | 🛠️ Skills / keywords |
| 🧑‍💼 Posted by company or consultant | ⚡ Easy apply, web job, premium, top employer | 🔒 Confidential company |
| 💵 Salary (local, USD, USD band), benefits | 🏭 Industry, functional area | ⏱️ Employment type, work mode |
| 🎓 Education | 🌍 Nationality asked for | 👤 Gender asked for |
| 🧾 Desired candidate profile | 🏢 Company type, profile, website | 📇 Recruiter name, designation, email, city, country, address, website |
| ✉️ Emails, phones and links in the posting | 🔁 New in monitor mode, reposts | 🔢 Search position and total |

### How to scrape Naukrigulf with Naukrigulf Jobs Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) (it comes with monthly free credit).
2. Open **Naukrigulf Jobs Scraper**, type a keyword such as `accountant` and a location such as `Dubai` (or `UAE`, `Riyadh`, `Saudi Arabia` ...). Or paste a link from naukrigulf.com.
3. Pick filters (posted within, experience, salary band, industry, nationality ...) if you need them.
4. Turn on **Include full job record** if you need salaries, industry, education, nationality and recruiter contacts.
5. Set **Max jobs** and click **Start**. Download the jobs as JSON, CSV, Excel or HTML, or read them through the API.

### ⬇️ Input

Every field is optional. An empty form returns 50 jobs from the whole site in Naukrigulf's own order (41,289 jobs on 2026-10-28).

| Parameter | Type | Description |
|---|---|---|
| `keywords` | array | Job titles, skills or company names. Each is searched in every location. A Naukrigulf URL works here too. |
| `locations` | array | Cities or countries as Naukrigulf reads them (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait, Muscat, Manama, Cairo, UAE, Saudi Arabia ...). Empty = every country. |
| `startUrls` | array | Naukrigulf search URLs (their filters are kept), job URLs or bare job ids (read as full rows), company pages, or a link to a text file with one per line. |
| `maxItems` | integer | Jobs for the whole run (default 50, `0` = no limit). |
| `maxItemsPerSearch` | integer | Cap per keyword × location search, URL or company. |
| `includeDetails` | boolean | Read each job's full record (charged as `job-details` instead of `job`). |
| `sortBy` | string | `relevance` or `date` (newest first). |
| `postedWithinDays` | integer | Naukrigulf's freshness filter plus an exact cut on the posted time. |
| `postedAfter`, `postedBefore` | string | Exact date window (`2026-10-01` or `2026-10-01T08:00:00Z`). |
| `experienceYears` | integer | Jobs whose experience range includes this many years. |
| `experienceBands` | array | 0-1, 2-5, 6-10, 11-15, 16-20, 20+ years. |
| `salaryBands` | array | Naukrigulf's monthly USD salary bands. |
| `minSalaryUsd` | integer | Picks the salary bands from this amount up; with the full record on, the exact USD salary is checked too. |
| `industries`, `functionalAreas` | array | Names or ids (e.g. `IT`, `Construction`, `Engineering`, `Accounts / Taxation / Audit / Company Secretary`). |
| `countries`, `cities` | array | Naukrigulf's country and city filters (names or ids). |
| `nationalities`, `genders` | array | Nationality and gender the job asks for. |
| `postedBy` | string | `any`, `company` (direct employers) or `consultant` (recruiters). |
| `easyApplyOnly` | boolean | Only easy-apply jobs. |
| `jobTitles` | array | Naukrigulf's standard job titles. |
| `companyIds` | array | All open jobs of these Naukrigulf company ids. |
| `excludeConfidential`, `companyNames`, `excludeCompanies`, `includeKeywords`, `excludeKeywords` | | Filters applied before the charge. |
| `withSalaryOnly`, `workModes`, `employmentTypes`, `excludeNationalityRestricted`, `excludeGenderRestricted` | | Filters on the full record (need `includeDetails`). |
| `monitorMode`, `monitorStoreName`, `resetMonitor`, `skipReposts` | | Only new jobs across runs; repost detection. |
| `descriptionFormat`, `descriptionMaxLength`, `compact`, `excludeEmptyFields` | | Output shape. |
| `language` | string | `en` (www.naukrigulf.com) or `ar` (arabic.naukrigulf.com). |
| `webhookUrl`, `slackWebhookUrl`, `discordWebhookUrl`, `telegramToken` + `telegramChatId`, WhatsApp fields | | Alerts with the new jobs of each run. |
| `maxConcurrency` | integer | Job records read at once (default 8). |
| `proxyConfiguration` | object | Optional; your own proxy URLs are tried first. |

#### Input JSON

```json
{
  "keywords": ["accountant", "civil engineer"],
  "locations": ["dubai", "riyadh"],
  "postedWithinDays": 7,
  "includeDetails": true,
  "maxItems": 500
}
```

#### Paste a Naukrigulf link to reuse the filters you set on the site

Set the search on naukrigulf.com (keyword, location, freshness, industry, salary ...), copy the address, for example `https://www.naukrigulf.com/accountant-jobs-in-dubai?freshness=7&industryType=55`, and paste it into **Naukrigulf URLs**. Company pages (`...-careers-cid-381120`) return all the company's open jobs; job links return the full record of that job.

### ⬆️ Output

Each job is one row. A real full row from a run on 2026-10-28 (long texts shortened here):

```json
{
  "jobId": "271026000194",
  "title": "Senior Accountant",
  "url": "https://www.naukrigulf.com/senior-accountant-jobs-in-dubai-uae-in-titan-lithium-5-to-10-years-p-cd-317673-jid-271026000194",
  "company": "Titan Lithium",
  "companyId": "317673",
  "companyUrl": "https://www.naukrigulf.com/titan-lithium-careers-cid-317673",
  "postedBy": "company",
  "location": "Dubai , Abu Dhabi - United Arab Emirates (UAE)",
  "city": "Dubai",
  "cities": ["Dubai", "Abu Dhabi"],
  "jobCountry": "United Arab Emirates (UAE)",
  "countryCode": "AE",
  "summary": "Prepare accurate financial statements in compliance with GAAP to ensure transparency and p…",
  "jobHighlights": ["Prepare accurate financial statements in compliance with GAAP", "Lead the month-end close process", "Conduct detailed variance analysis and present recommendations", "Manage accounts payable and receivable processes"],
  "description": "- Prepare accurate financial statements in compliance with GAAP to ensure transparency and…",
  "experienceMin": 5,
  "experienceMax": 10,
  "experienceText": "5-10 years",
  "vacancies": 1,
  "keywords": ["Internal Controls", "Financial Reporting", "Financial Analysis", "Data Integrity", "Senior Financial Accountant", "Senior Tax Accountant", "Corporate Accountant", "Lead Accountant"],
  "postedAt": "2026-10-27T09:47:17.000Z",
  "isEasyApply": true,
  "jobSource": "POSTED",
  "companyType": "Corporate",
  "locationType": "On-site",
  "employmentType": "Full-time",
  "industry": "Chemicals / Petrochemicals / Polymers / Industrial Gases",
  "functionalArea": "Accounts / Taxation / Audit / Company Secretary",
  "desiredCandidate": "- Bachelor's degree in Accounting or Finance; a Master's degree or MBA is highly desirable…",
  "education": "Master of Commerce (Commerce), MBA/PG Diploma in Business Mgmt (Finance), Chartered Financ…",
  "nationality": "Any Nationality",
  "gender": "Any",
  "salaryHidden": false,
  "salaryText": "AED 8,000 - 12,000",
  "salaryMin": 8000,
  "salaryMax": 12000,
  "salaryCurrency": "AED",
  "salaryPeriod": "month",
  "salaryMinUsd": 2161,
  "salaryMaxUsd": 3241,
  "salaryBandUsd": "$2,001 - $4,000",
  "contactName": "Moolam Venkateswara Rao",
  "contactDesignation": "Project Manager",
  "contactCity": "Dubai",
  "contactCountry": "United Arab Emirates (UAE)",
  "detailFetched": true,
  "searchQuery": "accountant in uae",
  "searchTotal": 2968,
  "position": 5
}
```

#### Fields

Search rows (every row), fill measured on a 2,000-row run (all jobs in the UAE) and a 300-row run (sales / nurse in Dubai and Riyadh):

| Field | Filled | |
|---|---:|---|
| `jobId`, `title`, `url`, `company`, `companyId`, `location`, `city`, `cities`, `jobCountry`, `countryCode`, `summary`, `description`, `descriptionHtml`, `descriptionMarkdown`, `experienceMin`, `experienceMax`, `vacancies`, `keywords`, `postedAt`, `postedBy`, `jobSource` | 100% | `postedAt` is Naukrigulf's exact posted / refreshed time |
| `jobHighlights` | 81-97% | |
| `keywordsWhitelisted` | 89-90% | Naukrigulf's normalised skills |
| `companyUrl` | 76-84% | consultants and confidential employers often have no company page |
| `companyLogo` | 32-40% | |
| `isEasyApply` (true) | 74-91% | flags: `isWebJob`, `isConsultantJob`, `isConfidentialCompany`, `isPremium`, `isTopEmployer`, `jobRedirection` ... |

Full rows (`includeDetails`), fill measured on 200 accountant jobs in the UAE:

| Field | Filled |
|---|---:|
| `industry`, `functionalArea`, `education`, `nationality`, `gender`, `companyType`, `applyUrl` | 100% |
| `desiredCandidate` | 99% |
| `employmentType`, `locationType` (work mode) | 98% |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryMinUsd`, `salaryMaxUsd`, `salaryBandUsd` | 52% (`salaryHidden` = true on the rest) |
| `companyProfile` | 38% |
| `contactName`, `contactCity`, `contactCountry` | 34% |
| `contactAddress` | 32% |
| `contactDesignation` | 26% |
| `contactEmail` | 18% (23% of 125 jobs across four other searches) |
| `companyWebsite`, `contactWebsite`, `otherBenefits` | 10% |
| `extractedEmails`, `extractedPhones`, `extractedUrls`, `socialProfiles` | when the posting prints them |

A field Naukrigulf does not show for a job is `null`, never a made-up value. Not delivered: the recruiter's phone and fax and the employer's reference number (empty on every job we read), and anything Naukrigulf shows only to signed-in members.

### How can I use Naukrigulf jobs data?

- 🧲 **Recruiting agencies**: see which companies and consultants hire for the roles you place, in which Gulf city, with the recruiter contact they publish.
- 📊 **Salary benchmarking**: monthly ranges in local currency and US dollars by role, city, experience and nationality requirement.
- 🪪 **Emiratisation / Saudization tracking**: nationality asked for per employer and job.
- 💼 **B2B sales**: hiring is a buying signal; filter by industry, functional area and company type.
- 🛰️ **Job boards and aggregators**: a daily feed of new Gulf jobs in monitor mode.
- 🤖 **AI agents**: compact rows through the API or MCP.

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

Naukrigulf Jobs Scraper is pay-per-result, with no start fee:

| Event | Price | |
|---|---:|---|
| `job` | $0.00063 | one job from search results, full description included ($0.63 per 1,000) |
| `job-details` | $0.00072 | one job with its full record, charged **instead of** `job` ($0.72 per 1,000) |

| Jobs | Search rows | Full rows |
|---:|---:|---:|
| 100 | $0.063 | $0.072 |
| 1,000 | $0.63 | $0.72 |
| 10,000 | $6.30 | $7.20 |

Jobs removed by your filters, duplicates and jobs already delivered in monitor mode are never charged. A monitor poll with nothing new charges nothing. Apify platform usage (compute, proxy) is included in these prices. Set **Maximum cost per run** to cap a run: the actor stops cleanly at the limit and charges only what it delivered.

### Integrations, API, scheduling & MCP

- **Schedules:** run it hourly or daily from the **Schedules** tab; with **Monitor mode** each run returns only jobs you have not received. A poll reads Naukrigulf newest first and stops at the first page with nothing new.
- **Alerts:** Slack, Discord, Telegram, WhatsApp or any webhook, straight from the input.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client`; code on the [API tab](https://apify.com/topapi/naukrigulf-jobs-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2). Input names used by other Naukrigulf actors (`query`, `location`, `maxResults`, `datePosted`, `includeDescription`, `searchUrls`, `jobUrls`, `incrementalMode`, `stateKey` ...) are accepted.
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/naukrigulf-jobs-scraper/api/mcp); **Compact rows** keeps answers small.

### More TopApi scrapers

<table>
<tr>
<td>💼 <a href="https://apify.com/topapi/bayt-jobs-scraper">Bayt Jobs Scraper</a>: job rows from Bayt.com across the Middle East</td>
<td>💼 <a href="https://apify.com/topapi/xing-jobs-scraper">XING Jobs Scraper</a>: job rows from Germany, Austria and Switzerland</td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per search:** 49 jobs per request, to the end of any search (Naukrigulf's whole site is about 41,000 jobs, inside the 45,000 its search can page through).
- **Speed:** 20 jobs in 3 s, 300 jobs over 3 searches in 5 s, 2,000 jobs in 40 s, 200 full rows in 22 s on 256 MB.
- **Route to Naukrigulf:** the actor uses its own connection first, then Apify's datacenter and residential proxies if Naukrigulf refuses it; `RUN_SUMMARY` → `transport` shows which one served each run. A route that is refused is not retried for that run.
- **Full records that could not be read** ship as search rows, charged as `job`, with `detailsError` saying why; the status line counts them.
- **Salary:** about half of full rows publish one; `null` with `salaryHidden: true` when the employer hides it. Salaries are monthly.
- **Company pages of the newer layout** (`...-jobs-cid-...`) are matched by the company name in a keyword search, keeping only that company's jobs.
- **Empty dataset:** your filters removed every job (the status line says which filter removed how many), the keyword has no jobs in that location, or in monitor mode nothing is new. Nothing is charged for an empty run.

### FAQ

#### How many jobs can Naukrigulf Jobs Scraper collect in one run?

As many as match: set **Max jobs** to `0`. Any search pages to its end; the whole site is about 41,000 jobs.

#### Can I run Naukrigulf Jobs Scraper on a schedule to get only new jobs?

Yes. Save your input as a task, turn on **Monitor mode** and add a daily schedule. Each run delivers only jobs you have not received; a run with nothing new charges nothing.

#### Does Naukrigulf Jobs Scraper return the full job description?

Yes, on every row, as plain text, HTML and Markdown, at the `job` price.

#### Does Naukrigulf Jobs Scraper give salaries?

With **Include full job record**, when the employer shows one (52% of full rows in our run): the employer's monthly range in local currency, the same range in US dollars and Naukrigulf's USD band.

#### Can I get recruiter contacts?

With the full record: recruiter name, designation, email, city, country, address and website exactly as Naukrigulf publishes them (email on 18-23% of jobs in our runs), plus emails and phones written in the posting.

#### Can I get jobs for Gulf nationals only, or hide nationality-restricted jobs?

Yes: pick **Nationality asked for** (GCC nationals, Arab nationals, Indians, Filipinos ...), or turn on **Hide jobs limited to some nationalities** with the full record.

#### Can I use Naukrigulf Jobs Scraper with the Apify API?

Yes. Start runs and read datasets with `apify-client` for [Node.js](https://apify.com/topapi/naukrigulf-jobs-scraper/api/javascript) or [Python](https://apify.com/topapi/naukrigulf-jobs-scraper/api/python).

#### Can I use Naukrigulf Jobs Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/topapi/naukrigulf-jobs-scraper/api/mcp), connect Claude Desktop, Cursor or another MCP client, and ask for Naukrigulf jobs in plain language.

#### Do I need a Naukrigulf account, cookies or an API key?

No. The actor reads what Naukrigulf shows to every visitor.

#### Why did my Naukrigulf Jobs Scraper run return no results?

Usually the filters: several together can remove every job. The status line and `RUN_SUMMARY` give the matches per search and what each filter removed. A filter name Naukrigulf does not list for your search is reported under `unknownFilters`.

#### Your feedback

Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/naukrigulf-jobs-scraper/issues/open).

# Actor input Schema

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

Job titles, skills or company names, one per line (e.g. accountant, civil engineer, nurse). Each keyword is searched in every location below. Leave empty to list every job of the location (or the whole site). A Naukrigulf URL pasted here works too.

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

Cities or countries, one per line (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait, Muscat, Manama, Cairo, UAE, Saudi Arabia ...). Naukrigulf reads the place name itself. Leave empty for all 25+ countries the site lists.

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

Any Naukrigulf search URL from your browser (e.g. https://www.naukrigulf.com/accountant-jobs-in-dubai?freshness=7, its filters are kept), job URLs or job ids (read as full rows), and company pages (all their open jobs). A link to a text file with one URL per line also works.

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

Maximum jobs for the whole run (0 = no limit). Rows already delivered before a restart count against it.

## `maxItemsPerSearch` (type: `integer`):

Optional cap per keyword x location search (or per URL / company).

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

Read every job's full record from Naukrigulf: salary (employer's local range, USD conversion, USD band, benefits), industry, functional area, employment type, work mode (on-site / remote), localities, education, nationality and gender asked for, desired candidate profile, company type / profile / website, recruiter name, designation, email, city, country, address, website. Charged as job-details instead of job. Without it, every row still has the full description, summary, highlights, skills, experience and posted time.

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

Naukrigulf's own order.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days: Naukrigulf's own freshness filter (1, 3, 7, 15, 30, 60) plus an exact cut on each job's posted time, before anything is charged.

## `postedAfter` (type: `string`):

Only jobs posted after this date or time (2026-10-01 or 2026-10-01T08:00:00Z), checked before the charge.

## `postedBefore` (type: `string`):

Only jobs posted on or before this date or time, checked before the charge.

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

Only jobs whose required experience range includes this many years (Naukrigulf's own filter).

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

Naukrigulf's experience filter.

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

Naukrigulf's salary filter (monthly, US dollars).

## `minSalaryUsd` (type: `integer`):

Picks Naukrigulf's salary bands from this amount up; with the full record on, the exact USD salary is checked too, before the charge.

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

Naukrigulf industry names or ids, one per line (e.g. IT, Construction, Banking and Finance, Hospitality, Oil and Gas, 25). A name is matched against Naukrigulf's own industry list for your search.

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

Naukrigulf job-function names or ids, one per line (e.g. Engineering, IT Software, Sales / Business Development, Accounts / Taxation / Audit / Company Secretary).

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

Naukrigulf's country filter (names or ids: UAE, Saudi Arabia, Qatar, Kuwait, Oman, Bahrain, Egypt, Lebanon ...). Use it with a keyword search to narrow without a location.

## `cities` (type: `array`):

Naukrigulf's city filter (names or ids: Dubai, Abu Dhabi, Sharjah, Riyadh, Jeddah, Doha, Muscat, Cairo ...).

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

Naukrigulf's nationality filter.

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

Naukrigulf's gender filter.

## `postedBy` (type: `string`):

Direct employers or recruitment consultants (Naukrigulf's own filter).

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

Only jobs with Naukrigulf's easy apply.

## `jobTitles` (type: `array`):

Naukrigulf's own job-title filter (names or ids, e.g. Accountant, Sales Executive, Project Manager).

## `companyIds` (type: `array`):

Naukrigulf company ids (the companyId of a row): all open jobs of each company.

## `excludeConfidential` (type: `boolean`):

Skip jobs whose company is hidden as 'Confidential', before the charge.

## `companyNames` (type: `array`):

Keep only jobs whose company name contains one of these words, before the charge.

## `excludeCompanies` (type: `array`):

Skip jobs whose company name contains one of these words, before the charge.

## `includeKeywords` (type: `array`):

Keep only jobs whose title, company or skills contain one of these words, before the charge.

## `excludeKeywords` (type: `array`):

Skip jobs whose title, company or skills contain one of these words, before the charge.

## `withSalaryOnly` (type: `boolean`):

Needs the full record. Skips jobs without a published salary, before the charge.

## `workModes` (type: `array`):

Needs the full record.

## `employmentTypes` (type: `array`):

Needs the full record.

## `excludeNationalityRestricted` (type: `boolean`):

Needs the full record. Skips jobs that ask for specific nationalities.

## `excludeGenderRestricted` (type: `boolean`):

Needs the full record. Skips jobs that ask for one gender.

## `monitorMode` (type: `boolean`):

Deliver only jobs that no earlier run with the same monitor store delivered. Each search reads Naukrigulf's newest-first order and stops at the first page with nothing new, so a scheduled poll costs almost nothing when nothing changed.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers delivered jobs. Use one name per saved search.

## `resetMonitor` (type: `boolean`):

Forget earlier runs and deliver everything again.

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

Skip a job whose title, company and city match one already delivered (in this run or, in monitor mode, earlier runs).

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

Which description fields to include.

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

Cut long texts to this many characters (0 = full text).

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

Only the core fields (id, title, company, location, country, salary, experience, employment type, work mode, posted time, URL).

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

Leave out fields that are null or empty.

## `language` (type: `string`):

English (www.naukrigulf.com) or Arabic (arabic.naukrigulf.com, Arabic keywords and labels).

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

POST the new jobs of each run (JSON) to this URL.

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

Extra headers for the webhook, e.g. an Authorization header.

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

Incoming-webhook URL of a Slack channel.

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

Webhook URL of a Discord channel.

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

Bot token from @BotFather.

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

Chat or channel id the bot posts to.

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

WhatsApp Cloud API sender id.

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

WhatsApp Cloud API token.

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

Recipient phone number with country code.

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

How many jobs each alert lists.

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

Skip the alert when a run delivered nothing.

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

Job records read at once (search pages: up to 4 at once).

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

Optional. By default the actor picks its own route to Naukrigulf. Your own proxy URLs are tried first.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "dubai"
  ],
  "maxItems": 20,
  "includeDetails": false,
  "sortBy": "relevance",
  "postedBy": "any",
  "easyApplyOnly": false,
  "excludeConfidential": false,
  "withSalaryOnly": false,
  "excludeNationalityRestricted": false,
  "excludeGenderRestricted": false,
  "monitorMode": false,
  "monitorStoreName": "naukrigulf-jobs-monitor",
  "resetMonitor": false,
  "skipReposts": false,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "language": "en",
  "notificationLimit": 10,
  "notifyOnlyChanges": true,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

One item per Naukrigulf job: search card fields, plus the full job record when asked for.

## `summary` (type: `string`):

Per-search counts (matching, read, delivered, filtered, seen before), Naukrigulf's facet counts for each search, the route each request took and charges.

# 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"
    ],
    "locations": [
        "dubai"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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"],
    "locations": ["dubai"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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"
  ],
  "locations": [
    "dubai"
  ],
  "maxItems": 20
}' |
apify call topapi/naukrigulf-jobs-scraper --silent --output-dataset

```

## MCP server setup

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