# NHS Jobs Scraper: UK Trust Vacancy Alerts (`getascraper/nhs-trust-vacancy-monitor`) Actor

Search public NHS Jobs by Trust, keyword, location, and date. Export source-linked vacancies and confirmed hiring changes for permitted internal workflows with Apify schedules and webhooks.

- **URL**: https://apify.com/getascraper/nhs-trust-vacancy-monitor.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.52 / 1,000 vacancies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🏥 NHS jobs scraper

<table width="100%" style="display:table;width:100%;min-width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed">
<tr>
<td style="padding:24px 28px;background:#EFF6FF;border:1px solid #B7D4F2;border-top:4px solid #005EB8;border-radius:12px">
<span style="display:block;font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">🔎 Keep a clear view of public NHS vacancies.</span>
<span style="display:block;margin-top:10px;font-size:15px;color:#57534E;line-height:1.6">Collect current public listings, keep each row tied to its source, and make the next hiring decision with a clean, repeatable feed. Work only from pages that anyone can normally view.</span>

</td>
</tr>
</table>

<table width="100%" style="display:table;width:100%;min-width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed">
<tr>
<td style="padding:16px 14px;width:25%;background:#FFFFFF;border:1px solid #B7D4F2;border-top:3px solid #005EB8;border-radius:10px 0 0 10px;vertical-align:top"><span style="display:block;font-size:15px;font-weight:800;color:#003E7E;line-height:1.3">🧭 Focused sources</span><span style="display:block;margin-top:8px;font-size:12px;color:#57534E;line-height:1.5">Use ordinary public company and careers pages.</span></td>
<td style="padding:16px 14px;width:25%;background:#FFFFFF;border:1px solid #B7D4F2;border-top:3px solid #005EB8;border-left:none;vertical-align:top"><span style="display:block;font-size:15px;font-weight:800;color:#003E7E;line-height:1.3">🔔 Meaningful changes</span><span style="display:block;margin-top:8px;font-size:12px;color:#57534E;line-height:1.5">Separate new, updated, returning, and closed roles.</span></td>
<td style="padding:16px 14px;width:25%;background:#FFFFFF;border:1px solid #B7D4F2;border-top:3px solid #005EB8;border-left:none;vertical-align:top"><span style="display:block;font-size:15px;font-weight:800;color:#003E7E;line-height:1.3">🔗 Source context</span><span style="display:block;margin-top:8px;font-size:12px;color:#57534E;line-height:1.5">Keep the original job link beside every record.</span></td>
<td style="padding:16px 14px;width:25%;background:#FFFFFF;border:1px solid #B7D4F2;border-top:3px solid #005EB8;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="display:block;font-size:15px;font-weight:800;color:#003E7E;line-height:1.3">📅 Ready to repeat</span><span style="display:block;margin-top:8px;font-size:12px;color:#57534E;line-height:1.5">Run once for research or on a schedule for monitoring.</span></td>
</tr>
</table>

### 🎯 Turn public hiring activity into a useful signal

Search public NHS vacancies by keyword, employer, place, staff group, contract type, and publication date, then identify confirmed changes over time. Each record stays connected to the public listing so a recruiter, analyst, or operations team can verify the context before acting.

#### Who gets value

- **I am a healthcare workforce planner** looking to monitor relevant NHS hiring activity without repeatedly running the same manual searches.
- **I am a recruiting operations lead** looking to keep a clean, current feed of roles without checking company sites by hand.
- **I am a research analyst** looking to compare hiring signals across a defined company list.

### ⚡ Get results in three steps

Start with a small public source to confirm the output fits your workflow. Repeat the same setup on an Apify schedule when you need ongoing visibility.

<table width="100%" style="display:table;width:100%;min-width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed">
<tr>
<td style="padding:16px 14px;width:33.333%;background:#EFF6FF;border:1px solid #B7D4F2;border-radius:10px 0 0 10px;vertical-align:top"><span style="display:block;font-size:12px;font-weight:800;color:#005EB8;letter-spacing:1px">STEP 1</span><span style="display:block;margin-top:6px;font-size:14px;font-weight:700;color:#1C1917;line-height:1.35">Add sources</span><span style="display:block;margin-top:6px;font-size:12px;color:#57534E;line-height:1.5">Paste a public NHS search and optional employer filters or select your filters.</span></td>
<td style="padding:16px 14px;width:33.333%;background:#EFF6FF;border:1px solid #B7D4F2;border-left:none;vertical-align:top"><span style="display:block;font-size:12px;font-weight:800;color:#005EB8;letter-spacing:1px">STEP 2</span><span style="display:block;margin-top:6px;font-size:14px;font-weight:700;color:#1C1917;line-height:1.35">Choose the view</span><span style="display:block;margin-top:6px;font-size:12px;color:#57534E;line-height:1.5">Collect a current snapshot or focus on changes.</span></td>
<td style="padding:16px 14px;width:33.333%;background:#EFF6FF;border:1px solid #B7D4F2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="display:block;font-size:12px;font-weight:800;color:#005EB8;letter-spacing:1px">STEP 3</span><span style="display:block;margin-top:6px;font-size:14px;font-weight:700;color:#1C1917;line-height:1.35">Use the feed</span><span style="display:block;margin-top:6px;font-size:12px;color:#57534E;line-height:1.5">Send source-linked records into your existing process.</span></td>
</tr>
</table>

### 🧩 Configure your run

The first setting identifies the public sources you want to follow. The remaining settings let you balance detail, scope, and the amount of history returned.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `keyword` | Text | No | Public NHS vacancy keyword to search. |
| `employerCodes` | List of text | No | Optional employer codes for an employer-specific search. |
| `staffGroup` | Choice | No | Optional staff-group filter. |
| `location` | Text | No | Optional place filter. |
| `contractType` | Choice | No | Optional contract-type filter. |
| `publishedFrom` | Date | No | Optional earliest publication date. |
| `limit` | Number | No | Vacancies requested in each result page. |
| `maxPages` | Number | No | Maximum pages checked for each search. |
| `maxItems` | Number | No | Maximum vacancies returned across all searches. |
| `outputMode` | Choice | No | Choose a current view, changed rows only, or all rows with change status. |
| `stateName` | Text | No | Name the saved comparison history for this search. |

### 📦 Use the data immediately

Every result is a structured record with the original public source retained for review. Choose a full view for a current snapshot or a change-focused view for downstream actions.

| Field | Type | Description |
| --- | --- | --- |
| `changeType` | Text | Change status for a monitored vacancy. |
| `title` | Text | Public vacancy title. |
| `employer` | Text or null | Listed NHS employer. |
| `locations` | List | Public location labels. |
| `salary` | Text or null | Public salary information. |
| `contractType` | Text or null | Listed contract type. |
| `postDate` | Date or null | Public posting date. |
| `closeDate` | Date or null | Public application close date. |
| `vacancyId` | Text | Source vacancy identifier. |
| `reference` | Text or null | Public vacancy reference. |
| `url` | Link | Original public vacancy page. |
| `changedFields` | List | Fields that changed since the prior complete check. |
| `firstSeenAt` | Date and time | First time this vacancy appeared in this history. |
| `lastSeenAt` | Date and time | Most recent observation time. |
| `closedAt` | Date and time or null | Time a confirmed closure was recorded. |
| `scrapedAt` | Date and time | Time this Actor collected the row. |

### 💳 Understand your run cost

Review the current pricing shown in the Apify Store before you scale a scheduled workflow. Begin with a small public source so you can confirm the records match your criteria.

### ⭐ Enjoying NHS jobs scraper?

After a successful run, rate the Actor based on the usefulness and clarity of the records. Your feedback helps improve the next release for teams with the same workflow.

<table width="100%" style="display:table;width:100%;min-width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed">
<tr>
<td style="padding:20px 24px 14px;background:#EFF6FF;border:1px solid #B7D4F2;border-left:5px solid #005EB8;border-radius:10px 10px 0 0">
<span style="display:block;font-size:20px;letter-spacing:4px;color:#F59E0B">⭐ ⭐ ⭐ ⭐ ⭐</span>
<span style="display:block;margin-top:8px;font-size:17px;font-weight:800;color:#1C1917;line-height:1.35">Rate this Actor if it helped you keep NHS vacancy research current.</span>
<span style="display:block;margin-top:8px;font-size:14px;color:#57534E;line-height:1.5">Your feedback helps workforce teams find a clear public vacancy workflow.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#005EB8;border:1px solid #B7D4F2;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/nhs-trust-vacancy-monitor/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ Frequently asked questions

These answers cover the safest way to get a reliable first result. Use a separate saved state for each independent watchlist or client workflow.

#### Can I start with a normal public source link?

Yes. Paste the public source described in the input form, then use the available filters to narrow the collection.

#### Can I use this for recurring monitoring?

Yes. Run it on an Apify schedule and choose the change-focused output when you only need records that have meaningfully changed.

#### How are closed roles handled?

A role is only treated as closed after complete checks confirm that it is no longer present. This reduces false closure events caused by incomplete source results.

#### Do I need access to the employer system?

No. This Actor is designed for publicly available listings and does not request employer, applicant, or account access.

### 🛡️ Use public information responsibly

Use the records for permitted workforce analysis, service planning, and internal vacancy workflows. Respect the source’s terms and intended use, minimize retention, and do not use the data to make sensitive decisions about individuals.

### 🔗 Other actors

These adjacent Actors cover public hiring sources that teams often track alongside this one. Choose the source that matches the company’s careers platform.

- [🌱 Greenhouse jobs scraper](https://apify.com/getascraper/greenhouse-requisition-monitor)
- [🎯 SmartRecruiters jobs scraper](https://apify.com/getascraper/smartrecruiters-jobs-monitor)
- [🗂️ Workday jobs scraper](https://apify.com/getascraper/workday-tenant-jobs-monitor)
- [🧲 Lever jobs scraper](https://apify.com/getascraper/lever-jobs-monitor)
- [🇨🇦 Job Bank Canada scraper](https://apify.com/getascraper/jobbank-scraper)

# Actor input Schema

## `keyword` (type: `string`):

Public NHS vacancy keyword sent to the official XML feed.

## `employerCodes` (type: `array`):

Optional NHS employer codes for a permitted employer-specific feed.

## `staffGroup` (type: `string`):

Optional official NHS staff-group filter.

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

Optional location query sent to the official feed.

## `contractType` (type: `string`):

Optional source contract-type filter.

## `publishedFrom` (type: `string`):

Optional source publication date boundary.

## `limit` (type: `integer`):

Vacancies requested per XML page.

## `maxPages` (type: `integer`):

Maximum pages fetched for each employer search.

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

Global vacancy cap across every search.

## `outputMode` (type: `string`):

Choose full or compact current rows, changed rows only, or all rows with change status.

## `stateName` (type: `string`):

Separates one permitted employer or schedule from another.

## Actor input object example

```json
{
  "keyword": "nurse",
  "employerCodes": [],
  "limit": 5,
  "maxPages": 1,
  "maxItems": 5,
  "outputMode": "compact",
  "stateName": "default"
}
```

# Actor output Schema

## `results` (type: `string`):

Official-feed vacancy rows or selected monitoring events.

## `summary` (type: `string`):

Coverage, result counts, closure status, and publication permission reminder.

# 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 = {
    "keyword": "nurse",
    "employerCodes": [],
    "limit": 5,
    "maxPages": 1,
    "maxItems": 5,
    "outputMode": "compact",
    "stateName": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/nhs-trust-vacancy-monitor").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 = {
    "keyword": "nurse",
    "employerCodes": [],
    "limit": 5,
    "maxPages": 1,
    "maxItems": 5,
    "outputMode": "compact",
    "stateName": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/nhs-trust-vacancy-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keyword": "nurse",
  "employerCodes": [],
  "limit": 5,
  "maxPages": 1,
  "maxItems": 5,
  "outputMode": "compact",
  "stateName": "default"
}' |
apify call getascraper/nhs-trust-vacancy-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=getascraper/nhs-trust-vacancy-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Cj2jwwbzCpdNY4xRp/builds/O184Tms3j6AK10wq8/openapi.json
