# Naukri Job Scraper ⚡ from $0.50/1K — Salary, Skills & Full JD (`corvuslab/naukri-jobs-scraper`) Actor

Naukri Job Scraper extracts structured job listing data from Naukri.com — job title, company, experience, salary, location, full details. Fast, reliable, and built for scale. Ideal for recruiters, market researchers, and businesses tracking hiring trends.

- **URL**: https://apify.com/corvuslab/naukri-jobs-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 71.4% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.50 / 1,000 job listings

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/platform/actors/running/actors-in-store#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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 🇮🇳

Scrape job listings from **[naukri.com](https://www.naukri.com)** — India's largest job
board — into clean, structured data: salaries, skills, experience, company profiles, full
descriptions, recruiter contacts, and walk-in interview details. Search by keyword, filter
precisely, get real-time alerts, and monitor listings cheaply with **incremental mode**.

### Why this scraper

Get **complete, reliable** Naukri job data — every run returns full, structured results
instead of empty or partial output. Built for real production use: scheduled monitoring,
data pipelines, and large one-off exports.

- ✅ **Reliable & stable** — engineered for consistent, complete results, run after run.
- 🔄 **Always fresh** — data is pulled straight from Naukri at run time, never a stale cache.
- 📦 **Complete & honest** — every field Naukri actually exposes, with filters **verified to
  genuinely filter** (not silently ignored). No made-up fields.
- ⚙️ **Production-ready** — graceful failure handling, retries, budget-aware, and ready for
  scheduled runs and data pipelines.

### What you get

- 🔎 **Flexible search** — by keyword, multiple queries, specific job IDs, or pasted Naukri
  URLs (single job, search results, or SEO listing pages).
- 🎚️ **Rich, verified filters** — location, experience, salary, skills, work mode
  (remote/hybrid/office), freshness, city, company, company type, and a **recruiter-spam
  filter** (`postedBy: Company` for direct employers only).
- 📄 **Deep enrichment** (`fetchDetails`) — full descriptions in **text / HTML / Markdown**,
  education, role & employment type, company profile, and **AmbitionBox** ratings & reviews.
- 🏢 **Walk-in interview details** — structured venue, dates, daily timing, Saturday/Sunday
  flags, Google Maps link, and **HR contact name & phone**.
- 📇 **Recruiter contact extraction** — best-effort **emails & phone numbers** pulled from
  descriptions and walk-in details.
- 🔁 **Incremental monitoring** — later runs emit only **new / updated / expired** jobs, with
  repost detection — cutting the cost of daily monitoring to pennies.
- 🔔 **Real-time alerts** — push new jobs to **Telegram, Slack, Discord, WhatsApp**, or any
  **webhook** (n8n / Make / Zapier).
- 🤖 **AI-friendly** — `compact` mode returns just the core fields for LLM / MCP pipelines.

### Getting started

1. Enter a **keyword** (and optionally a **location**) in the input form.
2. Optionally turn on **`fetchDetails`** for full descriptions & enrichment, and
   **`incremental`** for monitoring.
3. Click **Start** — then export results as **JSON, CSV, or Excel**, or pull them via the API.

Works out of the box — no proxy setup required for most runs.

### Quick start

Provide at least one search method. Minimal input:

```json
{
  "keyword": "data analyst",
  "location": "bangalore",
  "maxResults": 25
}
````

Full enrichment + daily monitoring with Telegram alerts:

```json
{
  "searchQueries": ["python developer", "data engineer"],
  "location": "remote",
  "salary": "10to15",
  "fetchDetails": true,
  "incremental": true,
  "notifyOnlyChanges": true,
  "telegramToken": "<bot-token>",
  "telegramChatId": "<chat-id>",
  "maxResults": 100
}
```

### Example output

```json
{
  "jobId": "230326015841",
  "title": "Data Scientist",
  "companyName": "Movate Technologies",
  "location": "Hybrid - Bengaluru",
  "experienceText": "5-8 Yrs",
  "salary": "Not disclosed",
  "skills": ["Machine Learning", "Python", "NLP"],
  "shortDescription": "We are looking for an experienced Data Scientist...",
  "createdDate": "2026-07-02T08:35:02+00:00",
  "portalUrl": "https://www.naukri.com/job-listings-data-scientist-movate-230326015841",
  "viewCount": 3692,
  "applyCount": 504,
  "industry": "IT Services & Consulting",
  "roleCategory": "Data Science & Machine Learning",
  "ambitionBox": { "rating": "3.1", "reviewsCount": 2706 },
  "emails": ["careers@movate.com"],
  "walkInDetail": {
    "startDate": "2026-07-09", "endDate": "2026-07-10",
    "dailyTiming": "10.00 AM - 4.00 PM", "venueAddress": "Hi-Tech City, Hyderabad",
    "contactName": "Vishal Reddy", "contactPhone": "7780165167"
  },
  "changeType": "NEW"
}
```

With `fetchDetails: true` you additionally get `description`, `descriptionHtml`,
`descriptionMarkdown`, `educationUG`/`educationPG`, `employmentType`, `companyDescription`,
`vacancy`, `consultant`, and more. Use `compact: true` for just the core fields.

### Input highlights

- **`keyword`** — your main search term (job title, skill, or company). Alias: `query`.
- **`searchQueries`** — run several keyword searches in one go; each is capped by `maxResults`.
- **`location`** — restrict results to a city or region (e.g. `bangalore`, `remote`).
- **`experience`** — filter by years of experience (e.g. `3`, `0-2`, or a label like `senior`).
- **`salary`** — filter by salary band.
- **`skills`** — require specific skills (e.g. `python`, `sql`) in the results.
- **`workMode`** — filter by office, remote, or hybrid roles.
- **`freshness`** — only jobs posted within the last N days.
- **`postedBy`** — set to `Company` to return direct-employer jobs only and skip recruitment consultants.
- **`jobIds` / `startUrls`** — scrape exact jobs by ID, or paste Naukri job / search / listing URLs directly.
- **`fetchDetails`** — enrich each job with full descriptions plus company, walk-in, and recruiter-contact data.
- **`descriptionFormat`** — choose the description formats you want: text, HTML, and/or Markdown.
- **`compact`** — return only the core fields (ideal for AI / LLM pipelines).
- **`excludeEmptyFields`** — drop empty fields from each record for cleaner output.
- **`incremental`** — on recurring runs, emit only new, updated, or expired jobs.
- **`skipReposts`** — filter out reposted duplicate listings.
- **`emitExpired`** — include jobs that have disappeared since your last run.
- **`maxResults`** — cap the number of results (`0` = unlimited).
- **`telegram*` / `slack*` / `discord*` / `whatsapp*` / `webhookUrl`** — push new jobs to your channels in real time.

See the input form for the full list and defaults.

### Output fields

**Always present (listing):** `jobId`, `title`, `companyName`, `companyId`, `location`,
`experienceText`, `minimumExperience`, `maximumExperience`, `salary`, `salaryMin`,
`salaryMax`, `salaryCurrency`, `skills`, `shortDescription`, `createdDate`, `portalUrl`,
`logoPath`, `walkinJob`, `ambitionBox`, `emails`, `phones`, `scrapedAt`, `searchKeyword`.

**Added with `fetchDetails`:** `description`, `descriptionHtml`, `descriptionMarkdown`,
`industry`, `roleCategory`, `functionalArea`, `jobRole`, `employmentType`, `educationUG`,
`educationPG`, `vacancy`, `viewCount`, `applyCount`, `consultant`, `companyDescription`,
and structured `walkInDetail`.

**Incremental mode:** `changeType` (NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED),
`isRepost`, `repostOfId`, `repostDetectedAt`.

### Incremental monitoring — pay only for what changed

Run the same search on a schedule with `incremental: true`. After the first baseline run,
each subsequent run emits **only new, updated, or expired jobs** — not the whole result set.
For a stable daily monitor, that means you pay for a handful of changed records instead of
re-scraping hundreds every day. Add `notifyOnlyChanges: true` to get alerts only when
something actually changes.

### Use cases

- 🧑‍💼 **Recruiters** — track fresh postings for target roles/locations daily and get a
  Slack/Telegram ping when new ones appear.
- 🏭 **Walk-in drives** — collect walk-in venues, dates, and **HR contact name & phone** for
  high-volume hiring.
- 📊 **Salary & skills research** — aggregate compensation and in-demand skills across
  regions and roles over time.
- 📇 **Recruiter lead generation** — extract recruiter **emails & phone numbers** from
  postings and walk-in details.
- 🏢 **Competitive hiring intel** — follow a specific company's openings via `companyId` /
  `companyGroupIds`.
- 🔗 **ATS / CRM pipelines** — feed apply URLs and structured job data straight into your
  systems via the API.
- 🤖 **AI & LLM agents** — pipe `compact` structured jobs into agents and RAG pipelines.

### FAQ

**Is scraping Naukri legal?** This actor collects **publicly available** job listings.
Scraping public data is generally considered acceptable, but you're responsible for how you
use the data (e.g. comply with privacy rules when handling recruiter contact info). This
isn't legal advice.

**Will it keep working reliably?** Yes. It's engineered for stable, consistent results and is
actively maintained, so it keeps returning complete, structured Naukri data run after run.

**How do I get only new jobs?** Turn on `incremental` mode — later runs emit only changed
records, with repost detection. Pair with a schedule for hands-off monitoring.

**Can I get real-time alerts?** Yes — Telegram, Slack, Discord, WhatsApp, or any webhook
(n8n / Make / Zapier). Configure the matching fields in the input.

**How do I get full descriptions and recruiter contacts?** Enable `fetchDetails`. It adds
full descriptions (text/HTML/Markdown), company profile, education, walk-in HR contacts, and
extracted emails/phones.

**How many results can I get?** As many as the search returns — set `maxResults` (0 =
unlimited). Very large runs take longer, especially with `fetchDetails`.

**Can I use it with AI assistants / my own code?** Yes — export JSON/CSV/Excel or call the
Apify API from any language. `compact` mode trims records to core fields for token-efficient
LLM use.

### Pricing

Pay-per-event: a small fee when a run starts, plus a per-result fee — **listings are cheap**,
and results fetched with `fetchDetails` cost a bit more (they do more work). **Incremental
mode keeps recurring costs low** by emitting only what changed. Exact prices are on the
actor's pricing tab, and you stay in control with Apify's per-run spend limits.

### Notes & tips

- **Proxy is optional.** Most runs work without one. For scheduled or large-scale jobs, set
  **Apify Proxy → Residential, country India** for maximum reliability and consistency.
- `fetchDetails` retrieves each job's full details, so detailed runs take longer and cost a
  bit more — use it when you need descriptions/enrichment, and lean on `incremental` mode for
  routine monitoring.
- This is an unofficial scraper for publicly available listings and is not affiliated with
  Naukri / Info Edge.

# Actor input Schema

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

Job search keyword, e.g. "data analyst". Alias: query.

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

Multiple keyword searches per run (unioned, each capped by maxResults).

## `jobIds` (type: `array`):

Fetch specific jobs by their Naukri job ID.

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

Paste Naukri URLs directly (single job page, search results, or SEO listing URLs).

## `ignoreUrlFailures` (type: `boolean`):

Skip URLs that cannot be parsed instead of failing the whole run.

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

Free-text location filter, e.g. "bangalore".

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

Shortcut accepting ranges ("0-1", "5+") or labels (fresher, junior, senior). Overridden by experienceMin/experienceMax if set.

## `experienceMin` (type: `integer`):

Minimum years of experience.

## `experienceMax` (type: `integer`):

Maximum years of experience.

## `salary` (type: `string`):

Annual salary bracket in lakhs (INR).

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

Filter by skill names.

## `workMode` (type: `string`):

Filter by work mode.

## `freshness` (type: `integer`):

Only jobs posted within the last N days.

## `datePosted` (type: `string`):

Shortcut: "today", "3d", "7d", "week", "month". Overridden by freshness if set.

## `cityTypeGid` (type: `integer`):

Naukri city GID, e.g. 97=Bengaluru, 17=Hyderabad, 220=Delhi/NCR.

## `companyId` (type: `integer`):

Restrict to a single company entity ID.

## `companyGroupIds` (type: `array`):

Fan out a parallel crawl across multiple company group IDs.

## `companyType` (type: `array`):

Filter by company type.

## `postedBy` (type: `string`):

Filter by who posted the job (recruiter-spam filter).

## `industry` (type: `string`):

Keep only jobs in this industry. Requires fetchDetails.

## `roleCategory` (type: `string`):

Keep only jobs in this role category. Requires fetchDetails.

## `sortBy` (type: `string`):

Result ordering.

## `maxResults` (type: `integer`):

Maximum jobs to return per search (0 = unlimited, capped at 5000). Aliases: limit, maxItems.

## `fetchDetails` (type: `boolean`):

Fetch full descriptions, company metadata, education, walk-in and AmbitionBox data for each job (billed at a higher per-result rate).

## `compact` (type: `boolean`):

Return only core fields (AI/MCP-friendly).

## `excludeEmptyFields` (type: `boolean`):

Drop null/empty fields and objects from output items.

## `descriptionMaxLength` (type: `integer`):

Truncate descriptions to N characters (0/empty = no limit).

## `descriptionFormat` (type: `string`):

Which description formats to include (requires fetchDetails).

## `incremental` (type: `boolean`):

Emit only jobs that are new or changed since the last run with the same state key.

## `stateKey` (type: `string`):

Override the incremental state scope. Defaults to a hash of the search parameters.

## `skipReposts` (type: `boolean`):

Exclude jobs detected as reposts of previously seen listings.

## `emitUnchanged` (type: `boolean`):

Include jobs whose content has not changed since the last run.

## `emitExpired` (type: `boolean`):

Emit records for jobs that disappeared since the last run (changeType = EXPIRED).

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Target chat/channel ID for Telegram alerts.

## `slackWebhookUrl` (type: `string`):

Slack incoming webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming webhook URL.

## `whatsappPhoneNumberId` (type: `string`):

Meta Cloud API phone number ID.

## `whatsappAccessToken` (type: `string`):

Meta Cloud API access token.

## `whatsappTo` (type: `string`):

Recipient phone number in E.164 format (e.g. 919876543210).

## `webhookUrl` (type: `string`):

Receives a JSON POST { count, jobs: \[...] } — for n8n / Make / Zapier.

## `webhookHeaders` (type: `object`):

Custom headers sent with the generic webhook (e.g. auth).

## `notificationLimit` (type: `integer`):

Max jobs listed per notification message.

## `notifyOnlyChanges` (type: `boolean`):

In incremental mode, only notify about NEW/UPDATED jobs.

## `maxConcurrency` (type: `integer`):

Maximum concurrent requests.

## `detailConcurrency` (type: `integer`):

How many job-detail pages to load in parallel (fetchDetails only). Higher = faster wall-clock on large runs, but NOT cheaper: extra pages need more memory (set 2048MB+ for 2-3) and share one proxy IP. Leave at 1 for lowest cost; raise it only when finishing fast matters more than cost.

## `maxRequestRetries` (type: `integer`):

Retries per failed request.

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

Optional. The stealth browser often reaches Naukri without a proxy, but for scheduled or large runs — or if you hit blocks — use Apify Proxy with group RESIDENTIAL and country IN for the most reliable results. Clear this to run without a proxy.

## Actor input object example

```json
{
  "keyword": "data analyst",
  "searchQueries": [
    "python developer",
    "data engineer"
  ],
  "ignoreUrlFailures": true,
  "location": "bangalore",
  "postedBy": "Both",
  "maxResults": 25,
  "fetchDetails": false,
  "compact": false,
  "excludeEmptyFields": false,
  "descriptionFormat": "all",
  "incremental": false,
  "skipReposts": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "maxConcurrency": 5,
  "detailConcurrency": 1,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (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 = {
    "keyword": "data analyst"
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Naukri Job Scraper ⚡ from $0.50/1K — Salary, Skills & Full JD",
        "description": "Naukri Job Scraper extracts structured job listing data from Naukri.com — job title, company, experience, salary, location, full details. Fast, reliable, and built for scale. Ideal for recruiters, market researchers, and businesses tracking hiring trends.",
        "version": "0.1",
        "x-build-id": "NTyCGXzpewLeIZvug"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/corvuslab~naukri-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-corvuslab-naukri-jobs-scraper",
                "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/corvuslab~naukri-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-corvuslab-naukri-jobs-scraper",
                "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/corvuslab~naukri-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-corvuslab-naukri-jobs-scraper",
                "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",
                "properties": {
                    "keyword": {
                        "title": "🔑 Keyword",
                        "type": "string",
                        "description": "Job search keyword, e.g. \"data analyst\". Alias: query."
                    },
                    "searchQueries": {
                        "title": "📝 Search queries",
                        "type": "array",
                        "description": "Multiple keyword searches per run (unioned, each capped by maxResults).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "jobIds": {
                        "title": "🆔 Job IDs",
                        "type": "array",
                        "description": "Fetch specific jobs by their Naukri job ID.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "🔗 Start URLs",
                        "type": "array",
                        "description": "Paste Naukri URLs directly (single job page, search results, or SEO listing URLs).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "ignoreUrlFailures": {
                        "title": "⏭️ Ignore URL failures",
                        "type": "boolean",
                        "description": "Skip URLs that cannot be parsed instead of failing the whole run.",
                        "default": true
                    },
                    "location": {
                        "title": "📍 Location",
                        "type": "string",
                        "description": "Free-text location filter, e.g. \"bangalore\"."
                    },
                    "experience": {
                        "title": "🧑‍💼 Experience (shortcut)",
                        "type": "string",
                        "description": "Shortcut accepting ranges (\"0-1\", \"5+\") or labels (fresher, junior, senior). Overridden by experienceMin/experienceMax if set."
                    },
                    "experienceMin": {
                        "title": "⬇️ Experience min (years)",
                        "minimum": 0,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Minimum years of experience."
                    },
                    "experienceMax": {
                        "title": "⬆️ Experience max (years)",
                        "minimum": 0,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum years of experience."
                    },
                    "salary": {
                        "title": "💰 Salary range (lakhs)",
                        "enum": [
                            "0to3",
                            "3to6",
                            "6to10",
                            "10to15",
                            "15to25",
                            "25to50",
                            "50to75",
                            "75to100"
                        ],
                        "type": "string",
                        "description": "Annual salary bracket in lakhs (INR)."
                    },
                    "skills": {
                        "title": "🛠️ Skills",
                        "type": "array",
                        "description": "Filter by skill names.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "workMode": {
                        "title": "🏠 Work mode",
                        "enum": [
                            "office",
                            "remote",
                            "hybrid",
                            "temporary_wfh"
                        ],
                        "type": "string",
                        "description": "Filter by work mode."
                    },
                    "freshness": {
                        "title": "🕒 Freshness (days)",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Only jobs posted within the last N days."
                    },
                    "datePosted": {
                        "title": "📅 Date posted (shortcut)",
                        "type": "string",
                        "description": "Shortcut: \"today\", \"3d\", \"7d\", \"week\", \"month\". Overridden by freshness if set."
                    },
                    "cityTypeGid": {
                        "title": "🏙️ City ID (cityTypeGid)",
                        "type": "integer",
                        "description": "Naukri city GID, e.g. 97=Bengaluru, 17=Hyderabad, 220=Delhi/NCR."
                    },
                    "companyId": {
                        "title": "🏢 Company ID",
                        "type": "integer",
                        "description": "Restrict to a single company entity ID."
                    },
                    "companyGroupIds": {
                        "title": "🏬 Company group IDs",
                        "type": "array",
                        "description": "Fan out a parallel crawl across multiple company group IDs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "companyType": {
                        "title": "🏷️ Company type",
                        "type": "array",
                        "description": "Filter by company type.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "213",
                                "62",
                                "51",
                                "83",
                                "223"
                            ],
                            "enumTitles": [
                                "Foreign MNC",
                                "Startup",
                                "Indian MNC",
                                "Corporate",
                                "Others"
                            ]
                        }
                    },
                    "postedBy": {
                        "title": "👤 Posted by",
                        "enum": [
                            "Both",
                            "Company",
                            "Consultant"
                        ],
                        "type": "string",
                        "description": "Filter by who posted the job (recruiter-spam filter).",
                        "default": "Both"
                    },
                    "industry": {
                        "title": "🏭 Industry (post-filter)",
                        "type": "string",
                        "description": "Keep only jobs in this industry. Requires fetchDetails."
                    },
                    "roleCategory": {
                        "title": "🗂️ Role category (post-filter)",
                        "type": "string",
                        "description": "Keep only jobs in this role category. Requires fetchDetails."
                    },
                    "sortBy": {
                        "title": "↕️ Sort by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Result ordering."
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum jobs to return per search (0 = unlimited, capped at 5000). Aliases: limit, maxItems.",
                        "default": 25
                    },
                    "fetchDetails": {
                        "title": "📄 Fetch details",
                        "type": "boolean",
                        "description": "Fetch full descriptions, company metadata, education, walk-in and AmbitionBox data for each job (billed at a higher per-result rate).",
                        "default": false
                    },
                    "compact": {
                        "title": "🗜️ Compact output",
                        "type": "boolean",
                        "description": "Return only core fields (AI/MCP-friendly).",
                        "default": false
                    },
                    "excludeEmptyFields": {
                        "title": "🧹 Exclude empty fields",
                        "type": "boolean",
                        "description": "Drop null/empty fields and objects from output items.",
                        "default": false
                    },
                    "descriptionMaxLength": {
                        "title": "✂️ Description max length",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Truncate descriptions to N characters (0/empty = no limit)."
                    },
                    "descriptionFormat": {
                        "title": "📝 Description format",
                        "enum": [
                            "all",
                            "text",
                            "html",
                            "markdown"
                        ],
                        "type": "string",
                        "description": "Which description formats to include (requires fetchDetails).",
                        "default": "all"
                    },
                    "incremental": {
                        "title": "🆕 Incremental mode",
                        "type": "boolean",
                        "description": "Emit only jobs that are new or changed since the last run with the same state key.",
                        "default": false
                    },
                    "stateKey": {
                        "title": "🗝️ State key",
                        "type": "string",
                        "description": "Override the incremental state scope. Defaults to a hash of the search parameters."
                    },
                    "skipReposts": {
                        "title": "🚫 Skip reposts",
                        "type": "boolean",
                        "description": "Exclude jobs detected as reposts of previously seen listings.",
                        "default": false
                    },
                    "emitUnchanged": {
                        "title": "♻️ Emit unchanged",
                        "type": "boolean",
                        "description": "Include jobs whose content has not changed since the last run.",
                        "default": false
                    },
                    "emitExpired": {
                        "title": "⌛ Emit expired",
                        "type": "boolean",
                        "description": "Emit records for jobs that disappeared since the last run (changeType = EXPIRED).",
                        "default": false
                    },
                    "telegramToken": {
                        "title": "🤖 Telegram bot token",
                        "type": "string",
                        "description": "Bot token from @BotFather."
                    },
                    "telegramChatId": {
                        "title": "💬 Telegram chat ID",
                        "type": "string",
                        "description": "Target chat/channel ID for Telegram alerts."
                    },
                    "slackWebhookUrl": {
                        "title": "📨 Slack webhook URL",
                        "type": "string",
                        "description": "Slack incoming webhook URL."
                    },
                    "discordWebhookUrl": {
                        "title": "🎮 Discord webhook URL",
                        "type": "string",
                        "description": "Discord incoming webhook URL."
                    },
                    "whatsappPhoneNumberId": {
                        "title": "📱 WhatsApp phone number ID",
                        "type": "string",
                        "description": "Meta Cloud API phone number ID."
                    },
                    "whatsappAccessToken": {
                        "title": "🔐 WhatsApp access token",
                        "type": "string",
                        "description": "Meta Cloud API access token."
                    },
                    "whatsappTo": {
                        "title": "📲 WhatsApp recipient",
                        "type": "string",
                        "description": "Recipient phone number in E.164 format (e.g. 919876543210)."
                    },
                    "webhookUrl": {
                        "title": "🪝 Generic webhook URL",
                        "type": "string",
                        "description": "Receives a JSON POST { count, jobs: [...] } — for n8n / Make / Zapier."
                    },
                    "webhookHeaders": {
                        "title": "📋 Webhook headers",
                        "type": "object",
                        "description": "Custom headers sent with the generic webhook (e.g. auth)."
                    },
                    "notificationLimit": {
                        "title": "🔢 Notification limit",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Max jobs listed per notification message.",
                        "default": 5
                    },
                    "notifyOnlyChanges": {
                        "title": "🔔 Notify only changes",
                        "type": "boolean",
                        "description": "In incremental mode, only notify about NEW/UPDATED jobs.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "🚦 Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum concurrent requests.",
                        "default": 5
                    },
                    "detailConcurrency": {
                        "title": "🧵 Detail concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many job-detail pages to load in parallel (fetchDetails only). Higher = faster wall-clock on large runs, but NOT cheaper: extra pages need more memory (set 2048MB+ for 2-3) and share one proxy IP. Leave at 1 for lowest cost; raise it only when finishing fast matters more than cost.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "🔁 Max request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries per failed request.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy configuration",
                        "type": "object",
                        "description": "Optional. The stealth browser often reaches Naukri without a proxy, but for scheduled or large runs — or if you hit blocks — use Apify Proxy with group RESIDENTIAL and country IN for the most reliable results. Clear this to run without a proxy.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
