NHS Jobs Scraper
Pricing
Pay per event
NHS Jobs Scraper
Extract structured NHS Jobs vacancies with salary, pay band, dates, full descriptions, person specifications, employer details, and public recruiter contacts. Export to JSON, CSV, or Excel; schedule runs or use the API.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
NHS Jobs Scraper extracts public healthcare vacancies from NHS Jobs into structured, reusable data.
Search by role and location, apply NHS-specific filters, or process a search or vacancy URL directly.
What does NHS Jobs Scraper do?
NHS Jobs Scraper turns public jobs.nhs.uk vacancy pages into clean records for recruiting, aggregation, monitoring, and workforce analysis.
It supports both discovery and deep extraction:
- 🔎 Search by keyword, location, employer, or job reference.
- 🏥 Filter by pay band, contract type, and working pattern.
- 🔗 Paste NHS Jobs search-result or vacancy-detail URLs.
- 📄 Enrich each result with full descriptions and person specifications.
- 💷 Parse salary ranges, pay schemes, and pay bands.
- 📅 Normalize posting and closing dates.
- 👤 Capture public recruitment contact details when listed.
- 📦 Export JSON, CSV, Excel, XML, RSS, or access data by API.
No NHS Jobs account, login, or private API key is required.
The scraper uses lightweight public HTML rather than a browser, keeping repeat runs fast and predictable.
Who is NHS Jobs Scraper for?
Healthcare recruiters and staffing firms
- Build daily candidate-sourcing and vacancy feeds.
- Identify trusts hiring for specific professions.
- Route public recruiter contacts into compliant outreach workflows.
Job boards and aggregators
- Import current NHS vacancies with stable IDs and canonical URLs.
- Deduplicate listings across searches and regions.
- Track closing dates before syndicating opportunities.
Workforce and labour-market analysts
- Compare advertised salaries across roles and locations.
- Measure Band 5, Band 6, or consultant hiring demand.
- Study contract and working-pattern trends over time.
NHS suppliers and sales intelligence teams
- Detect trusts expanding particular teams.
- Use hiring signals to prioritize account research.
- Monitor employer activity without manually repeating searches.
Why use this NHS Jobs scraper?
- ✅ Complete search and detail workflow in one Actor.
- ✅ Full narrative fields, not only search-card snippets.
- ✅ NHS-specific pay-band and person-specification fields.
- ✅ Search filters and pasted URL modes can be combined.
- ✅ Pagination and deduplication work across all inputs.
- ✅ Optional proxy routing is available but disabled by default.
- ✅ Runs can be scheduled daily, weekly, or on demand.
- ✅ Dataset data integrates with thousands of Apify-connected tools.
What NHS vacancy data can you extract?
| Category | Fields |
|---|---|
| Identity | vacancyId, referenceNumber, title, url |
| Employer | employer, address, town, county, country, website |
| Location | location, postcode |
| Pay | salary text, minimum, maximum, currency, period, scheme, band |
| Dates | posting date, closing date, normalized ISO dates |
| Employment | contract type, working pattern |
| Narrative | summary, main duties, full job description, employer description |
| Requirements | essential and desirable person-specification criteria |
| Contact | public contact role, name, email, and phone |
| Provenance | source URL, search keyword, page, enrichment status, scrape time |
A single dataset item represents one unique NHS vacancy.
Detail fields are optional only when detail enrichment is disabled or a vacancy does not publish that field.
How much does it cost to scrape NHS Jobs?
This Actor uses pay-per-event pricing.
You pay a small run-start fee and a per-vacancy fee only for records saved to the dataset.
| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| Run start | $0.00030 | $0.00030 | $0.00030 | $0.00030 |
| Vacancy saved | $0.00012067 | $0.00010493 | $0.000081846 | $0.000062958 |
Higher Apify plans receive additional volume discounts down to $0.000029381 per vacancy on the Diamond tier.
A 10-vacancy Free-plan run costs about $0.00151, including the start fee. A 1,000-vacancy Starter-plan run costs about $0.10523.
Start with 10 vacancies to inspect output and estimate the cost of your recurring workflow.
Your Apify free-plan credits can be used to test thousands of vacancies.
How to scrape NHS Jobs vacancies
- Open
automation-lab/nhs-jobs-scraperin the Apify Store. - Enter one or more role keywords, such as
nurseorradiographer. - Optionally enter a town, city, county, or postcode.
- Select pay-band, contract, or working-pattern filters.
- Keep Enrich vacancy details enabled for full descriptions and contacts.
- Set Maximum vacancies to the number of records needed.
- Click Start.
- Open the dataset and export it in your preferred format.
For a precise existing search, paste its jobs.nhs.uk URL under NHS Jobs URLs.
For one known vacancy, paste its /candidate/jobadvert/... URL and set maxItems to 1.
Input parameters
| Input | Type | Default | Description |
|---|---|---|---|
keywords | string[] | ["nurse"] | Job titles, skills, or search terms |
location | string | empty | UK town, city, county, or postcode |
distanceMiles | integer | 10 | Radius around the location |
jobReference | string | empty | NHS Jobs or Trac reference |
employer | string | empty | NHS trust or employer name |
contractTypes | string[] | [] | Permanent, fixed-term, bank, locum, and other filters |
workingPatterns | string[] | [] | Full-time, part-time, remote, flexible, and other filters |
payBands | string[] | [] | Agenda for Change bands or medical grades |
startUrls | request list | sample search URL | NHS Jobs search or vacancy URLs |
maxItems | integer | 10 | Maximum unique vacancies saved |
enrichDetails | boolean | true | Fetch full vacancy detail pages |
detailConcurrency | integer | 4 | Simultaneous detail requests, from 1 to 10 |
useApifyProxy | boolean | false | Route requests through Apify Proxy |
proxyGroups | string[] | [] | Optional proxy groups |
At least one keyword, job reference, employer, search URL, or detail URL is required.
URLs outside jobs.nhs.uk and unrelated paths are rejected.
Input examples
Search for nurse vacancies around Manchester:
{"keywords": ["nurse"],"location": "Manchester","distanceMiles": 20,"maxItems": 25,"enrichDetails": true}
Monitor Band 5 vacancies across two role families:
{"keywords": ["nurse", "therapist"],"payBands": ["BAND_5"],"maxItems": 100,"enrichDetails": true,"detailConcurrency": 4}
Extract one vacancy URL:
{"keywords": [],"startUrls": [{ "url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9262-26-1074?language=en" }],"maxItems": 1}
Output example
{"vacancyId": "C9262-26-1074","referenceNumber": "262-A-26-8075087","title": "Community Nurse - Night Nurse","employer": "North Cumbria Integrated Care NHS Foundation Trust","location": "Carlisle CA1 3TP","postcode": "CA1 3TP","salaryText": "£32,073 to £39,043 a year Per Annum Pro Rata","salaryMin": 32073,"salaryMax": 39043,"salaryCurrency": "GBP","salaryPeriod": "year","payScheme": "Agenda for change","payBand": "Band 5","datePostedIso": "2026-07-08","closingDateIso": "2026-07-26","contractType": "Permanent","workingPattern": "Part-time","detailEnriched": true,"url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9262-26-1074"}
Long narrative and criteria fields are included in the real item but shortened here for readability.
Tips for best results
- 🎯 Use a specific role phrase for focused feeds.
- 📍 Add location and distance when monitoring a regional labour market.
- 🏥 Combine employer and pay-band filters for trust-level analysis.
- 🧪 Start with 10 records before scaling a new search.
- 📄 Keep detail enrichment enabled when you need descriptions or contacts.
- ⚡ Disable detail enrichment for a faster search-card-only discovery pass.
- 🕐 Schedule recurring searches at a respectful interval.
- 🔁 Deduplicate longitudinal exports using
vacancyId.
Pagination, deduplication, and reliability
Each search page exposes a server-rendered next-page link.
The Actor follows that link until it reaches maxItems, runs out of pages, or finds no new vacancy IDs.
Temporary HTTP failures are retried with conservative limits.
A failed detail request from a search workflow preserves the valid search-card record and marks detailEnriched false.
A blocked or malformed top-level page fails the run rather than returning a misleading success.
Direct requests are the default because public NHS Jobs pages are anonymously accessible.
Enable Apify Proxy only when your environment requires it.
Integrations for NHS recruitment workflows
NHS Jobs → Google Sheets
- Append daily vacancy records for recruiter review.
- Build salary and closing-date dashboards by trust.
NHS Jobs → Slack or Microsoft Teams
- Send an alert when a target trust posts a new Band 6 role.
- Notify a sourcing team before a vacancy closes.
NHS Jobs → Make or Zapier
- Create a CRM hiring-signal record for each new employer vacancy.
- Route relevant vacancies into an internal candidate-matching process.
Scheduled runs and webhooks
- Run searches every morning and deliver the dataset by webhook.
- Compare current
vacancyIdvalues with a previous export to detect additions.
Using the Apify API with Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/nhs-jobs-scraper').call({keywords: ['radiographer'],location: 'Birmingham',maxItems: 50,enrichDetails: true});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Using the Apify API with Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("automation-lab/nhs-jobs-scraper").call(run_input={"keywords": ["occupational therapist"],"location": "Leeds","maxItems": 50,"enrichDetails": True,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Using the Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~nhs-jobs-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords":["pharmacist"],"location":"London","maxItems":25,"enrichDetails":true}'
After the run finishes, download items from its defaultDatasetId.
Use with AI agents via MCP
NHS Jobs Scraper is available to AI assistants through the Model Context Protocol.
Claude Code
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/nhs-jobs-scraper"
Claude Desktop, Cursor, or VS Code
{"mcpServers": {"apify-nhs-jobs": {"url": "https://mcp.apify.com?tools=automation-lab/nhs-jobs-scraper"}}}
Your client will ask you to authenticate with Apify.
Example prompts
- “Use
automation-lab/nhs-jobs-scraperto find Band 5 nurse vacancies within 20 miles of Manchester and summarize salary ranges.” - “Extract this NHS Jobs vacancy URL and compare its essential criteria with my candidate profile.”
- “Monitor radiographer vacancies in London and return new employers, closing dates, and public contact emails.”
Is it legal to scrape NHS Jobs?
This Actor collects information displayed on public NHS Jobs pages.
Scraping public data can be lawful, but legality depends on your jurisdiction, purpose, and handling of personal data.
Review NHS Jobs terms, applicable employment rules, copyright, database rights, and UK GDPR obligations before use.
Public recruiter contact details should not be used for spam or unlawful profiling.
Use respectful run sizes and frequencies, store only necessary data, and honor deletion or access obligations that apply to your workflow.
This documentation is general information, not legal advice.
Frequently asked questions
Do I need an NHS Jobs account?
No. The Actor uses anonymously available search and vacancy pages.
Does it fetch full job descriptions?
Yes. Detail enrichment is enabled by default and captures summary, duties, responsibilities, person specifications, employer context, and public contact fields.
How fast is it?
Search pages are lightweight. Detail-enriched runs make one additional request per vacancy with bounded concurrency, so run time grows with maxItems.
Can I scrape a saved NHS Jobs search URL?
Yes. Paste a /candidate/search/results URL into startUrls.
Can I extract one vacancy?
Yes. Paste its /candidate/jobadvert/... URL and set maxItems to 1.
Why are some fields empty?
Employers do not publish every optional field on every vacancy. Inspect detailEnriched; if it is true, empty optional values were not present on the page.
Why did my search return no vacancies?
The combination of keyword, location, pay band, and contract filters may have no current matches. Broaden one filter and run a small test.
What happens if NHS Jobs changes its markup?
The Actor checks for recognizable result/detail structures and fails clearly on total parser failure instead of silently producing misleading records.
How does pricing compare with an official API?
No private NHS Jobs API key is required. Pay-per-event pricing includes Actor operation and Apify platform features such as storage, schedules, API access, and integrations.
Data quality and responsible use
Vacancy content is captured as published by the employer.
Normalized numeric salaries and ISO dates are convenience fields; retain the raw salary and date text for auditability.
A closing date may be brought forward by an employer, so refresh time-sensitive feeds.
Person specifications can contain sensitive employment criteria; use them for legitimate matching and analysis, not unlawful discrimination.
Validate critical decisions against the canonical vacancy URL.
Other recruitment and jobs scrapers
Combine NHS Jobs data with other public hiring sources from automation-lab:
- LinkedIn Jobs Scraper
- Glassdoor Jobs Scraper
- Google Jobs Scraper
- Greenhouse Jobs Scraper
- Jobsite UK Jobs Scraper
- Indeed Scraper
- Dice Tech Jobs Scraper
Use stable vacancy IDs and canonical URLs when joining or deduplicating sources.
Support
If a valid NHS Jobs page fails, open an Actor issue with the input and run URL.
Do not include private candidate data or credentials.
For best diagnostics, identify whether the failure affected search extraction, detail enrichment, or a specific filter combination.