NHS Jobs Scraper — Job Listings & Career Data Extractor
Pricing
from $1.50 / 1,000 scraped results
NHS Jobs Scraper — Job Listings & Career Data Extractor
Scrape NHS job listings from jobs.nhs.uk. Get title, employer, salary, NHS band, location, contract type, closing date, job description, main duties, and structured person specification. Auto-pagination. Checkpoint resume. $2 per 1,000 jobs.
Pricing
from $1.50 / 1,000 scraped results
Rating
0.0
(0)
Developer
Scrape Pilot
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
🏥 NHS Job Scraper – Extract Job Details, Employer, Salary, Band, Location & More
Scrape NHS job vacancies from jobs.nhs.uk – structured data including job title, employer, salary, band, location, contract type, working pattern, closing date, job summary, main duties, and person specification.
Pay only for successfully scraped jobs ($2 per 1,000). Automatic checkpoint/resume, residential proxy ready. Perfect for recruitment analytics, labour market research, and job board aggregation.
💡 What is the NHS Job Scraper?
The NHS Job Scraper extracts full job listing data from the official NHS Jobs portal (jobs.nhs.uk). It starts from a search results URL (e.g., with keywords, location, or filters) and then:
- Crawls paginated search result pages
- Visits each job detail page
- Parses all available structured and unstructured fields
The actor extracts every piece of public information from a typical NHS job advert:
- Job title
- Employer (Trust/Organisation)
- Salary (normalised, including band detection)
- Band (e.g.,
Band 5,Band 6) - Location (town/city)
- Working pattern (full‑time, part‑time, flexible)
- Contract type (permanent, fixed‑term, secondment)
- Closing date and date posted
- Reference number
- Job summary (short overview)
- Main duties (bulleted list)
- Person specification (structured: categories + essential/desirable criteria)
The NHS Job Scraper is built for pay‑per‑event (PPE) – you are charged only for successfully scraped job adverts ($0.002 per job). Failed requests, blocked pages, or missing data cost nothing. The actor also includes automatic checkpoint/resume – if interrupted (spending limit, timeout, network error), it restarts from the last page without re‑scraping already processed jobs.
🚀 Key Features
| Feature | Description |
|---|---|
| Start from any search URL | Use NHS Jobs search filters (keyword, location, distance, etc.). |
| Paginated crawling | Automatically follows page=X parameters up to maxItems. |
| Full job detail extraction | Title, employer, salary, band, location, contract, working pattern, closing date, reference. |
| Long‑text fields | Job summary, main duties, job description. |
| Person specification | Structured output (category → list of essential/desirable criteria). |
| Normalised salary & band | Converts salary text to a consistent format; detects NHS Bands automatically. |
| Resume & checkpoint | Saves progress after each page. If the actor stops, it restarts where it left off. |
| Pay‑per‑success (PPE) | Charged only for jobs that are successfully scraped and pushed to dataset. Failed attempts are free. |
| Spending limit protection | Stops automatically when the user’s daily/monthly limit is reached. |
| Residential proxy ready | Bypasses anti‑bot measures (recommended for large runs). |
| Clean JSON / CSV / Excel | Export from Apify dataset. |
📥 Input Parameters
The actor accepts a JSON object with the following fields:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startUrl | string | Yes | – | A valid NHS Jobs search URL (e.g., https://www.jobs.nhs.uk/candidate/search/results?keyword=nurse&page=1). |
maxItems | integer | No | 2000 | Maximum number of jobs to scrape (actor stops when reached). |
proxyConfiguration | object | No | – | Apify proxy configuration. Residential proxies strongly recommended to avoid blocking. |
Example Input
{"startUrl": "https://www.jobs.nhs.uk/candidate/search/results?keyword=physiotherapist&location=London&page=1","maxItems": 500,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
📤 Output Fields
Each successful job advert returns an object with the following fields (some may be null or []):
| Field | Type | Description |
|---|---|---|
url | string | Direct link to the job advert. |
id | string | Job ID (extracted from URL). |
title | string | Job title. |
employer | string | NHS Trust or organisation name. |
salary | string | Normalised salary (e.g., £28,407 - £34,581 or Band 5). |
band | string | NHS band (e.g., Band 5, Band 6). |
location | string | Primary location (town/city). |
pay_scheme | string | Pay scheme (e.g., Agenda for Change). |
working_pattern | string | Working pattern (e.g., Full time, Part time, Flexible working). |
contract_type | string | Contract type (e.g., Permanent, Fixed term, Secondment). |
closing_date_text | string | Closing date (as displayed). |
date_posted_text | string | Date posted (as displayed). |
reference_number | string | Job reference number (falls back to URL id). |
job_summary | string | Short job summary paragraph. |
main_duties_of_the_job | string | Main duties / responsibilities. |
job_description | string | Combined job summary + main duties (if separate description missing). |
person_specification | array | List of categories with essential/desirable items (structured). |
Example Output
[{"url": "https://www.jobs.nhs.uk/candidate/jobadvert/A1234-5678","id": "A1234-5678","title": "Senior Occupational Therapist","employer": "Guy's and St Thomas' NHS Foundation Trust","salary": "£40,057 - £45,839 per annum incl. HCA","band": "Band 6","location": "London SE1","pay_scheme": "Agenda for Change","working_pattern": "Full time - 37.5 hours per week","contract_type": "Permanent","closing_date_text": "15 June 2026","date_posted_text": "22 May 2026","reference_number": "A1234-5678","job_summary": "We are looking for an experienced Occupational Therapist to join our dynamic team...","main_duties_of_the_job": "• Manage a complex caseload • Provide clinical supervision • Participate in service development","job_description": "We are looking for... • Manage a complex caseload...","person_specification": [{"category": "Qualifications","essentials": ["Degree in Occupational Therapy", "HCPC registration"]},{"category": "Experience","essentials": ["Minimum 2 years post‑graduate experience", "Experience in acute medicine"],"desirables": ["MSc in relevant field"]}]}]
💰 Pricing
| Component | Price |
|---|---|
| Actor start (per run) | $0.40 |
| Per successful job | $0.002 |
| Per 1,000 successful jobs | $2.00 |
- You are charged only when a job advert is successfully scraped (title exists, basic fields present).
- Failed pages (blocked, no results, 404) cost nothing.
- The actor start fee ($0.40) covers infrastructure for the run (even if no jobs are scraped).
- Example: 500 successful jobs = $0.40 + (500 × $0.002) = $1.40.
- Example: 2,500 successful jobs = $0.40 + (2,500 × $0.002) = $5.40.
Checkpoint & Resume:
The actor saves state after every page. If it stops due to spending limit, timeout, or network issue, restarting will continue from the last page without re‑charging for already processed jobs.
🛠 How to Use on Apify
- Create a task with this actor.
- Get a search URL from NHS Jobs – go to
jobs.nhs.uk, enter your search criteria (keyword, location, distance, etc.), copy the URL from the results page (it should containpage=1). - Paste the
startUrlinto the input. - Set
maxItems– how many jobs to scrape (max 2000 per run, but you can run multiple tasks). - Enable residential proxies – go to Proxy Configuration → Selected proxies → Residential (strongly recommended to avoid blocking).
- Run – the actor will crawl pages, extract each job, push to dataset, and charge per successful job.
- Export – download results as JSON, CSV, or Excel from the Dataset tab.
Running via API
curl -X POST "https://api.apify.com/v2/acts/your-username~nhs-job-scraper/runs" \-H "Content-Type: application/json" \-H "Authorization: Bearer YOUR_API_TOKEN" \-d '{"startUrl": "https://www.jobs.nhs.uk/candidate/search/results?keyword=admin&page=1","maxItems": 100,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}'
🎯 Use Cases
| Industry / Use Case | How the NHS Job Scraper Helps |
|---|---|
| Labour market analytics | Track NHS hiring trends by region, band, speciality, and contract type. |
| Recruitment agencies | Enrich candidate matching with real‑time vacancy data from NHS Trusts. |
| Job board aggregation | Build a secondary job board focused on NHS roles. |
| Academic research | Study workforce supply in the UK healthcare system. |
| Salary benchmarking | Extract salary and band information for comparable roles. |
| Data journalism | Analyse vacancy patterns, closing dates, and geographical distribution. |
❓ Frequently Asked Questions
1. Do I need an NHS Jobs account?
No. The actor uses the public NHS Jobs website. No login required.
2. Why do I need residential proxies?
NHS Jobs uses Cloudflare and may block datacenter IPs after many requests. Residential proxies avoid Access Denied pages and ensure stable scraping, especially for large runs.
3. How many jobs can I scrape per run?
The actor respects maxItems (default 2000). NHS Jobs typically returns up to ~1000–2000 results per search. You can increase by using broader keywords or multiple start URLs.
4. What happens if the actor is blocked (CAPTCHA)?
It will log “Blocked by website security” and stop. Retry with a different residential proxy IP or reduce the request rate.
5. How does the pay‑per‑event work?
Each successful job advert triggers Actor.charge(event_name='scraped-result'). You are charged $0.002 per job. Failed requests (e.g., job detail page 404) are not charged.
6. What is the checkpoint feature?
The actor saves its state (processed URLs, items pushed, current page number) in the key‑value store. If the run stops, the next run will resume from where it left off without re‑scraping already processed jobs.
7. Can I scrape job descriptions that are long?
Yes. The job_summary, main_duties_of_the_job, and person_specification fields capture multi‑paragraph content and bullet points.
8. What is the person_specification field?
It is a structured array where each item has a category (e.g., “Qualifications”, “Experience”) and an essentials list (sometimes also desirables). This is parsed from the “Person Specification” section of the job advert.
9. How accurate is the band detection?
The actor first looks for explicit Band field. If not present, it tries to extract band from the salary text (e.g., “Band 5” or “Band 6”). Accuracy is very high for most NHS jobs.
10. What is the actor start fee ($0.40) for?
It covers the cost of running the actor container, proxy setup, and checkpoint management – even if no jobs are found. It is a fixed cost per run.
📝 Technical Notes
- Libraries used:
curl_cffi(TLS fingerprinting),beautifulsoup4(lxml parser). - Proxy: Uses Apify’s
create_proxy_configuration(). SetuseApifyProxy: trueand chooseRESIDENTIALgroup. - Concurrency: Fetches job detail pages in parallel using
asyncio.gather()for speed. - Checkpoint: Stored in key‑value store under
SCRAPER_STATE. - Rate limiting: The actor does not add artificial delays between pages; use proxies to avoid triggering Cloudflare.
- Error handling: Single job failures do not stop the entire run; they are logged and skipped.
🔍 SEO Keywords
NHS Job Scraper, NHS jobs, jobs.nhs.uk scraper, NHS vacancy extractor, NHS recruitment data, UK healthcare jobs, NHS salary band scraper, NHS job details API, Apify NHS actor, NHS job advert parser, NHS Trust vacancies, NHS job search automation
🔗 Related Actors
- UK Job Scraper – Indeed / Reed – Multi‑site job board extraction.
- LinkedIn Jobs Scraper – Extract corporate job listings.
- Government Tenders Scraper – UK public sector procurement notices.
Start scraping NHS Job Scraper today – $0.40 per run + $2 per 1,000 successful jobs. Residential proxy ready.