NHS Jobs Scraper (Cheap)
Pricing
from $3.99 / 1,000 results
NHS Jobs Scraper (Cheap)
NHS Jobs Scraper that pulls vacancy listings from jobs.nhs.uk by keyword, location, and filter, so recruiters and analysts get clean structured job data without manual searching.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Data API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
NHS Jobs Scraper
Searching jobs.nhs.uk by hand means clicking through page after page of results and copying out each role one cell at a time. This scraper does that part for you. Give it a search term such as "nurse" or "physiotherapist", add an area if you want one, and it walks the NHS Jobs results and returns every vacancy as a clean row: role title, employer, salary, location, contract, closing date, and a direct link to the advert. Run one search or queue dozens of term-and-area pairs in a single go.

What you get
Every vacancy comes back as one row with the same set of columns, so the results drop straight into a spreadsheet or database. Each row carries:
- The role —
roleTitle,employerName,workLocation,payRange,contractKind,workSchedule - Dates and reference —
postedDate,applyByDate,vacancyRef,listingUrl - Search context —
queryTermandqueryAreaso you can tell which search produced each row, plus acollectedAttimestamp
Quick start
- Click Try for free and open the input form.
- Type your searches into Search terms, one per line (for example
midwife). - Optional: add a matching Search area on the same line, then set a Radius, a salary band, or a contract filter.
- Set Results per search term to cap how many jobs each search returns.
- Hit Start, then download the results as JSON, CSV, Excel, or XML once the run finishes.

Use cases
- Recruitment agencies — track new NHS vacancies by role and region and feed them into your candidate pipeline
- Job boards and aggregators — keep a fresh feed of NHS listings without manual copy-paste
- Workforce planning — watch which trusts are hiring, for what, and at what salary over time
- Salary benchmarking — pull pay ranges across a role or band to compare against your own offers
- Locum and bank staffing — filter to Locum or Bank contracts and surface short-term openings fast
- Career research — gather every matching role in your area into one list instead of scrolling the site
Input
| Field | Type | Required | Description |
|---|---|---|---|
searchTerms | array of strings | Yes | One job search per line. Each line pairs with the area on the same row in searchAreas. Prefill healthcare assistant. |
searchAreas | array of strings | No | One town, city, or postcode per line, matched by row to searchTerms. Leave empty to search the whole UK. |
searchRadius | integer | No | How far from each area to look, in miles (5, 10, 20, 30, 50, or 100). Default 20. |
employerFilter | string | No | Limit results to a single employer or NHS Trust by name. |
contractKindFilter | string | No | Keep only one contract type (Permanent, Locum, Bank, and so on). Default is all contracts. |
workScheduleFilter | string | No | Keep only one work schedule (Full time, Part time, Flexible working, and so on). Default is all schedules. |
minSalary | integer | No | Lowest annual salary to include. Default 0 for no lower bound. |
maxSalary | integer | No | Highest annual salary to include. Default 0 for no upper bound. |
firstPage | integer | No | Results page to start from, per search row. Default 1. Use it to resume a stopped run. |
resultsLimit | integer | No | Jobs to collect per search row. Default 50; three terms at 50 gathers up to 150 jobs. |
timeoutSeconds | integer | No | Seconds to wait on each request before giving up. Default 45. |
Example input
{"searchTerms": ["healthcare assistant", "physiotherapist", "midwife"],"searchAreas": ["Leeds", "Bristol", "Glasgow"],"searchRadius": 20,"contractKindFilter": "Permanent","workScheduleFilter": "full-time","minSalary": 30000,"maxSalary": 55000,"firstPage": 1,"resultsLimit": 50,"timeoutSeconds": 45}
Output
Each vacancy is one row, and the columns are the same on every row. Fields with nothing to show come back as null so the dataset stays rectangular.
Example output
{"roleTitle": "Band 5 Physiotherapist","listingUrl": "https://www.jobs.nhs.uk/candidate/jobadvert/C9123-25-4567","vacancyRef": "C9123-25-4567","employerName": "Leeds Teaching Hospitals NHS Trust","workLocation": "Leeds, LS1 3EX","payRange": "£29,970 to £36,483 a year","postedDate": "12 June 2026","applyByDate": "30 June 2026","contractKind": "Permanent","workSchedule": "Full time","queryTerm": "physiotherapist","queryArea": "Leeds","collectedAt": "2026-06-29T12:00:00.000000+00:00"}
Output fields
| Field | Type | Description |
|---|---|---|
roleTitle | string | Vacancy title as shown on NHS Jobs |
listingUrl | string | Direct link to the full job advert |
vacancyRef | string | NHS Jobs reference code from the advert link |
employerName | string | Hiring organisation or NHS Trust |
workLocation | string | Town, city, or postcode for the role |
payRange | string | Salary text as printed on the listing |
postedDate | string | When the advert went live |
applyByDate | string | Application closing date |
contractKind | string | Contract on offer, such as Permanent or Locum |
workSchedule | string | Hours pattern, such as Full time or Part time |
queryTerm | string | The search term that produced the row |
queryArea | string | Area paired with the term; null when none was given |
collectedAt | string | ISO 8601 timestamp of when the row was captured |
Tips for best results
- Start with one search. Run a single term against a single area first to confirm the output looks right, then scale up.
- Match your rows. Search terms and areas pair by line number, so keep them aligned. A term with no area on its row searches the whole UK.
- Cap each search with
resultsLimit. Keep it low while you test, then raise it for the full pull. Remember the cap counts per search row, not per run. - Use the salary band to cut noise. Set
minSalaryandmaxSalaryto focus on a specific pay bracket instead of wading through every result. - Resume long runs with
firstPage. If a run stops part way, set the starting page to pick up roughly where it left off.
How can I use NHS Jobs data?
How can I use the NHS Jobs Scraper to build a recruitment feed?
Queue the roles you place for, like nurse, healthcare assistant, and radiographer, across the areas you cover. Set a sensible resultsLimit and run it on a schedule. Each run hands back every matching vacancy with the employer, salary, location, and a link to the advert, ready to load into your applicant tracking system.
How can I scrape NHS job vacancies for salary benchmarking?
Search a single role and read the payRange field across the results. Because every row carries the contract, schedule, and employer too, you can group the pay data by trust or by region and compare it against your own bands without opening a single advert by hand.
How can I track which NHS Trusts are hiring in my region?
Add your towns and postcodes to searchAreas and set a searchRadius. The scraper returns the employerName and workLocation on every vacancy, so you can count openings per trust, watch demand shift over weeks, and spot which employers are recruiting hardest near you.
Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Support
Questions, feature requests, or a field you'd like added? Reach out at data.apify@proton.me and we'll get back to you.