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

Search public Naukri job listings by keyword and location. Uses direct HTTP first, then a bounded browser and India residential fallback only after blocking.

- **URL**: https://apify.com/dami\_studio/naukri-jobs-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

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

Collect public Naukri job-listing data by keyword and optional location. The Actor returns normalized title, company, location, experience, salary, skills, posting label, public job URL, and any public listing snippet returned by search.

### How collection works

1. The Actor calls Naukri's public search endpoint directly with bounded pagination.
2. If Naukri returns an anti-bot response such as HTTP 406, it uses a real browser to load the matching public Naukri search page and captures that page's public search response.
3. The browser fallback starts without a proxy. Only a browser block activates a fresh rotating **datacenter** proxy session. Metered proxy groups (RESIDENTIAL, GOOGLE\_SERP) are never used, and a request for one in `proxyConfiguration` is replaced with datacenter addresses. Proxy servers you supply yourself in `proxyUrls` are used exactly as given.

This order keeps ordinary runs inexpensive and never spends metered per-gigabyte bandwidth. Each returned unique job is charged once. Samples, no-result rows, blocked rows, input errors, and network diagnostics are never charged.

### Input

- `searchQueries`: one or more keywords or job titles.
- `locations`: optional Indian city or region labels. Empty searches nationwide.
- `maxItems`: maximum unique jobs, 1 to 1,000.
- `maxPagesPerSearch`: maximum pages per query/location, 1 to 25.
- `experience`: optional visible experience-label filter.
- `includeDetails`: retain the public listing snippet returned by search.
- `useBrowserFallback`: use the browser route only after direct HTTP is blocked.
- `maxProxyRetries`: maximum proxied browser attempts (rotating datacenter) after a browser block. The legacy key `maxResidentialRetries` is still accepted as an alias.
- `proxyConfiguration`: optional. Your own `proxyUrls` are honoured verbatim; metered Apify groups are replaced with datacenter and the substitution is reported in the log and as an uncharged dataset note.

An empty input intentionally emits one clearly labeled, uncharged sample row so a new task has a non-empty dataset without generating billable data.

### Output

`jobId`, `title`, `company`, `location`, `experience`, `salary`, `skills`, `postedAt`, `description`, `url`, `query`, `searchLocation`, and `source`.

Rows are deduplicated by Naukri job ID across all queries, locations, and pages. Pagination stops at the configured page and item limits, an empty page, or a page with no fresh jobs.

### Limitations

- Naukri can require dynamic anti-bot context. A direct endpoint response of HTTP 406 is expected in some environments; the browser fallback addresses this but is slower.
- The proxied browser fallback can still be challenged by Naukri. A blocked run emits an uncharged diagnostic rather than partial or fabricated jobs.
- This Actor collects only publicly accessible job data. It does not log in, apply to jobs, solve CAPTCHAs, or access candidate data.
- Search cards expose the fields Naukri makes public at runtime; listing-detail fields are not guaranteed.

### Live pricing assessment

The closest qualifying market floor found in the July 25, 2026 scan was `$0.0004/job`. Apify cloud returned HTTP 406 on direct search, then failed to capture a public search response in either direct-browser or proxied-browser mode. A prior India-residential attempt cost `$0.0170047` and returned zero jobs, so residential was removed outright on August 15, 2026: it bought nothing and billed the owner per gigabyte. An August 15, 2026 side-by-side probe of the search endpoint returned the same HTTP 406 `recaptcha required` from a plain address, from Apify datacenter, and from Apify residential India. This Actor therefore remains private and unpriced; blocked runs settle successfully with an uncharged diagnostic.

# Actor input Schema

## `searchQueries` (type: `array`):

Naukri keywords or job titles.

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

Optional Indian city or region names.

## `experience` (type: `string`):

Optional visible experience label to retain, for example 3-5 Yrs.

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

Maximum unique jobs to return.

## `maxPagesPerSearch` (type: `integer`):

Maximum search-result pages per keyword and location.

## `requestTimeoutSecs` (type: `integer`):

Maximum duration of one direct or browser request.

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

Retain public listing snippets when returned by Naukri search.

## `useBrowserFallback` (type: `boolean`):

When direct HTTP is blocked, use Naukri's public browser flow. It starts on the plain container address and only then retries through a rotating datacenter proxy.

## `maxProxyRetries` (type: `integer`):

Maximum fresh proxied browser sessions after a browser block. Uses rotating datacenter addresses.

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

Optional proxy configuration, used only after a block. Your own proxyUrls are used exactly as given. Metered Apify groups (RESIDENTIAL, GOOGLE\_SERP) are not offered and are replaced with rotating datacenter addresses.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "locations": [],
  "experience": "",
  "maxItems": 100,
  "maxPagesPerSearch": 5,
  "requestTimeoutSecs": 35,
  "includeDetails": true,
  "useBrowserFallback": true,
  "maxProxyRetries": 1
}
```

# 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 = {
    "searchQueries": [
        "python developer"
    ]
};

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

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

```

## MCP server setup

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