# California Prop 65 60-Day Notice & Settlement Feed (`minty_modesty/ca-prop65-60day-notice-feed`) Actor

Feed of California Proposition 65 60-day notices of violation from the Attorney General's register: new and changed records only, with alleged violators, chemicals, product, filer, the civil penalty and attorneys' fees of each attached settlement or judgment, and links to the filed PDFs.

- **URL**: https://apify.com/minty\_modesty/ca-prop65-60day-notice-feed.md
- **Developed by:** [Minty Modesty](https://apify.com/minty_modesty) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Prop 65 60-Day Notice Feed

Every Proposition 65 enforcement action in California starts the same way: a private
enforcer serves a 60-day notice of violation on a business and files a copy with the
Attorney General. The Attorney General publishes those filings, and later attaches the
settlements, judgments, complaints and withdrawals that follow from them.

The register is searchable one page at a time and its CSV export stops at 1,000 rows.
This Actor turns it into a feed: give it a date window and optional filters, and it
returns the notices and case documents that are **new or changed since your last run**,
as structured records with working links to the filed PDFs.

If you sell into California, defend Prop 65 claims, underwrite product liability, or
track a serial filer, the useful question is not "what is in the register" but "what
appeared since Tuesday". That is what comes out of this.

### What one record looks like

```json
{
  "agNumber": "2026-03559",
  "noticeDate": "2026-07-24",
  "noticingParty": "Blue Sky Forever",
  "plaintiffAttorney": "Seven Hills LLP",
  "allegedViolators": ["Pereg Natural Foods Inc."],
  "allegedViolatorsRaw": "Pereg Natural Foods Inc.",
  "chemicals": ["Lead"],
  "chemicalsRaw": "Lead",
  "source": "Quinoa Spinach",
  "caseId": null,
  "caseType": null,
  "civilPenaltyUsd": null,
  "attorneyFeesUsd": null,
  "otherPaymentsUsd": null,
  "injunctiveRelief": null,
  "noticeDetailUrl": "https://oag.ca.gov/prop65/60-Day-Notice-2026-03559",
  "noticePdfUrl": "https://oag.ca.gov/system/files/prop65/notices/2026-03559.pdf",
  "changeType": "new",
  "recordKey": "2026-03559|",
  "scrapedAt": "2026-07-26T03:02:51.273Z"
}
````

And once a settlement is filed against that notice, the same feed hands you a second
record for it, marked `changeType: "new"`, carrying the money:

```json
{
  "agNumber": "2022-00526",
  "caseId": "Settlement 1427",
  "caseType": "settlement",
  "caseName": "EHA v. Global Healing Center, LLC, et al.",
  "courtDocketNumber": "22CV010847",
  "civilPenaltyUsd": 5000,
  "attorneyFeesUsd": 45000,
  "otherPaymentsUsd": 0,
  "injunctiveRelief": "reformulation or warnings",
  "caseDocumentUrl": "https://oag.ca.gov/system/files/prop65/settlements/2022-00526S1427.pdf"
}
```

### Input

| Field | What it does |
| --- | --- |
| `since` / `until` | Filing-date window, `YYYY-MM-DD` or `MM/DD/YYYY`. Defaults to the last 30 days. The register goes back to 1988. |
| `chemicals` | Listed chemicals, spelled as in the Attorney General's Chemical dropdown (`Lead`, `Cadmium`, `Bisphenol A (BPA)`, `Di(2-ethylhexyl)phthalate (DEHP)`, …). Several are combined with OR. A misspelled name fails the run instead of quietly returning everything. |
| `productKeywords` | Substring match on the notice's Source/Product text (`powder`, `socks`, `vinyl gloves`). |
| `defendants` | Alleged violator name (`Amazon`, `Target`). |
| `plaintiff` | Noticing party or its attorney, for following one filer. |
| `includeSettlements` | Include the settlement / judgment / complaint / withdrawal rows attached to each notice. On by default. |
| `onlyNewSinceLastRun` | Return only new and changed records. On by default. |
| `resolveDetailFields` | Read the notice page as well, for the split violator list, split chemical list and working PDF link. On by default. |
| `maxItems` | Cap on records written. `0` for no cap. |
| `resetBaseline` | Forget what previous runs saw, so the window comes back in full. Use it for a first backfill. |
| `stateStoreName` | Named key-value store holding the fingerprints. Separate watch lists want separate names. |

A daily monitor of lead-in-food notices looks like this:

```json
{
  "since": "2026-07-01",
  "chemicals": ["Lead"],
  "productKeywords": ["powder", "supplement"],
  "includeSettlements": true,
  "onlyNewSinceLastRun": true
}
```

Schedule it, point a webhook at the dataset, and each run charges you for the handful of
records that actually appeared. A quiet day costs one Actor start and nothing else.

### How the change detection works

The register's export has one row per notice **per attached case document**. A single
notice can carry seven rows once its complaint, settlements and judgments are all on
file, so the notice number by itself does not identify a row. The key used here is
`(AG Number, Case ID)`, which was checked against a 566-row export covering January and
February 2022: 414 distinct notice numbers, 566 distinct keys, no collisions.

Each run fingerprints all 17 source columns of every row and compares them against the
fingerprints stored in your key-value store:

- a `(AG Number, Case ID)` pair never seen before → `changeType: "new"`;
- a pair seen before whose columns now differ → `changeType: "changed"`, with the
  previous fingerprint attached. This is how an amended notice reaches you, and how a
  settlement filed months after the notice reaches you;
- everything else is skipped.

Raw responses are written to the same store keyed by request URL before anything is
parsed. Windows that ended in the past are served from that copy on later runs; a window
that reaches today is always refetched, because it can still gain rows. So a backfill you
have already paid for is never fetched twice, and re-running with different filters reads
what is already on disk.

The export truncates at 1,000 rows and has no page 2 (`attach=page_2` returns the same
rows as `attach=page_1`). A window that comes back exactly full is therefore bisected by
date and each half fetched separately, so a multi-year backfill returns complete data.

### Field notes

The 17 source columns are passed through under camelCase names. Where a column needed
interpretation, here is what it was checked against.

**Money columns.** `Civil Penalty`, `Attorney Fees` and `Other Payments` are the three
payment lines on form JUS 1501, *Report of Settlement*, which private enforcers file with
the Attorney General under Health and Safety Code section 25249.7(e) and (f). On the form
they read `PAYMENT: CIVIL PENALTY`, `PAYMENT: ATTORNEYS FEES` and `PAYMENT: OTHER`.
Filers type bare dollar amounts, so `5000` means five thousand dollars. Each column is
delivered twice: `civilPenaltyRaw` is the string as filed, `civilPenaltyUsd` is the number,
and the number is `null` rather than a guess whenever the string is not plain digits. The
form does not define which payments belong under `PAYMENT: OTHER`, so no meaning beyond
the form's own label is claimed for `otherPaymentsUsd`.

**Which rows carry which columns.** Checked row by row across the same 566-row export:

| Row type | Populated |
| --- | --- |
| Notice with no case document yet (181 rows) | notice fields only |
| `Complaint N` (99 rows) | `typeOfClaim`, `reliefSought`, `caseName`, `courtDocketNumber` — 99/99 |
| `Settlement N` (202 rows) | the three payment columns and `injunctiveRelief` — 202/202 |
| `Judgment N` (35 rows) | the three payment columns and `injunctiveRelief` — 35/35 |
| `Withdrawal N` (49 rows) | notice fields only |

No row of any other type carried a payment figure, and no settlement or judgment row was
missing one.

**Violator and chemical lists.** The export joins these with `", "`, and the values
themselves contain commas: `Jo-Ann Stores, LLC` is one company and
`1,1,1,2-Tetrachloroethane` is one chemical. Splitting the export string on commas
corrupts both. So `allegedViolatorsRaw` and `chemicalsRaw` are always the string as
published, and the `allegedViolators` / `chemicals` arrays come from the notice page,
where the Attorney General publishes each value in its own element. With
`resolveDetailFields` off, the arrays are omitted and `detailsResolved` is `false`,
rather than a comma split being passed off as a list.

**PDF links.** `noticePdfUrl` cannot be assembled from the notice number: some notices are
stored under a revised filename and the plain one returns 403. Compare
`notices/2026-03559.pdf` (200) with `notices/2026-03540.pdf` (403) and
`notices/2026-03540_0.pdf` (200). With `resolveDetailFields` on, the link is read off the
notice page, and `noticeDocumentUrls` lists every document filed against that notice.
Case-document links follow the folder pattern `settlements/…S…`, `complaints/…C…`,
`judgments/…J…`, `withdrawals/…W…`.

**Comments.** The Attorney General's CMS appends its own field placeholder,
`[field_prop65_comments]`, to every populated comment. It is stripped.

### Source and terms

Data comes from the Attorney General's public 60-day notice register at
`oag.ca.gov/prop65`, which serves both the search pages and the CSV export without a login.
No rate limiting was observed while building this, and requests are still made one at a
time rather than in parallel. Fetched records are public filings about businesses,
not personal data. Naming a business in a notice is an allegation by a private enforcer,
not a finding by any court or agency, and the Attorney General publishes the filings
without endorsing them; treat the records the same way.

This Actor is not affiliated with the California Department of Justice or the Office of
the Attorney General, and nothing it returns is legal advice.

### Pricing

Pay per result: the charge is per record written to the dataset, plus Apify's standard
per-run Actor-start event. With `onlyNewSinceLastRun` left on, a monitoring schedule
therefore costs whatever the register actually produced that day, and a quiet day costs
just the start event. A historical backfill is priced the same way; cap it with `maxItems`
if you want a hard ceiling. The exact figures are on the pricing tab of this page.

### Support

Open an issue on the Actor's Apify page. Include the notice number and the input you ran,
which is usually enough to reproduce the problem without a follow-up question. If the
Attorney General changes the export's columns, the Actor fails loudly with the column names
it received rather than shifting your values one field sideways.

# Actor input Schema

## `since` (type: `string`):

Start of the filing-date window, as YYYY-MM-DD or MM/DD/YYYY. Defaults to 30 days before the end date. The Attorney General's register goes back to 1988, so a wide window is allowed — the Actor splits it into as many requests as the export's 1,000-row limit needs.

## `until` (type: `string`):

End of the filing-date window, as YYYY-MM-DD or MM/DD/YYYY. Defaults to today.

## `chemicals` (type: `array`):

Filter by listed chemical, using the exact spelling from the Chemical dropdown at oag.ca.gov/prop65/60-day-notice-search — for example Lead, Cadmium, Acrylamide, Bisphenol A (BPA), Di(2-ethylhexyl)phthalate (DEHP). Several entries are combined with OR. A name the Attorney General's list does not contain makes the run fail rather than silently return everything.

## `productKeywords` (type: `array`):

Filter on the Source/Product text of the notice, e.g. powder, socks, vinyl gloves, dietary supplement. Each keyword costs one extra request; results from all keywords are merged and de-duplicated.

## `defendants` (type: `array`):

Filter on the alleged violator (defendant) name, e.g. Amazon, Walmart, Target. The Attorney General's form accepts one name, so the first entry is sent to the server and any further entries are applied locally to what comes back.

## `plaintiff` (type: `string`):

Filter on the noticing party or its attorney, e.g. Environmental Health Advocates, Lexington Law Group. Useful for tracking one serial filer.

## `includeSettlements` (type: `boolean`):

The register attaches case documents to a notice over time. With this on, each attached settlement, judgment, complaint or withdrawal is its own record carrying the payment figures reported on form JUS 1501 (civil penalty, attorneys' fees, other payment) and the injunctive relief text. Turn it off to receive only the notices themselves.

## `onlyNewSinceLastRun` (type: `boolean`):

Compares this run against the fingerprints stored from previous runs and returns only records that are new or whose fields changed — which is how a settlement getting attached to an old notice reaches you. Turn it off to receive every row in the window on every run.

## `resolveDetailFields` (type: `boolean`):

Costs one extra request per notice and adds three things the CSV export cannot give you: the alleged violators as a proper list, the chemicals as a proper list, and the working PDF link. The export joins violator names with commas and the names themselves contain commas, so the list can only be rebuilt from the notice page. Some notices store a revised PDF under a suffixed filename, and the plain filename returns 403 for those.

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

Caps how many records are written to the dataset. 0 means no cap. The fingerprint store is still advanced for the whole window, so capped rows are not re-reported as new next run.

## `resetBaseline` (type: `boolean`):

Discards the stored fingerprints, so every row in the window is reported as new. Use it for a first backfill, or after changing the filters.

## `stateStoreName` (type: `string`):

Named key-value store that holds the fingerprints and the landed raw responses. Give separate watch lists separate store names so their change detection stays independent.

## Actor input object example

```json
{
  "since": "2026-07-01",
  "chemicals": [
    "Lead",
    "Cadmium"
  ],
  "productKeywords": [
    "powder",
    "socks"
  ],
  "defendants": [
    "Amazon"
  ],
  "includeSettlements": true,
  "onlyNewSinceLastRun": true,
  "resolveDetailFields": true,
  "maxItems": 20,
  "resetBaseline": false,
  "stateStoreName": "ca-prop65-60day-notice-feed-state"
}
```

# Actor output Schema

## `notices` (type: `string`):

One item per (AG Number, Case ID) pair: the 60-day notice fields, the alleged violators and chemicals, and — on settlement and judgment rows — civil penalty, attorneys' fees and other payments, plus the URL of the filed PDF. Only records that are new or changed since the previous run are pushed.

## `noticesCsv` (type: `string`):

The same records as a spreadsheet-ready CSV.

## `overview` (type: `string`):

The columns most people read first: change type, AG number, date filed, noticing party, alleged violators, chemicals, source/product, and the penalty and fee amounts.

## `settlements` (type: `string`):

Case name, court docket number, civil penalty, attorneys' fees, other payments, injunctive relief and the case PDF for every attached settlement or judgment.

# 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 = {
    "since": "2026-07-01",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("minty_modesty/ca-prop65-60day-notice-feed").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 = {
    "since": "2026-07-01",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("minty_modesty/ca-prop65-60day-notice-feed").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 '{
  "since": "2026-07-01",
  "maxItems": 20
}' |
apify call minty_modesty/ca-prop65-60day-notice-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=minty_modesty/ca-prop65-60day-notice-feed",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "California Prop 65 60-Day Notice & Settlement Feed",
        "description": "Feed of California Proposition 65 60-day notices of violation from the Attorney General's register: new and changed records only, with alleged violators, chemicals, product, filer, the civil penalty and attorneys' fees of each attached settlement or judgment, and links to the filed PDFs.",
        "version": "0.0",
        "x-build-id": "Wf207pnkBpNA0CPUL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/minty_modesty~ca-prop65-60day-notice-feed/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-minty_modesty-ca-prop65-60day-notice-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/minty_modesty~ca-prop65-60day-notice-feed/runs": {
            "post": {
                "operationId": "runs-sync-minty_modesty-ca-prop65-60day-notice-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/minty_modesty~ca-prop65-60day-notice-feed/run-sync": {
            "post": {
                "operationId": "run-sync-minty_modesty-ca-prop65-60day-notice-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "since": {
                        "title": "Filed on or after",
                        "type": "string",
                        "description": "Start of the filing-date window, as YYYY-MM-DD or MM/DD/YYYY. Defaults to 30 days before the end date. The Attorney General's register goes back to 1988, so a wide window is allowed — the Actor splits it into as many requests as the export's 1,000-row limit needs."
                    },
                    "until": {
                        "title": "Filed on or before",
                        "type": "string",
                        "description": "End of the filing-date window, as YYYY-MM-DD or MM/DD/YYYY. Defaults to today."
                    },
                    "chemicals": {
                        "title": "Chemicals",
                        "type": "array",
                        "description": "Filter by listed chemical, using the exact spelling from the Chemical dropdown at oag.ca.gov/prop65/60-day-notice-search — for example Lead, Cadmium, Acrylamide, Bisphenol A (BPA), Di(2-ethylhexyl)phthalate (DEHP). Several entries are combined with OR. A name the Attorney General's list does not contain makes the run fail rather than silently return everything.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "productKeywords": {
                        "title": "Product / source keywords",
                        "type": "array",
                        "description": "Filter on the Source/Product text of the notice, e.g. powder, socks, vinyl gloves, dietary supplement. Each keyword costs one extra request; results from all keywords are merged and de-duplicated.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "defendants": {
                        "title": "Alleged violators",
                        "type": "array",
                        "description": "Filter on the alleged violator (defendant) name, e.g. Amazon, Walmart, Target. The Attorney General's form accepts one name, so the first entry is sent to the server and any further entries are applied locally to what comes back.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "plaintiff": {
                        "title": "Noticing party or plaintiff's attorney",
                        "type": "string",
                        "description": "Filter on the noticing party or its attorney, e.g. Environmental Health Advocates, Lexington Law Group. Useful for tracking one serial filer."
                    },
                    "includeSettlements": {
                        "title": "Include settlement, judgment and complaint rows",
                        "type": "boolean",
                        "description": "The register attaches case documents to a notice over time. With this on, each attached settlement, judgment, complaint or withdrawal is its own record carrying the payment figures reported on form JUS 1501 (civil penalty, attorneys' fees, other payment) and the injunctive relief text. Turn it off to receive only the notices themselves.",
                        "default": true
                    },
                    "onlyNewSinceLastRun": {
                        "title": "Only new and changed records",
                        "type": "boolean",
                        "description": "Compares this run against the fingerprints stored from previous runs and returns only records that are new or whose fields changed — which is how a settlement getting attached to an old notice reaches you. Turn it off to receive every row in the window on every run.",
                        "default": true
                    },
                    "resolveDetailFields": {
                        "title": "Resolve fields from the notice page",
                        "type": "boolean",
                        "description": "Costs one extra request per notice and adds three things the CSV export cannot give you: the alleged violators as a proper list, the chemicals as a proper list, and the working PDF link. The export joins violator names with commas and the names themselves contain commas, so the list can only be rebuilt from the notice page. Some notices store a revised PDF under a suffixed filename, and the plain filename returns 403 for those.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max records",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Caps how many records are written to the dataset. 0 means no cap. The fingerprint store is still advanced for the whole window, so capped rows are not re-reported as new next run.",
                        "default": 0
                    },
                    "resetBaseline": {
                        "title": "Reset the stored fingerprints",
                        "type": "boolean",
                        "description": "Discards the stored fingerprints, so every row in the window is reported as new. Use it for a first backfill, or after changing the filters.",
                        "default": false
                    },
                    "stateStoreName": {
                        "title": "Fingerprint store name",
                        "type": "string",
                        "description": "Named key-value store that holds the fingerprints and the landed raw responses. Give separate watch lists separate store names so their change detection stays independent.",
                        "default": "ca-prop65-60day-notice-feed-state"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
