# Naukri Scraper — Jobs, Salaries & Companies (`tortuga/naukri-scraper`) Actor

Scrape Naukri.com jobs by keyword, location, filters or search URL: title, company, rating, experience, salary in lakhs, skills, applicants, full description.

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

## Pricing

from $1.00 / 1,000 job scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Scrape job listings from **Naukri.com**, India's largest job site, by keyword, location and Naukri's own filters (experience, salary, freshness, work mode, company type), or from any Naukri search, company or job URL. Every job comes with the company's AmbitionBox rating, the experience range, the salary as text and as numbers (INR and lakhs per year), locations, work mode, skills and the posted date. Turn on **Include full job details** for the full description, role, industry, department, education, applicants count and the company profile.

Export to JSON, CSV or Excel, or pull the data through the API into Google Sheets, your ATS, a BI tool or an LLM pipeline. No login and no browser: the actor reads the same JSON API the Naukri website uses, so it is fast and cheap.

### What data does Naukri Scraper extract?

| Field | Description |
|---|---|
| `jobId`, `url` | Naukri job id and job page URL |
| `title` | Job title |
| `companyName`, `companyId`, `companyUrl`, `companyLogo` | Hiring company (or the consultant that posted the job) and its Naukri page |
| `companyRating`, `companyReviewsCount`, `companyReviewsUrl` | AmbitionBox rating (1-5), number of employee reviews, reviews page |
| `experienceText`, `experienceMin`, `experienceMax` | Experience required, e.g. "2-7 Yrs" -> 2 and 7 |
| `salaryText` | Salary as Naukri shows it, e.g. "4.5-9.5 Lacs PA" or "Not disclosed" |
| `salaryDisclosed`, `salaryMin`, `salaryMax`, `salaryMinLakhs`, `salaryMaxLakhs`, `salaryCurrency`, `salaryPeriod` | Parsed salary range in INR and in lakhs (per year unless `salaryPeriod` says month) |
| `location`, `locations` | Location text and the list of cities |
| `workMode` | `office`, `hybrid` or `remote` |
| `skills` | Skills / tags on the job |
| `description` | Job description text (full for most jobs; with details always the full text) |
| `postedAt`, `postedAgo` | Posting time (UTC, ISO 8601) and Naukri's label such as "2 Days Ago" |
| `walkIn`, `walkInDetails` | Walk-in drive flag; dates, timing, venue, map link and the contact the employer published |
| `consultant`, `hiringFor` | Posted by a recruitment consultant, and the client named in the ad |
| `openings` | Number of openings, when given |
| `applyOnCompanySite`, `applyUrl` | Jobs that are applied for on the employer's own site, with that URL |
| `diversity` | Diversity tags such as "women" |
| `source` | `naukri` (posted on Naukri) or `company career site` (Naukri lists it from the employer's site) |
| `searchKeyword`, `searchLocation`, `searchUrl`, `scrapedAt` | Which search found the job, and when |

With **Include full job details** each job also gets:

| Field | Description |
|---|---|
| `description`, `descriptionHtml` | Full job description as text and HTML |
| `highlights` | Naukri's "Job highlights" bullet points |
| `role`, `roleCategory`, `industry`, `department`, `employmentType` | E.g. "Full Stack Developer", "Software Development", "IT Services & Consulting", "Engineering - Software & QA", "Full Time, Permanent" |
| `education` | Required UG / PG / doctorate degrees |
| `keySkills` | Skills Naukri marks as preferred |
| `applicantsCount` | Applicants so far |
| `localities` | Areas within the city, when given |
| `companyDescription`, `companyWebsite`, `companyAddress` | The company profile shown on the job page |
| `detailsFetched`, `detailError` | Whether the job page was read (expired jobs get a `detailError`) |

### How to scrape Naukri jobs

1. Enter one or more **Keywords** (e.g. `python developer`, `sales manager`) and an optional **Location** (`Bangalore`, `Delhi / NCR`, `Mumbai`...). Or paste Naukri URLs into **Start URLs**.
2. Optionally set filters: experience, salary ranges, freshness, work mode, company type, posted by, sort order.
3. Set **Max jobs** to cap the run and the cost.
4. Click **Start**. Jobs appear in the **Output** tab; download them or use the API.

### Input example

```json
{
  "keywords": ["python developer", "data analyst"],
  "location": "Bangalore",
  "experience": 3,
  "salaryRanges": ["10to15", "15to25"],
  "postedWithinDays": "7",
  "workModes": ["hybrid", "remote"],
  "sortBy": "date",
  "maxItems": 500,
  "includeDetails": false
}
```

Start URLs work with any filters you set on the site, for example `https://www.naukri.com/python-developer-jobs-in-bangalore?experience=3&jobAge=7`, a company page `https://www.naukri.com/<company>-jobs-careers-<id>`, or a single job page `https://www.naukri.com/job-listings-...-091026022394`.

### Output example

```json
{
  "jobId": "091026022394",
  "title": "Sales Manager/Executive",
  "companyName": "Minitek Systems (india)",
  "companyUrl": "https://www.naukri.com/minitek-systems-india-jobs-careers-124316716",
  "companyRating": 3.8,
  "companyReviewsCount": 80,
  "experienceText": "2-7 Yrs",
  "experienceMin": 2,
  "experienceMax": 7,
  "salaryText": "2-7 Lacs PA",
  "salaryDisclosed": true,
  "salaryMin": 200000,
  "salaryMax": 700000,
  "salaryMinLakhs": 2,
  "salaryMaxLakhs": 7,
  "salaryCurrency": "INR",
  "salaryPeriod": "year",
  "location": "Mumbai (All Areas), Pune, Bengaluru",
  "locations": ["Mumbai (All Areas)", "Pune", "Bengaluru"],
  "workMode": "office",
  "skills": ["Enterprise Business", "IT Hardware Sales", "Network Sales", "Government Sales", "Business Development"],
  "postedAt": "2026-10-09T08:52:09Z",
  "postedAgo": "1 Day Ago",
  "walkIn": false,
  "consultant": false,
  "openings": 10,
  "source": "naukri",
  "url": "https://www.naukri.com/job-listings-sales-manager-executive-minitek-systems-india-pune-bengaluru-mumbai-all-areas-2-to-7-years-091026022394",
  "role": "Sales Head (B2B)",
  "roleCategory": "Enterprise & B2B Sales",
  "industry": "Hardware & Networking",
  "department": "Sales & Business Development",
  "employmentType": "Full Time, Permanent",
  "education": { "ug": ["Any Graduate"], "pg": [], "doctorate": [], "text": null },
  "applicantsCount": 13,
  "highlights": ["Experience in IT hardware, networking, security, surveillance, and managed services sales"],
  "detailsFetched": true
}
```

### How many jobs can I get per search?

Naukri shows at most 150 pages of 20 jobs (3,000 jobs) for any search. When you ask for more and **Collect more than 3,000 jobs per search** is on (default), the actor splits the search by department, work mode, poster type and industry (Naukri's own filters) and keeps the jobs it has not seen yet, so a search like "python developer" in Bangalore (10,000+ jobs) can be collected far beyond 3,000. Several keywords run one after another; use **Max jobs per search** to share the budget.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (Apify Console -> Schedules), for example every morning. Each run remembers the jobs earlier runs of the same search returned and outputs only jobs that are new or whose title or salary changed; unchanged jobs are not output and not charged (and their job pages are not opened). Output items get `changeType` (`new` or `changed`) and, for changed jobs, `previousValues` with the old title or salary. Sort by date so the watch window covers the newest jobs, and use **Monitoring key** to keep several schedules on the same search apart.

### Can I get salaries from Naukri?

Yes, whenever the employer discloses them: in our test runs 26-61% of jobs per search showed a salary (accountant 47%, sales manager in Mumbai 61%), while IT searches such as "python developer" in Bangalore mostly say "Not disclosed". `salaryText` keeps Naukri's wording, and `salaryMin` / `salaryMax` give the numbers in rupees per year (plus `salaryMinLakhs` / `salaryMaxLakhs`), so you can sort and chart them directly. Jobs marked "Not disclosed" have `salaryDisclosed: false` and empty numbers. The **Salary** filter uses Naukri's own salary buckets.

### Can I scrape all jobs of one company?

Yes: open the company's jobs page on Naukri (`https://www.naukri.com/<company>-jobs-careers-<id>`) and paste the URL into **Start URLs**, or use the company name as a keyword.

### Does it work without login?

Yes. Everything comes from the public job search and job pages that anyone can open without a Naukri account. Recruiter contact details that Naukri shows only to logged-in job seekers are not collected.

### Pricing

Pay per event, no subscription:

- **$0.001 per job** saved (all search fields above).
- **+$0.001 per job page** when **Include full job details** is on, or for each job URL in Start URLs.

1,000 jobs cost $1.00, or $2.00 with full details. Apify platform usage is small: about $0.007 per 1,000 jobs (search pages) in our tests. Monitoring runs only charge for new or changed jobs.

### Proxy note

The default Apify Proxy (datacenter) works for Naukri's job API. One request returns up to 20 jobs (about 70 KB), so proxy traffic is negligible. If Naukri asks for a captcha on a request (HTTP 406), the actor retries it on another IP automatically; switch to RESIDENTIAL only if a run log shows many of those.

### Integrations and API

Use the results in Make, Zapier, n8n, Google Sheets or Airtable, or call the actor from Python / Node.js with the Apify client (see the **API** tab). Schedules plus **Only new or changed items** give you a daily feed of new Naukri jobs for a keyword and city.

### Is it legal to scrape Naukri.com?

The actor reads only data that Naukri shows publicly without login: job ads, company names and ratings, and the walk-in contact details that employers publish for candidates. It does not log in, does not collect job seeker profiles, and does not collect anything hidden behind a click or a login. You are responsible for how you use the data and for complying with Naukri's terms and applicable law (for personal data such as walk-in contact names and phone numbers, e.g. India's DPDP Act or the GDPR).

### Support

Found a bug or need a field? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

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

One search per keyword, as you would type it in Naukri's search box, e.g. "python developer", "sales manager", "data analyst, sql". Leave empty to list every job in the location.

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

City or region as on Naukri, e.g. "Bangalore", "Delhi / NCR", "Mumbai", "Pune, Hyderabad". Leave empty to search all of India.

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

Optional: Naukri URLs with any filters you set on the site, e.g. https://www.naukri.com/python-developer-jobs-in-bangalore?experience=3\&jobAge=7, a company page such as https://www.naukri.com/<company>-jobs-careers-<id>, or single job pages (/job-listings-...), which are output with full details. A URL keeps its own filters; the filter fields below apply to the keyword search.

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

Naukri's Experience filter: jobs whose required range includes this many years. 0 = freshers.

## `salaryRanges` (type: `array`):

Naukri's Salary filter. Pick one or more ranges in INR lakhs per annum; jobs that do not disclose a salary are left out by Naukri when this is set.

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

Only jobs posted within this many days (Naukri's Freshness filter).

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

Only jobs with these work modes. Leave empty for all.

## `companyTypes` (type: `array`):

Naukri's Company type filter. Leave empty for all.

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

Only jobs posted by the hiring company itself, or only jobs posted by recruitment consultants.

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

Relevance (Naukri's default) or newest first. Use date with monitoring to watch the newest jobs.

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

Stop after this many jobs in total (you pay per job saved).

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

Optional cap for each keyword / start URL, so one search does not use the whole Max jobs budget.

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

Open each job for the full description (text and HTML), job highlights, role, role category, industry, department, employment type, education, key skills, applicants count, localities and the company profile (description, website, address). One extra request and one 'detail' event per job.

## `splitLargeSearches` (type: `boolean`):

Naukri shows at most 150 pages (3,000 jobs) of any search. With this on, a bigger search is split by department, work mode, poster type and industry (Naukri's own filters) to reach more of its jobs. Only used when Max jobs asks for more than one search page can give.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new jobs or jobs whose title or salary changed. Use with a Schedule; unchanged jobs are not charged. With this on, Max jobs (and Max jobs per search) is the number of jobs checked per run; sort by date to watch the newest jobs.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

Apify Proxy (datacenter) works for Naukri's job API and costs nothing extra on most plans. Each request returns up to 20 jobs (about 70 KB). Switch to RESIDENTIAL only if you see many blocked responses in the run log.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "location": "Bangalore",
  "sortBy": "relevance",
  "maxItems": 100,
  "includeDetails": false,
  "splitLargeSearches": true,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "keywords": [
        "python developer"
    ],
    "location": "Bangalore",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/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 = {
    "keywords": ["python developer"],
    "location": "Bangalore",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/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 '{
  "keywords": [
    "python developer"
  ],
  "location": "Bangalore",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/naukri-scraper --silent --output-dataset

```

## MCP server setup

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