# CO Charity Registry - Nonprofit Filings & Financials (`j0401/co-charity-registry`) Actor

Colorado charitable-solicitation register (public open data): registration + annual financial filings for charities, paid solicitors and fundraising consultants - revenue/expense breakdown, year-end assets, program-service ratio, IRS exempt status, and the officers behind each organization.

- **URL**: https://apify.com/j0401/co-charity-registry.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.10 / 1,000 co charity filing 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Colorado Charity Registry - Nonprofit Filings & Financials

Colorado publishes its **charitable-solicitation register** as open data - the state's own file of every charity, paid solicitor and professional fundraising consultant registered to solicit in Colorado, together with their **annual financial filings**. This actor turns that register into a **charged-per-record lookup, filter and aggregate tool**: pull an organization's whole record, filter charities by name, county, status or size, read the financial statement behind a filing, or aggregate the register.

**Built for:** funders and grant-makers doing due diligence, nonprofit researchers and journalists, and anyone screening a charity's finances who wants **the financial history and the people behind it in one query** instead of reading PDFs one year at a time.

### What it covers

**272,689 filings** across **29,604 organizations** - a **multi-year history**, not a count of charities (one organization holds up to **36 annual filings**). Four linked tables, all keyed by **entity id**:

- **272,689 financial filings** - registration plus the annual report, with a full **990-style financial statement** on each
- **3,413,247 associated persons** - the officers, directors and contacts behind the filings
- **261,177 stated charitable purposes**
- **3,203,830 other-state registrations** - where else the charity is authorized to solicit

Depth beyond a bare registry:

- the **revenue split** - contributions, government, program services, investments, special events, sales - and the **expense split** - program services, administrative, fundraising, affiliates - plus **year-end assets and liabilities**, the **program-service ratio** and the previous year's totals on the same filing
- the **IRS exempt status and code**, the **registration status** (GOOD **194,094** / NOTICE 3 **51,521** / WITHDRAWN **23,430** / EXEMPT / REVOKED / ...) and its date
- the **authorized officer and CFO** who signed the report, the NTEE codes, the principal and mailing address with county, and the registration / renewal / expiration dates

### The fine print that matters

Read the grain before quoting a number: the **272,689** figure is **filings**, and there are only **29,604 organizations** behind them - this is a filing history per charity, which is exactly what makes it useful. `mode=entity` returns one organization's whole record in a single query: its filing history, its associated persons, its stated purpose and the other states it solicits in.

Two quirks are handled for you. **Socrata omits null columns**, so every record carries the full key set with empty fill across every table and mode - a downstream schema never shifts. And the reporting-period columns (`reportingperiodbegin` / `reportingperiodend`) hold **only a month and day** ("12-31"), never a year - they are passed through verbatim and never parsed into a fake date.

### Typical questions

- "One **charity's whole record** - every filing, officer, purpose and other-state registration."
- "Charities in **Denver County** over **$1M** in revenue."
- "Who sits on the board of a given nonprofit."
- "Which charities are on **NOTICE 3** (delinquent) status."
- "Aggregate the register by **county**, **registrant type** or **status**."

### Inputs

| Input | What it does |
|---|---|
| `mode` | `filings` (default) / `officers` / `purposes` / `otherStates` / `entity` / `aggregate` |
| `name` / `fein` / `entityId` / `documentId` | identify the organization |
| `registrantType` / `filingType` / `status` / `taxExemptStatus` | what kind of registrant, filing or standing |
| `county` / `city` | where (principal address) |
| `state` | other state it solicits in (mode=otherStates) |
| `revenueMin/Max` / `expensesMin/Max` | financial ranges |
| `approvedFrom/To` / `signedFrom/To` | filing-approval and officer-signature dates |
| `corpus` / `groupBy` | aggregate table and dimension |
| `maxResults` | cap records (default 200) |

**Default run = the 200 most recently approved filings** - fast for the daily auto-test. For one organization use `entity`; for a broad view use `aggregate`.

### Low cost

**From $0.0001 per record** - billed only for the rows you use, at the platform floor. Cost scales with what you pull, not with the size of the register, and because each record is metered individually there's no per-run charge cap to hit on a big pull.

What a thin scraper misses is the **join across four tables**: the financial statement, the people who signed it, the stated purpose and the other-state registrations all hang off one **entity id**, and the register holds a **filing history** (up to 25 years of annual filings - as many as 36 filings for one organization) rather than a single snapshot. The financials are also filed as **strings over the wire** even though they are numbers - a text-ordered revenue column sorts $9 above $1,000,000 - and the reporting period is a **month-and-day with no year**. Normalizing the four-table join, the string-numbers and the yearless periods into a schema where a `county` / `revenueMin` / `status` query returns exactly the charity you mean is the actual product. Every pull is integrity-checked against the register's known shape, so a degraded source fails loudly instead of returning bad rows.

### Source

- [Colorado: Registration of Charities & Paid Solicitors](https://data.colorado.gov/Business/Registration-of-Charities-Paid-Solicitors-Profes/37wu-kn3g) - the state's charitable-solicitation register with annual financial filings. Public open data. Records are the state's own published fields; not an endorsement of any organization, and not tax advice.

# Actor input Schema

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

filings = registration + financial filings (default). officers = associated persons. purposes = stated charitable purpose. otherStates = other states it solicits in. entity = one organization's whole record (needs entityId). aggregate = one count row per group.

## `name` (type: `string`):

Organization name substring, e.g. 'VINCENT', 'FOOD BANK'. Blank = any.

## `entityId` (type: `string`):

Colorado entity id (e.g. '20093009043'). Required for mode=entity; also usable as an exact filter.

## `fein` (type: `string`):

Federal EIN, with or without the dash (e.g. '26-2686998' or '262686998').

## `registrantType` (type: `string`):

Charitable Organization (~269k filings), Paid Solicitor (~2.4k), Paid Financial Consultant (~850). Blank = any.

## `filingType` (type: `string`):

Exact filing type: RENEWAL (~223k), INITIAL REGISTRATION, AMENDMENT, EXTENSION, FINANCIAL REPORT, ... Blank = any.

## `status` (type: `string`):

Exact status (case-insensitive): GOOD (~194k), NOTICE 3, WITHDRAWN, EXEMPT, REVOKED, ... Blank = any.

## `taxExemptStatus` (type: `string`):

IRS exempt status substring. Blank = any.

## `county` (type: `string`):

Colorado county of the principal address, e.g. 'DENVER', 'EL PASO'. Blank = any.

## `city` (type: `string`):

Principal city substring. Blank = any.

## `state` (type: `string`):

Two-letter state the charity is authorized to solicit in (mode=otherStates only). Blank = any.

## `revenueMin` (type: `number`):

Minimum total revenue on the filing (USD). Filings with no reported financials are excluded.

## `revenueMax` (type: `number`):

Maximum total revenue on the filing (USD).

## `expensesMin` (type: `number`):

Minimum total expenses on the filing (USD).

## `expensesMax` (type: `number`):

Maximum total expenses on the filing (USD).

## `approvedFrom` (type: `string`):

Only filings approved on/after this date (YYYY-MM-DD). The newest filings are first.

## `approvedTo` (type: `string`):

Only filings approved before this date (YYYY-MM-DD).

## `signedFrom` (type: `string`):

Only filings whose authorized officer signed on/after this date (YYYY-MM-DD).

## `signedTo` (type: `string`):

Only filings whose authorized officer signed before this date (YYYY-MM-DD).

## `corpus` (type: `string`):

Which table to aggregate when mode=aggregate. The groupBy dimension must belong to this table (filings: registrantType/filingType/status/county/city/taxExemptStatus/nteeCode; officers: entityType/personType; otherStates: state/registrantType/authorizedSoliciting; purposes: none).

## `groupBy` (type: `string`):

Dimension to count over (must belong to the selected corpus). Blank = that table's default (registrantType for filings, personType for officers, state for otherStates).

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

Cap the number of records pushed in rows/entity mode (0 = up to ~10k per run; each record is metered individually, so there is no per-run charge cap). Aggregate mode returns every group.

## Actor input object example

```json
{
  "mode": "filings",
  "name": "",
  "entityId": "",
  "fein": "",
  "registrantType": "",
  "filingType": "",
  "status": "",
  "taxExemptStatus": "",
  "county": "",
  "city": "",
  "state": "",
  "approvedFrom": "",
  "approvedTo": "",
  "signedFrom": "",
  "signedTo": "",
  "corpus": "filings",
  "groupBy": "",
  "maxResults": 50
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

Colorado charity filing / officer / purpose / other-state records or aggregates - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (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("j0401/co-charity-registry").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("j0401/co-charity-registry").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 j0401/co-charity-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/co-charity-registry"
        }
    }
}
```

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/wA6IZe5IQAYHP4KpY/builds/W94SV9NtIT5w3e7nO/openapi.json
