NHS UK $0.8💰 URL | Keyword | Deep Search Scraper
Pricing
from $0.08 / 1,000 results
NHS UK $0.8💰 URL | Keyword | Deep Search Scraper
From $0.8/1k. Scrape nhs.uk Jobs listings into a flat dataset. Extract 50+ fields, including pay band, salary, full description, essential and desirable criteria, PDFs, sponsorship, DBS, employer details, contacts, and apply URL. Search by filters or use any URL.
Pricing
from $0.08 / 1,000 results
Rating
0.0
(0)
Developer
AbotAPI
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
NHS Jobs UK Scraper
Scrape every public job advert on jobs.nhs.uk into a clean, flat dataset. Handles 50+ fields per listing including pay band, salary range parsed into numbers, full job description (HTML and plain text), person specification with essential AND desirable criteria split out (the official NHS Jobs structure most other scrapers flatten away), supporting PDF download IDs, sponsorship + UK registration + DBS flags, employer address, contact details, and the direct apply URL. Search by keyword, location, distance, pay band, staff group, contract type, working pattern, salary band, OR paste any jobs.nhs.uk URL refined in your browser.
Why This Scraper?
- 50+ fields per record, including fields most NHS Jobs scrapers drop: desirable person-spec criteria, supporting PDF document IDs, sponsorship eligibility, UK registration requirement, DBS check requirement, salary parsed into
salaryMin/salaryMax/salaryPeriod, full address split into postcode / town / county / lines. - Two modes: search builder (keyword + location + 7 facet filters) OR paste any jobs.nhs.uk URL.
- Concurrent enrichment: 6 detail-page workers run in parallel and push records as soon as each one is parsed. A 50-card page completes in around 10 seconds, and a mid-run abort still flushes everything that finished.
- Forward pagination: walks
?page=Nfrom any starting URL. URL mode honors the page in the pasted URL. - Robust error reporting: when a run returns zero results, an
errorrecord explains the proxy upgrade path so users see it in the dataset preview, not just the run log. - Cost discipline: efficient fetch path keeps proxy bandwidth around £0.0001 per page, so a 1000-listing run typically lands well under £2 in compute + proxy.
Data You Get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | C0000-00-0000 |
url | https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000 |
referenceNumber | 000-X000-XXX |
title | Sample Job Title |
employer | Sample NHS Foundation Trust |
employerWebsite | https://example.org/working-with-us |
employerLogoDataUri | data:image/png;base64,iVBOR... |
location | London SW1A 1AA |
postcode | SW1A 1AA |
addressLine1 | Sample Hospital |
addressTown | London |
addressLines | ["Sample Hospital", "London", "SW1A 1AA"] |
salary | £00,000 to £00,000 a year |
salaryMin | 00000 |
salaryMax | 00000 |
salaryPeriod | per annum |
salaryQualifier | inclusive of HCAS |
payScheme | Agenda for change |
grade | Band 0 |
contractType | Permanent |
contractDuration | 12 months |
workingPattern | Full-time |
datePosted | 01 January 2026 |
datePostedIso | 2026-01-01 |
closingDate | 15 January 2026 |
closingDateIso | 2026-01-15 |
applyUrl | https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000/ats-direct-apply |
contactName | Jane Doe |
contactJobTitle | Recruitment Lead |
contactEmail | recruitment@example.org |
contactPhone | +44 0000 000000 |
jobOverviewText | Sample short job overview text appears here. |
mainDutiesText | Sample main duties text appears here. |
aboutOrganisationText | Sample about-us text appears here. |
jobDescriptionText | Sample full job description text appears here. |
personSpecification[0] | {"category": "Qualifications", "essentials": ["Sample essential criterion"], "desirables": ["Sample desirable criterion"]} |
supportingDocuments[0] | {"name": "Job Description.pdf", "sizeText": "PDF, 000 KB", "documentId": "0000000"} |
sponsorshipAvailable | true |
ukRegistrationRequired | true |
dbsCheckRequired | true |
privacyPolicyUrl | https://example.org/privacy |
basicInfo | {"id": "...", "title": "...", ...} (drop-in compat with rival schemas) |
scrapedAt | 2026-01-01T00:00:00.000Z |
How to Use
Search by keyword + location:
{"mode": "search","keywords": ["nurse"],"location": "Manchester","distance": "10","maxPages": 2,"fetchDetails": true}
Search by pay band + contract type:
{"mode": "search","keywords": ["doctor"],"location": "London","distance": "20","payBands": ["CONSULTANT", "SPECIALTY_DOCTOR"],"contractTypes": ["Permanent", "Fixed-Term"],"workingPatterns": ["full-time"],"maxPages": 3,"maxListings": 100}
Browse a whole staff group across the UK:
{"mode": "search","keywords": [],"location": "","distance": "","staffGroups": ["NURSING_AND_MIDWIFERY_REGD"],"sortBy": "publicationDateDesc","maxPages": 5}
Paste any jobs.nhs.uk URL:
{"mode": "url","urls": ["https://www.jobs.nhs.uk/candidate/search/results?keyword=physiotherapist&location=Birmingham&distance=20","https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000"],"maxPages": 2,"fetchDetails": true}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | enum | search | search or url. The other mode's fields are ignored. |
keywords | array of strings | ["doctor"] | Free-text job-title or skill keywords. One scrape per keyword. Empty = browse without a keyword filter. |
location | string | London | Town, city, county, or postcode. Empty = nationwide. |
distance | enum | 10 | Search radius in miles (5/10/20/30/50/100) or empty for all UK. |
payBands | array of enum | [] | Multi-select. BAND_2..BAND_9 (Agenda for Change), CONSULTANT, SPECIALTY_DOCTOR, etc. |
staffGroups | array of enum | [] | Multi-select. MEDICAL_AND_DENTAL, NURSING_AND_MIDWIFERY_REGD, ALLIED_HEALTH_PROF, etc. |
contractTypes | array of enum | [] | Multi-select. Permanent / Fixed-Term / Locum / Apprenticeship / Bank / Voluntary / etc. |
workingPatterns | array of enum | [] | Multi-select. full-time / part-time / job-share / flexible-working / remote-working / etc. |
payRanges | array of enum | [] | Salary bands in thousands GBP (0-10, 10-20, ..., 100). |
employerName | string | null | Filter by NHS Trust name (partial match). |
covidJobsOnly | boolean | false | Limit to roles tagged COVID-related. |
sortBy | enum | "" (Best Match) | publicationDateDesc / closingDate / salaryDesc / salaryAsc. |
urls | array of strings | one example URL | URL mode only. Paste any jobs.nhs.uk search-results or jobadvert URL. |
maxPages | integer | 2 | Hard cap on SERP pages walked per keyword (1..200). 50 listings per page. |
maxListings | integer | 0 | Total listings cap across all searches. 0 = no cap. |
fetchDetails | boolean | true | Fetch each advert's detail page for the full 50+ fields. OFF returns SERP-only fields. |
proxy | object | UK residential | Proxy config. Default groups: ["RESIDENTIAL"], country: "GB". |
Output Example
Sample shape, values are illustrative placeholders, not from a live listing.
{"id": "C0000-00-0000","url": "https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000","referenceNumber": "000-X000-XXX","title": "Sample Job Title","employer": "Sample NHS Foundation Trust","employerWebsite": "https://example.org/working-with-us","employerLogoDataUri": "data:image/png;base64,...","location": "London SW1A 1AA","postcode": "SW1A 1AA","addressLine1": "Sample Hospital","addressLine2": null,"addressTown": "London","addressCounty": null,"addressLines": ["Sample Hospital", "London", "SW1A 1AA"],"salary": "£00,000 to £00,000 a year","salaryQualifier": "inclusive of HCAS","salaryMin": 00000,"salaryMax": 00000,"salaryPeriod": "per annum","payScheme": "Agenda for change","grade": "Band 0","contractType": "Permanent","contractDuration": "12 months","workingPattern": "Full-time","datePosted": "01 January 2026","datePostedIso": "2026-01-01","closingDate": "15 January 2026","closingDateIso": "2026-01-15","interviewDate": null,"applyUrl": "https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000/ats-direct-apply","contactName": "Jane Doe","contactJobTitle": "Recruitment Lead","contactEmail": "recruitment@example.org","contactPhone": "+44 0000 000000","contactDetails": {"jobTitle": "Recruitment Lead","name": "Jane Doe","email": "recruitment@example.org","phone": "+44 0000 000000"},"employerDetails": {"name": "Sample NHS Foundation Trust","website": "https://example.org/working-with-us","address": ["Sample Hospital", "London", "SW1A 1AA"],"postcode": "SW1A 1AA"},"jobOverviewHtml": "<p>Sample short job overview HTML appears here.</p>","jobOverviewText": "Sample short job overview text appears here.","mainDutiesHtml": "<p>Sample main duties HTML appears here.</p>","mainDutiesText": "Sample main duties text appears here.","aboutOrganisationHtml": "<p>Sample about-us HTML appears here.</p>","aboutOrganisationText": "Sample about-us text appears here.","jobDescriptionHtml": "<p>Sample full job description HTML appears here.</p>","jobDescriptionText": "Sample full job description text appears here.","personSpecification": [{"category": "Qualifications","essentials": ["Sample essential criterion"],"desirables": ["Sample desirable criterion"]},{"category": "Experience","essentials": ["Sample essential criterion"],"desirables": []}],"supportingDocuments": [{ "name": "Job Description.pdf", "sizeText": "PDF, 000 KB", "documentId": "0000000", "downloadFormUrl": "https://www.jobs.nhs.uk/candidate/search/save-job" }],"privacyPolicyUrl": "https://example.org/privacy","sponsorshipAvailable": true,"ukRegistrationRequired": true,"dbsCheckRequired": true,"saveJobUrl": "https://www.jobs.nhs.uk/candidate/search/save-job/C0000-00-0000","basicInfo": {"id": "C0000-00-0000","title": "Sample Job Title","url": "https://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000","employer": "Sample NHS Foundation Trust","location": "London SW1A 1AA","salary": "£00,000 to £00,000 a year","datePosted": "01 January 2026","closingDate": "15 January 2026","contractType": "Permanent","workingPattern": "Full-time"},"scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan Requirement
The upstream edge filter on jobs.nhs.uk rejects datacenter IPs. UK residential routing is required. The actor's default proxy config is groups: ["RESIDENTIAL"], country: "GB", which covers paid Apify plans (Starter and above include residential).
If you are on the Apify Free plan, residential is not included. Two options:
- Upgrade your Apify plan to Starter or above.
- Uncheck "Use Apify proxy" in the proxy field and paste your own UK residential proxy URLs (Bright Data, Oxylabs, SmartProxy, IPRoyal, etc.).
When a run returns zero results due to proxy issues, the actor pushes a single { error: true, code: "ZERO_RESULTS", message: "..." } record to the dataset so you see the upgrade hint in the dataset preview as well as the run log.