# Naukri Jobs Scraper — salaries in USD, not Lacs (`entrogix_works/naukri-jobs-scraper`) Actor

Scrape Naukri job listings with Indian salary notation (Lacs/Crore) converted to plain rupees and an approximate USD figure, plus the salary disclosure rate so you know how much of the market actually reports pay. Unofficial; not affiliated with Naukri.

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

## Pricing

$5.00 / 1,000 job scrapeds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — salaries in USD, not Lacs

Scrape job listings from Naukri, India's largest job board, with **pay converted out
of Lac/Crore notation** into plain rupees and an approximate USD figure — plus the
**salary disclosure rate**, so you know how much of the market actually reports pay.

> Unofficial. Not affiliated with, endorsed by, or connected to Naukri or Info Edge.

### Why this one

Naukri reports pay the way Indian listings do:

```
2.25-3.5 Lacs PA        1 Lac   =    100,000 INR
1.5-2 Cr PA             1 Crore = 10,000,000 INR
Not disclosed
```

That notation is unreadable to most buyers outside India, and as a string it can't be
sorted, averaged, or compared against a budget. This Actor returns:

| Field | Example |
|---|---|
| `salaryMinInr` / `salaryMaxInr` | `600000` / `1000000` |
| `salaryMidInr` | `800000` |
| `salaryMidUsd` | `9091` |
| `salaryUnit` | `LAC` |
| `salaryText` | `"6-10 Lacs PA"` |

**The original string is always kept**, so the conversion stays auditable. The exchange
rate is yours to set (`inrPerUsd`, default 88) and is reported back in `SALARY_SUMMARY`,
so you can recompute with a different rate without re-running.

#### Undisclosed pay is never zero

Most Naukri listings don't show pay. Rows without a figure get `isSalaryDisclosed: false`
and `null` — **not `0`**. Zero-filling would drag the median down and make the market look
cheaper than it is. `SALARY_SUMMARY` reports `salaryDisclosureRate` so you can see how much
of the sample the median is actually based on.

#### Other things made sortable

- `experienceMinYears` / `experienceMaxYears` from `"0-4 Yrs"`
- `postedDaysAgo` from `"3 weeks ago"` — filter out stale listings
- `companyRating` with `companyReviewCount` — a 4.8 from 3 reviews is not a 4.8 from 3,000

### What you get

Per job: title, company, location, the salary fields above, experience range, company
rating and review count, days since posting, skills, snippet, and URL.

A `SALARY_SUMMARY` record with `salaryDisclosureRate`, `medianSalaryInr`,
`medianSalaryUsd`, `medianExperienceMinYears`, `medianPostedDaysAgo`, the `inrPerUsd`
used, and the top hiring companies.

### What this Actor does not do

- **No personal data.** Job listings are company data. No recruiter names, contacts, or profiles.
- **No CAPTCHA solving or bot-detection bypass.**
- **No logged-in scraping.** Public listing pages only.
- **No applicant-side data.** Nothing about who applied or viewed.

### Reliability

Success rate was measured **before** this Actor was written: **18/18 fetches** through
the same browser path used in production. It is monitored twice daily against a live page.

Naukri is a Next.js app whose listings render client-side, so this Actor drives a real
browser. Use `useProxy: true` with `RESIDENTIAL`.

### Input

```json
{
  "queries": ["data analyst", "software engineer"],
  "maxItemsPerQuery": 60,
  "inrPerUsd": 88,
  "useProxy": true,
  "proxyType": "RESIDENTIAL"
}
```

Plain search terms are turned into Naukri list URLs automatically. You can also pass full
list URLs (`https://www.naukri.com/data-analyst-jobs`) if you've already filtered on the site.

### Billing

Pay per event: one `job-scraped` event per job actually delivered to your dataset.
Duplicates are removed before charging, and a run that returns nothing costs nothing.

# Actor input Schema

## `queries` (type: `array`):

Job titles to search, or full Naukri list URLs. Plain terms are converted to Naukri list pages automatically.

## `maxItemsPerQuery` (type: `integer`):

Capped at 300. One page returns 20.

## `inrPerUsd` (type: `integer`):

Exchange rate used for the approximate USD figure. Rupee values are never adjusted — only the USD estimate uses this. The rate is reported back in SALARY\_SUMMARY so you can recompute.

## `minIntervalMs` (type: `integer`):

Requests are serialized with at least this gap.

## `useProxy` (type: `boolean`):

Off by default — this target was measured to work 5/5 without a proxy. Turn on only if you hit blocks.

## `proxyType` (type: `string`):

Used only when Use Apify Proxy is on. DATACENTER costs far less than RESIDENTIAL.

## Actor input object example

```json
{
  "queries": [
    "data analyst"
  ],
  "maxItemsPerQuery": 60,
  "inrPerUsd": 88,
  "minIntervalMs": 3000,
  "useProxy": false,
  "proxyType": "DATACENTER"
}
```

# Actor output Schema

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

Every row this run produced, as JSON.

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

Totals and medians for this run, so you can judge the rows without reading them all.

# 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 = {
    "queries": [
        "data analyst"
    ]
};

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

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

```

## MCP server setup

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