Naukri.com Scraper at a glance
Naukri.com Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, listingsource, recordid, jobid and title, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 37 options
Scrape Naukri.com jobs by keyword or URL. Extract job title, company, skills, experience, salary, location and posting date, with optional full descriptions, education requirements and company details. Supports incremental monitoring and resume runs.
What Naukri.com Scraper can do
- Two ways to find jobs. Search by keyword and an optional city, or paste your own job or search links, filters and all.
- Every filter you built on the site comes along. A pasted search link keeps the filters you applied on naukri.com, because the page path carries them; the actor walks it exactly as configured.
- Card fields plus full detail on demand. Every hit carries the search-card fields; switch on Fetch full job details for the complete description, key skills, education, employment type, industry, company profile and view/apply counts, and pay the detail surcharge only for records whose job page read actually succeeded.
- Built for schedules. Incremental mode returns only new, updated and reappeared postings on recurring runs, and a posting is only marked expired once a run has genuinely scanned the whole tracked search end to end.
- Resume without repaying. Continue one interrupted run from its previous run or dataset id and skip everything already collected there.
- A refused run fails loudly instead of returning an empty dataset, so "no jobs matched" is never confused with "the site could not be read".
Choose what to collect
These inputs let you configure Naukri.com Scraper - Jobs, Salaries & Companies. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | Search mode walks the job results for your keywords. URL mode reads the pasted links instead: search pages are walked like a search, single job pages are read directly. |
keywordsarray | Job search keywords, exactly as you would type them into the site's search box. |
locationstring | Optional city name applied to every keyword above, e.g. bangalore, mumbai, delhi ncr. Leave empty to search all India. |
urlsarray | Links to read. In URL mode this list is used; in Search mode it is ignored. |
jobIdsarray | Optional. Job ids (the 12-digit number at the end of a job page link) or job page links, read directly one job page each. Works in both modes, in addition to the keywords or links above. |
sortBystring | Order of the results. Relevance is the site's default order; Date posted returns the newest jobs first. |
experienceinteger | Only jobs open to a candidate with this many years of experience (0 = fresher). Leave empty for any experience. |
Show 30 more inputs
| Input | What it controls |
|---|---|
freshnessstring | Only jobs posted within this many days. A time window is a moving view, so incremental mode does not mark jobs that age out of it as EXPIRED. |
workModearray | Only jobs with any of these work arrangements. Leave empty for all. |
salaryRangearray | Only jobs whose advertised salary falls in any of these bands. Jobs that hide their salary are not matched by this filter. |
citiesarray | Only jobs in any of these cities, by name (e.g. Hyderabad, Bengaluru, Pune; Bangalore, Gurgaon and other older spellings work too) or numeric city id. Unlike Location above, this accepts several cities at once. |
departmentarray | Only jobs in any of these departments, by name as the site shows it (e.g. Engineering - Software & QA, Data Science & Analytics) or numeric id. |
roleCategoryarray | Only jobs in any of these role categories, by name (e.g. Software Development, Quality Assurance and Testing) or numeric id. |
industryarray | Only jobs at employers in any of these industries, by name (e.g. IT Services & Consulting, Software Product) or numeric id. |
companyTypearray | Only jobs at any of these kinds of employer. Leave empty for all. |
postedBystring | Only jobs posted directly by the employer, or only jobs posted by a recruitment consultant. |
topCompaniesarray | Only jobs at any of these companies, by name (e.g. Infosys, Accenture, Tata Consultancy Services) or numeric company group id. Names are matched against the companies the site lists for the search. |
walkInOnlyboolean | Only jobs with a walk-in interview. |
stipendarray | Internship searches only (e.g. keyword internship): only internships paying any of these monthly stipends (INR). Leave empty for all. |
internshipDurationarray | Internship searches only: only internships of any of these durations. Leave empty for all. |
ugCoursearray | Only jobs accepting any of these undergraduate qualifications, by name (e.g. B.Tech / B.E., B.Sc, Any Graduate) or numeric id. |
pgCoursearray | Only jobs accepting any of these postgraduate qualifications, by name (e.g. MCA, M.Tech, MBA/PGDM) or numeric id. |
urlParamsarray | Optional. Extra query parameters added as-is to every search page address, for a site filter not listed above (copy the key and value from the address of a filtered page on the site). Incremental mode does not mark jobs EXPIRED for a search that uses them. |
fetchDetailsboolean | Read each job's own page for the full description, key skills, education, employment type, workplace label, industry, company details and view/apply counts. Off keeps the lighter search-card fields. On adds the per-job detail surcharge, charged once per record whose job page read succeeded. |
maxItemsinteger | Maximum job records returned in total, across all keywords or links. 0 means unlimited (the run only stops when the results end). |
maxPagesinteger | Maximum result pages walked per keyword or search link. 0 (default) means no page limit, so Max items is the only cap that stops a run early. |
maxReviewsPerJobinteger | Each job's own page carries up to a handful of AmbitionBox employee-review snippets for that job's company (reviewer, rating, title, likes/dislikes, date, link), plus a salary insight and a benefits list, when the site serves them. Caps how many review snippets are kept per job (the site itself may serve fewer); 0 keeps none. Only applies when Fetch full job details is on. Reviews ride on their job row (see the Company reviews output view). |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and URL setup; use State key to name or deliberately share a monitoring campaign. The days-ago age label shown on each card is excluded from change detection: the site re-renders it as time passes even when the posting date is unchanged, so a display flip alone never marks a job UPDATED. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and filter settings. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search; the source sometimes serves fewer results than it reports, and a run that could not see every matching job skips EXPIRED detection rather than guessing. |
skipRepostsboolean | Off by default. In incremental mode every row carries isRepost: true when a NEW job id re-posts a job this monitoring campaign already tracked under another id (same title, employer and location; repostOfJobId names the earlier id). Turn this on to leave those reposts out of the results (they are not returned and not billed, but are still remembered). |
ignoreFieldsForChangesarray | Output field names (or dotted paths like companyRating.aggregateRating) that should NOT make a record count as UPDATED. By default the posted-days-ago label, viewCount, applyCount, companyLogo, searchScope and the AmbitionBox rating/review count are already ignored, because they drift on their own without the posting itself changing. Add more field names here if changes to them are not relevant to you. Ignored fields are still returned in the output. |
mcpConnectorsarray | Connector IDs to export pushed records to when the run finishes. |
notionParentPageUrlstring | When a Notion connector is used, the parent page the records are written under. |
maxNotifyListingsinteger | Cap on records sent through the connectors above per run. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
kindkindlistingSourcelistingSourcerecordIdrecordIdjobIdjobIdtitletitleurlurlcompanyNamecompanyNamecompanyIdcompanyIdgroupIdgroupIdisTopGroupisTopGroupcompanyLogocompanyLogocompanyJobsUrlcompanyJobsUrlShow 61 more fields
skillsskillskeySkillskeySkillsexperienceexperienceminimumExperienceminimumExperiencemaximumExperiencemaximumExperiencesalarysalarysalaryDetailsalaryDetaillocationlocationlocationslocationslocationDetailslocationDetailslocationIdslocationIdsdescriptionSnippetdescriptionSnippetdescriptiondescriptiondescriptionHtmldescriptionHtmldescriptionMarkdowndescriptionMarkdowneducationeducationeducationDetailseducationDetailsemploymentTypeemploymentTypejobTypejobTypeinternshipDurationinternshipDurationindustryindustryfunctionalAreafunctionalAreajobRolejobRoleroleCategoryroleCategoryroleCategoryIdroleCategoryIdworkFromHomeTypeworkFromHomeTypevacancyvacancyviewCountviewCountapplyCountapplyCountexternalApplyexternalApplyapplyUrlapplyUrlhasApplyQuestionnairehasApplyQuestionnairepostedAtpostedAtpostedDaysAgoLabelpostedDaysAgoLabelpostedByConsultantpostedByConsultantcurrencycurrencywalkinJobwalkinJobwalkInDetailswalkInDetailsdiversityTagsdiversityTagssearchScopesearchScopecompanyRatingcompanyRatingcompanyReviewscompanyReviewscompanySalaryInsightcompanySalaryInsightcompanyBenefitscompanyBenefitscompanyBenefitsUrlcompanyBenefitsUrlcompanyBenefitsReportedBycompanyBenefitsReportedBycompanyDetailscompanyDetailschangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAtisRepostisRepostscrapedAtscrapedAtreviewerNamereviewerNameroleAndLocationroleAndLocationratingratinglikeslikesdislikesdislikespublishedOnpublishedOnreviewUrlreviewUrlrepostOfJobIdrepostOfJobIdExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordId": "999000111222",
"jobId": "999000111222",
"kind": "job",
"title": "Senior Backend Engineer",
"url": "https://www.naukri.com/job-listings-senior-backend-engineer-example-tech-solutions-bengaluru-999000111222",
"companyName": "Example Tech Solutions Pvt Ltd",
"companyId": 500123,
"companyLogo": "https://img.example.com/logo_images/groups/v1/500123.gif",
"skills": [
"Python",
"Django",
"SQL"
],
"experience": "3-6 Yrs",
"minimumExperience": 3,
"maximumExperience": 6,
"salary": "8-14 Lacs PA",
"salaryDetail": {
"minimumSalary": 800000,
"maximumSalary": 1400000,
"currency": "INR",
"hideSalary": false
},
"location": "Bengaluru",
"descriptionSnippet": "Own backend services for a growing product team...",
"description": "Full job description text goes here...",
"vacancy": 2,
"postedAt": "2026-06-15T00:00:00+00:00",
"postedDaysAgoLabel": "3 Days Ago",
"currency": "INR",
"walkinJob": false,
"searchScope": "python developer in bangalore",
"education": "Any Graduate",
"employmentType": "Full Time, Permanent",
"jobType": "fulltime",
"industry": "IT Services",
"functionalArea": "Engineering - Software",
"companyRating": {
"aggregateRating": 4.2,
"reviewsCount": 350
},
"companyReviews": [
{
"reviewerName": "Anonymous",
"roleAndLocation": "Backend Engineer in Bengaluru",
"rating": "4",
"likes": "Good work-life balance and a supportive team.",
"dislikes": "Promotions could be faster.",
"publishedOn": "01 Feb 2026",
"reviewUrl": "https://www.ambitionbox.com/reviews/example-tech-solutions-reviews?rid=1234567"
}
],
"companySalaryInsight": {
"jobProfileName": "Senior Backend Engineer",
"averageCtc": "14.2",
"minCtc": "11.0",
"maxCtc": "18.5",
"salariesUrl": "https://www.ambitionbox.com/salaries/example-tech-solutions-salaries/senior-backend-engineer"
},
"companyBenefits": [
"Health Insurance",
"Free Meal",
"Transport / Travel Support"
],
"descriptionMarkdown": "**About the role**\n\n- Own backend services\n- Mentor two engineers",
"roleCategoryId": "1028",
"hasApplyQuestionnaire": false,
"scrapedAt": "2026-06-18T09:30:00+00:00"
}Ways to use this data
- Recruiters and staffing agencies: track fresh postings for specific roles and cities without checking the site by hand.
- Job seekers and career sites: build a personal or aggregated feed of matching openings with salary, experience band and posting date.
- Compensation and market research teams: collect salary bands, experience ranges and skill tags across postings to benchmark a role or region.
- Competitive intelligence teams: monitor a set of roles or companies and get notified the moment a new or changed posting appears, using incremental mode.
- Data teams and ML pipelines: build historical datasets of postings, skill demand and hiring activity for analysis.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Naukri.com Scraper return?
The documented output for Naukri.com Scraper includes kind, listingsource, recordid, jobid, title, url, companyname and companyid. Availability of each field depends on the source page and the selected mode.
How much does Naukri.com Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new job postings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Later runs then return only new, updated and reappeared postings, and unchanged ones are suppressed and not billed unless you turn on Emit unchanged.
Why didn't I get any EXPIRED rows even with Emit expired on?
Expired postings are only produced once a run has scanned its whole tracked search end to end: not capped by Max items or Max pages, not resumed, every scope reached its natural end (including a scope whose very first page comes back empty while the source still reports matching jobs for it, which also counts as incomplete), and the source's own reported job count matched what the walk actually served. A pasted search link that already starts past page one, or carries its own filter query string, counts the same way: the run never saw that scope's full window, so it is not trusted to decide what is EXPIRED from it. This check applies to the whole run, not one keyword at a time, so for example a two-keyword incremental run where the first keyword finishes cleanly but the second hits Max items mid-page skips expiry detection for both keywords that run. Raise Max items (or set it to 0), or give each keyword its own scheduled run and state key, so a cap on one search never withholds expired detection on another.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues ONE specific interrupted run: paste its run or dataset id and the actor skips everything it already collected there. Incremental mode is for running the SAME search again and again, for example daily, and getting only what changed; it keeps its own state per search and filter combination, or per State key.
Why did my run fail instead of returning an empty dataset?
The log may show a boxed warning "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." and, once a backup connection serves data, "Served over the backup connection (the default connection was unavailable)." Both are informational; the run keeps going. If every page read is refused, the run stops with a clear message so "no jobs matched" is never confused with "the site could not be read". Run it again in a few minutes. If only some keywords or links could be read, you still get what was found from the rest. One exception in Incremental mode: the check counts only returned records, so a scheduled run where every posting read was unchanged (and suppressed) and one page was refused also ends as failed, even though its state was still updated. Re-run it, or turn on Emit unchanged (which returns and bills those rows) if you need such runs to succeed.
