# CQC Care Home Inspection Reports & Homecare API (`changeable_peddler/cqc-report-finder`) Actor

Find CQC care home inspection reports and homecare report links in England. Look up known service IDs or filter a dated ratings snapshot; export provider-grouped CSV. $0.01/provider plus Apify usage. Independent metadata tool; no clinical findings.

- **URL**: https://apify.com/changeable_peddler/cqc-report-finder.md
- **Developed by:** [Sean J](https://apify.com/changeable_peddler) (community)
- **Categories:** Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 provider records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## CQC Care Home Inspection Reports & Homecare API

Preparing a care-provider review? Collect CQC report links, publication dates and available ratings for care homes and homecare services in England, grouped by provider and ready to export to a spreadsheet.

**$0.01 per provider returned, plus Apify platform usage.** A provider with several matching locations is charged once in that run. No CQC API key, DataForSEO account or paid data subscription is required. Free Apify accounts can run the Actor within their normal platform limits.

This is an independent public-data tool, not a CQC service or endorsement. It finds and organises published metadata; it does not assess care quality, extract clinical findings or produce a commercial lead score.

### Choose the right search

| Mode | Use it when | Important coverage limit |
|---|---|---|
| `LOOKUP` | You already know the CQC location IDs to review. | Fetches the public pages at run time, but does not reconstruct a complete inspection history. |
| `DISCOVERY` | You want a filtered shortlist from CQC's latest-ratings publication. | Starts from a monthly snapshot, not a complete daily feed of newly published reports. |

**Check freshness before using the results.** CQC says its API and website are updated daily, but the ratings spreadsheet used for discovery is normally monthly. CQC also warns that its system migration can delay updates. Every result includes source and coverage information; `checkedAt` is the time this Actor checked the source, not proof that the underlying data was published that day. See [Using CQC data](https://www.cqc.org.uk/about-us/transparency/using-cqc-data).

Start with the [ready-to-edit one-location lookup example](https://apify.com/changeable_peddler/cqc-report-finder/examples/cqc-care-home-report-lookup), saved with one-location/provider bounds and a $0.03 spending limit. Review its input and pricing before running. For a lookup-to-spreadsheet walkthrough, see the [public care-provider CSV guide](https://github.com/shamusj-create/security-risk-intelligence-apify/blob/main/docs/cqc-care-home-report-links-csv.md). It explains how to retain source dates and distinguish lookup from monthly discovery.

### Quick start

1. Run the prefilled **Lookup** example to check one public care service, then replace its ID with the services you need. Choose **Discovery** for a snapshot-based shortlist instead.
2. Start with a small limit. For discovery, select a report-publication lookback, ratings, region or service-type filters as needed.
3. In Discovery mode, optionally enter an England postcode and radius. Distance is straight-line distance to each service location, not driving distance or distance to the provider's office. The origin is a secret input, is sent to Postcodes.io for geocoding, and is not included in the output.
4. Review the Pricing tab and set a spending limit that covers the provider fees **and** platform usage.
5. Run the Actor. Use **Provider overview** for the grouped shortlist or **Reports and locations** for a flat spreadsheet. Open the CQC links before relying on a record.

#### Discovery example

```json
{
  "mode": "DISCOVERY",
  "lookbackDays": 90,
  "ratings": ["Requires improvement", "Inadequate"],
  "maxLocationsToCheck": 25,
  "maxProviders": 25
}
```

Discovery supports a lookback of 1–365 days. It defaults to 90 days and the two ratings above. Optional `regions` filters accept CQC region names; `serviceTypes` filters match fragments such as `care home` or `domiciliary`. Discovery is scoped to adult social care, not hospitals, dentists or GP practices. Publication dates and ratings are checked again against the public location page before an entry is returned. An unknown publication date is excluded rather than guessed. A report-publication filter is not an inspection-visit-date filter. Results describe the source's available ratings; they are not a newly made judgement about a service.

For a geographic search, you can add `originPostcode` and `maxDistanceMiles`. For example, `SW1A 0AA` is the public postcode of the UK Parliament, not a private origin. CQC covers England; this Actor does not support Northern Ireland/BT origins or search the separate Scottish, Welsh or Northern Irish care registers.

#### Lookup example

This runnable example checks [Regency Park](https://www.cqc.org.uk/location/1-13361514096), a public CQC-listed care service. Copy the location ID from another CQC location URL to check your own services:

```json
{
  "mode": "LOOKUP",
  "locationIds": ["1-13361514096"],
  "maxLocationsToCheck": 1,
  "maxProviders": 1
}
```

On 27 October 2026, this example returned Bright Futures Care Limited, one matched location, a Good overall rating and an available report published 7 August 2026. This is a public-source functionality example, not a customer, endorsement or outcome claim; source data can change. The [linked report](https://www.cqc.org.uk/location/1-13361514096/reports/AP27086/overall) is the authority.

Lookup accepts 1–100 supplied IDs. It ignores Discovery's ratings, lookback, region, service-type and radius filters, so a requested location can be returned with a Good rating, an older report or an unknown publication date. It skips services whose adult-social-care classification or provider/location identity cannot be verified. It returns the latest observable metadata, not every historical report. It is preferable to discovery when you need to check a particular service that may not be present in the current discovery snapshot.

### Output and downloads

The underlying dataset contains **one row per provider**, with the matched location/report entries nested in `reports`.

- **Provider overview / Provider CSV:** provider identity, matched-location count, latest available report-publication date, ratings, location names, regions, optional nearest-location distance, source details and coverage notes.
- **Reports and locations / Report CSV:** one row per matched location/report entry, with provider identity, location ID/name, current available rating, report-publication date and source links. It is not one row for every historical inspection.
- **Full JSON:** preserves the nested `reports` array and metadata. Unavailable values remain null rather than being invented.

An illustrative shortened row:

```json
{
  "providerId": "ILLUSTRATIVE_PROVIDER_ID",
  "providerName": "Illustrative Care Provider Ltd",
  "matchedLocations": 1,
  "latestReportPublishedAt": "2026-09-15",
  "ratings": ["Requires improvement"],
  "locationNames": ["Illustrative Care Service"],
  "regions": ["London"],
  "nearestLocationDistanceMiles": null,
  "reports": [
    {
      "locationId": "ILLUSTRATIVE_LOCATION_ID",
      "locationName": "Illustrative Care Service",
      "locationUrl": null,
      "reportId": null,
      "reportUrl": null,
      "reportPublishedAt": "2026-09-15",
      "currentRating": "Requires improvement",
      "ratingSource": "Illustrative source label",
      "region": "London",
      "postcode": null,
      "distanceMiles": null
    }
  ],
  "checkedAt": "2026-10-27T12:00:00.000Z",
  "sourceType": "ILLUSTRATIVE",
  "sourcePublishedAt": "2026-10-01",
  "coverageNote": "Illustrative monthly-source example, not a complete daily report feed."
}
```

The names, IDs, dates and rating above are invented solely to show the format. They are not a real care service, a live result or evidence that a customer achieved an outcome.

`currentRating` and the linked report's publication date can refer to different source updates. Do not assume the rating was awarded in that report or infer a downgrade without checking the source. A missing report date, an empty search or an unavailable page does not prove that a service has no reports or is unregistered.

### Pricing and run limits

- **$0.01 per distinct provider record delivered in a run.** Twenty-five providers cost $0.25 in report fees; one provider with several matched locations still costs $0.01.
- **Apify platform usage is charged separately.** Compute, transfer and storage depend on the run and your plan. There is no publisher run-start fee, but an empty or unsuccessful search can still incur platform usage.
- Empty searches, source errors and excluded locations do not create a provider-report fee. Dataset storage is attempted before its provider charge. The two operations are not an atomic transaction: if either cannot be confirmed, `RUN_SUMMARY` flags the uncertainty so you can check the dataset and platform charge history before retrying. Repeat runs are billed separately; downloading an existing result does not start a new CQC search, although storage access can incur platform usage.
- Both `maxLocationsToCheck` and `maxProviders` default to 25 and are capped at 100. Increasing `maxProviders` does not bypass the location-check cap. A bounded or interrupted search is not an exhaustive list of services in an area.
- There are no DataForSEO, LLM, residential-proxy or paid-routing charges in this Actor.

Use a narrow search and review the run summary if results are empty or fewer than expected. Check source freshness, filters, location limits and source errors before repeating a run. If all checked public pages fail, the run fails rather than presenting those failures as a valid empty search. Partial failures and limits can leave an incomplete result; errors are not emitted as billable provider rows.

Discovery must process a large national workbook even when you request a small shortlist. The default 2 GB run allocation provides more CPU for this step; lowering memory can substantially slow it down. Lookup avoids that workbook. The default timeout is 15 minutes. A stopped run whose summary has `finalized: false` is incomplete: check the run status and platform charge history instead of treating initial zero counters as a final billing statement.

### Fit and boundaries

Useful for analysts and care-sector teams who need a provider-grouped, source-linked review sheet. For a single manual check, [CQC's own service search](https://www.cqc.org.uk/) may be sufficient. The [official data downloads](https://www.cqc.org.uk/about-us/transparency/using-cqc-data) are available directly; this Actor charges for processing and organisation, not ownership of that public information.

This version does not return full report text, clinical themes, personal contacts, a lead score, expected revenue, rating-change alerts or a complete historical archive. It creates no schedule, monitoring subscription or outreach. It is not clinical, safeguarding, regulatory, legal or investment advice. Review current CQC evidence and obtain appropriate professional advice for consequential decisions.

### Sources and attribution

Source: **Care Quality Commission** public information. Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). CQC retains its source rights. This tool is not affiliated with or endorsed by CQC and does not use its logo. OGL does not license personal data or third-party rights; these are not a licence to republish identifiable report quotations or make unsolicited approaches.

Optional postcode geocoding uses [Postcodes.io](https://postcodes.io/docs/overview/). Its [licence page](https://postcodes.io/docs/licences/) provides the following underlying-data notices:

- Contains Ordnance Survey data © Crown copyright and database right 2025.
- Contains Royal Mail data © Royal Mail copyright and database right 2025.
- Contains National Statistics data © Crown copyright and database right 2025.
- Contains NRS data © Crown copyright and database right 2025.

No personal origin postcode, credentials, private outcomes or private commercial assumptions are included in dataset rows. When reporting an issue, provide a run ID and a non-sensitive description; do not post tokens or private postcodes.

# Actor input Schema

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

Lookup fetches the current public page for known service IDs. Discovery uses the monthly ratings workbook as its candidate index; it is not a complete real-time report feed.

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

Supply up to 100 CQC location IDs, such as the ID in a CQC service URL. The default is one public care-service example verified on 27 October 2026. Replace it with your own IDs. URLs, provider IDs and arbitrary websites are not accepted.

## `originPostcode` (type: `string`):

Discovery only: your chosen postcode, sent to Postcodes.io for geocoding. It is encrypted by Apify and omitted from datasets/logs. No publisher postcode is inherited. BT postcodes are unsupported. Leave blank for region/service filters instead.

## `maxDistanceMiles` (type: `integer`):

Used only when a postcode is provided. Distance is to each care location, not a provider headquarters or driving route.

## `lookbackDays` (type: `integer`):

Discovery only: filter known publication dates. The monthly index can omit newer reports; check its source date in RUN_SUMMARY. Unknown dates are excluded. Lookup ignores this filter.

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

Discovery only: select exact overall ratings; an empty list accepts any known or unknown rating. A weak domain rating never substitutes for missing overall. Lookup ignores this filter.

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

Exact region names, case-insensitive. Leave empty to include all regions covered by the source.

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

Case-insensitive fragments of source service descriptions, such as care home or domiciliary. Scope is adult social care, not hospitals, dentists or GP services.

## `maxLocationsToCheck` (type: `integer`):

Bounds work before provider grouping. Discovery sorts candidates by source date first; reaching this cap means partial coverage, explicitly reported in RUN_SUMMARY.

## `maxProviders` (type: `integer`):

One provider is billed once even when several matching locations are grouped beneath it. No report fee for errors or empty output; platform usage still applies.

## `maxSourceLocations` (type: `integer`):

Advanced bound on recent rows retained from the source. Any source truncation is reported; this is not a promise to search every CQC service.

## `concurrency` (type: `integer`):

Maximum public report lookups in parallel. No authentication, proxies, LLMs or paid routing APIs are used.

## Actor input object example

```json
{
  "mode": "LOOKUP",
  "locationIds": [
    "1-13361514096"
  ],
  "maxDistanceMiles": 40,
  "lookbackDays": 90,
  "ratings": [
    "Requires improvement",
    "Inadequate"
  ],
  "regions": [],
  "serviceTypes": [],
  "maxLocationsToCheck": 25,
  "maxProviders": 25,
  "maxSourceLocations": 5000,
  "concurrency": 2
}
```

# Actor output Schema

## `providerCsv` (type: `string`):

One row per delivered provider with matched-location counts, available ratings and source coverage.

## `reportCsv` (type: `string`):

One row per matched location/report entry with provider identity, available publication date and CQC links. Not a complete history.

## `results` (type: `string`):

Complete delivered provider records, preserving the nested reports array and coverage metadata.

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

Inspect search limits, source coverage and run outcomes, including when no provider rows were returned.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("changeable_peddler/cqc-report-finder").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 = {}

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

```

## MCP server setup

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

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/a0pWR2nrCdnq9bR2L/builds/GcEWVw8MNT9uZL33d/openapi.json
