# Naukri.com Jobs Scraper - India Job Listings (`solidcode/naukri-com-scraper`) Actor

\[💰 $0.95 / 1K] Extract job postings from Naukri.com, India's largest job board. Get the employer, salary in rupees per annum, experience range, skills, degree requirements, work mode, employer ratings and live application counts. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/solidcode/naukri-com-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.95 / 1,000 job postings

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **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.com Jobs Scraper - India Job Listings

Pull job postings from Naukri.com — India's largest job board — at scale, with the employer, salary band, experience range, skills, degree requirements and live application counts on every row. Built for Indian recruitment-tech teams, staffing agencies, HR analytics platforms and compensation researchers who need a clean, structured hiring dataset in JSON or CSV, without babysitting a job-board crawler or copy-pasting listings one page at a time.

### Why This Scraper?

- **13,586 unique job postings from a single keyword + city search**, walked across 682 pages on one live query. Depth is per search rather than a fixed ceiling, so a broad query keeps returning until the result set is genuinely exhausted.
- **48 fields per job posting** — 26 come back with the search itself, and 22 more when you switch on `enrichDetails`: the full job description, employment type, work mode, vacancy count, structured skills, UG and PG degree requirements, industry and functional area.
- **Live competition signal on every enriched posting.** `applyCount` and `viewCount` came back on 100 of 100 enriched job postings sampled — you can see how contested a role already is before you act on it, which the job page itself never puts in a comparable form.
- **Salary as numbers, not a string you have to unpick.** `salaryMin` and `salaryMax` arrive as whole rupees per annum alongside the site's own label verbatim (`"9-18 Lacs P.A."`). Postings that withhold pay come back empty rather than as ₹0 — a distinction that affects two thirds of the rows in our sample.
- **Employer ratings and review volume on 308 of 500 sampled postings** — an AmbitionBox rating out of 5 plus the review count behind it (Genpact: 3.6 across 43,723 reviews), so you can weigh an employer without a second lookup.
- **Identity fields on 100% of rows** — job ID, job URL, company name, location, posting teaser and company careers page on all 500 postings sampled across 10 Indian metros and 10 job functions. Posting timestamp, experience band and skills text on 499 of 500.
- **Work mode, employment type and every listed city, resolved.** Hybrid / Remote / Work from office mapped from the site's own filter vocabulary on 100 of 100 enriched postings, with the complete multi-city list — not the single truncated line the search card prints — plus structured skills arrays on 96 of 100.
- **Tell consultancy postings from direct-employer ones.** `postedByConsultant` is set on every enriched row and `hiringForClient` names the end client on 17% of search rows, so agency-placed roles are filterable instead of indistinguishable.

### Use Cases

#### Recruitment & Talent Intelligence

- Build a live map of who is hiring for a role in a city, refreshed on a schedule.
- Rank openings by `applyCount` and `viewCount` to find the roles candidates have not saturated yet.
- Separate direct-employer postings from consultancy-placed ones before you plan outreach.
- Track a competitor's hiring by pulling their company careers page postings over time.

#### Compensation & Market Benchmarking

- Build salary bands by role, city and experience level from `salaryMin` / `salaryMax` in rupees per annum.
- Compare disclosed pay for the same job title across Bangalore, Mumbai, Delhi, Chennai, Pune, Hyderabad, Kolkata, Ahmedabad, Jaipur and Noida.
- Correlate advertised pay against the experience band the employer is asking for.
- Feed compensation reviews and offer-benchmarking decks with sourced, dated evidence.

#### Labour-Market & Economic Research

- Measure hiring volume by metro and functional area over time — Naukri is India's largest job board, so the sample is broad.
- Track the spread of remote and hybrid work from the `remoteWorkType` field rather than from job-title guesswork.
- Study skill demand from structured `skills` and `preferredSkills` arrays instead of keyword-matching prose.
- Chart degree requirements (`educationUG`, `educationPG`) by industry and seniority.

#### Sales & Lead Generation

- Identify companies actively growing a function — an open requisition is a budget signal.
- Build target lists filtered by industry, city and employer rating.
- Reach hiring teams through the employer's own careers page and profile URLs carried on every row.
- Time outreach to postings published today using `postedToday` and `postedAt`.

#### Data Enrichment & Integration

- Mirror Naukri.com listings into an ATS, job board or HR-tech product with stable, normalised field names.
- Enrich an existing company list with the roles each is currently advertising.
- Push results straight into Google Sheets, a warehouse or a webhook on every run.
- Deduplicate across several searches automatically — a posting matching more than one search is delivered once.

### Getting Started

#### Simplest run

```json
{
  "maxItems": 100
}
```

#### Paste a filtered search URL from the site

Search on the site, then copy the address bar URL. The keyword and the city travel
with it, so you do not have to spell either out separately.

```json
{
  "searchUrls": [
    "https://www.naukri.com/development-programmer-jobs?k=python&l=bangalore"
  ],
  "maxItems": 500
}
```

#### Several cities at once, with full details

`maxItems` is applied to each search separately, so the run below can return up to 1,500 job postings.

```json
{
  "searchUrls": [
    "https://www.naukri.com/data-scientist-jobs-in-mumbai",
    "https://www.naukri.com/data-scientist-jobs-in-bangalore",
    "https://www.naukri.com/data-scientist-jobs-in-hyderabad"
  ],
  "maxItems": 500,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Naukri.com search result URLs — search on Naukri.com, then paste the address bar URL here. The keyword and city are read from it. Add several to run several searches in one go. |
| `maxItems` | integer | `100` | Maximum job postings per search URL (0 = collect everything each search returns). |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 22 extra fields per job posting. Adds one request per job posting and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every job posting is one dataset row. Enabling `enrichDetails` adds 22 further fields to the same row — there is no second record type to join.

```json
{
  "jobId": "210726017720",
  "title": "Data Scientist",
  "url": "https://www.naukri.com/job-listings-data-scientist-genpact-hyderabad-pune-mumbai-all-areas-5-to-7-years-210726017720",
  "companyName": "Genpact",
  "postedAt": "2026-07-21T07:08:18.994000+00:00",
  "postedLabel": "8 Days Ago",
  "postedToday": false,
  "isWalkIn": false,
  "descriptionSnippet": "Role & responsibilities Design, develop, and deploy machine learning and generative AI models to address business needs. Work with large-scale datasets using Python, SQL, and industry-standard libraries (Scikit-learn, TensorFlow, PyTorch, Keras, AutoML, etc.)…",
  "location": "Hybrid - Mumbai (All Areas), Hyderabad, Pune",
  "salaryMin": 900000,
  "salaryMax": 1800000,
  "salaryCurrency": "INR",
  "companyId": 30975,
  "companyLogo": "https://img.naukimg.com/logo_images/groups/v1/42932.gif",
  "companyCareersUrl": "https://www.naukri.com/genpact-jobs-careers-25103",
  "companyRating": 3.6,
  "companyReviewCount": 43723,
  "companyReviewsUrl": "https://www.ambitionbox.com/reviews/genpact-reviews",
  "hiringForClient": null,
  "applyUrl": null,
  "experienceText": "5-7 Yrs",
  "experienceMin": 5,
  "experienceMax": 7,
  "skillsText": "Gen AI,LLM,Machine Learning,data science,langchain,Artificial Intelligence,RAG,Data",
  "diversityPreference": null,

  "description": "Role & responsibilities Design, develop, and deploy machine learning and generative AI models to address business needs. Develop and fine-tune LLM-based solutions (GPT-3, GPT-4, or similar models) for real-world applications. Ensure data quality, integrity, and compliance with best practices, frameworks, and coding standards. Collaborate with cross-functional teams (engineering, product, business) to translate requirements into AI-driven solutions… Regards, [recruiter name], Talent Acquisition Group, Gurgaon",
  "keyHighlights": "Experience in designing and deploying machine learning and generative AI models, proficiency with Python, SQL, and frameworks like TensorFlow, PyTorch|Design, develop, and deploy AI models; manage projects and teams; mentor juniors",
  "employmentType": "Full Time, Permanent",
  "jobType": "fulltime",
  "vacancy": 1,
  "locations": ["Hyderabad", "Pune", "Mumbai (All Areas)"],
  "remoteWorkType": "Hybrid",
  "salaryText": "9-18 Lacs P.A.",
  "companyDescription": "Genpact (NYSE: G) is a global professional services firm focused on delivering digital transformation for our clients, putting digital and data to work to create competitive advantage…",
  "companyAddress": "Genpact Building DLF City, Phase V Sector Road, Sector 53, Gurgaon, Haryana, India",
  "companyWebsite": null,
  "companyProfileUrl": "https://www.naukri.com/genpact-overview-42932",
  "postedByConsultant": false,
  "skills": ["data science", "langchain", "Artificial Intelligence", "RAG"],
  "preferredSkills": ["Gen AI", "LLM", "Machine Learning"],
  "educationUG": ["Any Graduate"],
  "educationPG": null,
  "industry": "IT Services & Consulting",
  "functionalArea": "Data Science & Analytics",
  "applyCount": 1222,
  "viewCount": 2026,
  "referenceCode": null
}
```

This is a real job posting captured during testing. The recruiter's name has been replaced with a placeholder, and the long text fields are shortened with `…` so the example stays readable — everything else is exactly as delivered.

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Job ID |
| `title` | string | Job title |
| `url` | string | Job URL |
| `companyName` | string | Company |
| `postedAt` | string | Posted at (UTC) |
| `postedLabel` | string | Posted (relative) |
| `postedToday` | boolean | Posted today |
| `isWalkIn` | boolean | Walk-in interview |
| `descriptionSnippet` | string | Description snippet |

#### Price & Value & Location

| Field | Type | Description |
|-------|------|-------------|
| `salaryMin` | number | Minimum salary (INR/year) |
| `salaryMax` | number | Maximum salary (INR/year) |
| `salaryCurrency` | string | Currency |
| `location` | string | Location |

#### Contacts

| Field | Type | Description |
|-------|------|-------------|
| `companyId` | number | Company ID |
| `companyLogo` | string | Company logo |
| `companyCareersUrl` | string | Company careers page |
| `companyRating` | number | Employer rating |
| `companyReviewCount` | number | Employer review count |
| `companyReviewsUrl` | string | Employer reviews URL |
| `hiringForClient` | string | Hiring for |
| `applyUrl` | string | Employer apply URL |

#### Details & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `experienceText` | string | Experience required |
| `experienceMin` | number | Min experience (years) |
| `experienceMax` | number | Max experience (years) |
| `skillsText` | string | Skills (comma-separated) |
| `diversityPreference` | string | Diversity preference |

#### With `enrichDetails` enabled

| Field | Type | Description |
|-------|------|-------------|
| `description` | string | Full job description |
| `keyHighlights` | string | Key highlights |
| `employmentType` | string | Employment type |
| `jobType` | string | Job type |
| `vacancy` | number | Openings |
| `locations` | array | Locations |
| `remoteWorkType` | string | Work mode |
| `salaryText` | string | Salary (as shown) |
| `companyDescription` | string | About the company |
| `companyAddress` | string | Company address |
| `companyWebsite` | string | Company website |
| `companyProfileUrl` | string | Company profile page |
| `postedByConsultant` | boolean | Posted by consultancy |
| `skills` | array | Skills |
| `preferredSkills` | array | Preferred skills |
| `educationUG` | array | Undergraduate requirement |
| `educationPG` | array | Postgraduate requirement |
| `industry` | string | Industry |
| `functionalArea` | string | Function |
| `applyCount` | number | Applications |
| `viewCount` | number | Views |
| `referenceCode` | string | Employer reference code |

### Tips for Best Results

- **Salary disclosure swings hard by city *and* by function — plan the query around it.** In our 500-posting sample, pay figures were present on 82% of Jaipur customer-support postings but only 14% of Chennai mechanical-engineer ones. Many Indian employers withhold pay outright, and the rate depends on both variables, so there is no single average worth quoting. If you are benchmarking compensation, widen the search and work from the disclosed subset rather than assuming a fixed hit rate.
- **Depth is per search, not a global cap.** One keyword + city query returned 13,586 unique postings over 682 pages; a narrower query simply ends sooner. To go wider, run several focused searches rather than one broad search with a very large `maxItems`.
- **`maxItems` counts per search URL.** Ten search URLs at `maxItems: 500` is up to 5,000 rows, not 500 — size your run on the product of the two.
- **Leave `enrichDetails` off for discovery and switch it on for shortlists.** The search tier already carries 26 fields including title, company, location, experience band and skills text. Enrichment adds one request per posting and bills at the higher rate, so it pays to narrow first and enrich second.
- **Rank on `applyCount` against `viewCount`, don't just read them.** Both came back on 100 of 100 enriched postings. A role sitting at 1,222 applications against 2,026 views is saturated; one at 4 applications against 61 views is not — that ratio is the fastest signal in the dataset.
- **A missing employer rating means "not rated", not "rated badly".** 308 of 500 sampled postings carried one, ranging from 78% of Mumbai data-scientist postings down to 34% of Jaipur customer-support ones. Newer and smaller employers are simply absent from the review data.
- **A pasted URL carries the keyword and the city, and nothing else.** Any extra filters you set on the site — experience, salary band, freshness — are not read from the URL, so treat the pasted search as "this role, this city" and filter the rest in your own pipeline from the fields on each row.

### Pricing

**From $0.95 per 1,000 results** (search only) or **from $4.75 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.095 | $0.475 |
| 1,000 | $0.95 | $4.75 |
| 10,000 | $9.50 | $47.50 |
| 100,000 | $95.00 | $475.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $1.14 | $5.69 |
| Bronze | $1.07 | $5.37 |
| Silver | $1.01 | $5.06 |
| **Gold and above** | **$0.95** | **$4.75** |

Per 1,000 results.

A "result" is any job posting row in the output dataset. When you run several searches at once, a job posting matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same job posting. The full-details rate applies only to rows that actually came back enriched — if a job posting's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Naukri.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Naukri.com's Terms of Service.

Results may include personal data such as contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them.

# Actor input Schema

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

Naukri.com search result URLs — search on Naukri.com, then paste the address bar URL here. The keyword and city are read from it. Add several to run several searches in one go.

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

Maximum job postings per search URL (0 = collect everything each search returns).

## `enrichDetails` (type: `boolean`):

Add 22 extra fields per job posting. Adds one request per job posting and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [],
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each job posting.

## `financial` (type: `string`):

Price & Value for each job posting.

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

Location for each job posting.

## `contact` (type: `string`):

Contacts for each job posting.

## `meta` (type: `string`):

Details & Timestamps for each job posting.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/naukri-com-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 '{}' |
apify call solidcode/naukri-com-scraper --silent --output-dataset

```

## MCP server setup

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