# UK Charity Commission High-Income Charity Intelligence (`afkdigital/uk-charity-commission-high-income-intelligence`) Actor

Official daily England and Wales charity intelligence. Filter income, published operation area and latest financial year; export finances and public register contacts to JSON/CSV. No trustee leads.

- **URL**: https://apify.com/afkdigital/uk-charity-commission-high-income-intelligence.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 unique charity records

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 Charity Commission High-Income Charity Intelligence

Turn the official daily Charity Commission for England and Wales bulk register into filtered organisation intelligence and flat JSON/CSV records for Clay, n8n, due diligence and sector research.

**Coverage: registered main charities on the England and Wales register.** Scotland and Northern Ireland have separate registers and are not covered as registration jurisdictions. An England/Wales charity may operate elsewhere. Linked subsidiary records and removed charities are excluded. This is an independent product, not endorsed by the Charity Commission.

### Quick start

```json
{"minIncomeGbp":1000000,"maxResults":10}
```

The default returns up to ten unique charities with latest reported annual income of at least £1 million, in source file order. It downloads two official daily files once per run and streams their contents without a browser, proxy or Commission API account. This is daily snapshot data, not a live API lookup. A small result limit does not eliminate the initial full-source download/validation cost.

For a published operation area and latest reporting year:

```json
{"minIncomeGbp":1000000,"region":"Kent","reportingYear":2025,"maxResults":100}
```

| Input | Meaning |
|---|---|
| minIncomeGbp | Inclusive threshold applied to latest_income; default 1000000 |
| region | Exact case-insensitive published area-of-operation description; blank = all |
| reportingYear | Calendar year in which the latest reported accounting period ends; optional |
| maxResults | Unique registration-number limit, default 10, maximum 10000 |

`region` is not a registered-office location or inferred coverage hierarchy. Examples include `Kent`, `Throughout London`, `Throughout England`, `Throughout Wales`, `Throughout England And Wales`. A charity declaring a nationwide area is not automatically included in a search for a local authority. No fuzzy/geographic expansion is performed. Check `operation_areas` to understand the returned scope. Unknown area labels simply return no results.

`reportingYear` filters the **latest** financial period, not older annual returns. If a charity's latest period ends in 2025, a 2024 query will not return its 2024 historical finances. Current contacts are never presented as historical contacts. Financial periods are charity-specific and may not last exactly twelve months. Missing income or financial dates excludes a record; missing expenditure remains JSON null.

### Output

One row per `registered_charity_number`, with:

| Field | Meaning |
|---|---|
| registered_charity_number | Registration number as string |
| charity_name | Official registered name |
| latest_income_gbp | Source latest income, numeric GBP |
| latest_expenditure_gbp | Source latest expenditure for the same period, numeric GBP or null |
| public_email | Published register contact, empty string if absent |
| public_phone | Published register contact, string preserving leading zero, empty if absent |
| website_url | Published website, https scheme added if missing, empty if absent/invalid |
| address | Published contact address joined into a single string |
| registration_date | ISO date or empty string |
| financial_year_start / financial_year_end | Exact source latest accounting period dates |
| reporting_year | Year of financial_year_end |
| operation_areas | Sorted, distinct published area labels separated by semicolons |
| source_date | Publisher's date_of_extract, not the download time |
| source_url / source_attribution | Official landing page and attribution |

Contact fields are published register contacts only. They are not validated for reachability, enriched, guessed or guaranteed to be non-personal. Blank values remain blank. This Actor does not download trustee files, process trustee names or offer individual/person leads. It does not grant permission to contact anyone or promise marketing-ready leads. Where a register contact identifies a person, users must establish their own lawful processing basis; public availability is not marketing consent.

Export from the Apify Dataset as JSON or CSV. All fields are scalar, so Clay can import CSV and n8n can consume the JSON Dataset endpoint directly. Keep charity numbers and phone numbers as strings during downstream imports to preserve leading zeros. CSV income/expenditure blanks correspond to missing amounts, never invented zeroes.

### Price

Target and release price: **$0.005 per successfully delivered unique charity ($5 / 1,000)**, using the `apify-default-dataset-item` Pay-per-Event event. No Actor-start fee or platform-usage surcharge is configured for standard runs. The live Store pricing is authoritative. Post-run Dataset storage/access can incur standard Apify account charges.

Duplicate registration numbers are filtered before Dataset writes and are not charged. Existing rows are checked when a run resumes; different source hashes or filters fail before new writes, and existing rows count against maxResults. Each separate new run is a separate request and can return and charge the same charity again. Empty results, validation errors and source failures do not create billable Dataset rows. Apify's SDK respects the run's spending limit. Stop/restart a run only through supported Apify lifecycle controls; do not concurrently modify its default Dataset.

### Sources and data handling

Official download service: https://register-of-charities.charitycommission.gov.uk/en/register/full-register-download

Official anonymous daily files:

- https://ccewuksprdoneregsadata1.blob.core.windows.net/data/txt/publicextract.charity.zip
- https://ccewuksprdoneregsadata1.blob.core.windows.net/data/txt/publicextract.charity_area_of_operation.zip

The operation-area join uses **organisation_number AND registered_charity_number**, excluding non-zero linked_charity_number. Finances and their period dates come together from the charity row; no cross-year financial join is used. Results follow source order, not income ranking.

Downloads have two attempts, connection/read timeouts, a 180-second aggregate deadline and an 80 MiB per-file compressed limit. Archives must contain exactly the expected file and no more than 1 GiB uncompressed. Schema changes, inconsistent daily snapshots and extracts older than three days fail closed before output. ETag, Last-Modified, download time, byte count, SHA-256 and source date are saved in `SOURCE_MANIFEST`; a fresh temporary cache is used per run and supports conditional revalidation within a downloader invocation directory. No unofficial mirrors, authentication workarounds, CAPTCHA bypasses or private endpoints are used. The Commission API requires account registration and a subscription API key, and is deliberately not called.

`RUN_SUMMARY` records the filters, delivered count and elapsed time. Source archives are temporary. The Actor does not set up a permanent copy or external scheduled downloader. Users control Dataset retention in their Apify account and should remove outdated records and comply with valid deletion/correction requests. Source availability and completeness are not guaranteed; income reflects self-reported accounts, not an independent audit or current cash position.

### Licence and permitted use

Source: Charity Commission for England and Wales.

**Contains public sector information licensed under the Open Government Licence v3.0.**
https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/

The OGL permits commercial reuse of licensed public-sector information with attribution. It excludes personal data and does not replace data-protection obligations or imply official endorsement. The Commission's API has separate terms, including restrictions on marketing uses of personal data; this Actor does not use that API. Do not interpret the bulk download route as a way around those obligations. Use this service for lawful organisation research and analysis; establish any additional rights required for personal data yourself.

API access and terms reviewed:

- https://register-of-charities.charitycommission.gov.uk/en/documentation-on-the-api
- https://api-portal.charitycommission.gov.uk/terms

### Development

Python 3.13, Apify SDK 4.1.0. Install requirements and run `python -m unittest discover -s tests -v`; run the Actor with `python -m src`. Docker: `docker build -t newapi38:1.0 .` then `docker run --rm newapi38:1.0`. Configuration and Dataset/input/output schemas are in `.actor`. Version 1.0.0.

# Actor input Schema

## `minIncomeGbp` (type: `number`):

Inclusive latest-period income threshold.

## `maxResults` (type: `integer`):

Maximum unique registration numbers.

## `region` (type: `string`):

Exact case-insensitive published label, e.g. Kent or Throughout Wales. Blank = all. Not headquarters location or inferred geographic coverage.

## `reportingYear` (type: `integer`):

Optional year in which latest accounting period ends. This does not retrieve historical accounts.

## Actor input object example

```json
{
  "minIncomeGbp": 1000000,
  "maxResults": 10,
  "region": ""
}
```

# Actor output Schema

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

No description

## `csv` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/uk-charity-commission-high-income-intelligence").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("afkdigital/uk-charity-commission-high-income-intelligence").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 afkdigital/uk-charity-commission-high-income-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/uk-charity-commission-high-income-intelligence"
        }
    }
}
```

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/8bFGLzXngV6oUbecx/builds/MNjznZNyipwGp630p/openapi.json
