# UK Jobs Scraper: NHS Jobs, DWP Find a Job & Careers Pages (`seaf999ield/uk-jobs-feed`) Actor

UK jobs scraper and API: one deduplicated feed from NHS Jobs, DWP Find a Job and public Greenhouse, Lever and Workable boards, with salary, location, closing date and new job alerts. Export CSV or JSON. By RawTrader | UK Industry & Bills

- **URL**: https://apify.com/seaf999ield/uk-jobs-feed.md
- **Developed by:** [RustonRoad](https://apify.com/seaf999ield) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Jobs Scraper: NHS Jobs, DWP Find a Job & Careers Pages

**One deduplicated UK job feed from NHS Jobs, DWP Find a Job and Greenhouse, Lever and Workable careers boards, with new job alerts.**

### What it does

This actor collects UK job adverts from NHS Jobs, DWP Find a Job and public Greenhouse, Lever and Workable company boards into one deduplicated feed with title, employer, location, salary, contract type, posted and closing dates. Monitor mode outputs only jobs that are new since your last run.

### Who it's for

- Recruiters and agencies spotting new vacancies (and hiring employers) first
- Job boards and newsletters that need a clean UK jobs feed
- Labour market analysts tracking salaries and roles by location

### Sample output

| source | title | employer | location | salaryText |
|---|---|---|---|---|
| nhs_jobs | Advanced Clinical Practitioner | Leeds Teaching Hospitals | Leeds, LS1 3EX | £57528.00 to £64750.00 |

*Real rows from a test run (shortened; the full output has more fields).*

### Price per 1,000 results

Main event: **`job-row` at $0.002 each**, so **1,000 results = $2.00**. Other events: `new-job` $0.005 each (only charged when that row type is output). See the Pricing tab for the current prices.

### Input example

```json
{
  "mode": "search",
  "keywords": [
    "nurse"
  ],
  "location": "Leeds",
  "sources": [
    "nhs_jobs",
    "dwp_find_a_job",
    "greenhouse",
    "lever",
    "workable"
  ],
  "companies": [
    "greenhouse:monzo",
    "lever:palantir",
    "workable:huggingface"
  ],
  "maxItemsPerSource": 50
}
```

**One clean, deduplicated feed of UK job vacancies from the biggest public sources:** NHS Jobs, the government's DWP Find a Job service, and the public careers boards of any company that uses **Greenhouse, Lever or Workable**. Each job comes out in one normalised format with **title, employer, location, salary min/max (£ and period), contract type, posted date, closing date, link and source**. Run it on a schedule in **new_jobs** mode to get only the jobs that appeared since your last run.

| Source | What it covers |
|---|---|
| 🏥 **NHS Jobs** | Every NHS and NHS partner vacancy in England and Wales (official public XML search feed), with closing dates |
| 🏛️ **DWP Find a Job** | The government's national job board, which also carries many recruiter and agency adverts |
| 🏢 **Greenhouse / Lever / Workable** | Careers pages of the companies you list (e.g. Monzo, Palantir, Hugging Face), filtered to UK locations |

### Use cases

- **Recruiters and staffing agencies:** a daily lead feed of new vacancies by keyword, area or target employer.
- **Job boards and niche sites:** a normalised multi source UK feed without duplicates.
- **HR, labour market and salary analysts:** salaries, contract types and hiring volumes by employer and region.
- **Sales teams:** companies hiring for a role is a strong buying signal (B2B lead generation).
- **Job seekers:** one alert across NHS, DWP and the companies you care about.

### Input

| Field | Example | Notes |
|---|---|---|
| Mode | `search` | or `new_jobs` |
| Keywords | `["nurse","data analyst"]` | Searched on NHS/DWP; must appear in the title for company boards |
| Location | `Leeds` | Town, city or postcode (NHS/DWP) |
| Sources | `["nhs_jobs","dwp_find_a_job","greenhouse"]` | |
| Company job boards | `["greenhouse:monzo","lever:palantir","workable:huggingface"]` | or board URLs |
| UK only | `true` | Company boards: UK and UK remote jobs only |
| Posted since | `2026-10-01` | |
| Max items per source | `100` | |
| Monitor name | `leeds-nursing` | new_jobs: separate saved state per name |

**Example: daily new nursing jobs in Leeds**

```json
{ "mode": "new_jobs", "keywords": ["nurse"], "location": "Leeds", "sources": ["nhs_jobs","dwp_find_a_job"], "monitorName": "leeds-nurses" }
```

### Output

```json
{
  "recordType": "job", "source": "nhs_jobs", "sourceId": "5667266",
  "title": "Staff Nurse", "employer": "Leeds and York Partnership NHS Foundation Trust", "location": "Leeds, LS2 9LN",
  "salaryMin": 32073, "salaryMax": 39043, "salaryPeriod": "year", "contractType": "Permanent",
  "postedDate": "2026-10-15", "closingDate": "2026-10-29",
  "url": "https://beta.jobs.nhs.uk/candidate/jobadvert/C9173-26-0501", "alsoListedOn": ["dwp_find_a_job"]
}
```

De duplication: the same job advertised on NHS Jobs and DWP Find a Job (matched on title, town and salary) is output once, and `alsoListedOn` lists the other sources.

### Pricing explained (pay per event)

| Event | Price |
|---|---|
| `job-row`: each job in search mode (and the first baseline run of a monitor) | $0.002 |
| `new-job`: each new job since the last run (new_jobs mode) | $0.005 |

### Notes

- Public feeds and pages only, read only, no login, no API keys. Requests use an identifiable user agent and are kept few and slow. DWP Find a Job is read only from `/jobs` pages, which its robots.txt allows.
- Civil Service Jobs is **not** included: its site puts a human verification check in front of search.
- Job adverts can contain recruiters' contact details. Use them in line with UK GDPR.
- Not affiliated with the NHS, DWP, Greenhouse, Lever or Workable.

### FAQ

**Can I run it on a schedule?** Yes. Use an Apify Schedule (for example daily) and the monitor options to get only new rows since the last run.

**Can I use it via API or connect it to other tools?** Yes. Run it with the Apify API or clients, and send results to Google Sheets, Zapier, Make, webhooks or Slack using Apify integrations. Export JSON, CSV or Excel.

**What am I charged for?** Only the pay per event prices above, for rows actually output. Set a maximum cost per run in the run options to cap spend.

### Related UK data actors

- [UK Visa Sponsor Register Scraper: Home Office Sponsor Monitor](https://apify.com/seaf999ield/uk-visa-sponsor-register-monitor)
- [UK Companies House Scraper: New Companies & Insolvency Alerts](https://apify.com/seaf999ield/uk-companies-house-feed)
- [UK Government Tenders Scraper: Find a Tender & Contracts Finder](https://apify.com/seaf999ield/uk-public-tenders-feed)

### About RawTrader | UK Industry & Bills

RawTrader | UK Industry & Bills is a UK newsletter and open data project tracking energy bills, fuel prices, public tenders, company closures and FCA short positions, using official data from Ofgem, DESNZ, ONS, Companies House, Find a Tender and the FCA.

- [RawTrader Data: every UK data tool in one place](https://imrawtrader.beehiiv.com/p/data)
- [UK Industry & Bills newsletter](https://imrawtrader.beehiiv.com)
- [Follow @ImRawTrader on X](https://x.com/ImRawTrader)

# Actor input Schema

## `mode` (type: `string`):

new_jobs keeps a snapshot in a named key-value store per monitor. The first run saves a baseline and outputs all current jobs.

## `keywords` (type: `array`):

Searched on NHS Jobs and DWP Find a Job; for company boards, every word of a keyword must appear in the job title. Empty = all jobs.

## `location` (type: `string`):

Town, city or postcode for NHS Jobs and DWP Find a Job, e.g. 'Leeds' or 'M1 1AE'.

## `sources` (type: `array`):

Greenhouse, Lever and Workable need a company list below.

## `companies` (type: `array`):

'greenhouse:<board>', 'lever:<company>' or 'workable:<account>', or a board URL such as https://job-boards.greenhouse.io/monzo or https://jobs.lever.co/palantir. A bare name is tried on every selected ATS.

## `ukOnly` (type: `boolean`):

Keep only company-board jobs located in the UK (or UK-remote).

## `sinceDate` (type: `string`):

Only jobs posted on or after this date (YYYY-MM-DD).

## `maxItemsPerSource` (type: `integer`):

Per source feed (each company board counts as one feed).

## `maxItems` (type: `integer`):

0 = no limit.

## `monitorName` (type: `string`):

new_jobs mode: separate saved state per name (store ukjobs-<name>).

## `newJobMaxAgeDays` (type: `integer`):

Only flag unseen jobs posted within this many days before the last run, so older adverts that drift into a capped result list are not flagged. 0 = off. Tip: raise 'Max items per source' to cover the whole search.

## `proxyConfiguration` (type: `object`):

Not needed: all sources are public feeds or APIs. Only used for DWP Find a Job if you turn it on.

## `residentialFallback` (type: `boolean`):

For DWP Find a Job, if the datacenter proxy is blocked.

## `debugSaveHtml` (type: `boolean`):

Save the first DWP results page per keyword to the key-value store.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "nurse"
  ],
  "location": "Leeds",
  "sources": [
    "nhs_jobs",
    "dwp_find_a_job",
    "greenhouse",
    "lever",
    "workable"
  ],
  "companies": [
    "greenhouse:monzo",
    "lever:palantir",
    "workable:huggingface"
  ],
  "ukOnly": true,
  "maxItemsPerSource": 50,
  "maxItems": 0,
  "monitorName": "default",
  "newJobMaxAgeDays": 7,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "residentialFallback": false,
  "debugSaveHtml": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

Job rows (search) or new jobs (new_jobs).

## `runSummary` (type: `string`):

Per-source counts, requests and blocks.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "keywords": [
        "nurse"
    ],
    "location": "Leeds",
    "sources": [
        "nhs_jobs",
        "dwp_find_a_job",
        "greenhouse",
        "lever",
        "workable"
    ],
    "companies": [
        "greenhouse:monzo",
        "lever:palantir",
        "workable:huggingface"
    ],
    "maxItemsPerSource": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("seaf999ield/uk-jobs-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "keywords": ["nurse"],
    "location": "Leeds",
    "sources": [
        "nhs_jobs",
        "dwp_find_a_job",
        "greenhouse",
        "lever",
        "workable",
    ],
    "companies": [
        "greenhouse:monzo",
        "lever:palantir",
        "workable:huggingface",
    ],
    "maxItemsPerSource": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("seaf999ield/uk-jobs-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "keywords": [
    "nurse"
  ],
  "location": "Leeds",
  "sources": [
    "nhs_jobs",
    "dwp_find_a_job",
    "greenhouse",
    "lever",
    "workable"
  ],
  "companies": [
    "greenhouse:monzo",
    "lever:palantir",
    "workable:huggingface"
  ],
  "maxItemsPerSource": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call seaf999ield/uk-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seaf999ield/uk-jobs-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3DUa6f48hNTzOSqix/builds/bfbawEFMfpsfPxkW3/openapi.json
