# Naukri Job Scraper (`scraptivo/naukri-scraper`) Actor

Collects Naukri.com job listings from keywords, locations, search URLs, or company pages. Returns title, company, salary, and optional details, overview, and reviews.

- **URL**: https://apify.com/scraptivo/naukri-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.70 / 1,000 job scrapeds

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

**Naukri Job Scraper** collects job listings from [Naukri.com](https://www.naukri.com) and turns them into structured data for hiring research, salary benchmarking, and competitor monitoring. Provide a job title or keyword with an Indian city, or paste Naukri search or company URLs, then export title, company, location, experience, salary, and work mode to JSON, CSV, or Excel. Use it to build job databases, track hiring, and schedule recurring collection. Pricing starts at **$3.00 per 1,000 jobs**, with optional job details and company overviews at the same rate and AmbitionBox reviews at **$2.00 per 1,000**.

### What can you automate with Naukri Job Scraper?

- **Build targeted job databases** — Search titles or skills such as "python developer" across Indian cities, or nationwide, and export company, experience, salary, and work mode on every row.
- **Benchmark pay and experience** — Compare salary bands and year ranges by role and city for compensation research.
- **Monitor competitor hiring** — Filter by freshness and sort by date to see who is hiring, for which titles, and how recent the listings are.
- **Collect one employer's live jobs** — Paste a Naukri or AmbitionBox company page and pull that company's openings up to your job cap.
- **Attach employee sentiment** — Optionally nest AmbitionBox reviews on each job from the same company.
- **Schedule recurring collection** — Run daily or weekly and push new listings into Sheets, a CRM, or an alert workflow.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Recruitment and staffing agencies | Build city-and-title pipelines of open roles and watch which employers are hiring this week. |
| Compensation and HR analytics teams | Compare experience bands, disclosed salaries, and work modes across Indian markets. |
| Talent-intelligence researchers | Combine live jobs with company size, headquarters, followers, and AmbitionBox reviews. |
| Sales and lead-generation teams | Spot companies hiring for a skill, then enrich those accounts downstream. |

### What data can you collect from Naukri?

| Data group | Example fields | How it helps |
|---|---|---|
| Job identity | `title`, `jobId`, `url`, `postedDate`, `postedAgo` | Identify each listing and deduplicate across runs with `jobId`. |
| Employer | `companyName`, `companyUrl`, `rating` | See who is hiring and how the company is rated. |
| Role terms | `location`, `experience`, `salary`, `workMode`, `employmentType` | Filter by city, years, pay, and office / hybrid / remote. |
| Company overview | `companySize`, `headquarters`, `followCount` | Qualify employer scale when **Scrape Company Overview** is enabled. |
| Employee reviews | `reviews` (rating, likes, dislikes, work policy) | Read sentiment on the same job row when **Scrape Company Reviews** is enabled. |

Listing-card fields are always collected. Full description, skills, education, apply/view counts, and `employmentType` appear when **Scrape Job Details** is enabled. Overview fields are charged once per unique company and copied onto that company's job rows. Reviews nest on those job rows — they are not separate dataset items. Salary and some overview fields are empty when Naukri does not publish them.

### How to use Naukri Job Scraper

1. Open the [Naukri Job Scraper](https://apify.com/scraptivo/naukri-scraper) on Apify.
2. Enter a search query such as "python developer" and an optional location such as "bangalore", or paste Naukri search / company URLs.
3. Set **Max Jobs** (Console prefill is 20; `0` means unlimited) and any sort, freshness, or work-mode filters.
4. Run the Actor — it writes one dataset row per job.
5. Export the dataset or connect it to your workflow.

```json
{
    "searchQueries": ["python developer"],
    "locations": ["bangalore"],
    "maxJobs": 20,
    "sortBy": "relevance",
    "freshness": "7",
    "workMode": "any",
    "scrapeJobDetails": false,
    "scrapeCompanyOverview": false,
    "scrapeCompanyReviews": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Example workflow

#### Build a weekly list of Python developer jobs in Bangalore

1. Schedule a Monday run with `searchQueries` = `["python developer"]`, `locations` = `["bangalore"]`, `freshness` = `"7"`, and `sortBy` = `"date"`.
2. Keep rows that match your experience band and work-mode needs using the `experience` and `workMode` fields.
3. On shortlisted `companyUrls`, enable **Scrape Company Overview** and **Scrape Company Reviews** when you need size, HQ, and employee sentiment.
4. Send new records to Google Sheets or a CRM through a webhook after each run.
5. Deduplicate user-side against the stable `jobId` field.

The Actor does not filter or merge results across runs — those steps happen in your pipeline.

### Automate and integrate your results

- **Schedules** — Run **daily** with `freshness` = `"1"` for new-job alerts, or **weekly** with `freshness` = `"7"` for market snapshots. Create a separate scheduled task per query and city.
- **Webhooks** — Push completed runs into Google Sheets, Make, Zapier, Slack, a CRM, or an ATS.
- **Exports and API** — Download JSON, CSV, Excel, or HTML from the Apify Console, or start a run from the API:

```shell
curl -X POST "https://api.apify.com/v2/acts/scraptivo~naukri-scraper/runs?token=YOUR-APIFY-TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["python developer"],
    "locations": ["bangalore"],
    "maxJobs": 20,
    "freshness": "7",
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"]
    }
  }'
```

- **Deduplication** — Within a run, listings are deduplicated by `jobId`. Across runs the Actor appends new results. Use `jobId` as the stable merge key.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---|---|---|---|
| `searchQueries` | Array of strings | No\* | `[]` | Job titles, skills, or keywords (e.g. `"python developer"`). Combined with each location. |
| `locations` | Array of strings | No | `[]` | Indian cities as shown on Naukri (e.g. `"bangalore"`, `"hyderabad"`, `"pune"`, `"remote"`). Empty = nationwide. |
| `startUrls` | Array of URLs | No\* | `[]` | Naukri search pages or job-listing URLs. Used in addition to search queries. |
| `companyUrls` | Array of URLs | No\* | `[]` | Naukri company pages or AmbitionBox review pages. Live jobs collected up to Max Jobs. |
| `maxJobs` | Integer | No | `0` | Maximum job rows (`0` = unlimited). Console prefill is `20`. Overview fields and reviews attach onto these rows. |
| `sortBy` | String | No | `relevance` | Search sort: `relevance` or `date`. Applies to keyword / location searches. |
| `freshness` | String | No | `any` | Only jobs posted within `any`, `1`, `3`, `7`, `15`, or `30` days. Keyword / location searches only. |
| `workMode` | String | No | `any` | `any`, `office`, `hybrid`, or `remote`. Keyword / location searches only. |
| `scrapeJobDetails` | Boolean | No | `false` | Fetch full description, skills, education, apply/view counts, and `employmentType`. Charged as `job-details`. |
| `scrapeCompanyOverview` | Boolean | No | `false` | Attach company profile fields onto each job from that company. Charged as `company-overview` once per unique company. |
| `scrapeCompanyReviews` | Boolean | No | `false` | Attach AmbitionBox reviews as a `reviews` list on each job. Charged as `company-reviews` per review. |
| `maxReviewsPerCompany` | Integer | No | `20` | Maximum AmbitionBox reviews per company (`0` = unlimited). Ignored when reviews are off. |
| `detailConcurrency` | Integer | No | `5` | Max parallel job-detail / company requests (1–20). |
| `proxyConfiguration` | Proxy object | No | Apify proxy, RESIDENTIAL | Proxy settings. Residential proxies are recommended. |

\* Provide at least one of `searchQueries`, `startUrls`, or `companyUrls`.

#### Which source should I use?

Use `searchQueries` plus `locations` for keyword discovery — every query is searched in every location, and `sortBy`, `freshness`, and `workMode` apply. Use `startUrls` when you already have a Naukri search or listing URL; those URLs are scraped in addition to keyword searches. Use `companyUrls` for one employer's live jobs from a Naukri overview page or an AmbitionBox reviews page.

#### Do overview and reviews create extra dataset rows?

No. **Max Jobs** is a row cap of one job per row. Overview fields and the `reviews` array nest onto each job from the same company. You still pay the overview event once per unique company and the review event per review, but you never get unjoined enrichment rows.

### Output example

Each dataset item is one job. With company overview and reviews enabled, a record looks like this:

```json
{
    "jobId": "150126031660",
    "title": "Python Developer (@Infosys)",
    "companyName": "Infosys",
    "url": "https://www.naukri.com/job-listings-python-developer-infosys-infosys-kolkata-hyderabad-bengaluru-5-to-10-years-150126031660",
    "companyUrl": "https://www.naukri.com/infosys-overview-13832",
    "location": "Kolkata, Hyderabad, Bengaluru",
    "experience": "5-10 Yrs",
    "salary": "Not disclosed",
    "workMode": "Hybrid",
    "postedAgo": "7 Days Ago",
    "postedDate": "2026-08-11T10:39:09.094000+00:00",
    "rating": 3.5,
    "companySize": "100001+",
    "headquarters": "Bengaluru",
    "followCount": 1878902,
    "sourceQuery": "python developer",
    "reviews": [
        {
            "reviewId": 78544194,
            "title": "rated by a Technical Lead in Bengaluru",
            "rating": 1.0,
            "likes": "Culture and env.",
            "dislikes": "Manager are no supportive...",
            "employmentType": "permanent",
            "workPolicy": "Hybrid"
        }
    ]
}
```

`employmentType` on the job itself is filled when **Scrape Job Details** is enabled. Listing-only runs still return title, company, location, experience, salary, work mode, posted date, URL, and job ID when Naukri publishes them.

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

The Actor uses pay-per-event pricing. Each run charges a small **Actor Start** event at **$0.00005**. Then you pay only for the events you trigger:

- **$3.00 / 1,000 jobs** — a `dataset-item` event for every job row pushed to the dataset.
- **$3.00 / 1,000 job details** — a `job-details` event per job when **Scrape Job Details** is enabled.
- **$3.00 / 1,000 company overviews** — a `company-overview` event once per unique company when **Scrape Company Overview** is enabled.
- **$2.00 / 1,000 reviews** — a `company-reviews` event per AmbitionBox review when **Scrape Company Reviews** is enabled.

A listing-only run of 20 jobs costs about **$0.06** plus the start event. A listing-only run of 1,000 jobs costs **$3.00**. Adding job details on those 1,000 rows costs **$6.00** in event fees. If the same 1,000 jobs come from 200 unique companies and you enable overviews, add **$0.60**. One thousand reviews add **$2.00**.

Apify paid plans discount the per-1,000 rates: **Bronze $2.90 / Silver $2.80 / Gold $2.70** for jobs, job details, and company overviews; reviews are **Bronze $1.90 / Silver $1.80 / Gold $1.70**. Compute units and residential proxy usage are billed separately on your Apify plan. When your event spending limit is reached, the run stops.

### Reliability and responsible use

- **Proxy requirement** — The Actor defaults to the Apify proxy with the RESIDENTIAL group. Residential IPs are recommended; raise `detailConcurrency` only while that group is enabled.
- **Retries and concurrency** — Failed requests are retried automatically. `detailConcurrency` defaults to 5 (maximum 20). Listing-card data is still returned when a detail request fails.
- **Conditional fields** — Job-detail fields, overview fields, and the `reviews` array appear only when the matching toggle is enabled. Naukri also leaves salary and some profile fields unset.
- **Search spelling** — Location values should match Naukri's search spelling (for example `bangalore`, not `Bengaluru`). Result rows may still display "Bengaluru".
- **Public data** — The Actor collects publicly visible job, company, and review information from Naukri and AmbitionBox.
- **Responsible use** — Only use the data in ways that comply with Naukri's and AmbitionBox's terms of service and applicable law.

### Frequently asked questions

#### Can I scrape Naukri jobs by keyword and city?

Yes. Add titles or skills in `searchQueries` and Indian cities in `locations`. Every query is searched in every location; leave `locations` empty for a nationwide search. `sortBy`, `freshness`, and `workMode` apply to those keyword searches.

#### Can I schedule Naukri Job Scraper to run automatically?

Yes. Open the **Scheduler** tab in Apify Console and set a recurring cadence — daily with `freshness` = `"1"` for new listings, weekly with `freshness` = `"7"` for a market sweep. Create separate schedules per query and city.

#### What counts as one result?

A job row is one `dataset-item` at **$3.00 per 1,000 jobs**. **Scrape Job Details** adds a `job-details` event per enriched job. **Scrape Company Overview** adds a `company-overview` event once per unique company. **Scrape Company Reviews** adds a `company-reviews` event per review. A listing-only run charges only the job-row event plus Actor Start.

#### Why are some fields empty?

Full description, skills, education, and `employmentType` are collected only when **Scrape Job Details** is on. Size, headquarters, and followers appear when **Scrape Company Overview** is on. The `reviews` array appears when **Scrape Company Reviews** is on. Naukri also omits salary on many listings.

#### How do I avoid duplicate records?

Within one run, listings are deduplicated by `jobId`. Across runs the Actor appends results and does not merge them. When you combine datasets, keep the first row for each `jobId`. Setting `maxJobs` caps any single run.

#### Do I need a proxy?

The Actor works with the default Apify residential proxy. If a run returns unusually few jobs or keeps timing out, confirm that `proxyConfiguration` uses the RESIDENTIAL group before raising `detailConcurrency`.

#### Can I collect one company's jobs and AmbitionBox reviews?

Yes. Add a Naukri overview URL such as `https://www.naukri.com/infosys-overview-13832` or an AmbitionBox URL such as `https://www.ambitionbox.com/reviews/infosys-reviews` to `companyUrls`. The Actor collects live jobs up to `maxJobs` and, when the toggles are on, attaches overview fields and up to `maxReviewsPerCompany` reviews onto those job rows.

### Related Scraptivo automations

- [LinkedIn Job Scraper](https://apify.com/scraptivo/linkedin-job-scraper) — collect LinkedIn postings for global hiring research alongside Naukri.
- [Glassdoor Jobs Scraper](https://apify.com/scraptivo/glassdoor-jobs-scraper) — add Glassdoor listings, ratings, and salaries to the same recruiting dataset.
- [ZipRecruiter Scraper](https://apify.com/scraptivo/ziprecruiter-scraper) — pull US job boards when you need coverage beyond India.
- [Upwork Jobs Scraper](https://apify.com/scraptivo/upwork-jobs-scraper) — monitor freelance openings that complement full-time Naukri roles.
- [StepStone Jobs Scraper](https://apify.com/scraptivo/stepstone-jobs-scraper) — cover DACH and Benelux job markets with the same workflow.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

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

Job titles, skills, or keywords (e.g. "python developer", "data analyst"). Combined with each Location below. Leave empty when using Start URLs or Company URLs only.

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

Indian cities or regions as shown on Naukri (e.g. "bangalore", "hyderabad", "pune", "remote"). Each query is searched in every location. Leave empty for nationwide search.

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

Naukri search pages or job listing URLs copied from the browser (e.g. https://www.naukri.com/python-developer-jobs-in-bangalore or a /job-listings-... URL). Used in addition to search queries.

## `companyUrls` (type: `array`):

Naukri company pages (e.g. https://www.naukri.com/infosys-overview-13832) or AmbitionBox company pages (e.g. https://www.ambitionbox.com/reviews/infosys-reviews). Live jobs for that company are collected up to Max Jobs. Overview fields and reviews are attached onto those job rows when enabled below.

## `maxJobs` (type: `integer`):

Maximum number of job listings to scrape (0 = unlimited). This is the dataset row cap — company overview fields and reviews are attached onto those job rows, not added as extra rows.

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

How to sort Naukri search results.

## `freshness` (type: `string`):

Only include jobs posted within this window. Applies to keyword/location searches.

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

Filter jobs by work arrangement. Applies to keyword/location searches.

## `scrapeJobDetails` (type: `boolean`):

When enabled, fetch the full job description, skills, education, and apply/view counts (charged separately as job-details). Listing card data is always collected.

## `scrapeCompanyOverview` (type: `boolean`):

When enabled, attach Naukri company profile fields (about, size, headquarters, followers, live job count) onto each job from that company. Charged as company-overview once per unique company.

## `scrapeCompanyReviews` (type: `boolean`):

When enabled, attach AmbitionBox employee reviews as a `reviews` list on each job from that company (up to Max Reviews Per Company). Charged as company-reviews per review. Reviews are not written as separate dataset rows.

## `maxReviewsPerCompany` (type: `integer`):

Maximum AmbitionBox reviews to collect per company when Scrape Company Reviews is enabled (0 = unlimited). Ignored when reviews are disabled.

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

Max parallel job-detail / company requests. Each request can use a fresh residential proxy.

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

Proxy settings for anti-bot protection. Apify Residential is recommended.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "locations": [
    "bangalore"
  ],
  "startUrls": [
    {
      "url": "https://www.naukri.com/python-developer-jobs-in-bangalore"
    }
  ],
  "companyUrls": [],
  "maxJobs": 20,
  "sortBy": "relevance",
  "freshness": "any",
  "workMode": "any",
  "scrapeJobDetails": false,
  "scrapeCompanyOverview": false,
  "scrapeCompanyReviews": false,
  "maxReviewsPerCompany": 20,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing job, company, and review records

## `runStats` (type: `string`):

Aggregate scrape statistics for this run

# 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": [
        "python developer"
    ],
    "locations": [
        "bangalore"
    ],
    "startUrls": [
        {
            "url": "https://www.naukri.com/python-developer-jobs-in-bangalore"
        }
    ],
    "maxJobs": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/naukri-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": ["python developer"],
    "locations": ["bangalore"],
    "startUrls": [{ "url": "https://www.naukri.com/python-developer-jobs-in-bangalore" }],
    "maxJobs": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/naukri-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": [
    "python developer"
  ],
  "locations": [
    "bangalore"
  ],
  "startUrls": [
    {
      "url": "https://www.naukri.com/python-developer-jobs-in-bangalore"
    }
  ],
  "maxJobs": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/naukri-scraper --silent --output-dataset

```

## MCP server setup

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