# NHS UK \[$0.85💰] Jobs Scraper Richest Output (`memo23/nhs-scraper`) Actor

💰 $0.85 per 1,000 results. Collects NHS Jobs listings with metadata like vacancy IDs, employer details, pay scheme/band, normalized closing & posting dates, narrative sections (summary, duties, about us), contact info, person specification, documents, and privacy links.

- **URL**: https://apify.com/memo23/nhs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 46 total users, 6 monthly users, 98.7% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.85 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

**Unlock UK Healthcare Hiring Insights** – Capture, analyze, and monitor NHS Jobs listings at scale with enterprise-grade reliability. Whether you are tracking workforce demand, enriching recruitment platforms, or conducting healthcare staffing research, our scraper delivers fresh, structured job intelligence while minimizing manual effort.

*"From nationwide vacancies to detailed job descriptions, we turn NHS Jobs data into your competitive advantage."*

### Overview

The NHS Jobs Scraper is your all-in-one utility for extracting hiring data from [jobs.nhs.uk](https://www.jobs.nhs.uk/). Ideal for staffing agencies, workforce planners, and healthcare analytics teams, it tracks search result pages and individual job details across the National Health Service. With straightforward configuration and structured outputs, it's perfect for anyone building healthcare talent pipelines or monitoring demand across NHS trusts.

### What does NHS Jobs Scraper do?

The NHS Jobs Scraper is a powerful tool that enables you to:

#### Comprehensive Data Collection
- **Job Search Results**
  - Capture structured job cards from NHS Jobs search result pages
  - Track pagination automatically to cover entire result sets
  - Extract metadata such as job title, employer, location, salary snippets, and posting highlights
- **Job Detail Pages**
  - Scrape full job descriptions, person specifications, and employer details
  - Collect recruiter contact information, application links, supporting documents, and privacy notices
  - Preserve sections such as job summary, main duties, and about us narratives
- **Market Insights**
  - Monitor healthcare hiring demand across trusts, specialties, and geographies
  - Build time-series datasets to benchmark staffing trends across the NHS
  - Feed downstream analytics, enrichment, and ATS/CRM workflows

#### Advanced Scraping Capabilities
- **Pagination Handling**: Automatically navigates through NHS Jobs search results
- **Efficient Processing**: Processes only new or updated postings in subsequent runs
- **Change Detection**: Detects new openings and updates to existing job ads
- **Incremental Data Collection**: Build comprehensive hiring datasets over time

#### Flexible Scraping Options
- **Job Search Results**: Extract job listings by keywords, location, staff group, and filters
  - Example: `https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=Liverpool&distance=5&language=en`
- **Individual Job Details**: Target specific job postings using direct URLs
  - Example: `https://www.jobs.nhs.uk/candidate/jobadvert/C9196-24-3040`

This tool is ideal for:
- UK healthcare workforce intelligence and competitive hiring analysis
- NHS talent market research across trusts, specialties, and regions
- Workforce planning and pay band benchmarking
- Building job scraping pipelines for ATS/CRM enrichment
- Monitoring hiring signals for business development & sales

### Features

- **Comprehensive Data Extraction**: Job metadata, descriptions, and employer insights
- **Dual Scraping Modes**: 
  - **Search Results**: Scrape all jobs from NHS Jobs search result pages
  - **Individual Job Details**: Target specific postings using job detail URLs
- **Flexible Input**: Supports multiple input formats:
  - Search result URLs (keyword, location, filters)
  - Direct job detail URLs
- **Automatic Pagination**: Handles multi-page result sets automatically
- **Efficient Processing**: Concurrent scraping with configurable concurrency settings
- **Reliable Performance**: Built-in retries, throttling, and proxy support
- **Structured Data Export**: Download job data in JSON or CSV for analytics

### Supported Scenario Types

The NHS Jobs Scraper can extract data from multiple hiring flows:

1. **Search Result Pages** – Keyword/location queries with optional filters
   - Example: `https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=Liverpool&distance=5&language=en`
   - Fields: `id`, `title`, `employer`, `location`, `salary`, `closing_date`, `working_pattern`, etc.

2. **Individual Job Postings** – Full details for a single job
   - Example: `https://www.jobs.nhs.uk/candidate/jobadvert/C9196-24-3040`
   - Fields: `job_summary`, `main_duties_of_the_job`, `about_us`, `job_description`, `person_specification`, `employer_details`, `supporting_documents`, etc.

3. **Filtered Market Research Runs** – Jobs narrowed by recency, remote/onsite, or radius filters
   - Example: `https://www.jobs.nhs.uk/candidate/search/results?keyword=nurse&location=London&distance=10&pay_band=Band+6`
   - Fields: `id`, `pay_scheme`, `pay_band`, `employment_type`, `distance`, `filter_context`, etc.

Each scenario returns a structured payload consistent across runs, making it straightforward to pipe into your analytics stack.

### Quick Start

1. **Sign up for Apify**: Create your free account at [apify.com](https://apify.com).
2. **Find the Scraper**: Search for "NHS Jobs Scraper" in the Apify Store.
3. **Configure Input**: Set your search URLs or direct job URLs in the input schema.
4. **Run the Scraper**: Execute the scraper on Apify or locally with Node.js/TSX.
5. **Data Collection**: Export raw job data as JSON or CSV for downstream processing.

### Input Configuration

Here's an example of how to set up the input for the NHS Jobs Scraper:

```json
{
    "startUrls": [
        "https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=Liverpool&distance=5&language=en",
        "https://www.jobs.nhs.uk/candidate/jobadvert/C9196-24-3040"
    ],
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
````

#### Input Fields Explanation

- `startUrls`: Array of strings containing any of these formats:
  - Search URL: `"https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=Liverpool&distance=5&language=en"`
  - Job detail URL: `"https://www.jobs.nhs.uk/candidate/jobadvert/"`
- `maxItems`: Maximum number of results to scrape (default: 1000).
- `maxConcurrency`: Maximum number of pages processed simultaneously (default: 10).
- `minConcurrency`: Minimum number of pages processed simultaneously (default: 1).
- `maxRequestRetries`: Number of retries for failed requests (default: 100).
- `proxyConfiguration`: Proxy settings for consistent scraping performance.

### Output Structure

The scraper provides structured information about Monster job postings. Outputs are normalized for both search results and job detail pages. Key groups include:

```json
{
    "id": "C9282-25-0864",
    "url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9282-25-0864",
    "referenceNumber": "282-C894-MED",
    "title": "Clinical Research Doctor - Gynaecology",
    "employer": "The Royal Marsden NHS Foundation Trust",
    "employerWebsite": "https://www.royalmarsden.nhs.uk/working-royal-marsden",
    "applyUrl": "https://www.jobs.nhs.uk/candidate/jobadvert/C9282-25-0864/ats-direct-apply",
    "closingDate": "05 October 2025",
    "closing_date_text": "05 October 2025",
    "closing_date": "20251005",
    "datePosted": "23 September 2025",
    "date_posted_text": "23 September 2025",
    "date_posted": "20250923",
    "payScheme": "Hospital medical and dental staff",
    "pay_scheme": "Hospital medical and dental staff",
    "grade": "Doctor - other",
    "salary": "£65,048 to £73,992 a year per annum incl. HCAS",
    "contractType": "Fixed term",
    "contract_type": "Fixed term",
    "workingPattern": "Full-time",
    "working_pattern": "Full-time",
    "contract_duration": "12 months",
    "jobSummaryHtml": "<p>The Gynaecological Cancer Unit at the Royal Marsden is world renowned for excellence in clinical care and clinical research. It is comprised of multidisciplinary teams of medical oncologists, clinical oncologists, surgeons, palliative care physicians, clinician scientists, specialist nurses, dieticians, research nurses, trial coordinators, data managers and biological specimen coordinators. They have state-of-the-art facilities for all investigations and treatments utilizing expert histopathology, radiology and nuclear medicine services, including MRI and PET/CT. </p>",
    "jobSummaryText": "The Gynaecological Cancer Unit at the Royal Marsden is world renowned for excellence in clinical care and clinical research. It is comprised of multidisciplinary teams of medical oncologists, clinical oncologists, surgeons, palliative care physicians, clinician scientists, specialist nurses, dieticians, research nurses, trial coordinators, data managers and biological specimen coordinators. They have state-of-the-art facilities for all investigations and treatments utilizing expert histopathology, radiology and nuclear medicine services, including MRI and PET/CT.",
    "job_summary": "The Gynaecological Cancer Unit at the Royal Marsden is world renowned for excellence in clinical care and clinical research. It is comprised of multidisciplinary teams of medical oncologists, clinical oncologists, surgeons, palliative care physicians, clinician scientists, specialist nurses, dieticians, research nurses, trial coordinators, data managers and biological specimen coordinators. They have state-of-the-art facilities for all investigations and treatments utilizing expert histopathology, radiology and nuclear medicine services, including MRI and PET/CT.",
    "mainDutiesHtml": "<p>The job will allow the successful candidate to undertake focused work in the area of gynaecological oncology surgical research.</p>",
    "mainDutiesText": "The job will allow the successful candidate to undertake focused work in the area of gynaecological oncology surgical research.",
    "main_duties_of_the_job": "The job will allow the successful candidate to undertake focused work in the area of gynaecological oncology surgical research.",
    "aboutUsHtml": "<p>The Royal Marsden NHS Foundation Trust is a world-leading cancer centre. Our role is to offer our patients the best cancer care available anywhere in the world, and to continue to make a global contribution to finding better ways of diagnosing and treating cancer. We employ over 4,500 staff in a diverse range of careers including nursing, medical, science, radiography, pharmacy, occupational therapy, finance and administrative services. We have two hospitals - one in Chelsea, London, and one in Sutton, Surrey - as well as a Medical Daycare Unit in Kingston Hospital.</p>",
    "aboutUsText": "The Royal Marsden NHS Foundation Trust is a world-leading cancer centre. Our role is to offer our patients the best cancer care available anywhere in the world, and to continue to make a global contribution to finding better ways of diagnosing and treating cancer. We employ over 4,500 staff in a diverse range of careers including nursing, medical, science, radiography, pharmacy, occupational therapy, finance and administrative services. We have two hospitals - one in Chelsea, London, and one in Sutton, Surrey - as well as a Medical Daycare Unit in Kingston Hospital.",
    "about_us": "The Royal Marsden NHS Foundation Trust is a world-leading cancer centre. Our role is to offer our patients the best cancer care available anywhere in the world, and to continue to make a global contribution to finding better ways of diagnosing and treating cancer. We employ over 4,500 staff in a diverse range of careers including nursing, medical, science, radiography, pharmacy, occupational therapy, finance and administrative services. We have two hospitals - one in Chelsea, London, and one in Sutton, Surrey - as well as a Medical Daycare Unit in Kingston Hospital.",
    "jobDescriptionHtml": "<p>For further information regarding this post please contact:</p>",
    "jobDescriptionText": "For further information regarding this post please contact:",
    "job_description": "For further information regarding this post please contact:",
    "employerAddress": [
        "The Royal Marsden Hospital Chelsea",
        "Chelsea",
        "SW3 6JJ"
    ],
    "employer_details": {
        "name": "The Royal Marsden NHS Foundation Trust",
        "address": [
            "The Royal Marsden Hospital Chelsea",
            "Chelsea",
            "SW3 6JJ"
        ],
        "website": "https://www.royalmarsden.nhs.uk/working-royal-marsden"
    },
    "contactJobTitle": "Consultant Gynaecological Oncology Surgeon",
    "contactName": "Mr John Butler",
    "contactEmail": "john.butler@rmh.nhs.uk",
    "contactNumber": null,
    "contact_details": {
        "jobTitle": "Consultant Gynaecological Oncology Surgeon",
        "name": "Mr John Butler",
        "email": "john.butler@rmh.nhs.uk",
        "phone": null
    },
    "person_specification": [
        {
            "category": "Qualifications",
            "essentials": [
                "MRCOG part 1 and 2"
            ]
        },
        {
            "category": "Knowledge",
            "essentials": [
                "Experience in Gynaecological oncology",
                "Experience in chemotherapy and/or radiotherapy; ATSM in gynaecological oncology"
            ]
        },
        {
            "category": "TrainingExpected",
            "essentials": [
                "It is anticipated that the appointee will have completed ST 5 or more"
            ]
        },
        {
            "category": "Management/AuditExperience",
            "essentials": [
                "Experience of clinical audit and research",
                "Published paper"
            ]
        },
        {
            "category": "PersonalSkills",
            "essentials": [
                "Good leadership skills",
                "Ability to communicate with clarity and intelligently in written and spoken English; ability to build rapport, listen, persuade/ negotiate with colleagues, patients, relatives, GPs, nurses and other agencies.",
                "Ability to work with other teams within the Trust.",
                "Ability to work under pressure",
                "Ability to be flexible and considerate, take responsibility, lead, make decisions and exert appropriate authority",
                "Ability to see patients as people, ability to empathise and work co-operatively with others"
            ]
        }
    ],
    "supporting_documents": [
        {
            "name": "Job Description & Person Specification.pdf",
            "size": "PDF, 656 KB"
        },
        {
            "name": "Job Features Form.pdf",
            "size": "PDF, 108 KB"
        }
    ],
    "privacy_policy": "https://www.royalmarsden.nhs.uk/privacy",
    "basicInfo": {
        "id": "C9282-25-0864",
        "title": "Clinical Research Doctor - Gynaecology",
        "url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9282-25-0864?keyword=doctor&location=London&distance=5&language=",
        "employer": "The Royal Marsden NHS Foundation Trust",
        "location": "Chelsea SW3 6JJ",
        "salary": "Salary: £65,048 to £73,992 a year",
        "datePosted": "Date posted: 23 September 2025",
        "closingDate": "Closing date: 5 October 2025",
        "contractType": "Contract type: Fixed-Term",
        "workingPattern": "Working pattern: Full time"
    }
}
```

### Output Fields Explanation

#### Core Job Fields

- **`id`**: Primary NHS Jobs vacancy identifier (mirrors the job advert code in the URL).
- **`url`**: Canonical NHS Jobs advert URL.
- **`referenceNumber`**: Trust-specific reference published on the job advert.
- **`title`**: Vacancy headline shown to candidates.
- **`employer` / `employerWebsite`**: NHS organisation advertising the role plus its careers site.
- **`applyUrl`**: Direct link to the on-platform application form (`/ats-direct-apply`).
- **`closingDate` / `closing_date_text` / `closing_date`**: Human-readable and normalized (YYYYMMDD) closing date formats.
- **`datePosted` / `date_posted_text` / `date_posted`**: Publication date in both display and normalized formats.
- **`payScheme` / `pay_scheme` / `grade` / `salary`**: Pay framework (e.g., Agenda for Change), band, and salary narrative.
- **`contractType` / `contract_type` / `contract_duration`**: Contract classification and stated duration when provided.
- **`workingPattern` / `working_pattern`**: Working time arrangement (e.g., Full-time, Part-time).

#### Narrative Sections

- **`jobSummaryHtml` / `jobSummaryText` / `job_summary`**: “Job summary” block preserved in HTML and text.
- **`mainDutiesHtml` / `mainDutiesText` / `main_duties_of_the_job`**: Main duties section in multiple formats.
- **`aboutUsHtml` / `aboutUsText` / `about_us`**: “About us” employer narrative.
- **`jobDescriptionHtml` / `jobDescriptionText` / `job_description`**: Longer job description or responsibilities when published.

#### Employer & Contact Details

- **`employerAddress` / `employer_details.address`**: Structured address lines gathered from the advert.
- **`employer_details.name` / `website`**: Trust name and careers URL grouped for convenience.
- **`contactJobTitle` / `contactName` / `contactEmail` / `contactNumber`**: Primary contact information highlighted on the page.
- **`contact_details`**: Nested replica of the contact block, ready for direct consumption.

#### Structured Lists

- **`person_specification`**: Array of categories (e.g., Qualifications, Knowledge) with essential bullet points.
- **`supporting_documents`**: Attachment metadata (file name and size) extracted from the “Supporting documents” section.

#### Compliance & Privacy

- **`privacy_policy`**: Employer-specific privacy notice link if provided; falls back to NHS Jobs privacy link when available.

#### Search Card Context

- **`basicInfo`**: Original search result card details (title, employer, location, salary, etc.) for traceability back to the listing page.

***

### Explore More Scrapers

If you found this Apify Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/B9QxpGHylsP0guHns/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
- Email: muhamed.didovic@gmail.com

# Actor input Schema

## `startUrls` (type: `array`):

NHS Jobs search results (`/candidate/search/results`) and/or job advert URLs (`/candidate/jobadvert/…`). Leave empty to search using the filter section below only.

## `jobKeyword` (type: `string`):

Search text (job title, skills). Maps to `keyword`. Ignored when Start URLs are set.

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

Town, city, or postcode (`location`). Ignored when Start URLs are set.

## `distanceMiles` (type: `string`):

Radius around location. “All” omits distance. Ignored when Start URLs are set.

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

NHS refine option. “All” omits. Ignored when Start URLs are set.

## `workingPattern` (type: `string`):

“All” omits. Ignored when Start URLs are set.

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

NHS staff group code. “All” omits. Ignored when Start URLs are set.

## `payRange` (type: `string`):

Pay range bucket on NHS Jobs. “All” omits. Ignored when Start URLs are set.

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

Maximum number of items that will be scraped.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=London&distance=5&language=en"
    }
  ],
  "maxItems": 10000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=London&distance=5&language=en"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/nhs-scraper").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 = {
    "startUrls": [{ "url": "https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=London&distance=5&language=en" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/nhs-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.jobs.nhs.uk/candidate/search/results?keyword=development&location=London&distance=5&language=en"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/nhs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NHS UK [$0.85💰] Jobs Scraper Richest Output",
        "description": "💰 $0.85 per 1,000 results. Collects NHS Jobs listings with metadata like vacancy IDs, employer details, pay scheme/band, normalized closing & posting dates, narrative sections (summary, duties, about us), contact info, person specification, documents, and privacy links.",
        "version": "0.0",
        "x-build-id": "7nQ4SbCEvTwmZjtYR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~nhs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-nhs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~nhs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-nhs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~nhs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-nhs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "NHS Jobs search results (`/candidate/search/results`) and/or job advert URLs (`/candidate/jobadvert/…`). Leave empty to search using the filter section below only.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "jobKeyword": {
                        "title": "Job keyword",
                        "type": "string",
                        "description": "Search text (job title, skills). Maps to `keyword`. Ignored when Start URLs are set."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Town, city, or postcode (`location`). Ignored when Start URLs are set."
                    },
                    "distanceMiles": {
                        "title": "Distance (miles)",
                        "enum": [
                            "",
                            "5",
                            "10",
                            "20",
                            "30",
                            "50",
                            "100"
                        ],
                        "type": "string",
                        "description": "Radius around location. “All” omits distance. Ignored when Start URLs are set."
                    },
                    "contractType": {
                        "title": "Contract type",
                        "enum": [
                            "",
                            "Permanent",
                            "Fixed-Term",
                            "Apprenticeship",
                            "Voluntary",
                            "Locum",
                            "Training",
                            "Secondment",
                            "Honorary",
                            "Bank",
                            "NHS Reservist"
                        ],
                        "type": "string",
                        "description": "NHS refine option. “All” omits. Ignored when Start URLs are set."
                    },
                    "workingPattern": {
                        "title": "Working pattern",
                        "enum": [
                            "",
                            "full-time",
                            "part-time",
                            "job-share",
                            "flexible-working",
                            "remote-working",
                            "compressed-hours",
                            "term-time-hours",
                            "annualised-hours"
                        ],
                        "type": "string",
                        "description": "“All” omits. Ignored when Start URLs are set."
                    },
                    "staffGroup": {
                        "title": "Staff group",
                        "enum": [
                            "",
                            "CLINICAL_SERVICES",
                            "PROF_SCIENTIFIC_AND_TECHNICAL",
                            "ADMINISTRATIVE_AND_CLERICAL",
                            "ALLIED_HEALTH_PROF",
                            "ESTATES_AND_ANCILLARY",
                            "HEALTHCARE_SCIENTISTS",
                            "MEDICAL_AND_DENTAL",
                            "NURSING_AND_MIDWIFERY_REGD",
                            "STUDENTS"
                        ],
                        "type": "string",
                        "description": "NHS staff group code. “All” omits. Ignored when Start URLs are set."
                    },
                    "payRange": {
                        "title": "Pay range",
                        "enum": [
                            "",
                            "0-10",
                            "10-20",
                            "20-30",
                            "30-40",
                            "40-50",
                            "50-60",
                            "60-70",
                            "70-80",
                            "80-90",
                            "90-100",
                            "100"
                        ],
                        "type": "string",
                        "description": "Pay range bucket on NHS Jobs. “All” omits. Ignored when Start URLs are set."
                    },
                    "maxItems": {
                        "title": "Maximum number of items OR limit the results per crawl",
                        "type": "integer",
                        "description": "Maximum number of items that will be scraped.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 100
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
