# Naukri Jobs Scraper (`neuro-scraper/naukri-jobs-scraper`) Actor

Naukri Scraper SD - Naukri Scraper is a job data tool that extracts Naukri.com job listings by keyword and city: title, company, experience, salary, location, skills, posting date, AmbitionBox rating, plus optional full job details.

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

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Scraper — Naukri.com jobs with experience, salary and skills

The Naukri Scraper searches Naukri.com by keyword and city and returns one row per job: title, company, experience range, salary, location, skills, posting date, vacancies, AmbitionBox rating and reviews and, optionally, the full job details (description, role, industry, department, education, key skills, applicants, views, work mode, company profile).

It works logged out.

#### How it works, and why a browser

Naukri's job APIs answer `406 "recaptcha required"` to a plain HTTP client, because every call needs a token that Naukri's own page script computes. That token is not rebuilt here.

Instead a real headless Chromium opens Naukri's public search page, and the Actor reads the results Naukri's own script loads. Further pages are opened by clicking the page's own "Next" control, as a visitor would.

Only checks a normal browser passes on its own are allowed. A visible challenge or "Access Denied" is never answered: the Actor opens a new browser session (a new proxy IP on Apify) at most 3 times, then stops that search with an error.

#### Input

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | list | `python developer` (prefill) | One Naukri search per line |
| `location` | text | – | City as on Naukri ("bangalore", "pune", "delhi ncr"); empty = all India |
| `experience` | integer | – | Naukri's experience filter, in years |
| `jobAge` | select | `any` | Freshness: 1, 3, 7, 15 or 30 days |
| `startUrls` | URLs | – | Naukri search URLs (`https://www.naukri.com/<keyword>-jobs...`) |
| `scrapeDetails` | boolean | `false` | Open each job page for the full details (about 5 s per job) |
| `maxItems` | integer | `40` | Stop after this many jobs (20 per page) |
| `proxyConfiguration` | proxy | Apify RESIDENTIAL, India | Proxy for the browser |

#### Output

| Field | Meaning |
|---|---|
| `jobId`, `jobUrl`, `title` | Job |
| `companyName`, `companyId`, `logoUrl`, `companyRating`, `companyReviews` | Company with AmbitionBox rating and review count |
| `experience`, `minExperience`, `maxExperience` | "4-6 Yrs" and the numbers |
| `salary`, `salaryMin`, `salaryMax`, `salaryCurrency` | Salary label; numbers only when the employer shows them |
| `location`, `skills`, `descriptionSnippet` | From the search results |
| `postedAgo`, `postedAt`, `vacancies`, `walkIn` | Dates and flags |
| Details: `descriptionText`, `descriptionHtml`, `employmentType`, `role`, `roleCategory`, `industry`, `department`, `education`, `keySkills`, `applicants`, `views`, `workMode`, `companyAbout` | From each job page |
| `searchKeywords`, `searchLocation`, `searchUrl`, `scrapedAt` | `searchUrl` is the results page the row was read from |

#### Measured (2026-10-03, one residential IP in Bangladesh, no proxy)

| Test | Result |
|---|---|
| `python developer`, 40 jobs | 40 rows in 9 s (2 pages, 38,659 jobs on Naukri) |
| `data analyst` / bangalore, 3 years, last 7 days, 100 jobs | 100 rows in 27 s from 5 pages; 100/100 experience ranges include 3 years, all posted within 7 days |
| Pune java search URL, 6 jobs with job details | 6 rows in 38 s, details read for 6/6 |
| Keyword `react, node` / pune | 5 rows; the keyword stays one search |
| Wrong URLs, empty input | Clean stop with an error line |

#### Limits (measured)

- Naukri resets connections (`ERR_HTTP2_PROTOCOL_ERROR`) when one session loads pages in a burst. Pages 3 and 4 opened directly by URL failed this way, while clicking "Next" at 4–7 s intervals read 5 pages in a row.
- Opening the "-2" URL of a filtered search directly made Naukri drop the filters (8,552 jobs instead of 587). That is why pages after the first are opened by clicking "Next".
- Job pages in one session were reset after the first; each job page now gets a fresh browser session (6 of 6 read). Details cost about 5 s per job.
- Logged out, the company website and address in the job details were empty on all 8 jobs checked, so they are not columns.
- The Docker image is Apify's Python + Playwright image; a run needs about 2 GB of memory.

#### Example input

```json
{"keywords": ["data analyst", "business analyst"], "location": "bangalore", "jobAge": "7", "maxItems": 200}
```

# Actor input Schema

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

One Naukri search per line, e.g. "python developer", "data analyst".

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

Indian city as on Naukri, e.g. "bangalore", "pune", "delhi ncr". Empty = all of India.

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

Naukri's experience filter: jobs suitable for this many years of experience.

## `jobAge` (type: `string`):

Naukri's freshness filter.

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

Naukri search result URLs such as https://www.naukri.com/data-analyst-jobs-in-bangalore?k=data%20analyst\&l=bangalore - pages 2, 3 ... are opened by adding -2, -3 to the path, as Naukri does.

## `scrapeDetails` (type: `boolean`):

Also read each job's page for the full description, role, industry, department, education, key skills, applicants, views and company details. One extra page load (2-4 s) per job.

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

Stop after this many jobs (20 per results page).

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

Residential proxy is recommended (Indian IPs work best).

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "jobAge": "any",
  "scrapeDetails": false,
  "maxItems": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/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"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call neuro-scraper/naukri-jobs-scraper --silent --output-dataset

```

## MCP server setup

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