# Changelog of Naukri Job Scraper 💰 Just $0.27/1k - Salary, Skills & Detail (`blackfalcondata/naukri-jobs-feed`) Actor

- **URL**: https://apify.com/blackfalcondata/naukri-jobs-feed/changelog.md
- **Full Actor documentation**: https://apify.com/blackfalcondata/naukri-jobs-feed.md

## Changelog

### \[1.3.3] — 2026-09-28

- Improved: a search that Naukri answers with no matching jobs now ends with a status saying so, instead of a technical request count.

### \[1.3.2] — 2026-09-13

- Fixed: searches in real Indian cities could fail with "No such location". A niche keyword returns few local matches, and the source answers those by widening to related jobs elsewhere — which the location check read as the city having been ignored. Gurugram, Jalandhar, Bengaluru, Chennai, Noida, Lucknow and others were affected. The check now confirms against the source whether the place exists before failing anything, so only a location the source genuinely does not know stops a run.
- Fixed: two runs sharing one `stateKey` could both pass the ownership check and deliver — and bill — the same records. Ownership is now settled atomically before the soft lock, so exactly one run proceeds.
- Fixed: a run that ended early on a deterministic input error released its hold on the state key immediately, instead of leaving it held for up to half an hour while every run started in that window returned nothing.
- Added: when the source widens past your location because there were too few local matches, the run says so in the log. Results may then include places outside the one you asked for.

### \[1.3.1] — 2026-07-07

- Improved: stability on large runs. Runs that collect a large number of results (a high `maxResults`, or detailed enrichment across many jobs) could occasionally stop early without returning results; such runs now stay stable and complete. No input or output changes.

### \[1.3.0] — 2026-05-09

- **New input shortcut: `experience`** — accepts ranges (`"0-1"`, `"3-6"`, `"10-15"`), open-ended (`"5+"`), single integer (`2` or `"2"`), and labels (`fresher`, `entry`, `junior`, `mid`, `senior`, `lead`). Coerces to `experienceMin` + `experienceMax` automatically. Before this release, sending a range string silently dropped the value into the integer field and the experience filter was not applied — the run still succeeded, masking the broken filter. Now: range strings work, unparseable values log a clear warning and don't apply.
- **New input shortcut: `datePosted`** — accepts integer days (`7`), shorthand (`"24h"`, `"7d"`, `"30d"`), and labels (`today`, `yesterday`, `week`, `fortnight`, `month`, `quarter`, with optional `last|past|this` prefix). Coerces to `freshness` (integer days). Same fix-class as `experience`.
- **New aliases:** `limit` and `maxItems` are now accepted as aliases for `maxResults`. Sibling-scraper shorthand previously surfaced as "unknown field".
- **New: filter-echo log line** — every run now prints `Search filters: keyword=…, experienceMin=…, freshness=…, …` immediately after input parsing so users can verify which filters actually took effect after alias coercion.
- **Behavior change for incremental runs that previously sent `experience: "0-1"`-style ranges**: the auto-built default `stateKey` fingerprint includes `experienceMin` + `experienceMax`. Before this release these were `undefined` (because the alias dropped the string), so all such runs shared a single state. After this release the fingerprint reflects the actual filtered universe, so the **first run after deploy will be a "fresh start"** for those users (everything emitted as NEW). Subsequent runs dedup normally. Users on a custom string `stateKey` are unaffected.

### \[1.2.1] — 2026-04-29

- Fix: pagination scope (`companyGroupIds` fan-out, `companyId`, `groupId`) is now carried forward to page 2+. Previously degraded to global keyword search after page 1.
- Fix: keyword search now coexists with `jobIds` and `startUrls` in the same run. Previously the keyword search seed was silently suppressed when either was set.
- Fix: `roleCategory` and `industry` post-filters now treat null/missing values as a mismatch instead of passing them through. Restores the documented filter strictness.
- Fix: `maxResults` cap now gates on emitted items, not enqueued candidates. Previously post-filter loss (postedBy, repost-skip, industry/roleCategory mismatch, incremental UNCHANGED) silently truncated results below the requested limit.
- Fix (potentially breaking for default `stateKey`): incremental state is now scoped by every filter that defines the search universe (`companyGroupIds`, `companyId`, `cityTypeGid`, `workMode`, `freshness`, `postedBy`, `experience*`, `salary`, `companyType`, `department/roleCategory IDs`, `ug/pgCourse`, `stipend`, `duration`, `topCompanies`, `roleCategory`, `industry`, `startUrls`). Runs with different filters no longer share state — previously caused jobs from broader runs to be falsely flagged EXPIRED in narrower runs. **Migration:** users on a custom string `stateKey` are unaffected. Users relying on the auto-built default stateKey will see one "first run" for each distinct filter set the next time those configs run; subsequent runs dedup normally.
- New: run-end footer logs review prompt and (for incremental runs) `$X saved via incremental mode` line.

### \[1.2.0] — 2026-04-26

- New: `walkInDetail.mapUrl` — Google Maps URL for the walk-in venue when the employer published one.
- New: `workModeLabel` — human-readable work-mode label (`"Remote"`, `"Hybrid"`, …) parallel to `wfhType`.
- New: `hybridWfhDetail` — free-text hybrid pattern when present (e.g. `"Hybrid (1 week office - 3 week WFH)"`).
- New: `internship.{amount, currency, duration, startDate}` — internship-specific metadata for internship listings.
- Docs: `startUrls` now documents all four supported URL shapes (single-job page, search-results, "X jobs in Y" SEO URL, keyword-only SEO URL) with concrete examples.

### \[1.1.0] — 2026-04-25 — v1.1 Coverage Overhaul

#### Added

- **38+ new output fields**:
  - **Apply URLs**: `applyRedirectUrl` (employer ATS URL), `companyApplyUrl` (apply via naukri.com), `companyApplyJob` (boolean)
  - **Walk-in details**: `walkinJob`/`walkIn` flag + structured `walkInDetail` (contactName, contactPhone, venueAddress, walkinStartDate/EndDate, dailyTiming, sat/sun)
  - **AmbitionBox full payload**: `ambitionBoxDetails.{companyInfo, reviews[], salaries, benefits, awards}` — top 3 employee reviews + role-level avg/min/max CTC + 30+ benefits
  - **Recruiter signals**: `consultant` boolean, `hiringFor` (end-employer when consultant), `hideClientName`
  - **Diversity / branding**: `diversityTagText`, `exclusive`, `brandingTags[]`
  - **Locations**: `locations[]` multi-location structured + `locationGids[]`
  - **Skills**: `keySkills.{preferred, other}` structured form
  - **Salary**: `salaryVariablePercent`, `salaryMinPerMonth`, `salaryMaxPerMonth`, `salaryHidden`
  - **SERP-level description** (`descriptionSnippet`) — short version available WITHOUT fetchDetails
  - Plus: `applyByTime`, `staticUrl`, `mode`, `board`, `groupId` (output), `isTopGroup`, `microsite`, `hideApplyButton`, `jobType`, `shortDescription`, `companyAddress`, `companyMedia`, `companyPageUrl`, `socialBanner`, `videoProfilePreferred`, `referenceCode`, `education12th`, `degreeCombination`, `smbGenderRequirement`, `logoPathV3`, `footerLabel`, `showMultipleApply`
- **Email + phone extraction**: `extractedEmails[]`, `extractedPhones[]` from job descriptions (Indian mobile + intl + walk-in HR).
- **Multi-URL paste mode**: `startUrls[]` accepts pasted Naukri URLs (4 patterns: detail, /jobs?keyword, SEO `/x-jobs-in-y`, keyword-only). Mix freely with keyword + jobIds.
- **`ignoreUrlFailures`**: graceful degradation on bad URLs in startUrls.
- **Notifications**: Telegram, Discord, Slack, WhatsApp Cloud API, generic webhook. Pair with incremental + `notifyOnlyChanges` for "Naukri job-monitor" workflows.
- **State lock**: prevents concurrent runs on same `stateKey` from corrupting incremental state. 30-min stale-lease auto-recovery.
- **Filters**: `companyType[]` (Foreign MNC, Startup, Govt/PSU, …), `postedBy` (Company / Consultant / Both — recruiter-spam filter), `departmentIds[]`, `roleCategoryIds[]`, `ugCourse[]`, `pgCourse[]`, `stipend[]`, `duration[]`, `topCompanies[]`.
- **502/503/504/520-524/590 transient retry** with exponential backoff (1s/2s/4s).

#### Changed

- Empty-input runs now surface as **FAILED** (was SUCCEEDED-with-zero-rows — silent UX bug).
- Input schema reorganized into 8 sections with emoji captions: 🔍 Search, 🎚️ Filters, 📋 Enrichment, 🤖 AI / Agent Output, ♻️ Incremental & Dedup, 🔔 Notifications, ⚙️ Performance, 🛡️ Proxy.

#### Removed

- UI/transient fields not exposed in output: `isSaved`, `saved`, `consent`, `segmentedTemplateId`, `logStr`, `clientLogo`, `banner`, `staticCompanyName` (redundant), plus low-signal/internal helpers (`tagLabels`, `template`, `fatFooter`, `jobIconType`, `education.label/.ppg/.tenth`, encrypted/duplicate `walkInDetail.*` variants, `companyDetail.clientHeadline/.clientType`).

### 0.1.x — 2026-04-16

- Added: Incremental output fields — `changeType` (`NEW` | `UPDATED` | `UNCHANGED` | `REAPPEARED` | `EXPIRED`), `firstSeenAt`, `lastSeenAt`
- Added: `emitUnchanged`, `emitExpired` inputs — opt-in emission of unchanged or expired listings in incremental mode
- Changed: `changeType` value now uppercase and 5-state (previously a single lowercase `"new"`). Default incremental output still covers new/updated/reappeared listings.

### 0.1.x — 2026-04-14

- Added: `descriptionHtml`, `descriptionMarkdown` output fields (triple-format descriptions for RAG/LLM pipelines)
- Added: `contentHash` output field (SHA-256 fingerprint of content-identifying fields)

### 0.1.x — 2026-04-14

- Added: cross-run repost detection (`isRepost`, `repostOfId`, `repostDetectedAt`)
- Added: `skipReposts` input to exclude detected reposts from output

### \[1.0.0] — 2026-03-26

#### Added

- Initial release
- Search Indian job listings on naukri.com by keyword, location, and filters
- Filters: experience range, salary range, work-from-home, freshness
- Detail enrichment with full description, education, company profile
- Direct job-ID lookup
- Incremental mode with change detection
- Compact output mode for AI-agent and MCP workflows
