NHS UK $0.8💰 URL | Keyword |  Deep Search Scraper avatar

NHS UK $0.8💰 URL | Keyword | Deep Search Scraper

Pricing

from $0.08 / 1,000 results

Go to Apify Store
NHS UK $0.8💰 URL | Keyword |  Deep Search Scraper

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

AbotAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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=N from any starting URL. URL mode honors the page in the pasted URL.
  • Robust error reporting: when a run returns zero results, an error record 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.

FieldExample
idC0000-00-0000
urlhttps://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000
referenceNumber000-X000-XXX
titleSample Job Title
employerSample NHS Foundation Trust
employerWebsitehttps://example.org/working-with-us
employerLogoDataUridata:image/png;base64,iVBOR...
locationLondon SW1A 1AA
postcodeSW1A 1AA
addressLine1Sample Hospital
addressTownLondon
addressLines["Sample Hospital", "London", "SW1A 1AA"]
salary£00,000 to £00,000 a year
salaryMin00000
salaryMax00000
salaryPeriodper annum
salaryQualifierinclusive of HCAS
paySchemeAgenda for change
gradeBand 0
contractTypePermanent
contractDuration12 months
workingPatternFull-time
datePosted01 January 2026
datePostedIso2026-01-01
closingDate15 January 2026
closingDateIso2026-01-15
applyUrlhttps://www.jobs.nhs.uk/candidate/jobadvert/C0000-00-0000/ats-direct-apply
contactNameJane Doe
contactJobTitleRecruitment Lead
contactEmailrecruitment@example.org
contactPhone+44 0000 000000
jobOverviewTextSample short job overview text appears here.
mainDutiesTextSample main duties text appears here.
aboutOrganisationTextSample about-us text appears here.
jobDescriptionTextSample 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"}
sponsorshipAvailabletrue
ukRegistrationRequiredtrue
dbsCheckRequiredtrue
privacyPolicyUrlhttps://example.org/privacy
basicInfo{"id": "...", "title": "...", ...} (drop-in compat with rival schemas)
scrapedAt2026-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

ParameterTypeDefaultDescription
modeenumsearchsearch or url. The other mode's fields are ignored.
keywordsarray of strings["doctor"]Free-text job-title or skill keywords. One scrape per keyword. Empty = browse without a keyword filter.
locationstringLondonTown, city, county, or postcode. Empty = nationwide.
distanceenum10Search radius in miles (5/10/20/30/50/100) or empty for all UK.
payBandsarray of enum[]Multi-select. BAND_2..BAND_9 (Agenda for Change), CONSULTANT, SPECIALTY_DOCTOR, etc.
staffGroupsarray of enum[]Multi-select. MEDICAL_AND_DENTAL, NURSING_AND_MIDWIFERY_REGD, ALLIED_HEALTH_PROF, etc.
contractTypesarray of enum[]Multi-select. Permanent / Fixed-Term / Locum / Apprenticeship / Bank / Voluntary / etc.
workingPatternsarray of enum[]Multi-select. full-time / part-time / job-share / flexible-working / remote-working / etc.
payRangesarray of enum[]Salary bands in thousands GBP (0-10, 10-20, ..., 100).
employerNamestringnullFilter by NHS Trust name (partial match).
covidJobsOnlybooleanfalseLimit to roles tagged COVID-related.
sortByenum"" (Best Match)publicationDateDesc / closingDate / salaryDesc / salaryAsc.
urlsarray of stringsone example URLURL mode only. Paste any jobs.nhs.uk search-results or jobadvert URL.
maxPagesinteger2Hard cap on SERP pages walked per keyword (1..200). 50 listings per page.
maxListingsinteger0Total listings cap across all searches. 0 = no cap.
fetchDetailsbooleantrueFetch each advert's detail page for the full 50+ fields. OFF returns SERP-only fields.
proxyobjectUK residentialProxy 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:

  1. Upgrade your Apify plan to Starter or above.
  2. 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.