NHS Jobs Scraper avatar

NHS Jobs Scraper

Pricing

Pay per event

Go to Apify Store
NHS Jobs Scraper

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

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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?

CategoryFields
IdentityvacancyId, referenceNumber, title, url
Employeremployer, address, town, county, country, website
Locationlocation, postcode
Paysalary text, minimum, maximum, currency, period, scheme, band
Datesposting date, closing date, normalized ISO dates
Employmentcontract type, working pattern
Narrativesummary, main duties, full job description, employer description
Requirementsessential and desirable person-specification criteria
Contactpublic contact role, name, email, and phone
Provenancesource 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.

EventFree planStarterScaleBusiness
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

  1. Open automation-lab/nhs-jobs-scraper in the Apify Store.
  2. Enter one or more role keywords, such as nurse or radiographer.
  3. Optionally enter a town, city, county, or postcode.
  4. Select pay-band, contract, or working-pattern filters.
  5. Keep Enrich vacancy details enabled for full descriptions and contacts.
  6. Set Maximum vacancies to the number of records needed.
  7. Click Start.
  8. 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

InputTypeDefaultDescription
keywordsstring[]["nurse"]Job titles, skills, or search terms
locationstringemptyUK town, city, county, or postcode
distanceMilesinteger10Radius around the location
jobReferencestringemptyNHS Jobs or Trac reference
employerstringemptyNHS trust or employer name
contractTypesstring[][]Permanent, fixed-term, bank, locum, and other filters
workingPatternsstring[][]Full-time, part-time, remote, flexible, and other filters
payBandsstring[][]Agenda for Change bands or medical grades
startUrlsrequest listsample search URLNHS Jobs search or vacancy URLs
maxItemsinteger10Maximum unique vacancies saved
enrichDetailsbooleantrueFetch full vacancy detail pages
detailConcurrencyinteger4Simultaneous detail requests, from 1 to 10
useApifyProxybooleanfalseRoute requests through Apify Proxy
proxyGroupsstring[][]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 vacancyId values 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 ApifyClient
client = 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().items
print(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-scraper to 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.”

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:

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.