# Naukri Jobs Scraper - India & Gulf Jobs, 60+ Fields (`thirdwatch/naukri-jobs-scraper`) Actor

Extract Naukri.com and Naukrigulf job listings at scale — title, company, salary, experience, skills, location, posted date and 50+ more fields — with clean JSON for job boards, labor-market analytics and recruiting pipelines. Built for reliability on India's largest job site.

- **URL**: https://apify.com/thirdwatch/naukri-jobs-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Jobs
- **Stats:** 877 total users, 36 monthly users, 89.2% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.60 / 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/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

## Naukri & Naukrigulf Jobs Scraper & Monitor — 60+ Fields, No Browser

> **Thirdwatch portfolio:** 8,800+ users across 140+ public Actors, 2M+ records delivered, >95% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

### What you get

Search and monitor **Naukri India and Naukrigulf from one Actor**. Extract one consistent row per public job with 60+ fields: full descriptions, salary data, complete skill sets, experience, company profiles, role taxonomy, applications, views, vacancies, apply URLs, and public recruiting metadata. The Actor uses direct HTTP at 256 MB—no browser, login, or cookies.

### Why use this Naukri scraper

- **India + Gulf coverage** — search Naukri, Naukrigulf, or both with the same schema.
- **60+ normalized fields** — Naukri's public mobile detail API adds company profile and address, industry, functional area, job role, role category, applications, views, vacancies, complete skills, locations, employment type, and job type.
- **One stable schema** — Naukri and Naukrigulf results use the same analytics-ready keys instead of forcing downstream code to handle two incompatible source shapes.
- **Incremental job monitoring** — scheduled runs can emit only job IDs not previously seen by that watch, so unchanged listings are not billed again.
- **Useful Naukri filters** — location, freshness, experience, work mode, salary range, minimum salary, industry, role category, employer posting type, sort order, and direct search URLs. Gulf searches support keyword and location.
- **Up to 1,000 jobs per query** — automatic pagination beyond the first search page.
- **Analytics-ready output** — stable IDs, normalized dates, salary bounds, experience bounds, skills arrays, and source labels.
- **Predictable cost** — one charge per unique row; empty searches, failed pages, and duplicate jobs are not billed.

### Quick start

#### Search Naukri India

```json
{
  "platform": "naukri",
  "queries": ["software engineer", "data scientist"],
  "location": "Bengaluru",
  "maxResultsPerQuery": 100,
  "includeNaukriDetails": true,
  "freshnessDays": "7",
  "experience": 3,
  "workMode": "hybrid",
  "salaryRange": "10to15",
  "industry": "IT Services",
  "roleCategory": "Software Development",
  "companyType": "company",
  "sortBy": "date"
}
```

#### Search jobs in Dubai and the Gulf

```json
{
  "platform": "naukrigulf",
  "queries": ["software engineer", "sales manager"],
  "location": "Dubai",
  "maxResultsPerQuery": 100,
  "includeGulfDetails": true
}
```

#### Search both job markets

```json
{
  "platform": "both",
  "queries": ["cyber security", "product manager"],
  "location": "UAE",
  "maxResultsPerQuery": 200
}
```

#### Monitor new jobs by role and city

```json
{
  "platform": "naukri",
  "queries": ["software engineer", "data scientist"],
  "location": "Bengaluru",
  "maxResultsPerQuery": 100,
  "sortBy": "date",
  "freshnessDays": "1",
  "includeNaukriDetails": false,
  "includeDescription": false,
  "monitorMode": "new-jobs",
  "monitorStoreName": "bengaluru-tech-jobs"
}
```

Save this input as an Apify Task and schedule it. The first run establishes the baseline and emits the current jobs with `change_type: "new"`. Later complete runs with the same monitor name emit only newly observed job IDs. A repeat run with no new jobs writes no billable result events.

Monitoring fails without updating state if any configured search is incomplete, preventing a partial Naukri or Naukrigulf response from creating false alerts. A single monitor may request up to 2,000 rows per run so its verified snapshot fits safely in the default 256 MB memory; split larger watchlists across stable monitor names. Snapshot mode still supports up to 1,000 results per query and streams pages without that monitor-wide cap. History is capped at 50,000 job IDs per watch. An evicted listing can be classified as new if it later reappears. Avoid overlapping runs with the same monitor name.

The backward-compatible default is `platform: "naukri"`. With `platform: "auto"`, locations such as Mumbai and Bengaluru route to Naukri, while Dubai, UAE, Saudi Arabia, Qatar, Kuwait, Oman, and Bahrain route to Naukrigulf. You can also put a recognized location in the query: `data analyst mumbai` or `sales manager dubai`.

Freshness, experience, work-mode, salary, and sort filters apply to Naukri India. Naukrigulf currently supports keyword and location and uses relevance order; the Actor logs a warning when a Naukri-only filter is supplied to a Gulf search.

Pass existing result pages through `searchUrls` when you already have a search configured:

```json
{
  "searchUrls": [
    "https://www.naukri.com/data-scientist-jobs-in-pune?k=data%20scientist&l=pune",
    "https://www.naukrigulf.com/software-engineer-jobs-in-dubai"
  ],
  "maxResultsPerQuery": 200
}
```

### Fast monitoring vs full Naukrigulf details

`includeGulfDetails` defaults to `true`. Each Naukrigulf result is enriched with its full description, desired-candidate profile, salary when disclosed, skills, education, employment type, industry, functional area, posted date, and public recruiter identity when available.

Set it to `false` for high-frequency monitoring. The Actor then returns search-card fields—title, company, experience, location, description snippet, posting age, and canonical job URL—with one HTTP request per 30 results.

Naukri India search rows already include descriptions, salary, skills, experience, ratings, and apply URLs. The optional detail lane adds the deeper company, role-taxonomy, and engagement fields described below.

Running several keyword searches in one job? Raise `maxConcurrency` (default 3, up to 5) to process them together; pagination within each individual search still respects the same rate limiting.

### Fast Naukri search vs 60+ field enrichment

`includeNaukriDetails` defaults to `true`. For each Naukri search result, the Actor calls Naukri's public mobile detail endpoint concurrently and merges richer fields into the same row. If an individual detail request fails or times out, the search-card row is preserved instead of losing the job.

Set `includeNaukriDetails` to `false` for the cheapest high-frequency title/company/location monitor. Set `includeDescription` to `false` to minimize dataset size, or `cleanHtml` to `true` to keep plain text while omitting duplicate HTML fields.

### Output fields

Every row uses the same core schema:

- identity: `job_id`, `title`, `source`, `apply_url`, `external_apply_url`
- company: `company_name`, `company_id`, `company_logo_url`, `company_jobs_url`, `company_website`, `company_address`, `company_description`
- role: `location`, `locations`, `work_mode`, `experience`, `experience_min`, `experience_max`, `skills`
- description: `description`, `description_html`
- salary: `salary_raw`, `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_disclosed`
- dates: `posted_at`, `posted_date`, `created_at`, `apply_by_time`, `scraped_at`
- reputation: `company_rating`, `company_reviews_count`, `ambitionbox_url`
- recruiting metadata: `vacancy`, `applicant_count`, `view_count`, `employment_type`, `job_type`, `industry`, `functional_area`, `job_role`, `role_category`, `education`, `nationality`, `gender`, `recruiter_name`, `recruiter_title`, `recruiter_email`, `is_company_apply`, `is_walk_in`, `is_consultant`. Public recruiter contact fields are populated only for Naukrigulf listings that disclose them; Naukri's public responses do not expose recruiter email.
- provenance: `source_query`, `searched_location`
- monitoring events: `change_type`, `first_seen_at`

Fields remain empty when the public listing does not disclose them. The Actor never invents salary, contact, or reputation data.

#### Example result

```json
{
  "job_id": "100726000119",
  "title": "Technical Support Engineer",
  "company_name": "Axiom Telecom LLC",
  "source": "Naukrigulf",
  "location": "Dubai, United Arab Emirates (UAE)",
  "experience": "4 - 9 Years",
  "experience_min": 4,
  "skills": ["Troubleshooting", "System Monitoring"],
  "employment_type": "Full Time",
  "industry": "Telecom / ISP",
  "posted_date": "2026-07-10",
  "apply_url": "https://www.naukrigulf.com/...-jid-100726000119"
}
```

### Input parameters

| Parameter | Required | Description |
|-----------|----------|--------------|
| `platform` | No | Job market to search: Naukri India, Naukrigulf, Both, or Auto-detect from location. Default `naukri`. |
| `queries` | No | Keyword or "role + city" searches, e.g. `data analyst mumbai`. Default `["software engineer"]`. |
| `location` | No | Explicit city, region, or `India`; overrides any city suffix in `queries`. |
| `searchUrls` | No | Existing Naukri or Naukrigulf search URLs to run instead of building one from `queries`. |
| `includeGulfDetails` | No | Enrich each Naukrigulf job with full description, skills, and other disclosed details. Default `true`. |
| `includeNaukriDetails` | No | Enrich each Naukri job with 40+ additional fields from the public mobile detail payload. Default `true`. |
| `includeDescription` | No | Return full plain-text and HTML descriptions. Default `true`. |
| `monitorMode` | No | `off` for a current snapshot, or `new-jobs` to emit only previously unseen job IDs on repeat runs. Default `off`. |
| `monitorStoreName` | No | Stable name for a scheduled watch; reuse it on every run. |
| `cleanHtml` | No | Keep cleaned plain text but omit the duplicate HTML description fields. Default `false`. |
| `maxResultsPerQuery` | No | Maximum jobs per keyword or search URL, up to 1,000. Default 20. |
| `sortBy` | No | Naukri India result order: `relevance` or `date`. Default `relevance`. |
| `freshnessDays` | No | Naukri India only: return jobs posted within this many days (`0` = any age). Default `0`. |
| `experience` | No | Naukri India only: filter by candidate experience level in years. |
| `workMode` | No | Naukri India only: `any`, `office`, `hybrid`, or `remote`. Default `any`. |
| `salaryRange` | No | Naukri India only: annual CTC band filter in lakhs of INR. Default `any`. |
| `minSalary` | No | Naukri India only: exclude disclosed salaries below this INR amount; jobs with hidden salary are still returned. |
| `industry` | No | Naukri India only: industry contains filter, e.g. "IT Services". |
| `roleCategory` | No | Naukri India only: role category contains filter, e.g. "Data Science". |
| `companyType` | No | Naukri India only: `any`, direct company jobs, or consultant/recruiter jobs. Default `any`. |
| `maxConcurrency` | No | Number of keyword searches processed together, 1-5. Default 3. |

### Common use cases

- Build India and GCC talent-market datasets
- Track new jobs by skill, employer, or city
- Benchmark disclosed salary and experience ranges
- Power recruiting, labor-market intelligence, and job alerts
- Monitor hiring expansion across India, UAE, Saudi Arabia, Qatar, Kuwait, Oman, and Bahrain
- Compare the same role across Naukri and Naukrigulf

### Reliability and responsible use

- Results reflect the live public indexes and may change between runs.
- Employers frequently omit salary; undisclosed values stay empty with `salary_disclosed: false`.
- Some listings omit ratings, review counts, education, or external application URLs.
- Search pagination is capped at 1,000 results per query and rate-limited between pages.
- Use public job data lawfully and respect applicable privacy, employment, and platform rules.
- This Actor is not affiliated with Naukri or Naukrigulf.

### Related guides and Actors

- [Build Naukri Salary Benchmarks by Experience](https://thirdwatch.dev/blog/build-naukri-salary-benchmarks-by-experience)
- [Find India Tech Jobs by Skill on Naukri](https://thirdwatch.dev/blog/find-india-tech-jobs-by-skill-on-naukri)
- [Scrape Naukri Jobs for India Recruiting at Scale](https://thirdwatch.dev/blog/scrape-naukri-jobs-for-india-recruiting)
- [Track India IT Services Hiring on Naukri](https://thirdwatch.dev/blog/track-india-it-services-hiring-on-naukri)

Pair it with [AmbitionBox Scraper](https://apify.com/thirdwatch/ambitionbox-scraper?fpr=9m2cd6) for employer reputation and [CutShort Jobs Scraper](https://apify.com/thirdwatch/cutshort-jobs-scraper?fpr=9m2cd6) for India tech-hiring coverage beyond Naukri.

### Limitations

- Salary is only returned when the employer discloses it on the listing; most Naukri and Naukrigulf postings do not, so `salary_min`/`salary_max` are frequently empty with `salary_disclosed: false`.
- Recruiter contact fields (`recruiter_email`, `recruiter_name`) are populated only for the subset of Naukrigulf listings that publish them; Naukri's public responses never expose recruiter email.
- Each search is capped at 1,000 results per query; monitor mode is capped at 2,000 rows per run and 50,000 tracked job IDs per watch, so very large watchlists need to be split across multiple monitor names.
- Naukrigulf search filters currently support keyword and location only — freshness, experience, work-mode, salary, and sort filters apply to Naukri India and are ignored (with a logged warning) on Gulf searches.

Last verified: 2026-07

# Actor input Schema

## `platform` (type: `string`):

Naukri India is the backward-compatible default. Choose Auto to route Gulf locations to Naukrigulf, or Both to search both markets.

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

Search keywords such as 'python developer'. Recognized suffixes such as 'data analyst mumbai' or 'sales manager dubai' become the location.

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

Explicit city, region, or 'India'. This overrides any city suffix in queries. Leave empty to infer a recognized suffix or search India.

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

Existing Naukri or Naukrigulf search URLs. Keyword, location, and source are extracted automatically.

## `includeGulfDetails` (type: `boolean`):

Fetch each public job page for full description, skills, education, industry, employment type, and other disclosed details. Disable for the fastest low-cost monitoring runs.

## `includeNaukriDetails` (type: `boolean`):

Fetch Naukri's public mobile detail payload for role taxonomy, company profile and address, full skills, applications, views, vacancies, job type, and richer locations. Failed detail requests preserve the base job row.

## `includeDescription` (type: `boolean`):

Return full plain-text and HTML descriptions. Disable for smaller monitoring datasets.

## `monitorMode` (type: `string`):

Off returns the current snapshot. New jobs emits and bills the current baseline on the first run, then stores a bounded history and emits only previously unseen job IDs. A monitor may request up to 2,000 rows per run; split larger watchlists across monitor names.

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

Stable name for a scheduled watch. Reuse it on every run. If omitted, the Actor derives one from the searches, filters, and detail settings.

## `cleanHtml` (type: `boolean`):

Keep cleaned plain text but omit the duplicate HTML description fields.

## `maxResultsPerQuery` (type: `integer`):

Maximum jobs per keyword or search URL. The Actor paginates automatically in batches of 20.

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

Naukri India result order. Naukrigulf currently uses relevance.

## `freshnessDays` (type: `string`):

Naukri India only: return jobs posted within this many days. Zero means any age.

## `experience` (type: `integer`):

Naukri India only: filter jobs by candidate experience level.

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

Naukri India only: filter office, hybrid, or remote listings.

## `salaryRange` (type: `string`):

Naukri India only: annual CTC filter in lakhs of INR.

## `minSalary` (type: `integer`):

Naukri India rich filter. Excludes disclosed salaries below this amount; jobs with hidden salary remain because the source does not expose a comparable value.

## `industry` (type: `string`):

Naukri India rich filter, for example 'IT Services', 'Financial Services', or 'Pharmaceutical'. Detail enrichment is enabled automatically by the default configuration.

## `roleCategory` (type: `string`):

Naukri India rich filter, for example 'Software Development', 'Data Science', 'Sales', or 'Marketing'.

## `companyType` (type: `string`):

Naukri India rich filter. Separate direct employer jobs from consultant or recruiter postings.

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

Number of independent keyword searches processed together. Pagination within each search remains rate-limited.

## Actor input object example

```json
{
  "platform": "naukri",
  "queries": [
    "software engineer",
    "data scientist"
  ],
  "location": "Bengaluru",
  "searchUrls": [],
  "includeGulfDetails": true,
  "includeNaukriDetails": true,
  "includeDescription": true,
  "monitorMode": "off",
  "cleanHtml": false,
  "maxResultsPerQuery": 100,
  "sortBy": "relevance",
  "freshnessDays": "0",
  "workMode": "any",
  "salaryRange": "any",
  "companyType": "any",
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "software engineer",
        "data scientist"
    ],
    "location": "Bengaluru",
    "maxResultsPerQuery": 100
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "queries": [
        "software engineer",
        "data scientist",
    ],
    "location": "Bengaluru",
    "maxResultsPerQuery": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "software engineer",
    "data scientist"
  ],
  "location": "Bengaluru",
  "maxResultsPerQuery": 100
}' |
apify call thirdwatch/naukri-jobs-scraper --silent --output-dataset

```

## MCP server setup

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