# CA Cal-Access Campaign Finance Scraper (`codingfrontend/cal-access-campaign-finance-scraper`) Actor

Unofficial search of California Secretary of State daily public CAL-ACCESS data; not affiliated with or endorsed by the Secretary of State.

- **URL**: https://apify.com/codingfrontend/cal-access-campaign-finance-scraper.md
- **Developed by:** [Coding Frontned](https://apify.com/codingfrontend) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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

## California CAL-ACCESS Campaign Finance Scraper

Search California Secretary of State campaign-finance and lobbying filer registrations from the official daily CAL-ACCESS raw-data export. The Actor returns normalized, deduplicated public filer records and can join the latest campaign-disclosure cover filing and its reported financial summary lines.

This is an unofficial community tool. It is not affiliated with, endorsed by, or operated by the California Secretary of State. CAL-ACCESS records are filer-submitted public disclosures and should not be treated as legal advice or a substitute for certified records.

### Why this Actor uses the official raw-data export

The public CAL-ACCESS website is protected by an interactive browser security check. This Actor does not solve CAPTCHAs or bypass that control. Instead, it uses the separate daily ZIP export that the Secretary of State expressly publishes for technical users. To keep runs bounded, it reads the ZIP directory with HTTP byte ranges and downloads only the required compressed tables—never the entire multi-gigabyte archive.

The official export is updated daily. Every dataset item includes the archive URL, its latest `Last-Modified` timestamp when supplied by the CDN, the exact source table, and the Secretary of State documentation page.

### Input

- `searchQuery` — case-insensitive filer-name fragment, such as `NEWSOM`.
- `filerId` — optional exact numeric CAL-ACCESS filer ID; when present, it takes precedence over the name query.
- `entityType` — optional official filer classification, including recipient committee, candidate/officeholder, major donor committee, lobbyist, firm, employer, client, payment-to-influence filer, slate mailer, proposition, or initiative.
- `status` — `ACTIVE`, `INACTIVE`, `TERMINATED`, `WITHDRAWN`, or `any`.
- `includeFinancialActivity` — when enabled, searches campaign-disclosure cover records for the latest filing and joins its numeric summary lines.
- `maxResults` — hard cap of 1–50 unique filers.
- `maxFinancialLines` — hard cap on attached financial summary lines per filer.
- `maxRunMillis`, `maxCompressedMbytes`, `maxRetries`, and `requestDelayMillis` — operational safety controls.
- `proxyConfiguration` — optional Apify Proxy configuration. The public CDN normally works directly.

Example:

```json
{
  "searchQuery": "NEWSOM",
  "entityType": "RECIPIENT COMMITTEE",
  "status": "ACTIVE",
  "includeFinancialActivity": true,
  "maxResults": 3
}
```

### Output

Each record has stable `recordId` and `filerId` fields, registered name, official entity classification, status, effective date, and available public contact information. Historical contact rows are normalized and deduplicated in `contactHistory`.

For matched campaign filers, `latestCampaignFiling` can include filing and amendment IDs, form and statement types, report date, reporting period, election date, candidate, office, jurisdiction, district, and support/oppose code. `financialSummaryLines` contains the official form line number and numeric amount columns exactly as represented by the raw export. Because line meanings depend on the filing form and year, the Actor does not invent friendly labels; use `formType` and the linked official documentation to interpret them.

Unavailable optional values are omitted. No placeholder strings, fabricated totals, or mock rows are generated. If nothing matches, the run fails clearly instead of reporting false success.

### Responsible operation and limitations

The Actor performs one range request at a time with a configurable delay, bounded exponential retries, a consistent browser identity, a compressed-download guard, and a deadline below five minutes. It validates required output fields and rejects duplicate filer identities.

CAL-ACCESS covers state-level records; it does not replace federal, county, or city disclosure systems. Historical records may contain repeated or superseded addresses, misspellings, incomplete contact fields, and amendments because the underlying data is supplied by filers. Financial summary line items are raw official form values, not independently audited calculations. Review the source documentation and current filings before making compliance, legal, or financial decisions.

# Actor input Schema

## `searchQuery` (type: `string`):

Case-insensitive name fragment. Ignored when an exact filer ID is supplied.

## `filerId` (type: `string`):

Optional exact numeric CAL-ACCESS filer ID.

## `entityType` (type: `string`):

Optional exact registry classification from the official export.

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

Optional exact current or historical registration-status filter from the official export.

## `includeFinancialActivity` (type: `boolean`):

For campaign filers, join the latest public campaign-disclosure cover record and its reported financial summary lines.

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

Maximum unique filer records to emit.

## `maxFinancialLines` (type: `integer`):

Safety limit for financial summary line items attached to each matched filer.

## `maxRunMillis` (type: `integer`):

Actor-side deadline, capped below five minutes.

## `maxCompressedMbytes` (type: `integer`):

Abort before fetching selected ZIP members if their combined compressed size exceeds this guard.

## `maxRetries` (type: `integer`):

Bounded attempts for each official CDN byte-range request.

## `requestDelayMillis` (type: `integer`):

Responsible pacing for the small number of byte-range requests.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy. Direct access to the public CDN is used by default.

## Actor input object example

```json
{
  "searchQuery": "NEWSOM",
  "entityType": "any",
  "status": "any",
  "includeFinancialActivity": true,
  "maxResults": 3,
  "maxFinancialLines": 40,
  "maxRunMillis": 240000,
  "maxCompressedMbytes": 140,
  "maxRetries": 3,
  "requestDelayMillis": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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("codingfrontend/cal-access-campaign-finance-scraper").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("codingfrontend/cal-access-campaign-finance-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 codingfrontend/cal-access-campaign-finance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=codingfrontend/cal-access-campaign-finance-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iHGa0P2sMqhyPCKGd/builds/PVmFYqF4baoFytmel/openapi.json
