# ACNC Australian Charity Register Scraper (`knotty_mistveil/acnc-charity-register`) Actor

Registered Australian charities from the ACNC Register on data.gov.au as JSON: ABN, legal and other names, size, address, charitable purposes, beneficiaries.

- **URL**: https://apify.com/knotty\_mistveil/acnc-charity-register.md
- **Developed by:** [Jason](https://apify.com/knotty_mistveil) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 charity 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

## ACNC Australian Charity Register Scraper

Pulls registered Australian charities from the **ACNC Register** — the public register kept by the Australian Charities and Not-for-profits Commission and published on **data.gov.au** (the "datadotgov\_main" register file, refreshed weekly). No API key, no account, no browser automation. You get one flat JSON record per charity with its ABN, legal name and any other/trading names, ACNC-reported size, business address, website, the charitable purposes it pursues, the beneficiary groups it helps, the Australian states/territories and overseas countries it operates in, its registration and establishment dates, and its Public Benevolent Institution and Health Promotion Charity flags — filtered by registration-date window, size, operating state, name keyword and ABN. On 10 September 2026 the register held **66,303 charities**, with about **170 registered in the last 90 days** and **1,932 in the last year**.

### What you get

Every record contains:

| Field | Description |
| --- | --- |
| `id` | The charity's ABN (same as `abn`) — the register's stable key |
| `source` | `acnc`, constant |
| `url` | `https://www.acnc.gov.au/charity/charities?search={abn}` — the ACNC Charity Register search, which resolves to this one charity (see *Data source and licence* for why this, not a profile URL) |
| `abn` | 11-digit Australian Business Number, e.g. `42838700668` |
| `charityName` | Legal name on the register, e.g. `The Daffodil Chef Incorporated` |
| `otherNames` | Other/trading names the charity is known by, as an array |
| `status` | `Registered`, constant — this open dataset contains only currently registered charities (see *Limits and freshness*) |
| `size` | `Small`, `Medium` or `Large` (ACNC size by annual revenue), or `null` when the charity has not reported one yet |
| `registrationDate` | Date the ACNC registered the charity, `YYYY-MM-DD` |
| `establishedDate` | Date the organisation itself was established, `YYYY-MM-DD`, or `null` |
| `addressType` | Type of the published address, e.g. `Business` |
| `addressLine` | Street address lines joined, e.g. `40 Cervantes Loop` |
| `town` / `state` / `postcode` / `country` | Address components as published (`state` is the address state; `country` is free text and lightly cleaned) |
| `website` | The charity's website as published, or `null` |
| `charitablePurposes` | The charitable purposes the charity pursues, as full-text labels (e.g. `Advancing health`, `Advancing religion`), from the register's purpose flags |
| `beneficiaries` | The beneficiary groups the charity helps, as full-text labels (e.g. `Children`, `Aged persons`, `People with disabilities`) |
| `operatingStates` | Australian states/territories the charity reports operating in, as codes (`ACT`, `NSW`, `NT`, `QLD`, `SA`, `TAS`, `VIC`, `WA`) |
| `operatingCountries` | Countries the charity reports operating in, as ISO 3166-1 alpha-3 codes (e.g. `["AUS", "NZL"]`) |
| `pbi` | `true` when the charity is registered as a Public Benevolent Institution |
| `hpc` | `true` when the charity is registered as a Health Promotion Charity |
| `numberOfResponsiblePersons` | Count of responsible persons (board/committee) the charity reports, or `null` |
| `financialYearEnd` | Financial-year end as published, e.g. `30-Jun` |
| `fetchedAt` | ISO timestamp of the run that produced the record |

There is no free-text "main activity" field: the ACNC main register does not carry one (it lives in the separate Annual Information Statement datasets). The structured `charitablePurposes` and `beneficiaries` arrays are what the register publishes about what each charity does and whom it helps. The dataset has three views: **Overview** (dates, size, location, purposes, link), **Names and location** (ABN, other names, full address, website) and **Purposes and beneficiaries**.

### Input

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `statuses` | string\[] | `["Registered"]` | The only value this open dataset can serve is `Registered`; it lists currently registered charities only. A request for anything else stops the run with a clear message. |
| `daysBack` | integer | `90` | Look-back window in days on the **registration date**, ending today. Ignored when `registeredFrom`/`registeredTo` are set, or when `abn` is given. Charities register slowly, so the default is 90. The register goes back to 1 July 2000. |
| `registeredFrom` | string | — | Start of the registration-date window, `YYYY-MM-DD`, inclusive. Overrides `daysBack`. |
| `registeredTo` | string | today | End of the registration-date window, `YYYY-MM-DD`, inclusive. |
| `sizes` | string\[] | all | Keep only `Small` (revenue under A$500k), `Medium` (A$500k–A$3m) or `Large` (A$3m+). A newly registered charity often has no size reported yet and is dropped when this filter is set. |
| `states` | string\[] | all | Keep only charities that report operating in at least one of these states/territories (`ACT`, `NSW`, `NT`, `QLD`, `SA`, `TAS`, `VIC`, `WA`). |
| `keywords` | string\[] | none | Case-insensitive terms matched against the legal name and any other/trading names. Terms are ORed. |
| `abn` | string | — | Return exactly this charity by its 11-digit ABN (spaces ignored). When set, it overrides the date window and every other filter. |
| `maxItems` | integer | `1000` | Stop after this many charities. You are charged per result, so this is also the cost cap. Newest registration first, so a value below the window's volume drops the **oldest** registrations in the window. |

Example — new small charities operating in NSW or Victoria, registered in the last 90 days:

```json
{ "daysBack": 90, "sizes": ["Small"], "states": ["NSW", "VIC"], "maxItems": 500 }
```

Example — every charity with "foundation" in its name registered in the last year:

```json
{ "daysBack": 365, "keywords": ["foundation"], "maxItems": 2000 }
```

Example — one specific charity by ABN:

```json
{ "abn": "59646743375" }
```

Bad input fails fast: an unknown size or state, a status other than `Registered`, a malformed ABN or a malformed date stops the run with the validation message as its status, before any request is made.

### Output example

A real record from a live run on 10 September 2026 (`{"daysBack": 180, "maxItems": 5}`), unedited:

```json
{
  "id": "42838700668",
  "source": "acnc",
  "url": "https://www.acnc.gov.au/charity/charities?search=42838700668",
  "abn": "42838700668",
  "charityName": "The Daffodil Chef Incorporated",
  "otherNames": [],
  "status": "Registered",
  "size": null,
  "registrationDate": "2026-08-27",
  "addressType": "Business",
  "addressLine": "40 Cervantes Loop",
  "town": "Yangebup",
  "state": "WA",
  "postcode": "6164",
  "country": "Australia",
  "website": "thedaffodilchef.org.au",
  "charitablePurposes": ["Advancing health"],
  "beneficiaries": ["Adults", "Aged persons", "Children", "Early childhood", "Families", "Females", "General community in Australia", "Males", "Other charities", "People with chronic illness", "Youth", "People of other gender identities"],
  "operatingStates": ["WA"],
  "operatingCountries": [],
  "pbi": false,
  "hpc": false,
  "numberOfResponsiblePersons": 3,
  "financialYearEnd": "30-Jun",
  "establishedDate": "2026-06-23",
  "fetchedAt": "2026-09-10T00:16:58.696Z"
}
```

A charity that works overseas looks the same but carries alpha-3 country codes, for example ABN `59646743375`, "WOMEN'S FUND ASIA LIMITED" (Large, Melbourne VIC), `operatingCountries` `["AFG", "BGD", "BTN", "IDN", "LAO", "LKA", "MDV", "MNG", "MYS", "NPL"]`, `charitablePurposes` `["Promoting or protecting human rights", "Advancing social or public welfare"]`.

Every run also writes a `SUMMARY` record to the key-value store with the resolved registration-date window, the filters used, `matchedTotal` (how many charities match the filters in the source), `pushed`, and the two completeness flags `limitReached` and `windowComplete`, plus the source file's last refresh, the licence and the required attribution.

### Pricing

Pay per result: **US$0.002 per charity delivered** (US$2 per 1,000 charities). You are charged only for records pushed to the dataset; a run that returns nothing costs nothing. Runs on the Apify free plan are limited by the platform's free-tier usage allowance.

### Data source and licence

- **Source.** The ACNC Register of Australian charities on data.gov.au — dataset [`ACNC Registered Charities`](https://data.gov.au/data/dataset/b050b242-4487-4306-abf5-07ca073e5594), resource "ACNC Register of Australian charities CSV" (`datadotgov_main.csv`, `datastore_active`). The Actor reads the resource's CKAN datastore through the public SQL endpoint `POST https://data.gov.au/data/api/3/action/datastore_search_sql`, which needs no key. The register's `Registration_Date` column is stored as text in `DD/MM/YYYY` form, so the Actor uses the SQL endpoint (which parses it server-side with `to_date`) rather than the plain `datastore_search` filters, which are exact-match only and cannot express a date range. Pages read at 1,000 rows, newest registration first. Read 10 September 2026.
- **Licence.** Creative Commons Attribution 3.0 Australia (CC BY 3.0 AU), <https://creativecommons.org/licenses/by/3.0/au/> (read 10 September 2026). Commercial reuse is permitted with attribution. You must attribute the data as: **"Source: Australian Charities and Not-for-profits Commission, CC BY 3.0 AU"**.
- **Why the `url` is a search, not a profile link.** Each charity has a page on the ACNC Charity Register, but its URL uses an internal GUID that is **not** in this dataset (verified 10 September 2026: ABN `40169025879` resolves to `/charity/charities/29f147b7-bd90-f111-8076-7ced8da2a7d2/profile`), so a profile URL cannot be built from the ABN. The Charity Register search **does** accept an ABN and resolves to the single matching charity (verified 10 September 2026), so the Actor links there; the raw `abn` is on every record, so you can also open the charity on the Australian Business Register at `https://abr.business.gov.au/ABN/View?abn={abn}`.
- **Personal data.** This dataset is organisation-level: it does not publish responsible-person names, emails or phone numbers (only a `numberOfResponsiblePersons` count), and private ancillary funds have their ABN and name withheld (see below). The address published is the charity's registered business address. Where a charity is a sole operator its business address may be a home address, and any contact details you obtain elsewhere for a charity's people are personal information: using this data to contact charities — marketing in particular — is the buyer's responsibility under Australia's Privacy Act 1988, the Spam Act 2003 and the Do Not Call Register Act 2006 (which govern electronic marketing and telemarketing to Australian numbers).

### Limits and freshness

- **Volumes, measured 10 September 2026** by running this Actor and by counting the source: the whole register is **66,303 charities**; by registration date, **17** were registered in the last 30 days, **170** in the last 90, **664** in the last 180 and **1,932** in the last year. By size: 43,279 Small, 9,304 Medium, 6,479 Large and 7,241 with no size reported. 43,703 charities publish a website. So `{"daysBack": 40000, "maxItems": 100000}` is a complete download of the register (about 65,700 records — see the exclusion below).
- **Private ancillary funds are excluded.** About **604 of the 66,303 rows** (48 of them registered in the last year) are private ancillary funds whose ABN and legal name the ACNC withholds from the public register (their name reads as a placeholder such as `PAF1779446-...`). Because the Actor keys every record on the ABN and links by it, these ABN-less rows are filtered out at source, so `matchedTotal` and the delivered count stay in step and `windowComplete` is honest.
- **Size `maxItems` to the window, and check `windowComplete`.** `maxItems` counts records delivered and the stream is newest-registration-first, so a value below the matched volume drops the **oldest** registrations in the window — but never silently. The run stops on the cap, warns `maxItems (N) reached; about M matching charities were not delivered`, and the `SUMMARY` record carries `limitReached: true` with `windowComplete: false`. `windowComplete: true` is the guarantee that you hold every matching charity: it is set only when the run delivered at least `matchedTotal` records and the spend limit did not cut delivery short.
- **Speed, measured 10 September 2026.** A one-year window of 1,884 charities was delivered across two SQL pages in about 18 seconds (roughly 100 records a second, dominated by the datastore's per-page response time, not by the Actor). A default 90-day run of ~170 records is a single page and a few seconds.
- **Rate limits.** data.gov.au documents none for the datastore SQL endpoint, and consecutive 1,000-row pages at ~1 request/second returned HTTP 200 throughout testing on 10 September 2026. The Actor still pauses ~200 ms between pages and retries 429 and 5xx responses with exponential back-off, honouring `Retry-After`.
- **Freshness.** The ACNC refreshes the register file **weekly** (on the run above it was last refreshed 6 September 2026, reported in the `SUMMARY` as `resourceLastModified`). The register also holds future-dated registrations (the latest registration date on 10 September 2026 was 21 October 2026), which a window ending today naturally excludes. Run an overlapping window (for example `daysBack: 14` weekly) rather than one that exactly abuts the previous run.
- **Status is `Registered` only.** This open dataset ("datadotgov\_main") lists currently registered charities and carries no status column, so every record is `Registered`. Charities whose registration has been revoked are shown on the ACNC website but are not published in this file; this Actor cannot return them.

### Use cases

- **Lead generation and market sizing for the not-for-profit sector:** pull newly registered charities by state, size and charitable purpose, each with its ABN, website and registered address, to build a prospect list for grant-makers, professional services, insurers or software vendors serving charities.
- **Grant-making and due diligence:** look up a charity by ABN, or pull every charity advancing a given purpose (health, education, religion) or helping a given beneficiary group, with its size, operating states and overseas countries, to scope eligibility and check standing before disbursing funds.
- **Sector research and dashboards:** download the whole register and analyse registrations over time, size distribution, geographic and overseas footprint, and the mix of charitable purposes and beneficiary groups across Australia's charity sector.

### Support

Open an issue on the Actor's page on Apify Store. Issues are answered within 14 days, as the Store terms require. Bug reports that name the run id and the input used are fixed fastest.

# Actor input Schema

## `statuses` (type: `array`):

This open dataset lists only currently registered charities, so Registered is the only value it can serve. Revoked charities are shown on the ACNC website but are not published in this file.

## `daysBack` (type: `integer`):

Look-back window in days on the charity's registration date, ending today. Ignored when Registered from / Registered to are set, or when an ABN is given. Charities register slowly, so the default is 90. The register goes back to 1 July 2000.

## `registeredFrom` (type: `string`):

Start of the registration-date window, YYYY-MM-DD (inclusive). Overrides Days back.

## `registeredTo` (type: `string`):

End of the registration-date window, YYYY-MM-DD (inclusive). Defaults to today.

## `sizes` (type: `array`):

Keep only charities of these ACNC-reported sizes (by annual revenue: Small under A$500k, Medium A$500k-A$3m, Large A$3m+). A newly registered charity often has no size reported yet and is dropped when this filter is set. Empty = all sizes.

## `states` (type: `array`):

Keep only charities that report operating in at least one of these states or territories. Empty = all.

## `keywords` (type: `array`):

Case-insensitive terms matched against the charity's legal name and any other/trading names. Terms are ORed; a match on any term keeps the charity. Empty = no keyword filter.

## `abn` (type: `string`):

Return exactly this charity by its 11-digit Australian Business Number (spaces are ignored). When set, it overrides the date window and every other filter.

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

Stop after this many charities. You are charged per result delivered, so this is also the cost cap. Newest registration first, so a value below the window's volume drops the OLDEST registrations in the window. Measured 2026-09-10: about 210 charities registered in the last 90 days, and the whole register is 66,303.

## Actor input object example

```json
{
  "statuses": [
    "Registered"
  ],
  "daysBack": 90,
  "sizes": [],
  "states": [],
  "keywords": [],
  "maxItems": 1000
}
```

# Actor output Schema

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

All charities returned by the run, one JSON object each. Append ?format=csv or ?format=xlsx to download a spreadsheet.

## `summary` (type: `string`):

Counts, the registration-date window used, the filters applied, the number matched, the source file's last refresh and the licence and attribution, written at the end of the run.

# 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 = {
    "statuses": [
        "Registered"
    ],
    "daysBack": 90,
    "sizes": [],
    "states": [],
    "keywords": [],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("knotty_mistveil/acnc-charity-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 = {
    "statuses": ["Registered"],
    "daysBack": 90,
    "sizes": [],
    "states": [],
    "keywords": [],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("knotty_mistveil/acnc-charity-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 '{
  "statuses": [
    "Registered"
  ],
  "daysBack": 90,
  "sizes": [],
  "states": [],
  "keywords": [],
  "maxItems": 1000
}' |
apify call knotty_mistveil/acnc-charity-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,knotty_mistveil/acnc-charity-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/IMC2Pf9X8vFaThkeT/builds/ty4BnExyvEOsAtf5o/openapi.json
