# Naukri Job Scrapper (`dineshwadhwani/naukri-job-scrapper`) Actor

Scrape job listings from Naukri.com by keyword, location, experience, and freshness. Extract structured data such as job title, company, salary, experience, location, skills, posting date, and job URL for hiring pipelines, market research, and lead generation.

- **URL**: https://apify.com/dineshwadhwani/naukri-job-scrapper.md
- **Developed by:** [Dinesh Kumar Wadhwani](https://apify.com/dineshwadhwani) (community)
- **Categories:** AI, Automation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.10 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Jobs Scraper — Multi-Role, Multi-Location, API-Native

Extract structured job listings from Naukri.com — India's largest job board — in seconds. No browser. No HTML parsing. Direct JSON API access.

Built for recruiters, data teams, and developers who need clean, deduplicated Naukri job data fast. This Actor hits Naukri's own internal search API (`/jobapi/v3/search`) — the same endpoint their website uses — returning fully structured JSON with salary, experience, skills, and work mode as first-class fields, not scraped text.

---

### Why this Actor

| | This Actor | Typical Naukri browser-based scrapers |
|---|---|---|
| ⚙️ Approach | Direct JSON API — no browser | Playwright / Selenium + HTML parsing |
| ⏱ Speed | Seconds | Minutes |
| 💰 Cost | Fraction of a cent | $0.01–$0.05+ per run |
| 🧠 Memory | 128–256 MB | 512–1024 MB |
| 📦 Data quality | Structured fields (salary, exp, skills) | Scraped text, often messy |
| 🔁 Deduplication | Global, across all locations | Usually per-location only |
| 🔍 Multi-role search | Yes — up to 3 roles combined | Rarely |

No Chromium. No rendering. No fragile CSS selectors. Just Naukri's own API, called directly.

---

### What it does

This Actor searches Naukri's job listings using:

- **Up to 3 roles** — combined into a single keyword query
- **Up to 3 skills** — appended as supporting keywords
- **Up to 3 locations** — one API call per location, results pooled globally
- **One time frame** — last 24 hours, 48 hours, 7 days, or 15 days

Results are automatically deduplicated by job ID across all locations. The run stops the moment **100 unique jobs** are collected.

---

### What you get that other Naukri scrapers don't

Because this Actor uses Naukri's JSON API rather than scraping HTML, every job record includes **structured fields that HTML scrapers have to guess at**:

- **Salary** — as a labelled band (e.g. "10-15 Lakhs"), not scraped from description text
- **Experience** — structured range, not a string extracted from a paragraph
- **Skills** — clean array, not a comma-split of a messy tag cloud
- **Work mode** — `Work from office`, `Remote`, or `Hybrid` as a clean enum
- **Total available jobs** — logged per location so you know how many results exist vs how many were collected

---

### Input

| Field | Type | Required | Limit | Description |
|---|---|---|---|---|
| `roles` | `string[]` | ✅ Yes | 3 | Job titles to search for (e.g. `"VP Engineering"`, `"Data Scientist"`) |
| `skills` | `string[]` | No | 3 | Supporting keywords (e.g. `"Python"`, `"AWS"`, `"SaaS"`) |
| `locations` | `string[]` | ✅ Yes | 3 | Indian cities or regions (e.g. `"Bangalore"`, `"Mumbai"`, `"Pune"`) |
| `timeFrame` | `string` | No | — | `1` = 24h · `2` = 48h · `7` = 7 days · `15` = 15 days · `""` = any time |

#### Example — Senior engineering leadership across India

```json
{
  "roles": ["VP Engineering", "Head of Engineering", "Engineering Director"],
  "skills": ["SaaS", "Platform"],
  "locations": ["Bangalore", "Pune", "Hyderabad"],
  "timeFrame": "7"
}
````

This runs **3 API calls** (one per location), each searching for:

```
VP Engineering Head of Engineering Engineering Director SaaS Platform
```

#### Example — Data science roles

```json
{
  "roles": ["Data Scientist", "ML Engineer"],
  "skills": ["Python", "PyTorch"],
  "locations": ["Bangalore", "Mumbai"],
  "timeFrame": "1"
}
```

***

### Output

Each result is a clean, flat JSON record saved to the Apify dataset:

```json
{
  "jobId": "4426507200",
  "title": "Vice President - Engineering",
  "company": "Acme Corp",
  "location": "Bengaluru",
  "experience": "10-15 Yrs",
  "salary": "25-50 Lakhs",
  "workMode": "Hybrid",
  "skills": ["Node.js", "AWS", "Microservices", "Leadership"],
  "postedAt": "2026-07-01",
  "updatedAt": "2026-07-01",
  "link": "https://www.naukri.com/job-listings-vp-engineering-acme-bangalore-10-to-15-years-010726001234",
  "searchLocation": "Bangalore",
  "searchKeywords": "Vice President Engineering SaaS",
  "roles": ["VP Engineering"],
  "inputSkills": ["SaaS"]
}
```

| Field | Description |
|---|---|
| `jobId` | Naukri's internal job ID — used as deduplication key |
| `title` | Job title as listed |
| `company` | Hiring company name |
| `location` | Location(s) as returned by Naukri's API |
| `experience` | Required experience range (e.g. `"5-10 Yrs"`) |
| `salary` | Salary band if disclosed (e.g. `"15-25 Lakhs"`). Null if hidden — common on Naukri |
| `workMode` | `Work from office`, `Remote`, or `Hybrid` |
| `skills` | Array of required skills from the job listing |
| `postedAt` | Date the job was first posted |
| `updatedAt` | Date the job was last updated |
| `link` | Direct URL to the job listing on Naukri |
| `searchLocation` | Which of your input locations produced this result |
| `searchKeywords` | The combined keyword string sent to Naukri's API |
| `roles` | Echo of your input roles |
| `inputSkills` | Echo of your input skills |

***

### How it works (technical)

This Actor uses Crawlee's `HttpCrawler` to call Naukri's internal JSON search API directly:

```
GET https://www.naukri.com/jobapi/v3/search
  ?noOfResults=20
  &urlType=search_by_key_loc
  &searchType=adv
  &keyword=<combined roles and skills>
  &location=<city>
  &pageNo=<n>
  &jobAge=<timeframe>
  &src=directSearch
```

This is the same endpoint Naukri's own website calls on every search — discovered via live DevTools inspection of Naukri's network requests. It returns `application/json` directly with structured fields for every job card.

**Pagination strategy:**

1. First response includes `noOfJobs` — the total result count for that query.
2. Pages are requested sequentially at 20 jobs per page.
3. Pagination stops when: the global 100-job cap is hit, a page returns no new unique results, or all available pages are exhausted.
4. All results are deduplicated globally using `jobId`.

**Cost model:** A run with 3 locations hitting 5 pages each fires **15 HTTP requests total** — no browser launch, no rendering, no JS execution. Memory usage is minimal (128MB is sufficient).

***

### Performance

Because this Actor calls Naukri's JSON API directly with no browser involved:

- Typical run with 2 locations, last 7 days: **under 30 seconds**
- Memory needed: **128 MB** (set this in your Apify actor settings — well below the 512MB default)
- Cost per run: **well under $0.001** for most searches

> 💡 **Tip:** Set memory to **128 MB** in your Apify actor settings. This Actor makes plain HTTP requests and needs almost no RAM — dropping from 512MB to 128MB cuts cost by 75%.

***

### Use cases

- **Recruiters & talent teams** — daily monitoring of VP/Director/Head-of roles across Bangalore, Mumbai, and Pune
- **HR analytics** — track salary bands and experience requirements by role over time
- **Job seekers** — automated daily alerts for fresh listings matching your title and skills
- **Market researchers** — benchmark hiring velocity, in-demand skills, and salary trends across Indian cities
- **AI pipelines** — feed structured job data into LLM workflows for candidate matching, JD summarisation, or market intelligence
- **Compensation benchmarking** — extract salary band data at scale (where disclosed) across companies and roles

***

### Scheduling & automation

Pair with Apify's scheduler for fully automated job monitoring:

1. Open the Actor and click **Schedule**
2. Set cron (e.g. `0 8 * * *` for 8am IST daily)
3. Use `timeFrame: "1"` (last 24 hours) to only collect fresh listings each run
4. Connect the dataset to Google Sheets, a webhook, or a downstream Apify Actor

***

### Limitations

- Returns up to **100 unique jobs per run**. For higher volumes, split searches across multiple runs with different role or location sets.
- **Salary is null for most listings** — Naukri allows companies to hide salary, and 60–80% do. This is a Naukri platform constraint, not an Actor limitation.
- Naukri's API structure can change without notice. If results drop to 0, check the run log — JSON parse errors will surface immediately.
- This Actor does not visit individual job detail pages. Full job descriptions are not included — only the data available in Naukri's search result API response.

***

### FAQ

**Does this require a Naukri account?**
No. The Actor uses Naukri's public search API — the same data any anonymous visitor sees.

**Why is salary null on most results?**
Naukri allows employers to hide salary — most do. This is a Naukri platform policy, not something the Actor can work around.

**Can I search for remote jobs across India?**
Yes — add `"Remote"` as one of your locations, or include it as a skill keyword.

**How is this different from other Naukri scrapers on the Apify Store?**
Most Naukri scrapers use Playwright or Selenium to render the full page and parse HTML — which is slow, expensive, and breaks whenever Naukri updates its CSS. This Actor calls Naukri's internal JSON API directly, making it faster, cheaper, and more resilient.

**Is this Actor maintained?**
Yes — actively maintained. If Naukri changes their API structure, an update ships promptly.

***

### Input schema reference

```json
{
  "roles": ["VP Engineering", "Head of Engineering"],
  "skills": ["SaaS", "B2B"],
  "locations": ["Bangalore", "Pune"],
  "timeFrame": "7"
}
```

`timeFrame` values:

| Value | Meaning |
|---|---|
| `1` | Last 24 hours |
| `2` | Last 48 hours |
| `7` | Last 7 days |
| `15` | Last 15 days |
| `""` (empty) | Any time |

# Actor input Schema

## `roles` (type: `array`):

Add up to 3 job titles or roles to search for (e.g. "Software Engineer", "Data Analyst"). At least one is required.

## `skills` (type: `array`):

Add up to 3 supporting skills or keywords (e.g. "Python", "AWS", "React"). Optional — appended to the role in the search query.

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

Add up to 3 cities or regions to search in (e.g. "Bangalore", "Mumbai", "Pune"). At least one is required.

## `timeFrame` (type: `string`):

Only return jobs posted within this time window.

## Actor input object example

```json
{
  "timeFrame": "1"
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dineshwadhwani/naukri-job-scrapper").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("dineshwadhwani/naukri-job-scrapper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 dineshwadhwani/naukri-job-scrapper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dineshwadhwani/naukri-job-scrapper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Naukri Job Scrapper",
        "description": "Scrape job listings from Naukri.com by keyword, location, experience, and freshness. Extract structured data such as job title, company, salary, experience, location, skills, posting date, and job URL for hiring pipelines, market research, and lead generation.",
        "version": "0.0",
        "x-build-id": "c9DJyv663YoLwDfkd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dineshwadhwani~naukri-job-scrapper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dineshwadhwani-naukri-job-scrapper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dineshwadhwani~naukri-job-scrapper/runs": {
            "post": {
                "operationId": "runs-sync-dineshwadhwani-naukri-job-scrapper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dineshwadhwani~naukri-job-scrapper/run-sync": {
            "post": {
                "operationId": "run-sync-dineshwadhwani-naukri-job-scrapper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "roles",
                    "locations"
                ],
                "properties": {
                    "roles": {
                        "title": "Job Role(s)",
                        "minItems": 1,
                        "maxItems": 3,
                        "type": "array",
                        "description": "Add up to 3 job titles or roles to search for (e.g. \"Software Engineer\", \"Data Analyst\"). At least one is required.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "skills": {
                        "title": "Skill(s)",
                        "maxItems": 3,
                        "type": "array",
                        "description": "Add up to 3 supporting skills or keywords (e.g. \"Python\", \"AWS\", \"React\"). Optional — appended to the role in the search query.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Location(s)",
                        "minItems": 1,
                        "maxItems": 3,
                        "type": "array",
                        "description": "Add up to 3 cities or regions to search in (e.g. \"Bangalore\", \"Mumbai\", \"Pune\"). At least one is required.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "timeFrame": {
                        "title": "Time Frame",
                        "enum": [
                            "",
                            "1",
                            "2",
                            "7",
                            "15"
                        ],
                        "type": "string",
                        "description": "Only return jobs posted within this time window.",
                        "default": "1"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
