# Naukri Job Scraper (`goat255/naukri-scraper`) Actor

Scrape Naukri job listings by keyword and location without a login. Search any role, skill, or company across Indian and Gulf locations and get clean structured rows: title, company, salary, experience, skills, location, and a direct apply link. Walks pagination up to your chosen limit.

- **URL**: https://apify.com/goat255/naukri-scraper.md
- **Developed by:** [Goutam Soni](https://apify.com/goat255) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.50 / 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 Job Scraper

Scrape Naukri job listings by keyword and location with no login and no API key required. Search any role, skill, or company across Indian and Gulf locations and get clean structured rows: job title, company, salary, experience, skills, location, posting date, and a direct apply link.

### What it does

- **Keyword job search** by role, skill, or company name (for example `python developer`, `react`, `Acme Co`).
- **Location filtering** across Indian cities and Gulf locations (for example `bangalore`, `mumbai`, `dubai`).
- **Many searches in one run.** Queue multiple keyword and location pairs and process them in parallel.
- **Automatic pagination.** Walks page after page until your per-search limit is reached or results run out.
- **Salary and experience parsing.** Returns both the human label (`14-24 Lacs PA`, `5-10 Yrs`) and numeric min/max values you can filter and sort on. Undisclosed pay returns null instead of a misleading zero.
- **Company ratings.** Includes company rating and review counts when the company has a public profile.
- **Openings count.** Reports the number of advertised vacancies for a role when the listing exposes it.
- **Clean structured output.** Every row follows one stable schema with skills as an array and a deduplicated job id.

No account, no password, no API key. Give it keywords and locations and it returns clean structured job rows.

### Use cases

- **Job board / aggregator** - power a niche, city, or skill-specific job feed with fresh listings.
- **Recruitment lead generation** - source companies actively hiring for a role and build an outreach list.
- **Hiring market research** - track demand for a skill, role, or technology across cities over time.
- **Competitor hiring monitoring** - watch which roles your competitors are recruiting for.
- **Salary benchmarking** - collect advertised salary ranges for a role to benchmark compensation.

### Input

| Field | Type | Description |
|---|---|---|
| `searches` | array | One entry per search. Each entry is an object with a `keyword` (role, skill, or company) and an optional `location`. |
| `keyword` | string | A single keyword, as a shortcut when you only need one search. Combined with `location` below. |
| `location` | string | Location for the single-search keyword. Leave blank to search everywhere. |
| `maxItemsPerSearch` | integer | Maximum jobs returned per search. Default 100. Pagination walks as many pages as needed to reach it. |
| `concurrency` | integer | How many searches to process in parallel. Default 5. |
| `proxyConfig` | object | Proxy configuration. Defaults to Apify residential proxy for reliable large runs. |

#### Example input

```json
{
  "searches": [
    { "keyword": "python developer", "location": "bangalore" },
    { "keyword": "accountant", "location": "dubai" }
  ],
  "maxItemsPerSearch": 200
}
```

### Output

Each job is one dataset row with a stable schema. Sample row:

```json
{
  "type": "job",
  "jobId": "160626017917",
  "title": "DevOps Engineer",
  "url": "https://www.naukri.com/job-listings-devops-engineer-acme-co-160626017917",
  "companyName": "Acme Co",
  "companyId": 15624,
  "companyRating": 3.4,
  "companyReviewsCount": 1516,
  "salaryLabel": "14-24 Lacs PA",
  "minSalary": 1400000,
  "maxSalary": 2400000,
  "currency": "INR",
  "experience": "5-10 Yrs",
  "minExperienceYears": 5,
  "maxExperienceYears": 10,
  "location": "Hyderabad, Bengaluru",
  "openings": 4,
  "skills": ["Docker", "Terraform", "AWS", "CI/CD"],
  "description": "Develop and manage container images...",
  "logo": "https://example.com/logo.png",
  "postedLabel": "1 Day Ago",
  "postedAt": "2026-06-16T00:32:17.000Z",
  "scrapedAt": "2026-06-18T04:10:00.000Z"
}
```

#### Key fields

- **`jobId`, `url`** - stable unique id and the direct apply link for each listing.
- **`salaryLabel` + `minSalary` / `maxSalary`** - the advertised salary as a readable label and as numeric bounds for filtering and sorting. When a listing does not disclose pay, `salaryLabel` reads "Not disclosed" and the numeric fields (and `currency`) are null rather than a misleading zero.
- **`experience` + `minExperienceYears` / `maxExperienceYears`** - required experience as a label and as numeric bounds.
- **`openings`** - number of advertised vacancies for the role, when the listing exposes it.
- **`skills`** - the listing's tagged skills as a clean array.
- **`companyRating`, `companyReviewsCount`** - included when the company has a public profile, null otherwise.
- **`postedAt`** - ISO timestamp of when the job was posted (null for listing types that do not expose it); `postedLabel` always carries the human-readable freshness ("1 Day Ago").

### FAQ

**Do I need a login or API key?**
No. The scraper needs no account, no password, and no API key. Just provide keywords and locations.

**How much does it cost?**
You are billed per job result returned, on top of standard Apify platform usage. There is no per-run start fee. See the Pricing tab on the actor page for the current rate.

**How many jobs can I get?**
Set `maxItemsPerSearch` to your target (up to 50,000 per search). The scraper paginates automatically until it reaches that number or the search is exhausted. Run multiple searches in one go to cover more roles and cities.

**Which locations are supported?**
Indian cities (for example bangalore, mumbai, delhi, pune, hyderabad) and Gulf locations (for example dubai, abu dhabi) all resolve through the same search. Leave `location` blank to search everywhere.

**How fast is it?**
Searches run in parallel (controlled by `concurrency`), and each search streams pages back as it goes. A typical search of a few hundred jobs completes in seconds; large multi-search runs scale with the number of pages walked.

**Why are some salary or rating fields empty?**
Some listings do not advertise a salary, and some companies have no public rating profile. Those fields are returned as null rather than guessed, so your data stays accurate.

**Can I filter by salary or experience?**
Yes. Each row includes numeric `minSalary` / `maxSalary` and `minExperienceYears` / `maxExperienceYears` alongside the readable labels, so you can filter and sort downstream.

### Privacy

To improve our actors we collect anonymized usage telemetry (run stats and input patterns). No personal account data is collected.

# Actor input Schema

## `searches` (type: `array`):

One entry per search. Each entry is an object with a keyword (role, skill, or company) and an optional location. Indian and Gulf locations both work. Example: \[{"keyword": "python developer", "location": "bangalore"}, {"keyword": "accountant", "location": "dubai"}].

## `keyword` (type: `string`):

A single keyword to search, as a shortcut when you only need one. Combined with the Location field below. Leave blank if you are using Searches above. Example: project manager.

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

Location for the single-search keyword above. Leave blank to search everywhere. Example: bangalore, mumbai, dubai.

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

Cap on jobs returned per search. Pagination is walked across multiple pages until this is reached or the search is exhausted.

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

How many searches to process in parallel.

## `proxyConfig` (type: `object`):

Optional proxy. Routing through a rotating proxy improves reliability for large runs.

## Actor input object example

```json
{
  "searches": [
    {
      "keyword": "data analyst",
      "location": "bangalore"
    }
  ],
  "maxItemsPerSearch": 100,
  "concurrency": 5,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "searches": [
        {
            "keyword": "data analyst",
            "location": "bangalore"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("goat255/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 = { "searches": [{
            "keyword": "data analyst",
            "location": "bangalore",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("goat255/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 '{
  "searches": [
    {
      "keyword": "data analyst",
      "location": "bangalore"
    }
  ]
}' |
apify call goat255/naukri-scraper --silent --output-dataset

```

## MCP server setup

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