# CQC England Care Locations: Search, Lookup and Changes (`yappman/cqc-register`) Actor

Search and look up care locations in CQC's England directory, and list what changed between its files. Locations whose names could be a person's are left out and counted. CQC data under the Open Government Licence. Not affiliated with CQC.

- **URL**: https://apify.com/yappman/cqc-register.md
- **Developed by:** [Russell Yapp](https://apify.com/yappman) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 locations

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

**Not affiliated with, endorsed by or sponsored by the Care Quality Commission (CQC).** CQC's name is used only to say where the data comes from.

## CQC England Care Locations

Search and look up care locations in CQC's England directory, and list what changed between its files. One fixed row per location or per change. Locations whose names could be a person's are left out and counted.

Contains CQC information, licensed under the Open Government Licence v3.0. We acknowledge that we are using CQC information.

### What it does

- **lookup**: up to 500 CQC location ids or provider ids together; one row per location shown. A provider id returns the locations of that provider that are shown. Ids not found or left out are counted, not listed. The filter inputs below apply to search and changes only; lookup ignores them.
- **search**: filter by local authority, region, outward postcode (for example SW11), service type (for example Homecare agencies or Nursing homes) and registration status.
- **changes**: events since a date: `listed`, `no_longer_listed`, `details_changed`. The first file's baseline (`first_seen`) is off unless you ask for it with `includeFirstSeen`.

Filters match exact values (case ignored). Local authority names must be written as CQC publishes them.

### What it does not do

- **It shows only some of the locations in CQC's file.** On the CQC file of 22 October 2026 it showed 9,787 of 57,107 rows, about 17%. About 83% were left out because the location's name or its provider's name could be a person's, or is not clearly an organisation's. Left-out locations are counted in `RUN_SUMMARY` and never shown, with or without a name. The share for the file behind your run is `withheldInFile` in `RUN_SUMMARY`; the 22 October figures are a dated example only.
- **It has no ratings in this version.** The rating columns are present in location rows and are empty. A rating filter (`overallRating`) or a care-home filter (`careHome`) is refused and a refusal costs nothing. The care-home flag, the number of beds and the key-question and report-date columns are empty on this route, because the directory file has no such columns.
- **It is not a record of what CQC knows today.** Results come from CQC's directory file of the date shown in `RUN_SUMMARY.fileDate` (`historyStart` is the first file we hold). A change means CQC's published file changed, not that care changed. A location missing from a later file is "no longer listed", not "closed". It is intended to be refreshed weekly; a week can be skipped.
- **It does not give advice or say anything about quality or safety.** No score, ranking or reason is given.

### Input

Only `mode` is required. Refusals happen before any row is read.

| Field | Type | Applies to | Notes |
|---|---|---|---|
| `mode` | string | any mode | `lookup`, `search` or `changes`. Default `search`. |
| `locationIds` | list of strings | lookup | CQC location ids. Up to 500 together with `providerIds`. |
| `providerIds` | list of strings | lookup | CQC provider ids. Lookup needs `locationIds` or `providerIds`. |
| `localAuthorities` | list of strings | search, changes | Exact local authority names as CQC publishes them. |
| `regions` | list of strings | search, changes | CQC regions, for example London or North West. |
| `postcodeDistricts` | list of strings | search, changes | Outward codes such as SW11. |
| `serviceTypes` | list of strings | search | CQC service types. Refused in changes mode. |
| `careHome` | boolean | search | Refused in this version (no care-home flag in the directory file). |
| `registrationStatus` | string | search | `Registered` or `Deregistered`. `Deregistered` is refused (registered locations only). Refused in changes mode. |
| `overallRating` | string | search | `Outstanding`, `Good`, `Requires improvement`, `Inadequate` or `No rating`. Refused in this version. |
| `since` | string | changes | Required in changes mode. A date such as 2026-10-22, not before `historyStart` in `RUN_SUMMARY`. |
| `events` | list of strings | changes | Event kinds to keep. Empty means no event-kind filter. On this route only `listed`, `no_longer_listed`, `details_changed` and `first_seen` are produced; `registered`, `deregistered` and `rating_changed` are accepted and return no rows. |
| `includeFirstSeen` | boolean | changes | The baseline rows of the first file. Default `false`. |
| `maxItems` | integer | any mode | 1 to 10,000. Default 1,000; the input form prefills 20. At most this many rows are returned and charged. |

Each list filter takes at most 50 values of at most 80 characters.

Example input:

```json
{
  "mode": "search",
  "serviceTypes": ["Homecare agencies"],
  "regions": ["North West"],
  "maxItems": 20
}
```

### Output fields

Rows go to the run's dataset. Each key is present; a missing value is `null` (or an empty list).

#### Location rows (lookup, search)

| Field | Type | Meaning |
|---|---|---|
| `locationId` | string | CQC location id. |
| `providerId` | string | CQC provider id. |
| `name` | string | Location name (shown only when it and its provider pass the organisation rule). |
| `nameWithheld` | boolean | `false` on rows returned. |
| `postcode` | string | Outward part of the postcode only, such as SW11. |
| `localAuthority` | string | Local authority. |
| `region` | string | CQC region. |
| `careHome` | boolean or null | Empty on this route: the directory file has no care-home flag. |
| `numberOfBeds` | integer or null | Empty on this route: the directory file has no bed count. |
| `serviceTypes` | list of strings | Service types. |
| `regulatedActivities` | list of strings | Empty on this route: the CQC directory file has no such column. |
| `specialisms` | list of strings | Specialisms. |
| `registrationStatus` | string | Registration status. |
| `registrationDate` | string | Empty on this route: the CQC directory file carries no registration date. |
| `deregistrationDate` | string | Empty on this route. |
| `ratingOverall`, `ratingSafe`, `ratingEffective`, `ratingCaring`, `ratingResponsive`, `ratingWellLed` | string | Rating columns. Empty in this version. |
| `ratingOverallReportDate`, `ratingSafeReportDate`, `ratingEffectiveReportDate`, `ratingCaringReportDate`, `ratingResponsiveReportDate`, `ratingWellLedReportDate` | string | Report dates for the rating columns. Empty in this version. |
| `source` | string | The route that produced the row (from the store's manifest). |
| `observedAt` | string | When the store was observed (from the store's manifest), as a UTC timestamp such as 2026-10-22T09:00:00Z. |

#### Event rows (changes)

| Field | Type | Meaning |
|---|---|---|
| `eventId` | string | Event id. |
| `event` | string | `listed`, `no_longer_listed`, `details_changed` or `first_seen`. |
| `locationId`, `providerId`, `name`, `nameWithheld`, `postcode`, `localAuthority`, `region`, `careHome` | as above | As in location rows. |
| `keyQuestion`, `oldRating`, `newRating`, `reportDate` | string | Rating-event fields. Empty in this version. |
| `field` | string | The field that changed, for `details_changed`. |
| `old`, `new` | string | The value before and after. A postcode is cut to its outward part here too. |
| `registrationDate`, `deregistrationDate` | string | Dates as held for the location. |
| `cqcChangeTime` | string | The date the change is dated by (CQC's file date). Rows are sorted by it. |
| `observedAt` | string | When the store was observed. |
| `historyStart` | string | The first file we hold. |
| `source` | string | The route that produced the row. |

#### Sample row

Illustrative, not a real record. The organisation, ids and values are invented.

```json
{
  "locationId": "EXAMPLE-LOC-1",
  "providerId": "EXAMPLE-PRV-1",
  "name": "Sample Homecare Services Ltd",
  "nameWithheld": false,
  "postcode": "XX1",
  "localAuthority": "Exampleshire",
  "region": "North West",
  "careHome": null,
  "numberOfBeds": null,
  "serviceTypes": ["Homecare agencies"],
  "regulatedActivities": [],
  "specialisms": ["Dementia"],
  "registrationStatus": "Registered",
  "registrationDate": null,
  "deregistrationDate": null,
  "ratingOverall": null,
  "ratingOverallReportDate": null,
  "source": "directory-csv",
  "observedAt": "2026-10-22T09:00:00Z"
}
```

The other rating columns (`ratingSafe` to `ratingWellLedReportDate`) are `null` and are left out of this sample for length.

### RUN_SUMMARY

Each run writes `RUN_SUMMARY` to its key-value store.

| Field | Meaning |
|---|---|
| `status` | `ok`, `refused` or `failed`. |
| `reason` | Why a run was refused or failed. Present when `status` is not `ok`. |
| `error` | The error type name, when a run failed on an exception. |
| `mode` | The mode that ran. |
| `route` | The route behind the store (`directory-csv`). |
| `fileDate` | The date of the CQC directory file behind your rows. |
| `historyStart` | The first file we hold; the earliest `since` you can use. |
| `storeObservedAt` | When the store was observed. |
| `withheldInFile` | Locations in that file that were left out. A count of 1 to 4 is shown as the text `<5`; 0 and 5 or more are shown as numbers. |
| `locationsInFile` | Locations shown from that file. |
| `counts` | `notFoundOrWithheld` (lookup ids with no row), `notOutput`, `alreadyDelivered`, `matched`, `cappedByMaxItems`, `duplicateKey`. |
| `pushed` | Rows returned and charged. |
| `runCharged`, `readData`, `payPerEvent`, `restarted` | Charging state of the run. |
| `chargeLimitReached` | `true` when your maximum-charge setting left rows out. |
| `runFeeRefusedByLimit` | `true` when the run fee did not fit your maximum-charge setting and was not charged. |
| `alreadyStored` | Rows a restarted run already held; they are not returned or charged again. |
| `startedAt`, `finishedAt` | Run times. |
| `attribution` | The attribution string below. |
| `wording` | A standing note on what a change means. |

Only `withheldInFile` is shown as `<5` in the code; the figures in `counts` are exact. The counts are taken over the whole file (tens of thousands of rows), so a small figure cannot single out a location.

### What you pay

Pay per event, flat on each plan: **run $0.005, location $0.004, event $0.003**.

- **The run fee is charged each time a run reads the register's data, even if no row matches.** A search with no matches, a changes run whose event files hold no matching event, and a lookup where each id is not found or left out each still cost the $0.005 run fee. A run refused before anything is read (a bad input, a rating or care-home filter, too many ids, a `since` date earlier than `historyStart`) costs nothing, and so does a changes run whose `since` is later than every event file (it reads only the store's index).
- **If the register store cannot be used, the run fails and nothing more is charged; try again later.**
- **Locations** (lookup and search): $0.004 per row returned. 20 rows: $0.085. 1,000 rows: $4.005.
- **Events** (changes): $0.003 per row returned. 20 rows: $0.065. 1,000 rows: $3.005.
- If you leave out `maxItems` the cap is 1,000 rows (up to $4.005 for locations, $3.005 for events); the input form prefills 20. Set `maxItems` and Apify's maximum-charge setting for the run. If the maximum is reached, the run stops and `RUN_SUMMARY.chargeLimitReached` is `true`.

### Personal data and removal

Each row has these field groups: the location's name (only when it and its provider pass an organisation rule), CQC's location and provider ids, the outward part of the postcode (such as SW11) and not the full postcode, local authority, region, service types, specialisms, the registration status, and the date of the CQC file and of our observation. It never reads or returns address lines, phone numbers, websites, registered managers or nominated individuals, contact details, coordinates, inspection report text, reviews or residents.

A location that is not clearly an organisation's is left out whole. An organisation-named location in a small area can still point to the household that runs it, and a rule that leaves names out is not a guarantee that none gets through. The Open Government Licence does not cover personal data.

To ask for a location to be removed, email info@yappman.com. A removal cannot recall rows already returned to you.

### Use of this data

Do not use rows to contact individuals. This cannot be enforced against rows already in your account, so it rests on you.

### Source and licence

The data is CQC's directory of registered care locations in England, read from a file CQC publishes, and reproduced here as one fixed row per location or change.

Contains CQC information, licensed under the Open Government Licence v3.0. We acknowledge that we are using CQC information.

### Ratings and reviews

Ratings and reviews on the Store page help other buyers judge whether this Actor fits their use, whatever your experience.

# Actor input Schema

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

lookup: locations by CQC id. search: locations matching filters. changes: change events since a date.

## `locationIds` (type: `array`):

CQC location ids, up to 500 together with providerIds. Ids not found or left out are counted, not listed.

## `providerIds` (type: `array`):

CQC provider ids: the locations of each provider that are shown.

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

Exact local authority names as CQC publishes them.

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

CQC regions, for example London or North West.

## `postcodeDistricts` (type: `array`):

Outward codes such as SW11.

## `serviceTypes` (type: `array`):

CQC service types, for example Homecare agencies or Nursing homes.

## `careHome` (type: `boolean`):

Not available on the directory route yet (refused, uncharged).

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

The directory lists registered locations only.

## `overallRating` (type: `string`):

Not available on the directory route yet (refused, uncharged).

## `since` (type: `string`):

A date such as 2026-10-22, not before the history start shown in RUN_SUMMARY.

## `events` (type: `array`):

listed, no_longer_listed, details_changed. Leave empty for every kind this route produces.

## `includeFirstSeen` (type: `boolean`):

The baseline rows of the first file. Off by default.

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

At most this many rows are returned and charged.

## Actor input object example

```json
{
  "mode": "search",
  "includeFirstSeen": false,
  "maxItems": 20
}
```

# Actor output Schema

## `locations` (type: `string`):

No description

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

No description

# 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 = {
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("yappman/cqc-register").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 = { "maxItems": 20 }

# Run the Actor and wait for it to finish
run = client.actor("yappman/cqc-register").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 '{
  "maxItems": 20
}' |
apify call yappman/cqc-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yappman/cqc-register"
        }
    }
}
```

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/OO0awRki7NKBptwYw/builds/Qj9Ha82G7Xu8NYr1j/openapi.json
