# UK Care Home Leads - CQC Registered Locations (`scrapersdelight/cqc-care-locations-scraper`) Actor

From $0.50 per 1,000 locations, no start fee. Every CQC-registered care location in England, from the official monthly register: registered manager, bed count, CQC rating, phone, full address, provider and Companies House number. 57,069 locations, 14,887 care homes. Filter by region, rating or beds.

- **URL**: https://apify.com/scrapersdelight/cqc-care-locations-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 per care location returneds

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## UK Care Home Leads — Every CQC-Registered Care Location in England

Every location registered with the **Care Quality Commission** under the Health and Social Care Act:
**registered manager's name, bed count, latest CQC rating, phone, full address, coordinates,
regulated activities, service types, provider and the provider's Companies House number.**

Measured on the live register, **1 September 2026 edition, read 16 September 2026**:

| | |
|---|---|
| Locations in the register | **57,069** |
| Care homes among them | **14,887** (26.09%) |
| Columns read from the source | **122** |
| Full address (street + city + postcode) | **57,069 — 100.00%** |
| A phone number (location or provider) | **56,947 — 99.79%** |
| A **named** registered manager | **47,488 — 83.21%** |
| Address **and** phone **and** a named manager | **47,377 — 83.02%** |
| Provider Companies House number | **42,019 — 73.63%** |
| A website (location or provider) | **42,510 — 74.49%** |
| A published CQC overall rating | **35,172 — 61.63%** |
| **Email addresses** | **0.** See *Honest limits* — this file has none |

Official CQC data under the Open Government Licence. **No API key. No account. No login.**

***

### What one row looks like

A real row, unedited, from the verified run:

```json
{
  "locationId": "1-10000812939",
  "locationName": "Charlotte House",
  "locationUrl": "https://www.cqc.org.uk/location/1-10000812939",
  "isCareHome": true,
  "dormant": false,
  "careHomeBeds": 103,
  "registeredManager": "Evans, Philip",
  "locationPhone": "01516431271",
  "locationWebsite": null,
  "odsCode": "VNH4Q",
  "hscaStartDate": "2020-12-18",
  "latestOverallRating": "Good",
  "ratingPublicationDate": "2023-04-04",
  "inheritedRating": false,
  "locationTypeSector": "Social Care Org",
  "inspectionDirectorate": "Adult social care",
  "primaryInspectionCategory": "Residential social care",
  "streetAddress": "Church Road",
  "addressLine2": "Bebington",
  "city": "Wirral",
  "county": "Merseyside",
  "postcode": "CH63 3DZ",
  "postcodeArea": "CH",
  "fullAddress": "Church Road, Bebington, Wirral, Merseyside, CH63 3DZ",
  "region": "North West",
  "nhsRegion": "North West",
  "localAuthority": "Wirral",
  "parliamentaryConstituency": "Wirral West",
  "latitude": 53.344289,
  "longitude": -3.00302,
  "uprn": "42024400",
  "brandName": "BRAND Lovett Care",
  "providerId": "1-101658918",
  "providerName": "Lovett Care Limited",
  "providerUrl": "https://www.cqc.org.uk/provider/1-101658918",
  "providerPhone": "03303010095",
  "providerWebsite": "https://www.lovettcare.co.uk",
  "providerCompaniesHouseNumber": "06496219",
  "providerCharityNumber": null,
  "providerOwnershipType": "Organisation",
  "providerNominatedIndividual": "Fairhurst, Cathryn",
  "providerAddress": "Unit 2, Evolution, Hooters Hall Road, Lymedale Business Park, Newcastle, ST5 9QF",
  "providerCity": "Newcastle",
  "providerPostcode": "ST5 9QF",
  "providerRegion": "West Midlands",
  "regulatedActivities": [
    "Accommodation for persons who require nursing or personal care",
    "Treatment of disease, disorder or injury"
  ],
  "serviceTypes": ["Care home service with nursing"],
  "serviceUserBands": ["Dementia", "Older People", "Physical Disability", "Sensory Impairment"],
  "dualRegistered": false,
  "dualRegistrationIsPrimary": null,
  "dataAsAt": "2026-09-01",
  "sourceFile": "https://www.cqc.org.uk/system/files/2026-09/01_September_2026_HSCA_Active_Locations.ods",
  "scrapedAt": "2026-09-16T23:00:00.000Z"
}
```

### Field fill, counted — not estimated

Counted with the shipping parser over **all 57,069 rows** of the September 2026 register. CQC's `*`
suppression marker, its `-` not-applicable marker and empty cells all count as **NOT filled**.

| field | filled | % |
|---|---:|---:|
| `locationId` `locationName` `locationUrl` `fullAddress` `postcode` `postcodeArea` `city` `streetAddress` `region` `isCareHome` `dormant` `hscaStartDate` `locationTypeSector` `inspectionDirectorate` `primaryInspectionCategory` `providerId` `providerName` `providerUrl` `providerAddress` `providerCity` `providerPostcode` `providerRegion` `providerOwnershipType` `regulatedActivities` `serviceTypes` `serviceUserBands` | 57,069 | **100.00%** |
| `careHomeBeds` | 57,068 | 100.00% |
| `localAuthority` `parliamentaryConstituency` `latitude` `longitude` | 57,058 | 99.98% |
| `nhsRegion` | 57,055 | 99.98% |
| any phone (`locationPhone` or `providerPhone`) | 56,947 | 99.79% |
| `providerPhone` | 56,483 | 98.97% |
| `locationPhone` | 52,202 | 91.47% |
| `uprn` | 48,457 | 84.91% |
| `registeredManager` (a real name) | 47,488 | **83.21%** |
| `providerNominatedIndividual` (a real name) | 44,777 | 78.46% |
| `odsCode` | 44,016 | 77.13% |
| any website (`locationWebsite` or `providerWebsite`) | 42,510 | 74.49% |
| `providerCompaniesHouseNumber` | 42,019 | 73.63% |
| `providerWebsite` | 38,501 | 67.46% |
| `inheritedRating` | 35,204 | 61.69% |
| `latestOverallRating` | 35,172 | 61.63% |
| `ratingPublicationDate` | 32,263 | 56.53% |
| `addressLine2` | 31,959 | 56.00% |
| `county` | 30,933 | 54.20% |
| `locationWebsite` | 29,523 | 51.73% |
| `brandName` | 13,701 | 24.01% |
| `providerCharityNumber` | 2,968 | 5.20% |
| `dualRegistered` = true | 866 | 1.52% |

**Care homes are a much richer slice.** With `careHomesOnly: true` (14,773 rows delivered after the
default dormant filter):

| | filled | % of delivered |
|---|---:|---:|
| bed count > 0 | 14,770 | **99.98%** |
| a phone number | 14,764 | **99.94%** |
| location phone specifically | 14,240 | 96.39% |
| a published CQC rating | 13,664 | **92.49%** |
| provider Companies House number | 13,463 | **91.13%** |
| a named registered manager | 13,054 | **88.36%** |
| a website | 11,039 | 74.72% |

Of the 35,172 published ratings register-wide, **32,223 (56.46%)** are one of the four real grades —
Good 26,489 · Requires improvement 3,970 · Outstanding 1,585 · Inadequate 179. The remaining 2,949
are `Not applicable`, `Not Rated`, `No Approved Rating` or `Insufficient evidence to rate`, kept as
CQC published them rather than flattened to null.

### Honest limits — read these before you buy

**1. There are no email addresses. None.** CQC says so on its own data page — *"The file does not
contain email addresses. It does include links to websites, which can be used to find email
addresses where providers have chosen to publish them."* Counted over all 57,069 rows: **9 rows
(0.016%)** contain anything email-shaped, and all nine are a mangled website cell with an address
glued on (`www.ceracare.co.ukjoan.bothma@ceracare.co.uk`). Those are passed through exactly as CQC
wrote them and are **not** dressed up as URLs. If you need email, this is a **phone + postal + named
manager** list, and `locationWebsite` / `providerWebsite` (74.49% of rows) is the hook for a separate
enrichment step.

**2. It is a monthly snapshot, and CQC is mid-migration.** Every row carries `dataAsAt` — the date
CQC states inside the file. On the verified run the file published in September was stamped
**1 September 2026** and last modified 3 September. CQC's own README sheet warns, verbatim: *"We are
currently moving to a new digital system to manage and publish our care directory. This has caused
delays in generating files in their usual format, and some updates — such as provider registration
cancellations — are taking longer than normal to appear."* The register was 57,966 rows in earlier
recon and is 57,069 today; that drop is consistent with the cancellation backlog CQC describes.

**3. `careHomeBeds` is 0 for most locations, and that is the truth, not a bug.** 42,184 rows
(73.92%) publish `0` because they are dentists, GP practices, domiciliary care agencies, clinics or
ambulance services — not care homes. Use `careHomesOnly` or `minBeds`. Exactly one row leaves the
cell empty; that one is `null`, not `0`.

**4. 9,581 manager names (16.79%) are withheld by CQC**, and 12,292 nominated-individual names
(21.54%). CQC writes a literal `*` in those cells. This Actor delivers `null` — **never the `*`** —
and the run summary reports `managerWithheldByCqc` so you can tell "CQC withheld it" from "we didn't
look". Set `requireRegisteredManager: true` to drop them.

**5. England only.** CQC does not regulate Scotland, Wales or Northern Ireland.

**6. This is a register, not a research file.** Manager and nominated-individual names are personal
data that CQC publishes as a statutory register. Using them for outreach is your call under UK GDPR
and PECR, not ours.

**7. What this Actor does NOT do:** it does not visit individual `cqc.org.uk/location/...` pages, so
there is no inspection-report text, no historic ratings and no per-service breakdown. It does not
read CQC's *Deactivated Locations* or *Latest ratings* exports, and it does not read the daily
directory CSV — that file is fresher but has 15 columns to this one's 122, with no manager, no bed
count and no service types. It does not expand the 866 dual-registration pairs into their partner
records; it flags them (`dualRegistered`, `dualRegistrationIsPrimary`) and leaves the pairing table
alone.

### How it reads a 444 MB file in 1 GB of RAM

The register is one `.ods` download — **24,137,712 bytes, downloaded in 2.95 seconds**. Inside it,
`content.xml` inflates to **444,681,952 bytes**, an 18.4x ratio. Loading that (a DOM parser,
`pandas.read_excel`, a whole-file regex) needs roughly a gigabyte of heap for a file we want to run
in a gigabyte total.

So the archive entry is **SAX-streamed and never assembled**. Measured: the full pass reads all
444,681,952 bytes in **26.2 s at a peak of 243 MB RSS** and produces all 57,069 records. A capped
run stops the stream where it stands — the daily 50-row demo reads **2,506,752 bytes of 444,681,952**
and parses in **0.25 s**.

Three things in this file break a naive reader, all of them found by running against the real bytes:

- **The first sheet is a README, not the data.** Taking "the first row of the first table" as the
  header reads the whole register against a one-column heading and emits 57,069 rows of nulls.
  Sheets are selected by **name**.
- **Rows are ragged.** The sheet drops trailing empty cells, so real rows are **109–122 cells wide**
  against a 122-column header. Every read is by column *name*, resolved from the sheet's own header
  row — never by a fixed index.
- **Two columns are mis-named at source.** `Location Dual Registered` holds the *label*
  `"Dual Registration"`, not `Y`/`N`. `Primary ID (Dual registration locations)` is **not an ID** —
  it is `Y`/`N` for "this is the primary half of the pair". Read at face value you ship a boolean
  where a label is, and an ID field full of the letter Y.

**And the file is served with no `Content-Length`.** Measured 2026-09-16: `transfer-encoding:
chunked` on HTTP/1.1, on HTTP/2 and with `accept-encoding: identity`, so the usual
received-vs-declared truncation check cannot fire. Instead the ZIP's own **end-of-central-directory
record** is verified before parsing — it is the last thing in the file, so any truncation destroys
it — and a full pass asserts it read exactly the byte count the archive declares. A parse that ends
under 40,000 rows without being deliberately capped **fails the run** rather than shipping a third of
England's care register as if it were whole.

### Integrity checks that ran clean on the real register

| check | result over all 57,069 rows |
|---|---|
| Duplicate `locationId` | **0** |
| Non-integer bed counts | **0** |
| Coordinates outside the UK | **0** (lat 49.91→55.79, lon −6.32→1.76) |
| Malformed UK postcodes | **0** |
| Unparseable dates | **0** (source is `DD/MM/YYYY`, delivered as ISO) |
| Rows with no id or no name | **0** |
| `*` or `-` markers shipped as data | **0** |
| Fabricated `0,0` coordinates | **0** |

### Filters

Every filter is applied **before** the row is delivered, so an excluded location is never delivered
and never charged. The run summary breaks down exactly how many rows each filter removed.

| input | what it does |
|---|---|
| `careHomesOnly` | 14,887 care homes instead of all 57,069 locations |
| `minBeds` | Care homes at or above a bed count — a null bed count never satisfies a minimum |
| `excludeDormant` | Drops the 1,082 locations CQC marks dormant (on by default) |
| `regions` · `localAuthorities` · `postcodePrefixes` | Geography. Prefixes ignore case and spaces: `ch63`, `SW1`, `M` |
| `primaryInspectionCategories` | `Residential social care`, `Dentists`, `GP Practices`, `Hospice services`, … |
| `ratings` | `Outstanding`, `Good`, `Requires improvement`, `Inadequate` |
| `serviceTypeContains` | Matches the service-type list: `nursing`, `supported living`, `domiciliary`, `hospice` |
| `locationNameIncludes` · `providerNameIncludes` | Pull one group's whole estate |
| `requireRegisteredManager` · `requirePhone` · `requireWebsite` | Only rows you can actually work |
| `maxLocations` | Cap on rows delivered **and charged**. `0` = the whole register |
| `odsUrl` | Advanced: read a specific file instead of this month's |

### Who buys this

- **Care-home software** (care planning, eMAR, rostering, catering, maintenance) — 14,887 care homes
  covering a measured **485,729 registered beds**, with a named manager on 88% of them and a direct
  phone on 96%.
- **Care staffing and agency nursing** — bed count is the demand signal; filter by `postcodePrefixes`
  to your travel radius.
- **Care-sector M\&A, brokerage and valuation** — `providerCompaniesHouseNumber` on 73.63% of rows
  joins straight to Companies House accounts; `brandName` and `providerId` group an operator's estate;
  `latestOverallRating` flags distress.
- **Turnaround and compliance consultants** — 179 Inadequate and 3,970 Requires-improvement
  locations, each with a publication date.
- **Anyone selling to UK dentists or GP practices** — 12,087 dental and 6,285 GP locations are in the
  same file.

### Pricing

Pay per event: **$0.0005 per location returned**, and **no run-start fee**.

- All 14,887 care homes: about **$7.44**
- The whole 57,069-location register: about **$28.53**
- One region's care homes — measured: South East 2,793 · North West 1,858 · South West 1,848 ·
  West Midlands 1,664 · East of England 1,621 · Yorkshire and The Humber 1,457 · East Midlands 1,443 ·
  London 1,269 · North East 734 — so **$0.37 to $1.40**
- The 50-row demo run: **2.5 cents**

Locations excluded by your filters are never delivered and never charged, and a run that matches
nothing costs nothing.

### Source and licence

Data comes from the Care Quality Commission's own bulk export, linked from
[cqc.org.uk/about-us/transparency/using-cqc-data](https://www.cqc.org.uk/about-us/transparency/using-cqc-data).
CQC publishes only the **current month's** file — verified on 2026-09-16 by asking for the same
filename under five different month folders: `2026-09` → **200**, and `2026-06`, `2026-07`,
`2026-08`, `2026-10` all → **404**. So this Actor reads the link off that page on every run instead
of hardcoding a filename that dies on the 1st of the month.

The data is published under the **Open Government Licence**; attribute the Care Quality Commission.
`robots.txt` was read on the day of the build: it disallows `/core/`, `/profiles/`, `/admin/`,
`/search/`, `/user/*`, `/comment/reply/`, `/node/add/` and `/filter/tips` — **`/system/files/` is not
disallowed**, and neither is `/location/`. The site has no
anti-bot, no rate limiting and no login, and this Actor makes exactly **two requests per run** — one
76 KB page, one 24 MB file — with **no proxy by default**.

Manager and nominated-individual names are personal data published by CQC as a statutory register.
How you use them for outreach is your responsibility under UK GDPR and PECR.

# Actor input Schema

## `careHomesOnly` (type: `boolean`):

Keep only locations CQC flags as a care home (14,887 of 57,069 on the September 2026 file). Off, you also get dentists, GP practices, domiciliary care agencies, clinics and ambulance services.

## `maxLocations` (type: `integer`):

Cap on locations delivered - and charged. Rows excluded by your filters are never delivered and never charged. 0 means the whole register.

## `minBeds` (type: `integer`):

Only care homes with at least this many registered beds. 42,184 locations publish 0 beds because they are not care homes, so any value above 0 also filters those out.

## `excludeDormant` (type: `boolean`):

Drop the 1,082 locations CQC marks dormant - registered but not currently trading.

## `regions` (type: `array`):

CQC region names, e.g. London, North West, South East, East of England, Yorkshire and The Humber, West Midlands, East Midlands, South West, North East. Empty = all.

## `localAuthorities` (type: `array`):

Exact local-authority names as CQC writes them, e.g. Wirral, Kent, Birmingham. Empty = all.

## `postcodePrefixes` (type: `array`):

Match the start of the location postcode - M, SW1, CH63. Spaces and case are ignored. Empty = all.

## `primaryInspectionCategories` (type: `array`):

CQC's own service category, e.g. Residential social care, Community based adult social care services, Dentists, Doctors/GPs, Hospitals. Empty = all.

## `ratings` (type: `array`):

Outstanding, Good, Requires improvement, Inadequate. 21,897 locations have no overall rating at all and are dropped by any value here.

## `serviceTypeContains` (type: `string`):

Match any of the location's CQC service types, e.g. nursing, supported living, domiciliary, hospice, dental.

## `locationNameIncludes` (type: `string`):

Only locations whose name contains this text.

## `providerNameIncludes` (type: `string`):

Only locations run by a provider whose name contains this text - useful for pulling one group's whole estate.

## `requireRegisteredManager` (type: `boolean`):

Keep only rows where CQC publishes the manager's name. 9,581 rows carry CQC's suppression marker instead of a name and are delivered as null.

## `requirePhone` (type: `boolean`):

Keep only rows with a location or provider phone number.

## `requireWebsite` (type: `boolean`):

Keep only rows with a location or provider website. CQC publishes NO email addresses, so the website is the enrichment hook.

## `odsUrl` (type: `string`):

Override the file to read. Leave empty and the actor reads the current link off cqc.org.uk/about-us/transparency/using-cqc-data - CQC serves only the current month, so a hardcoded URL 404s after the 1st.

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

Off by default and that is deliberate: cqc.org.uk has no anti-bot and the download is 24 MB, which would cost about $0.19 per run on residential proxy. Turn it on only if your runs start getting blocked.

## Actor input object example

```json
{
  "careHomesOnly": true,
  "maxLocations": 50,
  "minBeds": 0,
  "excludeDormant": true,
  "regions": [],
  "localAuthorities": [],
  "postcodePrefixes": [],
  "primaryInspectionCategories": [],
  "ratings": [],
  "requireRegisteredManager": false,
  "requirePhone": false,
  "requireWebsite": false,
  "odsUrl": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per CQC-registered location: name, registered manager, bed count, latest CQC rating, phone, full address, coordinates, regulated activities, service types, provider and provider Companies House number.

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

RUN\_SUMMARY: which register file was read and how stale it is, how many rows were examined, how many each filter excluded, how many were delivered and charged, and the measured field fill of the rows you actually received.

# 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 = {
    "careHomesOnly": true,
    "maxLocations": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/cqc-care-locations-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 = {
    "careHomesOnly": True,
    "maxLocations": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/cqc-care-locations-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 '{
  "careHomesOnly": true,
  "maxLocations": 50
}' |
apify call scrapersdelight/cqc-care-locations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/cqc-care-locations-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/xPuyH6M3ibEoLR95W/builds/mZYYgMaFruTuo66Mf/openapi.json
