UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies avatar

UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies

Pricing

Pay per event

Go to Apify Store
UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies

UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies

Scrape UK public-sector vacancies from NHS Jobs and Teaching Vacancies (official OGL APIs), plus optional DWP Find a Job. One schema with annual GBP salary, NHS Agenda for Change bands, teacher pay scales, region, closing-soon filter, new-job monitoring and employer hiring summaries.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Signal Scout

Signal Scout

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share

Get UK public-sector vacancies from NHS Jobs and Teaching Vacancies (DfE) in one clean dataset, with UK pay normalised. Every salary is turned into an annual GBP figure. NHS jobs are tagged with their exact Agenda for Change band and teaching jobs with their pay scale (MPS, UPS, leadership). Each job also gets its region and local authority. You can filter for jobs closing in the next few days, and run it on a schedule to get only new jobs.

✅ NHS Jobs + Teaching Vacancies in one schema · ✅ annual GBP salary min/max · ✅ exact NHS AfC band (2–9, 8a–8d) · ✅ teacher pay scales (MPS / UPS / leadership / unqualified) · ✅ region + local authority from postcode · ✅ "closing soon" filter · ✅ "new jobs only" monitoring · ✅ hiring summary per trust or school · ✅ official open-licence APIs, no proxies, no browser

By signalscouter: reliable, low-cost data scrapers for hiring and market signals.


What does UK Public Sector Jobs Scraper do?

It reads the official public APIs behind two of the UK's biggest public-sector job boards:

SourceWhat it coversAccessLicence
NHS Jobs (NHS Business Services Authority)~12,000 live NHS vacancies in England & Wales: trusts, GP practices, ICBs, hospicesOfficial public XML search APIOpen Government Licence v3.0
Teaching Vacancies (Department for Education)~5,000 live school jobs in England: teachers, leaders, teaching assistants, support staffOfficial public JSON API (schema.org JobPosting)Open Government Licence v3.0

It then normalises both into one schema and adds the things UK recruiters actually filter on:

  • Pay: "£28,392 to £31,157 a year", "£13.45 per hour" and "G6 SCP 20-24 £28,153-£31,015 FTE" all become salaryAnnualMin / salaryAnnualMax in GBP. Pro-rata and FTE adverts are flagged.
  • NHS Agenda for Change band: taken from NHS Jobs' own pay-band filter, so it's exact. When an advert gives no figures (e.g. "Negotiable"), the band's 2026/27 pay range is used and flagged.
  • Teacher pay scales: MPS / M1–M6, UPS / U1–U3, leadership (L-points), unqualified and lead practitioner, read from the advert text or matched against national pay ranges.
  • Location: postcode → region and local authority (postcodes.io, ONS open data).
  • Contract and hours: permanent / fixed-term / bank / locum / apprenticeship / training…, full-time / part-time, and hours per week where stated.
  • Dates: posted date, closing date and daysUntilClosing.

What data do you get?

Per job (recordType: "job"):

  • source, jobId, stable uid, reference, title, jobRole (Teaching Vacancies)
  • employer, employerType (nhs_trust, gp_practice, nhs_icb, school, academy_trust, local_authority…), employerId (school URN), employerWebsite
  • location, postcode, region, localAuthority, country
  • salaryText, salaryMin, salaryMax, salaryInterval, salaryAnnualMin, salaryAnnualMax, salaryIsProRata, salarySource
  • nhsBand, nhsBandSource, payScheme, teacherPayScales, teacherPayPoints
  • contractType, workingPattern, hoursPerWeek, isRemote
  • postedAt, closingDate, daysUntilClosing
  • url, applyUrl, description (+ descriptionHtml optional), isNew (monitoring mode), attribution, scrapedAt

Per employer (recordType: "employerSummary", optional):

  • Open roles; roles posted in the last 7 and 30 days; roles closing within 7 days
  • NHS band mix, teacher pay-scale mix, contract-type mix
  • Median annual salary, top titles, regions, local authorities
  • newSinceLastRun in monitoring mode

Use cases

  • 🏥 Healthcare recruitment and staffing agencies: get every new Band 5–7 nursing role in your region each morning, grouped by trust.
  • 🍎 Education recruitment agencies: track new teaching and TA roles by local authority, and see which schools are hiring repeatedly.
  • 🧑‍💻 Niche job boards: power a nurse, teacher or public-sector board with clean, attributed, openly licensed data.
  • 📈 Sales to the NHS and schools: a trust posting 30 roles this month, or a school replacing its business manager, is a buying signal. Feed the employer summaries into your CRM.
  • 📊 Labour-market research and journalism: count vacancies by band, region, trust or local authority over time.
  • ⏰ "Closing soon" alerts: catch roles before the deadline. Public-sector adverts have hard closing dates.

How to use it

  1. Click Try for free. Choose your sources (NHS Jobs, Teaching Vacancies or both) and, optionally, add Keywords and Locations.
  2. Add filters: region, minimum annual salary, NHS bands, teacher pay scales, job roles, contract type, working pattern, posted within N days, or closing within N days.
  3. Click Start. Download the results as JSON, CSV or Excel, or read them through the API.

Input example: Band 5–6 nursing jobs in Yorkshire closing within 7 days

{
"sources": ["nhs"],
"keywords": ["nurse"],
"nhsBands": ["5", "6"],
"regions": ["Yorkshire and The Humber"],
"closingWithinDays": 7,
"includeEmployerSummary": true
}

Input example: daily feed of new MPS/UPS teaching jobs in London (monitoring mode)

{
"sources": ["teaching"],
"teachingJobRoles": ["teacher"],
"teacherPayScales": ["MPS", "UPS"],
"regions": ["London"],
"onlyNewJobs": true
}

Schedule the Actor (for example, daily at 07:00) with Only new jobs since last run on. Each run then outputs only jobs that weren't there last time. The "seen jobs" memory is kept in a named key-value store (uk-public-sector-jobs-state) in your account, keyed on your filters so different saved tasks don't interfere.

Output sample

sourcetitleemployerregionsalaryAnnualMinsalaryAnnualMaxnhsBandteacherPayScalesclosingDate
nhsRegistered NurseThe Mid Yorkshire Teaching NHS TrustYorkshire and The Humber32073390435—2026-10-25
nhsPGDip Student MidwifeLewisham and Greenwich NHS TrustLondon32073390435—2026-10-20
teachingTeacher with Head of Learning ResponsibilitySt Edward's Church of England AcademyLondon3919558119—MPS, UPS2026-10-23
teachingTeaching Assistant Level 2Garforth AcademyYorkshire and The Humber2684727709——2026-10-31
{
"recordType": "job",
"source": "nhs",
"sourceName": "NHS Jobs",
"jobId": "5669750",
"title": "PGDip Student Midwife",
"employer": "Lewisham and Greenwich NHS Trust",
"employerType": "nhs_trust",
"location": "Woolwich, SE18 4QH",
"postcode": "SE18 4QH",
"region": "London",
"localAuthority": "Greenwich",
"salaryText": "£32,073 to £39,043 a year per annum plus HCAS",
"salaryAnnualMin": 32073,
"salaryAnnualMax": 39043,
"salaryInterval": "year",
"nhsBand": "5",
"nhsBandSource": "nhsJobsAdvert",
"payScheme": "Agenda for change",
"contractType": "training",
"workingPattern": "full_time",
"postedAt": "2026-10-16T15:16:42.657996+00:00",
"closingDate": "2026-10-20T00:00:00+00:00",
"daysUntilClosing": 0,
"url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9197-26-0938",
"attribution": "Contains public sector information licensed under the Open Government Licence v3.0. Source: NHS Jobs (NHS Business Services Authority)."
}

Employer summary example:

{
"recordType": "employerSummary",
"source": "nhs",
"employer": "Leeds Teaching Hospitals",
"employerType": "nhs_trust",
"openJobs": 23,
"postedLast7Days": 13,
"closingWithin7Days": 12,
"medianAnnualSalary": 35558,
"bandMix": [{"name": "Band 3", "count": 5}, {"name": "Band 6", "count": 7}, {"name": "Band 8a", "count": 1}],
"localAuthorities": [{"name": "Leeds", "count": 23}]
}

(Figures from test runs in October 2026; live numbers change daily.)

The Console has three ready-made views: Jobs, Employer hiring summaries and Errors.

How much does it cost?

The Actor uses pay-per-event pricing. Current prices are always on the Pricing tab. You pay for:

  • each job returned (job-result event)
  • each employer summary, only if you turn summaries on (employer-summary event)

Error records are never charged. In monitoring mode you pay only for new jobs. Use Max jobs per source, Max total jobs and the filters to cap the cost of a run.

The Actor also respects your run's maximum cost setting. When it is reached, it stops delivering jobs, and RUN_SUMMARY.droppedAtChargeLimit shows how many matching jobs and summaries were left out. In monitoring mode those jobs are not marked as seen, so the next run delivers them. Apify's free monthly credits are enough to try it.

FAQ

Is this legal? Can I reuse the data commercially? Both sources publish their job data under the Open Government Licence v3.0. The OGL lets you copy, publish and adapt the data, including commercially, as long as you attribute it. Every record carries an attribution field with the required statement. Keep it, or show "Contains public sector information licensed under the Open Government Licence v3.0" with the source name wherever you republish the data. The Teaching Vacancies API terms also say you must not charge candidates or schools a fee for a hire made through a listing you republished. Check that rule if you run an agency. The Actor reads only public job adverts, never logs in, collects no candidate data, respects robots.txt and waits between requests.

How accurate are the NHS bands and teacher pay scales?

  • NHS bands (nhsBandSource: "nhsJobs") come from NHS Jobs' own pay-band filter, so they're exact.
  • nhsJobsAdvert means the band was read from the advert page. text means "Band N" appeared in the title or salary. salary means the salary matched a 2025/26 or 2026/27 Agenda for Change pay point.
  • Teacher pay scales come from the advert's own wording (MPS, M1–M6, UPS, L8–L10…) or from figures that match the 2026/27 or 2025/26 national ranges.
  • When an advert names a scale but gives no figures, the national (rest-of-England) range is used and salarySource says so.

How is the annual salary calculated?

  • Hourly pay × 1,950 (37.5 hours × 52 weeks), daily × 260, weekly × 52, monthly × 12.
  • Pro-rata and FTE adverts keep the full-time-equivalent figures and set salaryIsProRata: true.
  • "Up to £X" gives only a maximum, and "From £X" only a minimum.

Why is the NHS description short? NHS Jobs' feed includes only the first ~150 characters. Turn on NHS: fetch full advert to get the full summary, main duties and responsibilities, plus pay scheme, working pattern and reference. It costs one extra request per output job, so use it with filters or caps.

What about Civil Service Jobs, DWP Find a Job, Reed or Indeed?

  • Civil Service Jobs runs an anti-bot check, so it isn't included.
  • DWP Find a Job returned errors to every automated request in our October 2026 tests, so it isn't included either.
  • Commercial boards (Reed, Totaljobs, Indeed, Adzuna) forbid commercial reuse in their terms.

We only ship sources we can use reliably and legitimately. Open an issue if there's an official feed you'd like added.

How do keywords work?

  • By default, a keyword must appear in the job title (or the Teaching Vacancies job role), which gives precise results.
  • Set Keyword match to Anywhere to use NHS Jobs' own full-text search and match Teaching Vacancies descriptions too. This is much broader: "nurse" matches about 40% of all NHS adverts.

How fast is it? Is the data complete?

  • A full run of both boards (~17,000 jobs) takes about 3–5 minutes on the platform at the default 512 MB memory (peak use is about 225 MB, so more memory doesn't help).
  • NHS Jobs is read in newest-first order, the only ordering NHS Jobs pages through without dropping jobs. Exact band tagging makes a second pass per band.
  • Teaching Vacancies: the API has no server-side filters, so each run reads all ~60 pages (about 1 minute). Some jobs appear on more than one page, and the Actor removes the duplicates. On 20 Oct 2026, the API's reported 5,794 count came to 5,050 unique jobs.
  • Posted within N days stops early on both sources, so daily monitoring runs take about 10 seconds.

How do I integrate it? Use the Apify API or the official JavaScript and Python clients. You can also connect it with Make, Zapier, n8n, Google Sheets, Slack, webhooks, or the Apify MCP server for AI agents. Results export to JSON, CSV, Excel, XML or RSS.

Attribution

  • Contains public sector information licensed under the Open Government Licence v3.0.
  • NHS Jobs data © NHS Business Services Authority.
  • Teaching Vacancies data © Department for Education.
  • Postcode lookups use postcodes.io, which serves Office for National Statistics data (OGL).

signalscouter isn't affiliated with, or endorsed by, the NHS, NHSBSA or DfE.

More signalscouter Actors

ActorWhat it gives you
Career Site Jobs ScraperJobs from 12 ATSes (Greenhouse, Lever, Ashby, Workday, Workable and more) in one schema, from company domains
Workday Jobs ScraperJobs from any myworkdayjobs.com career site, including sites with more than 2,000 jobs
Company Tech Stack & Domain SignalsWhat a company's website runs on, plus DNS, email security and domain age
SEC Form D Funding SignalsNewly funded US companies from SEC Form D filings

Support and feedback

Built and maintained by signalscouter (apify.com/signalscouter, signalscouter.data@gmail.com). Found a bug, or want a field or source added? Open a ticket on the Issues tab. We read every issue and aim to reply quickly. If the Actor saves you time, a review on the Store helps others find it.