# NaukriGulf Scraper - Gulf Jobs, Companies & Salaries (`scrapesage/naukrigulf-scraper`) Actor

Scrape Gulf job listings from NaukriGulf: title, company, location, experience range, vacancies, summary, skills keywords, posted date and apply URL for the UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain. Search by keyword and city, filter by experience and freshness. No login. JSON, CSV, Excel.

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

## Pricing

from $1.10 / 1,000 job listings

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

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

## What's an Apify Actor?

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 Scraper - Gulf Jobs, Companies & Salaries

Scrape **Gulf job listings from NaukriGulf.com** - the largest job board for the **UAE, Saudi Arabia, Qatar, Kuwait, Oman and Bahrain** - by keyword and location. Every job comes back as a clean record: title, company, location, experience range, number of vacancies, role summary, skills keywords, employer flags, posted date and the apply URL. No login, no API key, no browser - just JSON, CSV or Excel.

> **Why this actor exists (demand):** the NaukriGulf niche on Apify Store draws **~320 monthly users** across a fragmented field of single-purpose scrapers (leader ~37% share). This actor reads NaukriGulf's own search API - the same data the site's job cards render - with the site's real experience and freshness filters applied server-side, so you never pay for rows you filter away.

### What you get per job

| Field | Description |
|---|---|
| `title` `company` `companyId` `location` | Role, employer and the city/country string as NaukriGulf shows it |
| `experienceMin` `experienceMax` | Required experience range in years |
| `vacancies` | Number of openings for the posting |
| `summary` | The role summary NaukriGulf shows on the job card |
| `keywords[]` | Skills / keywords attached to the posting (great for matching and tagging) |
| `postedAt` | ISO timestamp of the latest posting date |
| `url` `logoUrl` | Job page URL (apply there) and the company logo |
| `isPremium` `isFeaturedEmployer` `isTopEmployer` `isSponsored` `recruiterActive` `expiringSoon` | Employer / posting flags straight from the source |
| `isExternalListing` `isFormBasedApply` `contactEmail` | Whether the job redirects to the employer's own site, whether applying is a form, and a contact email when the recruiter published one |
| `searchQuery` `searchLocation` `scrapedAt` | The search that found the job and when |

### Input

```json
{
  "searchQueries": ["civil engineer", "accountant"],
  "locations": ["Dubai", "Riyadh"],
  "minExperienceYears": 3,
  "postedWithinDays": "7",
  "maxResults": 200
}
```

- **Job title / keywords** - each keyword is searched separately and combined with every location. Leave empty to browse all jobs in the locations.
- **Locations** - cities or countries as NaukriGulf names them: Dubai, Abu Dhabi, Sharjah, UAE, Riyadh, Jeddah, Dammam, Saudi Arabia, Doha, Qatar, Kuwait, Muscat, Oman, Manama, Bahrain. Leave empty for the whole Gulf.
- **Minimum experience (years)** and **Posted within** (24 h / 3 / 7 / 15 / 30 / 60 days) are applied by NaukriGulf's search, so filtered-out jobs are never fetched or charged.
- **Max jobs** caps the run across all keyword x location combinations; duplicates are collapsed by job id.

Leave everything empty and the run returns a small free sample (engineer jobs in Dubai).

### Example output

```json
{
  "type": "job",
  "jobId": "310826000418",
  "title": "Sales Engineer / Sales Coordinator / Inside Sales Engineer",
  "company": "PETRA MECHATRONICS MIDDLE EAST TRADING LLC",
  "companyId": "113261",
  "location": "Dubai , Sharjah - United Arab Emirates (UAE)",
  "experienceMin": 3,
  "experienceMax": 8,
  "vacancies": 3,
  "summary": "The role involves sales coordination, technical sales, and customer relationship management, requiring strong communication skills and experience in industrial automation.",
  "keywords": ["Sales Coordination", "Sales Engineer", "Technical Sales Engineer", "Instrumentation", "Mechatronics", "Industrial Automation"],
  "postedAt": "2026-08-31T05:54:17.000Z",
  "url": "https://www.naukrigulf.com/sales-engineer-sales-coordinator-inside-sales-engineer-jobs-in-dubai-uae-in-petra-mechatronics-middle-east-trading-llc-3-to-8-years-n-cd-113261-jid-310826000418",
  "logoUrl": "https://static.naukimg.com/ni/nipjp/113261/113261.gif",
  "isPremium": false,
  "isFeaturedEmployer": false,
  "isTopEmployer": false,
  "isExternalListing": false,
  "isFormBasedApply": false,
  "isSponsored": false,
  "recruiterActive": true,
  "expiringSoon": false,
  "contactEmail": null,
  "searchQuery": "engineer",
  "searchLocation": "Dubai",
  "scrapedAt": "2026-09-02T06:00:00.000Z"
}
```

**About descriptions.** By default this actor ships the **role summary and skills keywords** the search index exposes (present on virtually every posting), plus the job URL. The **full job-description body** is rendered only by JavaScript on each job's detail page, so it is an **opt-in add-on** - see below.

### Full job descriptions (optional, off by default)

Turn on **Add full job descriptions** to also fetch each job's complete detail page and add: the full `description`, `qualifications`, `experienceRequirements`, `skillsDetail`, `industryDetail`, `employmentTypeDetail` and `validThrough`.

> ⚠️ **Read before enabling.** NaukriGulf renders the description with client-side JavaScript, so each one needs a full browser-render fetch through a paid unblocker. That means:
>
> - **Much slower** - roughly a few seconds per job, versus near-instant for the summary-only scrape.
> - **Billed separately and higher** - each description returned is charged as a **Job description** event (from **$0.025**, tiered down by volume) on top of the normal per-job charge, because it costs a rendered request to obtain.
> - **Cap it** with **Max descriptions** (default 50). The rest of the jobs still ship with every listing field, just without the description body.
>
> Leave it **off** unless you specifically need the description text. Descriptions are charged only when one is actually returned; a job whose page cannot be rendered ships without a description and is not charged for it.

### Use cases

- **Recruitment and staffing** - monitor new openings by title and city; enrich ATS pipelines with Gulf-market roles and the recruiters' contact emails when published.
- **Lead generation** - build lists of companies hiring in the UAE and Saudi Arabia (with company ids, logos, premium / top-employer flags) for B2B outreach.
- **Salary and market research** - track experience requirements, vacancy counts and demand by role across Gulf cities.
- **Job aggregators and alerts** - schedule daily runs with **Posted within: 24 hours** to feed a fresh Gulf jobs feed.
- **Career research** - find which skills keywords recur for a target role in Dubai, Doha or Riyadh.

### Use with AI assistants (MCP)

This actor is available through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), so assistants like Claude can call it as a tool - "find civil engineer jobs in Riyadh posted this week" - and get structured job data back.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** - AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** - an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) - no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** - agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Pricing

Pay-per-event, tiered by volume: **$0.002 per job** on the free tier, dropping to **$0.0005 per job** at the top tier. You pay only for jobs actually returned; searches the site does not answer are never charged.

### FAQ

**Which countries are covered?** Everything NaukriGulf lists: UAE (Dubai, Abu Dhabi, Sharjah, Ajman...), Saudi Arabia (Riyadh, Jeddah, Dammam, Al Khobar...), Qatar (Doha), Kuwait, Oman (Muscat), Bahrain (Manama) and remote/Gulf-wide roles.

**How fresh is the data?** Live at run time. Use **Posted within** to keep only recent postings, and schedule the actor to run daily.

**Why are requests paced?** NaukriGulf rate-limits bursts. The actor waits ~1-2 seconds between pages and retries on a fresh proxy session, which keeps runs reliable; a run that still gets no answer ends cleanly with an explanation and no charge.

**Does it include salaries?** NaukriGulf hides salary on most postings; when a recruiter publishes one it appears inside the summary text. Experience ranges and vacancy counts are always included.

Every run finishes with a clear status message; empty or rate-limited runs never crash and never bill.

***

*NaukriGulf is a trademark of its owner. This actor is an independent tool that reads publicly available job listings and is not affiliated with or endorsed by NaukriGulf or Info Edge.*

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search, e.g. <code>accountant</code>, <code>civil engineer</code>, <code>nurse</code>, <code>sales manager</code>. Each keyword is searched separately (and combined with every location). Leave empty to browse all jobs in the chosen locations.

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

Cities or countries as NaukriGulf names them: <code>Dubai</code>, <code>Abu Dhabi</code>, <code>Sharjah</code>, <code>UAE</code>, <code>Riyadh</code>, <code>Jeddah</code>, <code>Dammam</code>, <code>Saudi Arabia</code>, <code>Doha</code>, <code>Qatar</code>, <code>Kuwait</code>, <code>Muscat</code>, <code>Oman</code>, <code>Manama</code>, <code>Bahrain</code>. Leave empty to search the whole Gulf region.

## `minExperienceYears` (type: `integer`):

Only jobs whose experience range covers at least this many years (NaukriGulf's own experience filter). Leave empty for any experience.

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

Freshness filter - only jobs posted within this window.

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

Maximum number of jobs to return across all keyword x location combinations (duplicates are collapsed by job id).

## `includeDescriptions` (type: `boolean`):

⚠️ <b>Off by default.</b> When on, each job's full detail page is rendered to pull the complete <b>description</b>, plus qualifications, experience requirements, skills, industry and employment type. NaukriGulf renders the description with JavaScript, so each one needs a full browser-render fetch: this makes the run <b>much slower</b> (a few seconds per job) and is billed as a separate, higher-priced <b>Job description</b> event on top of the per-job charge. Leave OFF unless you specifically need the description text - the search already returns the summary, skills keywords, salary-experience, company and apply URL. Cap the count with the next field.

## `maxDescriptions` (type: `integer`):

When 'Add full job descriptions' is on, stop after this many descriptions (the remaining jobs still ship with all their listing fields, just no description). Keep this modest - each description is a slow, separately-billed render.

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

The search API answers Apify datacenter proxies, so the default is enough. Requests are paced automatically to stay under the site's rate limit.

## Actor input object example

```json
{
  "searchQueries": [
    "engineer"
  ],
  "locations": [
    "Dubai"
  ],
  "postedWithinDays": "0",
  "maxResults": 100,
  "includeDescriptions": false,
  "maxDescriptions": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped NaukriGulf job records as JSON items in the default dataset.

# 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 = {
    "searchQueries": [
        "engineer"
    ],
    "locations": [
        "Dubai"
    ],
    "postedWithinDays": "0",
    "maxResults": 100,
    "maxDescriptions": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/naukrigulf-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["engineer"],
    "locations": ["Dubai"],
    "postedWithinDays": "0",
    "maxResults": 100,
    "maxDescriptions": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "engineer"
  ],
  "locations": [
    "Dubai"
  ],
  "postedWithinDays": "0",
  "maxResults": 100,
  "maxDescriptions": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapesage/naukrigulf-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/naukrigulf-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GnnlR3s7RdfOOemU5/builds/iAmtVGcCtWtp3DZg9/openapi.json
