# Naukri Jobs Scraper: Full Descriptions, Salary & Skills (`quarra/naukri-jobs-scraper`) Actor

Scrape job postings from Naukri.com, India's largest job board: search by keyword and city, or paste search and job links. Full description, skills, salary, experience, company rating, applicants, education, dates. Only new jobs mode for daily runs.

- **URL**: https://apify.com/quarra/naukri-jobs-scraper.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.26 / 1,000 jobs

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 Jobs Scraper: Full Descriptions, Salary & Skills

Get job postings from **Naukri.com**, India's largest job board, by keyword and city, or by pasting the search pages and job
links you already use in your browser, filters included. Each job comes with its full description, skills, experience
range, salary when the employer shows it, company rating and reviews, applicants, views, education, industry and role.
Export as JSON, CSV or Excel, or read it through the Apify API.

**$0.38 per 1,000 jobs** on the free plan, less on paid plans. Duplicates, jobs already delivered to your watch and failed
searches are not charged.

### Why this one

- **The full job description, not the snippet.** Each job page is read: on 1,000 jobs (8 November 2026), every record had
  its full description (median 2,221 characters), 95% had the company's About text, 76% its rating and review count.
  Turn off **Full job details** for the search list only, more than ten times as fast, at the same price.
- **Up to 15,000 jobs per search,** with or without filters: that is what Naukri lists for one search. The run says
  when a search had more, so you can split it by city or keyword.
- **Many searches in one run.** Every keyword is searched in every location; a job found by two searches is delivered
  and charged once, by its Naukri ID.
- **Only new jobs.** Schedule the same searches every day: each run delivers only the jobs it has not delivered before.
  Jobs already delivered are never charged again.
- **No personal data.** Recruiter contact lines are removed from the text fields (`description`, `summary`,
  `companyAbout`): a phone number, a personal e-mail address, a WhatsApp number, or a recruiter's name in a signature
  ("Thanks & Regards, Priya") is replaced by `[removed]`, with the job title line of the signature next to it. A
  company's service address (`careers@…`, `hr@…`) is replaced alone, and the hiring company's own name always stays. On
  9,628 texts from 5,182 real jobs, 322 had a contact passage replaced, and we found no e-mail address, phone number or
  signature name left.
- **Never a silent empty run.** A search that finds nothing, a link that is not a Naukri page, a job that is closed: each
  gets a free error record or a status that says why, and the run summary lists every search with its count.

### Quick start

1. Type one or more **Keywords** (`python developer`, `data analyst`, `Infosys`) and, if you want, **Locations**
   (`Bengaluru`, `Pune`, `Delhi / NCR`, `Remote`).
2. Add filters if you need them: experience, freshness, work mode, salary, posted by, sort order.
3. Click **Start** and read the jobs in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### Inputs

| Field | What it does |
|---|---|
| **Keywords** | One job title, skill or company per line, as you would type it in Naukri's search box (`C++`, `C#`, `.NET` and `Node.js` are searched as typed). Each keyword is searched in each location. |
| **Locations** | Optional, one city per line. Naukri's usual spellings work (`Bangalore` and `Bengaluru`, `Gurgaon` and `Gurugram`); `Remote` lists remote jobs. Several cities on one line, separated by commas (`Pune, Bengaluru`), are one search, as on Naukri. A location with no keyword lists every job there. Empty = all of India. Up to 100 keywords and 100 locations, 500 searches per run. |
| **Search or job links** | A Naukri search page as shown in your browser, with its filters (`https://www.naukri.com/python-developer-jobs-in-pune?experience=3`), a job page, or a job ID alone (`061126008331`). The filters below are added to a pasted search unless the link already sets the same one. A link to a later page of a search reads the whole search, from its first page. |
| **Your experience (years)** | Keeps the jobs whose experience range includes this number, like Naukri's Experience filter (4 keeps 2-4, 3-5 and 4-8 years). |
| **Posted within** | Naukri's Freshness filter: 1, 3, 7, 15 or 30 days. |
| **Work mode** | Office, remote, hybrid, or several of them. |
| **Salary (lakhs per year)** | Naukri's Salary filter, one or more ranges. Naukri also returns jobs that hide their salary for it: they come with an empty salary. |
| **Posted by** | The hiring company itself, or a recruitment consultant (`isConsultantJob`). |
| **Sort by** | Relevance or date, and so which jobs come first when a limit is set. |
| **Full job details** | On (default): each job page is read. Off: only what the search list shows (title, company, locations, experience, salary, skills, short description), more than ten times as fast. Same price. |
| **Only new jobs** + **Watch name** | Deliver only the jobs this watch has not delivered before. Watch names are case-sensitive (`Pune Jobs` and `pune jobs` are two watches); extra spaces are ignored. |
| **Max jobs per search** | Empty = everything Naukri lists for a search (15,000 at most). |
| **Max results** | Total number of jobs of the run, all searches together, counted exactly. |

### Output

One record per job (texts shortened here):

```json
{
  "type": "job",
  "status": "ok",
  "jobId": "281026009236",
  "title": "Data Analyst",
  "company": "Floww.ai",
  "companyId": 124647838,
  "companyUrl": "https://www.naukri.com/floww-ai-jobs-careers-124647838",
  "companyLogoUrl": "https://img.naukimg.com/logo_images/groups/v1/9776450.gif",
  "companyRating": 4.4,
  "companyReviewsCount": 2,
  "companyReviewsUrl": "https://www.ambitionbox.com/reviews/floww-dot-ai-reviews",
  "locations": ["Hyderabad"],
  "workplaceType": "office",
  "experienceMin": 0,
  "experienceMax": 1,
  "experienceText": "0-1 Yrs",
  "salaryMin": 350000,
  "salaryMax": 475000,
  "salaryCurrency": "INR",
  "salaryPeriod": "year",
  "salaryVariablePercent": null,
  "salaryText": "3.5-4.75 Lacs P.A.",
  "salaryDisclosed": true,
  "skills": ["SQL", "Bigquery", "Looker Studio", "Power BI", "Google Sheets"],
  "employmentType": "Full Time, Permanent",
  "industry": "IT Services & Consulting",
  "department": "Data Science & Analytics",
  "roleCategory": "Data Science & Analytics - Other",
  "role": "Data Science & Analytics - Other",
  "education": {"graduate": ["Any Graduate"], "postgraduate": null, "doctorate": null},
  "vacancies": 2,
  "applicants": 17882,
  "views": 34433,
  "postedAt": "2026-10-28T07:39:14Z",
  "isConsultantJob": false,
  "isWalkIn": false,
  "appliesOnCompanySite": false,
  "summary": "Graduate from Top 100 NIRF colleges with advanced SQL (BigQuery) and BI tools (Looker Studio, Power BI) expertise…",
  "description": "About Us\n\nWe're Deepwork Technologies, the team behind Floww.ai, an AI-powered platform…",
  "hasFullDescription": true,
  "companyAbout": "About Company:\n\nFounded by IIT Kharagpur and BITS alumni, Floww.ai is an innovative early-stage B2B SaaS startup…",
  "url": "https://www.naukri.com/job-listings-data-analyst-floww-ai-hyderabad-0-to-1-years-281026009236",
  "input": "data analyst | Hyderabad",
  "position": 12,
  "scrapedAt": "2026-11-08T07:46:27Z"
}
```

- `salaryMin` and `salaryMax` are yearly amounts, usually in INR. Most employers on Naukri hide the salary: then
  `salaryDisclosed` is `false` and the salary fields are `null` (11% of 1,000 jobs showed one on 8 November). An unpaid
  internship has `salaryMin` and `salaryMax` at 0.
- `workplaceType` is `office`, `remote` or `hybrid`, as Naukri files the job.
- `applicants` and `views` are Naukri's counters on the day of the run.
- `description` is plain text with one paragraph or list item per line. Without **Full job details**, `description`
  holds the short description of the search list and `hasFullDescription` is `false`; `education`, `industry`,
  `department`, `role`, `employmentType`, `isConsultantJob`, `applicants`, `views` and `companyAbout` come with the job
  page only, and `workplaceType` is empty for most jobs.
- With **Only new jobs**, each job also has `"isNew": true`.

Error records (free) have `type: "error"`, an `errorCode`, a clear `error` message and `retryable`. The run summary
(OUTPUT record) gives, per search, the jobs delivered and a note.

### Pricing

Pay per event:

| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Job | $0.38 per 1,000 | $0.34 per 1,000 | $0.30 per 1,000 | $0.26 per 1,000 |
| Run start (per GB of memory) | $0.00095 | $0.00085 | $0.00075 | $0.00065 |

The default memory is 256 MB, so a run starts at one start event. Never charged: a job found by more than one search,
jobs already delivered to your watch, error records. Set **Maximum cost per run** in the run options and the run stops
before going over it.

### What we measured

On 8 November 2026, on Apify, with 256 MB of memory:

- **Speed**: the default input (python developer in Bengaluru, 50 jobs) in 10 seconds; 1,000 jobs with full details
  in 4 minutes 40 seconds; 2,794 jobs from the search lists only, with a filter, in 58 seconds.
- **Several searches in one run**: "data analyst" in Hyderabad and in Pune gave 1,000 jobs, every job ID distinct; 8
  jobs listed by both searches were delivered and charged once. The "java developer" searches of the same run were not
  read, because the run's limit of 1,000 jobs was reached first, and the run summary says so for each of them.
- **Search links**: a pasted Pune search with `experience=3` gave 118 jobs, all in Pune, all with 3 years inside their
  experience range. A link to another site got a free error record.
- **Filters**: with "Posted within 7 days", every job with a date was posted 0 to 7 days before the run (India time;
  2,784 of 2,794 jobs, 10 had no date). Posted by a consultant: 20
  recruitment firms out of 20; by the company: Infosys, HCLTech, Capgemini, Airtel.
- **Only new jobs**: three runs of the same watch on "react developer" in Chennai delivered 300, then 838, then 43 jobs.
  Not one job was delivered twice.

### Send results to Slack, Notion or Discord

Pick one of your Apify MCP connectors in "Send results to your app" (Notion connects in one click), or paste a Slack, Discord, Make, Zapier or n8n webhook URL. After each successful run, a summary lands there: the number of results, the first 25 with their links, and a link to the full dataset. Schedule the Actor with "Only new jobs" turned on and new results reach your team every day without opening Apify.

### Limits

- Up to 100 keywords and 100 locations per run, and 500 searches (keywords × locations, plus links) in all.
- 15,000 jobs per search: Naukri's own limit. Use several keywords or cities to cover more.
  The run says which searches it cut.
- A watch reads its searches in full, over several runs when a run stops early, then starts again from the first page:
  a new job can appear on any page of a search sorted by relevance. Keep the searches of a watch under the limits above.
- Recruiter names are recognised from lists of Indian and European first names and from the shape of a signature. A
  name written in a sentence with no contact detail and no first name we know can stay.
- The Actor runs with 256 MB of memory, so a run always pays one start event.

### FAQ

**Do I need a Naukri account?** No. The Actor reads the public job pages any visitor sees.

**How does "Only new jobs" work?** The watch remembers every job it delivered, by its Naukri ID. Use the same
**Watch name** in each scheduled run (without a name, the memory belongs to that exact list of searches and filters).
The first run delivers every matching job; the next ones only the jobs not delivered before. A run that stops early
(maxItems, cost limits) is continued by the next run of the watch, from the page where it stopped. One run of a watch at
a time: a run that was stopped abruptly keeps its watch busy for up to 15 minutes.

**Why do I get fewer jobs than Naukri announces?** Naukri lists at most 15,000 jobs per search.
Narrow the search (a city, a more precise keyword) or add searches.

**Is anything different on Apify's free plan?** No. The same searches, fields and limits apply on every plan; only the
price per job changes, as in the table above.

**Why is the start charged per GB?** Apify counts a run's start by its memory. At the default 256 MB, a run pays one
start event.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: jobs already in the
dataset are not delivered or charged again.

**What if Naukri changes its pages?** The run says so in its status and a free error record, instead of reporting
"no jobs", and nothing is charged but the start.

**Is it legal?** It collects public job postings published by employers to be read by anyone. Check the rules that apply
to your use of the data.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error
type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never
your input, your results, your account or the ID of your run.

# Actor input Schema

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

One job title, skill or company per line (python developer, data analyst, Infosys), as you would type it in Naukri's search box (C++, C#, .NET and Node.js are searched as typed). Naukri lists at most 15,000 jobs per search: use several keywords and locations to go further.

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

Optional, one city per line (Bengaluru, Pune, Delhi / NCR, Hyderabad). Naukri's usual spellings work (Bangalore and Bengaluru, Gurgaon and Gurugram). 'Remote' lists remote jobs. Several cities on one line, separated by commas (Pune, Bengaluru), are one search, as on Naukri. A location with no keyword lists every job there. Leave empty to search all of India.

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

One per line: a Naukri search page as shown in your browser, with its filters (https://www.naukri.com/python-developer-jobs-in-pune?experience=3), a job page (https://www.naukri.com/job-listings-…-061126008331), or a job ID alone (061126008331). The filters below are added to a pasted search unless the link already sets the same filter. A link to a later page of a search reads the whole search, from its first page.

## `experienceYears` (type: `integer`):

Optional. Keeps the jobs whose experience range includes this number, like Naukri's Experience filter (4 keeps 2-4, 3-5 and 4-8 years).

## `postedWithin` (type: `string`):

Naukri's Freshness filter.

## `workplace` (type: `array`):

Optional, one or more. Naukri's Work mode filter. Leave empty for all.

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

Optional, one or more. Naukri's Salary filter. Jobs that hide their salary on Naukri can still match: they come with an empty salary.

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

Jobs posted by the hiring company itself or by a recruitment consultant (isConsultantJob).

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

Order in which Naukri lists the jobs, and so which ones come first when a limit is set.

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

On: each job page is read, for the full description, education, industry, department, role, applicants, views and the company's About text. Off: only what the search list shows (title, company, locations, experience, salary, skills, short description), more than ten times as fast. Same price.

## `onlyNew` (type: `boolean`):

Deliver only the jobs this watch has not delivered before. The first run delivers every matching job; the next runs with the same watch name deliver only the jobs not delivered before. Made for scheduled runs: jobs already delivered are never charged again. A run that stops early is continued by the next one.

## `watchName` (type: `string`):

Name of the watch that remembers the jobs already delivered (used with 'Only new jobs'). Optional: without a name, the memory belongs to this exact list of searches and filters. Names are case-sensitive: 'Pune Jobs' and 'pune jobs' are two different watches, and two different names never share a memory. Extra spaces are ignored.

## `maxJobsPerSearch` (type: `integer`):

Leave empty for everything Naukri lists for a search (15,000 at most).

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

Total number of jobs delivered by the run, all searches together, counted exactly.

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

Connection. Keep the default (automatic). Costs are included in the price.

## `deliveryConnector` (type: `string`):

Pick one of your Apify MCP connectors: at the end of each run, a summary of the results (count, the first 25 with their links, a link to the full dataset) is posted there. With a schedule and 'Only new', you get each day's new results where your team works. Nothing is sent when a run finds nothing. Notion connects in one click; Slack and Google need your own OAuth app in Apify, or use the webhook field below.

## `deliveryTarget` (type: `string`):

Slack channel ID (C0123…), Notion page ID, Google Sheet ID… Leave empty if the app needs no target (a new Notion page is then created at the top of your workspace).

## `deliveryWebhookUrl` (type: `string`):

No connector needed. A Slack Incoming Webhook (hooks.slack.com/…) gets a message, a Discord channel webhook gets a message, any other URL receives the summary as JSON (title, text, count, datasetUrl, items).

## `deliveryTool` (type: `string`):

Name of the connector's tool to call. Leave empty: the best tool that posts a message, creates a page or appends rows is picked, and the run log lists every tool the connector offers.

## `deliveryArguments` (type: `object`):

Extra arguments for the tool, merged last, for example {"channel": "#naukri-jobs"} or {"parent": {"database_id": "…"}}.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "locations": [
    "Bengaluru"
  ],
  "postedWithin": "any",
  "postedBy": "any",
  "sortBy": "relevance",
  "includeDetails": true,
  "onlyNew": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every job with all its fields, and free error records.

## `overview` (type: `string`):

A table with one row per job.

## `summary` (type: `string`):

Jobs per search, notes, why the run stopped, and errors.

# 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"
    ],
    "locations": [
        "Bengaluru"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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