# General Chiropractic Council Register Scraper (`vexaloom-labs/general-chiropractic-council-register-scraper`) Actor

Search the General Chiropractic Council's public register of UK-regulated chiropractors by name, postcode radius, or registration number, with practice addresses, contact details, qualifications, and regulatory history.

- **URL**: https://apify.com/vexaloom-labs/general-chiropractic-council-register-scraper.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (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 $0.49 / 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/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

## General Chiropractic Council Register Scraper

Scrape the **General Chiropractic Council (GCC)** public register — the statutory list of chiropractors registered to practise in the UK. Search by name or by town/postcode, look up exact registration numbers, or walk the full register. Records include registration status, qualification, every published practice with contact details, distance from a location, last-known practice flags, and published regulatory actions. No login, cookies, API key, or proxy setup required.

### What this actor does

- **Three modes:** `search` by name or location, `byRegistrationNumber` for exact five-digit lookups, and `fullRegister` to browse all 4,000+ records
- **Status coverage:** practising, non-practising, conditions of practice, suspended/interim suspension, removed from register, and admonishment
- **Complete practice data:** every published practice, address, phone, email, website, coordinates from the site's map index, and distance in miles
- **Regulatory history:** action title, date, description, and a direct link to the published hearing decision
- **Client-side refinement:** gender, first-registered date range, qualification text, and city/region/country legacy filters
- **Empty fields are omitted** — records only contain values the GCC actually publishes

### Output per chiropractor

- `fullName` — registered name
- `gender` — `Male` or `Female` when published
- `registrationNumber` — five-digit GCC number, zero-padded
- `registrationStatus` — canonical status such as `Registered - Practising`
- `registrationStatusRaw` — exact status text shown by the GCC, including en dashes
- `statusCategory` — `practising`, `nonPractising`, `conditions`, `suspended`, `removed`, `admonishment`, or `other`
- `isRegistered` — legacy flag: true when the canonical status starts with `Registered`
- `isOnRegister` — false for removed and suspended records
- `isPractising` — true for practising, conditions-of-practice, and admonishment records
- `statusNote` — the GCC's explanation when a non-standard status is shown
- `sanction` — short label for a non-standard status, e.g. `Removal`, `Interim suspension`, `Conditions of practice`
- `dateFirstRegistered` — ISO date (`YYYY-MM-DD`)
- `qualification` — degree or diploma and awarding body, where published
- `practices[]` — one entry per practice: `name`, `street`, `city`, `region`, `postcode`, `country`, `phone`, `email`, `website`, `latitude`, `longitude`, `distanceMiles`, `addressFull`, `isLastKnown`
- `practiceCount` — number of published practices
- `primaryPracticeName` — first practice name
- `primaryPracticeAddress` — first practice address
- `practicesAreLastKnown` — true when the profile says "Last known to be working at" and publishes at least one such practice
- `distanceMiles` — nearest-result distance in location searches
- `regulatoryActions[]` — `title`, `actionDate`, `description`, `decisionUrl`
- `hasRegulatoryAction` — true when at least one action is published
- `regulatoryActionCount` — number of published actions
- `sourceUrl` — canonical GCC profile URL
- `searchQuery` — name, location, registration number, or browse label that produced the record
- `recordType: "chiropractor"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byRegistrationNumber` / `fullRegister` |
| `name` | string | – | Full or partial name, e.g. `Smith` (mode=search; ignored by `fullRegister`) |
| `postcode` | string | – | UK postcode; results nearest-first within 30 miles (mode=search) |
| `location` | string | – | Town, city, or UK postcode; results nearest-first (mode=search) |
| `gender` | select | – | `Male` / `Female` |
| `registrationStatus` | select | – | One of the six canonical register statuses |
| `includeNonPractising` | boolean | `false` | Include registered but non-practising chiropractors |
| `includeRemovedSuspended` | boolean | `false` | Include removed and suspended records |
| `registeredAfter` | string | – | ISO date; first registered on or after this date |
| `registeredBefore` | string | – | ISO date; first registered on or before this date |
| `qualificationContains` | string | – | Text filter on the published qualification |
| `registrationNumbers` | array | `[]` | Exact registration numbers (mode=byRegistrationNumber) |
| `fetchDetails` | boolean | `true` | Open each profile for full practice, contact, and action data |
| `maxItems` | integer | `50` | Hard cap on emitted records (1–5000) |

#### Example: search by surname

```json
{
  "mode": "search",
  "name": "Smith",
  "maxItems": 25,
  "fetchDetails": true
}
```

#### Example: chiropractors near a postcode

```json
{
  "mode": "search",
  "postcode": "SW1A 1AA",
  "maxItems": 20,
  "fetchDetails": true
}
```

#### Example: exact registration-number lookup

```json
{
  "mode": "byRegistrationNumber",
  "registrationNumbers": ["01913", "00078", "02260"]
}
```

#### Example: browse the full register without detail requests

```json
{
  "mode": "fullRegister",
  "maxItems": 500,
  "fetchDetails": false
}
```

### Use cases

- **Patient safety checks** — confirm a chiropractor's current registration status before booking
- **Insurer and referral credentialing** — validate registration numbers and qualifications in bulk
- **Healthcare directories** — build a UK chiropractor directory with live practice contacts
- **Compliance monitoring** — track suspensions, removals, admonishments, and published decisions
- **Practice-density research** — measure provision by town, region, qualification pathway, or registration year
- **Recruitment and lead research** — find practices near a location with website, phone, and email where published

### FAQ

**What is the GCC register?** The General Chiropractic Council is the UK statutory regulator for chiropractors. Its public register lists everyone who may lawfully use the title "chiropractor" in the UK. The actor reads that same public register; it is not affiliated with the GCC.

**Why do some records have no gender, first-registered date, or qualification?** The GCC suppresses those fields on removed and interim-suspension profiles. The actor omits what the site does not publish rather than inferring it.

**Why do non-practising records usually have no practices?** Non-practising chiropractors have told the GCC they are not currently working as chiropractors in the UK, so the register normally publishes no current practice for them. Last-known practices are kept where the site shows them.

**Does `distanceMiles` appear for every search?** No. It is published on location searches (town or postcode) within the site's 30-mile radius. Name and registration-number searches do not produce a distance.

**What is the difference between `isRegistered`, `isOnRegister`, and `isPractising`?** `isRegistered` preserves the old rule "status starts with Registered". `isOnRegister` is false for removed and suspended records. `isPractising` is true for practising, conditions-of-practice, and admonishment records, and false for non-practising, suspended, and removed records.

**Can I include removed or non-practising chiropractors?** Yes. Use `includeNonPractising` and `includeRemovedSuspended`, or select the matching `registrationStatus`; the relevant include flag is applied automatically.

**How complete is the full register?** The GCC currently returns 4,287 records, split across 429 result pages of 10. `maxItems` caps how many are emitted. Turning `fetchDetails` on adds one profile request per record and takes longer; turning it off emits the list fields only.

**Are regulatory-action findings or outcomes structured?** The current GCC profile publishes a free-text description and a decision link. The actor captures `description` and `decisionUrl`; older structured fields such as `finding`, `outcome`, `dateRange`, and `noticeUrl` are no longer published and are therefore omitted.

**How fresh is the data?** Every run reads the live GCC register, so registration status and practice details reflect the site at run time.

# Actor input Schema

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

Choose how to query the register.

## `name` (type: `string`):

Full or partial name, e.g. `Smith` or `Julia Smith`. Use at least 3 characters. When combined with a location, the name is applied as a filter inside that area.

## `postcode` (type: `string`):

UK postcode such as `SW1A 1AA`. Results are returned nearest-first within the site's 30-mile radius.

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

Town, city, or UK postcode such as `Manchester`, `Edinburgh`, or `CF10 1EP`. Results are nearest-first within the site's 30-mile radius.

## `gender` (type: `string`):

Only return chiropractors of this gender. Gender is not published for removed or interim-suspended records.

## `registrationStatus` (type: `string`):

Only return records with this exact status. Non-practising and removed/suspended records are included automatically when their status is selected.

## `includeNonPractising` (type: `boolean`):

Include chiropractors who are registered but not currently practising in the UK.

## `includeRemovedSuspended` (type: `boolean`):

Include chiropractors who have been removed from the register or are suspended.

## `registeredAfter` (type: `string`):

ISO date `YYYY-MM-DD`; keeps chiropractors first registered on or after this date.

## `registeredBefore` (type: `string`):

ISO date `YYYY-MM-DD`; keeps chiropractors first registered on or before this date.

## `qualificationContains` (type: `string`):

Case-insensitive text filter on the qualification, e.g. `AECC`, `McTimoney`, or `Doctor of Chiropractic`.

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

Exact GCC registration numbers, e.g. `01913` or `1913`. Leading zeros are added automatically.

## `fetchDetails` (type: `boolean`):

Open each matching profile to collect gender, first-registered date, qualification, full practices, contacts, and regulatory actions. Turn off for a faster name/registration/status list.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "name": "Smith",
  "includeNonPractising": false,
  "includeRemovedSuspended": false,
  "registrationNumbers": [
    "01913"
  ],
  "fetchDetails": true,
  "maxItems": 3
}
```

# Actor output Schema

## `chiropractors` (type: `string`):

Dataset containing all scraped chiropractor records.

# 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",
    "name": "Smith",
    "includeNonPractising": false,
    "includeRemovedSuspended": false,
    "registrationNumbers": [
        "01913"
    ],
    "fetchDetails": false,
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/general-chiropractic-council-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",
    "name": "Smith",
    "includeNonPractising": False,
    "includeRemovedSuspended": False,
    "registrationNumbers": ["01913"],
    "fetchDetails": False,
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/general-chiropractic-council-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",
  "name": "Smith",
  "includeNonPractising": false,
  "includeRemovedSuspended": false,
  "registrationNumbers": [
    "01913"
  ],
  "fetchDetails": false,
  "maxItems": 3
}' |
apify call vexaloom-labs/general-chiropractic-council-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/general-chiropractic-council-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/nnU6SFiDP7MgEYLqO/builds/wh0QvvuCTxCFSofnj/openapi.json
