NHS Jobs Scraper avatar

NHS Jobs Scraper

Pricing

from $1.00 / 1,000 actor starts

Go to Apify Store
NHS Jobs Scraper

NHS Jobs Scraper

Scrape live UK healthcare jobs from every NHS trust via the official NHS Jobs public XML API. No API key needed. Returns job title, trust, location, pay band (min/max GBP), contract type, hours, closing date, and full description (text, HTML, Markdown). Pay-per-result.

Pricing

from $1.00 / 1,000 actor starts

Rating

0.0

(0)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

NHS Jobs Scraper - UK Healthcare Vacancies, Pay Bands, Trusts

Pull live UK healthcare vacancies from every NHS trust via the official NHS Jobs public XML feed. Each record includes job title, trust name, location, pay band with GBP min and max, contract type, working pattern, closing date, and the full description body (text, HTML and Markdown). With detail mode on, you also get the recruiter contact person (name, position, email, phone), the employer website and address, pay scheme and band, reference number, essential and desirable requirements, and the DBS flag. No API key, no registration, no third-party dependency.

Contact person: most listings name a recruiter or hiring manager. You get their name, position and email straight from the vacancy page, ready for outreach.

Sample output

[
{
"id": "C9188-25-1234",
"title": "Staff Nurse - Cardiology",
"company_name": "Guy's and St Thomas' NHS Foundation Trust",
"company": "Guy's and St Thomas' NHS Foundation Trust",
"location": "London",
"country": "UK",
"employment_type": "permanent",
"hours": "Full-time, Flexible working",
"salary_min": 34089,
"salary_max": 41498,
"salary_currency": "GBP",
"salary_period": "yearly",
"salary_text": "£34,089 to £41,498 per annum inc. HCAS",
"description_full": "We are recruiting a Band 5 Staff Nurse to join our busy Cardiology ward. You will provide safe, evidence-based care...",
"description_snippet": "We are recruiting a Band 5 Staff Nurse to join our busy Cardiology ward. You will provide safe, evidence-based care...",
"description_html": "<p>We are recruiting a Band 5 Staff Nurse to join our busy Cardiology ward...</p>",
"description_md": "We are recruiting a Band 5 Staff Nurse to join our busy Cardiology ward...",
"posted_at": "2026-08-01",
"expires_at": "2026-08-15",
"job_url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9188-25-1234",
"source_url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9188-25-1234",
"apply_url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9188-25-1234",
"source_platform": "nhs-jobs",
"search_query": "nurse in London",
"scraped_at": "2026-08-06T10:30:00Z",
"contact_name": "Ceri Cole",
"contact_firstname": "Ceri",
"contact_lastname": "Cole",
"contact_position": "Maternity Triage Manager",
"contact_email": "ceri.cole@nhs.net",
"contact_emails": ["ceri.cole@nhs.net"],
"contact_phone": null,
"contact_phones": null,
"company_website": "https://www.pah.nhs.uk",
"company_address": "The Princess Alexandra Hospital, Harlow, Essex, CM20 1QX, United Kingdom",
"pay_scheme": "Agenda for change",
"pay_band": "Band 6",
"working_pattern": "Full-time",
"reference_number": "001076",
"requirements_must": [{"category": "Qualifications", "text": "Registered NMC Midwife"}],
"requirements_nice": null,
"dbs_check_required": true
},
{
"id": "C9235-25-0891",
"title": "Consultant Radiologist",
"company": "University Hospitals Birmingham NHS Foundation Trust",
"location": "Birmingham",
"country": "UK",
"employment_type": "permanent",
"hours": "Full-time",
"salary_min": 99532,
"salary_max": 131964,
"salary_currency": "GBP",
"salary_period": "yearly",
"posted_at": "2026-07-28",
"expires_at": "2026-08-25"
},
{
"id": "C9421-25-4402",
"title": "Band 3 Healthcare Assistant",
"company": "Manchester University NHS Foundation Trust",
"location": "Manchester",
"country": "UK",
"employment_type": "fixed-term",
"hours": "Part-time",
"salary_min": 24071,
"salary_max": 25674,
"salary_currency": "GBP",
"salary_period": "yearly"
}
]

Pricing

EventPrice
Actor start$0.001
SERP result (per job)$0.003
Detail result (per job, with full description)$0.005

Around $3 per 1000 jobs without descriptions, or $8 per 1000 jobs with the full description body. If a description fetch fails, you are not charged for the detail event.

New to Apify? Every account gets a $5 free monthly platform credit, enough for around 5,000 results on this actor before you commit to paying anything. Test extensively first.

Input

No API key required. Just pick your keywords and (optionally) a location.

FieldTypeRequiredDescriptionExample
keywordsarrayNoNHS role keywords. Each runs as a separate search. Results are deduplicated by vacancy ID.["nurse", "midwife", "radiographer"]
locationstringNoUK city, town, or postcode.London or SW1A 1AA
distanceMilesintegerNoRadius around the location in miles (0 to 100). Only meaningful when a location is set.10
payMinintegerNoFilter to jobs paying at least this many GBP per year.30000
payMaxintegerNoFilter to jobs paying at most this many GBP per year.80000
sortBystringNoResult order. "newest" returns the most recently published vacancies first and keeps only rows whose title or summary mention your keyword (the NHS API widens matching when sorting by date), paging until your cap is reached. "relevance" uses the platform default. Default "newest"."newest"
postedWithinDaysnumberNoOnly jobs published within the last N days (decimals allowed). Empty means no limit.7
maxResultsintegerNoTotal cap across all keywords. Default 100.500
maxResultsPerQueryintegerNoCap per keyword. Default 250.250
includeJobDetailsbooleanNoFetch each vacancy's detail page for the full description body plus contact person, employer, pay scheme, requirements and DBS fields. Default true.false
maxConcurrencyintegerNoConcurrent detail-page requests (1 to 20). Default 5.5
titleFilterstringNoComma-separated title terms (OR-match, case-insensitive). Only jobs whose title contains one of the terms are returned. Non-matching rows are dropped before any detail fetch, so you don't pay for them. Leave empty to disable."nurse, doctor"

Precision title filter

{
"keywords": ["healthcare"],
"titleFilter": "nurse, doctor",
"maxResults": 50
}

Only jobs with "nurse" or "doctor" in the title are returned. Non-matching rows are dropped before any detail fetch.

Output fields

Core

  • id: Vacancy ID (stable dedup key across the site).
  • title: Job title.
  • company_name: NHS trust or organisation name (canonical).
  • company: Deprecated duplicate of company_name, see Deprecation notes below.
  • location: City, town, or postcode as published.
  • country: Always "UK".

Employment

  • employment_type: Permanent, fixed-term, bank, locum, secondment, or apprenticeship.
  • hours: Working pattern from the vacancy page, for example Full-time, Flexible working or Part-time. Filled when includeJobDetails is true.

Salary

  • salary_min, salary_max: Numeric GBP bounds.
  • salary_currency: Always "GBP".
  • salary_period: yearly, hourly, daily, or sessional.
  • salary_text: Raw pay string as the trust published it.

Description

  • description_snippet: SERP-level teaser.
  • description_full: Full plain-text body (job summary plus main duties) from the vacancy detail page. Only when includeJobDetails: true.
  • description_html: The same body as cleaned HTML.
  • description_md: The same body as Markdown.

Contact person (only when includeJobDetails is true; null when the listing does not publish it)

  • contact_name: Recruiter or hiring manager named on the listing. Sometimes a team name.
  • contact_firstname, contact_lastname: Split of the name when it looks like a person (skipped for team or organisation names).
  • contact_position: Their job title.
  • contact_email, contact_emails: Primary email and the full list.
  • contact_phone, contact_phones: Primary phone and the full list. Often empty; placeholder numbers such as 0000000000 are dropped.

Employer (detail mode)

  • company_website: Employer website URL.
  • company_about: The employer's "About us" text.
  • region: County of the job location.
  • company_address: Joined job-location address, plus company_address_street, company_address_city, company_address_region, company_address_postcode, company_address_country.
  • employer_privacy_notice_url: Link to the employer's privacy notice.

Pay and role details (detail mode)

  • pay_scheme: For example "Agenda for change" or "Other".
  • pay_band: For example "Band 6". Empty for non-Agenda-for-change schemes.
  • working_pattern: For example "Full-time" or "Part-time".
  • reference_number: The employer's own job reference.
  • job_summary: The "Job summary" block as plain text (also included in the description).
  • requirements_must, requirements_nice: Essential and desirable person-specification criteria as arrays of {category, text}.
  • requirements: The same criteria as one flat text block.
  • dbs_check_required: true when the listing carries a Disclosure and Barring Service check notice.

Dates and links

  • posted_at: When the vacancy was published.
  • expires_at: Application closing date.
  • job_url: Canonical NHS Jobs vacancy page URL. source_url carries the same value.
  • source_url: Original NHS Jobs listing URL.
  • apply_url: Where to apply. For vacancies hosted on an external applicant tracking system (detail mode) this is the employer's own ATS link; otherwise the NHS Jobs vacancy page.
  • source_platform: Always "nhs-jobs".
  • search_query: The keyword + location string that produced this hit.
  • scraped_at: ISO timestamp when the record was written.

Deprecation notes

The following field name is deprecated and will be removed after 2027-09-29 (one-year backward-compatibility window):

  • company -> use company_name (canonical since 2026-09-29)

Both fields are emitted in every dataset row during the window. Please migrate downstream consumers to the canonical name before the removal date.

Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

Configure MCP server with NHS Jobs Scraper. Get a ready-to-use configuration for your MCP client with the NHS Jobs Scraper preconfigured at mcp.apify.com?tools=santamaria-automations/nhs-jobs-scraper. You can connect to the Apify MCP Server using clients like Tester MCP Client, or any other MCP client of your choice. See the Apify MCP docs for implementation details, the MCP protocol introduction for an overview, or the Apify blog post for a walkthrough.

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

For per-tool schemas and copy-paste snippets for MCP clients, see the MCP tab.

See the auto-generated API tab for language-specific examples (cURL, JS, Python, .NET, Ruby, PHP).

Why this actor

  • No API key to manage, no rate-limit tier to worry about, no third-party sign-up. NHS Jobs is a public feed.
  • Structured pay bands (salary_min / salary_max / salary_period) parsed out of the raw NHS pay strings, which include HCAS, London weighting, and sessional consultant rates.
  • Every NHS trust in one query. You do not need to enumerate trusts or run 200 separate searches.
  • Recruiter contact person, employer website and address, pay scheme and band, reference number and person-specification requirements on every detail row.
  • Full description body (with includeJobDetails: true) so downstream LLM parsing or JD matching has something to work with.
  • Failed detail fetches are not charged, so you never pay for empty data.

Common use cases

  • Refresh a Southampton private-hospital nursing pipeline daily so the recruiter has a live list of NHS staff nurses within 15 miles.
  • Alert on consultant radiology vacancies at any of the top-20 English trusts paying above £110k.
  • Feed every newly-posted Band 5 to Band 7 midwife role into a Slack channel for a maternity-agency shift-fill workflow.
  • Track vacancy count per trust per week to spot which trusts are struggling to hire and warrant an agency conversation.

Notes and limits

  • With sortBy: "newest", off-topic rows the NHS API returns for a keyword are dropped, so more pages are read to reach your cap. Very rare keywords can return fewer results than maxResults.
  • The public NHS Jobs feed caps deep pagination at a few hundred pages per query. Very broad searches ("nurse" with no location) may hit that ceiling before your maxResults.
  • Some vacancies do not publish a structured pay band. salary_min and salary_max will be null; salary_text still holds the raw string.
  • Sessional pay (typical for consultants) surfaces as salary_period: "sessional" with the numeric value per session.
  • The vacancy page does not publish a reliable NHS region, so there is no region field. Detail-page HTML can shift when NHS Jobs updates their template. If a description cannot be parsed, the job is still emitted with SERP-level data and you are not charged for the detail event.

Feed the company_website field from this actor's output into one of the two below to enrich rows with contact data.

Support

  • Questions or issues? Email contact@nanoscrape.com, we typically reply within 6 hours. You can also open a ticket in the Issues tab on the actor page.
  • Feature request for this actor? Open a ticket in the Issues tab or email contact@nanoscrape.com with the platform field you need and (if possible) a URL that shows the data live.
  • Need a scraper for a job board we don't cover yet? Email contact@nanoscrape.com with the target site + your rough usage volume. We ship one-off boards regularly.