# UK Health Professional Register Scraper (HCPC) (`crawlerbros/uk-health-professional-register-scraper`) Actor

Verify UK health and care professionals against the Health and Care Professions Council's official public register (hcpc-uk.org). Search by surname and profession, or look up exact HCPC registration numbers, to get registration status, profession, sub-specialism (modality), and registration period.

- **URL**: https://apify.com/crawlerbros/uk-health-professional-register-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## UK Health Professional Register Scraper (HCPC)

Verify UK health and care professionals against the **Health and Care Professions Council (HCPC)** official public register at `hcpc-uk.org`. Search by surname and profession — or look up an exact HCPC registration number — to confirm whether a physiotherapist, paramedic, occupational therapist, radiographer, psychologist, or any of the other 15 HCPC-regulated professions is currently registered and legally able to practise in the UK.

### What this actor does

- **Two lookup modes:** search the register by surname + profession, or look up exact HCPC registration numbers
- **Covers all 15 HCPC-regulated professions** — Arts therapist, Biomedical scientist, Chiropodist/podiatrist, Clinical scientist, Dietitian, Hearing aid dispenser, Occupational therapist, Operating department practitioner, Orthoptist, Paramedic, Physiotherapist, Practitioner psychologist, Prosthetist/orthotist, Radiographer, Speech and language therapist
- **Enriches every result** with the full registration-detail page — registration period, practice location, and profession sub-specialism ("modality") where the profession has one (e.g. Diagnostic vs Therapeutic radiographer; Clinical, Counselling, Educational, Forensic, or Health psychologist)
- **Filter by registration status** — good standing, registered-with-conditions/interim-order, or deregistered
- **Filter by practice location** — substring match on the registrant's listed town/city (note: the HCPC register only publishes a practice location for some registrants; a registrant with no published location is *not* excluded by this filter, since absent data can't be confirmed to fail the match — combine with `statusCategory` or review the `location` field yourself for stricter verification)
- **Empty fields are never included** — only real, extracted data is emitted

### Output per registrant

- `registrationNumber` — unique HCPC registration number (profession code + digits, e.g. `PH138535`)
- `fullName` — registrant's full name as shown on the register
- `professionCode` / `profession` — e.g. `PH` / `Physiotherapist`
- `status` — raw registration status, e.g. `Registered`, `Registered (Interim Conditions of Practice)`, `Deregistered (Interim Suspension)`
- `statusCategory` — normalized: `registeredGoodStanding` / `registeredWithConditions` / `deregistered`
- `isCurrentlyRegistered` — boolean, true if still on the register (with or without conditions)
- `hasHearingRecord` — boolean, true if the status links to an HCPC fitness-to-practise hearing
- `hearingDetailsUrl` — link to the hearing/conditions details page (only present when `hasHearingRecord` is true)
- `location` — registrant's listed practice town/city (when published)
- `modalities[]` — sub-specialism(s) held, for professions that have them (Radiographer, Psychologist, Arts therapist, Prosthetist/orthotist)
- `registrationValidFrom` / `registrationValidUntil` — current registration period (ISO `YYYY-MM-DD`)
- `sourceUrl` — direct link to the official HCPC register entry
- `recordType`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` (surname + profession) or `byRegistrationNumbers` (exact lookup) |
| `query` | string | `Clarke` | Surname (or full name) to search for (mode=search) |
| `profession` | select | `PH` | One of the 15 HCPC-regulated professions (mode=search, required) |
| `statusCategory` | select | `all` | Filter by `all` / `registeredGoodStanding` / `registeredWithConditions` / `deregistered` |
| `townContains` | string | – | Only include registrants whose location contains this text (registrants with no published location are still included — see note above) |
| `registrationNumbers` | array | `["PH138535"]` | Exact HCPC registration numbers (mode=byRegistrationNumbers) |
| `maxItems` | integer | `25` | Hard cap on emitted records (1–300) |

#### Example: verify a named physiotherapist

```json
{
  "mode": "search",
  "query": "Clarke",
  "profession": "PH",
  "maxItems": 25
}
```

#### Example: find paramedics in a location, excluding anyone with conditions

```json
{
  "mode": "search",
  "query": "Khan",
  "profession": "PA",
  "statusCategory": "registeredGoodStanding",
  "townContains": "Manchester"
}
```

#### Example: exact registration-number lookup

```json
{
  "mode": "byRegistrationNumbers",
  "registrationNumbers": ["PH138535", "RA79578", "PYL042669"]
}
```

### Use cases

- **Employers & recruiters** — verify a candidate health professional holds a current, valid HCPC registration before hiring
- **Patients** — confirm a practitioner treating them is legitimately registered
- **Healthcare providers & agencies** — bulk-verify staff registration status ahead of CQC/regulatory inspections
- **Insurance & compliance teams** — cross-check registration status and profession claims
- **Recruitment agencies** — build verified candidate shortlists filtered by profession or sub-specialism
- **Researchers** — analyse the composition of the UK allied-health workforce by profession or location

### FAQ

**What's the HCPC register?** The Health and Care Professions Council is the UK statutory regulator for 15 health and care professions (physiotherapists, paramedics, radiographers, psychologists, and more). Anyone practising in a protected title in these professions must be registered with the HCPC, and the register is public.

**Why is `profession` required for a search?** The HCPC register itself returns zero results for a name search that doesn't specify a profession — a name alone is not enough to search the live register.

**Why did my search return no records?** Either no registrant matches your surname within that profession, or your `statusCategory`/`townContains` filters excluded every match. The actor reports which case applies via the run's status message.

**What is a "modality"?** Some HCPC professions have recognised sub-specialisms shown on the register — for example Radiographers are Diagnostic or Therapeutic, and Practitioner psychologists are Clinical, Counselling, Educational, Forensic, or Health psychologists. These appear in the `modalities` field when the register publishes one.

**Does this include deregistered/suspended people?** Only registrants the HCPC register itself surfaces in a name search are returned, which can include recently deregistered or interim-suspended people (they still show up with a `Deregistered`/conditions status) — set `statusCategory` to filter these in or out.

**How fresh is the data?** Every run of this actor reads the register live.

**Do I need a proxy or login?** No — no login, cookies, or manual proxy configuration are required. The register briefly runs an anti-bot check before showing results; the actor solves this automatically and transparently on every run (occasionally falling back to Apify's own datacenter proxy pool if needed, at no extra setup or cost to you).

**Why did a run return 0 records with an anti-bot status message?** The register's anti-bot check is usually solved within seconds, but on rare occasions — especially if the exact same search is repeated many times in quick succession — it can take longer than the actor's retry budget. This is transient: simply re-running the actor (ideally with a moment's gap, or a different surname/profession) succeeds normally.

# Actor input Schema

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

What to fetch.

## `query` (type: `string`):

Surname (or full name) to search for on the register, e.g. 'Clarke'.

## `profession` (type: `string`):

The HCPC-regulated profession to search within. Required — the register returns zero results for a name search with no profession selected.

## `statusCategory` (type: `string`):

Restrict results by registration status.

## `townContains` (type: `string`):

Only include registrants whose listed practice location contains this text (case-insensitive), e.g. 'London'.

## `registrationNumbers` (type: `array`):

Exact HCPC registration numbers to look up, each a profession code followed by digits, e.g. 'PH138535'. Preserve any leading zeros exactly as shown on the register (e.g. 'PYL042669').

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "query": "Clarke",
  "profession": "PH",
  "statusCategory": "all",
  "registrationNumbers": [
    "PH138535"
  ],
  "maxItems": 25
}
```

# Actor output Schema

## `registrants` (type: `string`):

Dataset containing all scraped HCPC registrants.

# 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",
    "query": "Clarke",
    "profession": "PH",
    "statusCategory": "all",
    "registrationNumbers": [
        "PH138535"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/uk-health-professional-register-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 = {
    "mode": "search",
    "query": "Clarke",
    "profession": "PH",
    "statusCategory": "all",
    "registrationNumbers": ["PH138535"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/uk-health-professional-register-scraper").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",
  "query": "Clarke",
  "profession": "PH",
  "statusCategory": "all",
  "registrationNumbers": [
    "PH138535"
  ],
  "maxItems": 25
}' |
apify call crawlerbros/uk-health-professional-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/uk-health-professional-register-scraper"
        }
    }
}

```

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/MSiVZtN90f3iKPxDM/builds/0zfduEtBb1Rz3mSwF/openapi.json
