Free settlement data for everyone. Pro tier for eligibility matching and higher limits. Base URL for all endpoints: https://classactionhero.app
| Free | Pro — $29/mo | |
|---|---|---|
| Settlement inventory JSON | Yes | Yes |
| Story leads, RSS feed | Yes | Yes |
Eligibility matching (/v1/eligibility/check) | No | Yes |
| Rate limit | 100 requests per 60 seconds per IP | 5,000 requests/day per key |
| API key | Not required | Required (Bearer) |
| Support | Community |
Pro signup: classactionhero.app/api/pro/
Independent journalists get the full API free — including six datasets built for investigative reporting. Commercial buyers pay. The public API stays free for everyone.
| Free | Journalist | Pro — $29/mo | Data / Enterprise — $299 / $999 / custom | |
|---|---|---|---|---|
| Settlement inventory, story leads, RSS | Yes | Yes | Yes | Yes |
| Six journalist datasets (see below) | No | Yes — free | No | Yes — paid |
Eligibility matching (/v1/eligibility/check) | No | No | Yes | Yes |
| Rate limit | 100 requests per 60 seconds per IP | 5,000 requests/day | 5,000 requests/day | Negotiated |
| Attribution | Required — cite Class Action Hero | Required — cite Class Action Hero | Optional | Optional |
| Bulk dumps, daily diffs, webhooks, white-label embeds, SLA | No | No | No | Yes |
Built for reporting; not available as APIs anywhere else, free or paid:
| Dataset | What it holds |
|---|---|
| Take rates | Claims filed ÷ class size, per settlement — what share of eligible people actually file |
| Advertised vs actual payouts | Published "up to $X" vs the per-person amounts people actually received |
| Repeat offenders | Companies settling repeatedly: counts, totals paid, categories, over time |
| Unclaimed money + cy pres | Unclaimed funds per settlement; where cy pres awards go |
| Breach-to-settlement lag | Days from breach disclosure to payout, per company and industry |
| Administrator performance | Claims administrators ranked by speed, rejection rates, user experience |
Each dataset ships with methodology notes and source pointers so the numbers hold up in print. Five of the six are still in build — your journalist key lights each one up as it ships.
Free: freelance and independent reporters, nonprofit newsrooms, student press, worker-owned and co-op outlets. Not free: for-profit corporate newsrooms, conglomerate-owned clickbait and content-farm operations, data vendors, law firms, funds — those are commercial buyers.
The application asks who owns your outlet first. Ownership does the sorting — no blacklist, no arguments.
Email press@classactionhero.app with:
Review takes about two minutes; keys go out by email within 48 hours. Terms: the data is published under CC-BY 4.0 — cite Class Action Hero in anything published. Keys are revocable for abuse.
press@classactionhero.app inbox is not live yet — applications open as soon as it is. The base API needs no key and works now.Free endpoints need no key. Pro endpoints require your API key as a Bearer token:
Authorization: Bearer YOUR_PRO_API_KEY
Get your key after checkout via GET /v1/key-for-session (see below). Missing or invalid key returns 401. Keep your key secret — it is billed to your subscription.
No key required. CORS open. Cached at the edge (5-minute stale-while-revalidate).
Every open class-action settlement currently accepting claims: name, deadline, fund, eligibility text, proof requirements, state restrictions, and filing URL. Updated as settlements open, close, or change.
Schema v2: every record carries every field; a value that does not exist is null, never a missing key.
| Field | Type | Notes |
|---|---|---|
id | string | Stable record ID (the detail-page slug when a page exists). Cite this, not the name. |
name | string | Settlement name, display text. |
status | string | open | closed |
deadline | string | null | Claim deadline, YYYY-MM-DD; null when no date has been announced. |
deadline_status | string | dated | tbd (tbd exactly when deadline is null) |
deadlineLabel | string | Human-readable deadline. |
fund | string | Published fund figure as display text. |
fundNum | number | null | Total settlement fund in dollars. Set only when fundType is aggregate or verdict_estimate — never a per-person amount. |
fundType | string | aggregate | per_person | verdict_estimate | unknown |
perPersonMax | number | null | Largest stated per-person amount in dollars (cap, flat payment, or per-day rate). |
currency | string | ISO 4217: USD (US files) | CAD (Canada file) |
eligibility | string | Who qualifies, in plain language. |
proof | string | Proof label, derived from proof_enum. |
proof_enum | string | none | notice_id_only | tiered | required | automatic | unknown |
proof_verbatim | string | null | Proof language quoted from the official notice or claim form, when captured. |
tier_cap | string | null | Per-tier cap text quoted from the official notice, when captured. |
states | array | null | State codes the settlement is restricted to, sorted; null means nationwide. |
url | string | null | Official claim-filing URL; null when there is no public claim site (see url_note). |
url_note | string | null | Why there is no public claim URL, when recorded. |
unverified | boolean | True when the record has not yet been verified against the official source. |
administrator | string | null | Settlement administrator, detected from the official claim site. |
court | string | null | Court of record, when captured from primary documents. |
case_number | string | null | Case number, when captured from primary documents. |
last_verified | string | null | Date the record's proof language was verified against the official source. |
ca | string | Analyst notes on the record (may be empty). |
bonus | string | Derived from ca: the note itself when it is a CA-enhanced note, else empty. |
source | string | Always "Class Action Hero". |
source_url | string | Attribution URL. |
listing_url | string | null | Detail-page URL for the settlement, when one exists. |
Closed US settlements (claim deadline passed), same schema as settlements.json with status "closed". Free — the archive is not a Pro feature. Sidecar: /api/closed-settlements.meta.json.
Canadian settlements, same schema; amounts are in CAD — read the currency field. Sidecar: /api/settlements-ca.meta.json.
Bake metadata for settlements.json: generated_at (ISO 8601, UTC), row_count, schema_version, license, and aggregate_fund_total (the sum of fundNum over aggregate records).
Court-filings index: cases with filed documents (ISO dates, page counts, hashes), each joined to its settlement by settlement_id where the settlement is in the dataset.
Pre-filtered CSV cuts of the open dataset (all settlements, closing windows, largest funds, no-proof-needed, per state), regenerated with every bake. The index page lists each cut with its row count.
OpenAPI 3.0 spec for this surface, generated from the baked payload — field types and nullability are measured from the data, not hand-written.
Pre-computed story leads for journalists: the 10 largest funds, the 10 closing soonest, and every settlement requiring no proof of purchase.
RSS 2.0 feed of open settlements ordered by deadline.
Require Authorization: Bearer YOUR_PRO_API_KEY. Served by the cah-api-tiers worker.
Creates a Stripe checkout session for the $29/month Pro subscription. Returns a checkout URL to redirect the customer to.
{
"ok": true,
"checkout_url": "https://checkout.stripe.com/..."
}
Returns your Pro API key after checkout completes. Call with the checkout session ID:
GET /v1/key-for-session?session_id=cs_test_abc123
{
"ok": true,
"api_key": "cah_live_...",
"created": "2026-10-17T00:00:00Z"
}
Stripe webhook receiver. Verifies the Stripe signature, issues API keys on checkout.session.completed, and revokes keys when a subscription ends. Not called directly by API consumers.
Worker health check. No auth required.
{
"ok": true,
"service": "cah-api-tiers"
}
Matches a purchase history against the open settlement inventory and returns ranked eligibility suggestions. The API suggests; it never files. The user is always the filer — every claim is filed under penalty of perjury and only the user can attest to their own eligibility. There is deliberately no filing endpoint.
POST /v1/eligibility/check
Content-Type: application/json
Authorization: Bearer YOUR_PRO_API_KEY
{
"purchases": [
{
"description": "Oscar Mayer bacon 16oz",
"merchant": "Safeway",
"date": "2016-03-10",
"amount": 6.49
},
{
"description": "VSL#3 probiotic 60ct",
"merchant": "CVS",
"date": "2018-07-22",
"amount": 58.00
}
],
"state": "CA",
"options": {
"min_confidence": 0.35,
"max_results": 25,
"include_unverified": false
}
}
| Field | Required | Notes |
|---|---|---|
purchases | yes | Array of 1–200 items. Each: description (string, required), merchant (string, optional), date (YYYY-MM-DD, optional), amount (number, optional). |
state | no | Two-letter US state code. Filters state-restricted classes. |
options.min_confidence | no | Default 0.35. Matches below this are dropped. Range 0–1. |
options.max_results | no | Default 25. Max 100. |
options.include_unverified | no | Default false. When false, settlements flagged unverified are excluded. |
{
"ok": true,
"matches": [
{
"settlement_id": "pork-price-fixing-antitrust",
"settlement_name": "Pork Price-Fixing Antitrust",
"confidence": 0.92,
"confidence_label": "high",
"match_reasons": [
"You bought bacon at Safeway in March 2016.",
"This settlement covers raw pork and bacon bought at grocery stores in 24 states (including CA) from June 2014 to June 2018."
],
"deadline": "2026-10-29",
"deadline_label": "Oct 29, 2026",
"estimated_payout": "not published",
"proof_required": "no proof",
"claim_url": "https://www.overchargedforpork.com",
"verified": true,
"state_restriction": null
}
],
"meta": {
"settlements_checked": 279,
"purchases_evaluated": 2,
"model": "magnitude-local",
"degraded": false,
"processing_ms": 1840
}
}
| Field | Notes |
|---|---|
settlement_id | The eligibility service's slug for the settlement. The dataset's canonical record id is the id field in settlements.json. |
confidence | 0–1. Never 1.0 — the API suggests, it does not determine eligibility. |
confidence_label | high (≥0.75) · medium (0.45–0.75) · low (<0.45). |
match_reasons | Plain-language sentences, one concrete fact each. No invented claims. |
estimated_payout | From the inventory, or "not published". Never estimated by the model. |
proof_required | no proof | id | documents | automatic | unverified. |
verified | true when verified against the official settlement site. |
state_restriction | e.g. "CA only", or null. |
| Band | Range | Meaning |
|---|---|---|
| high | 0.75–1.0 | Product, date range, and geography all clearly align. |
| medium | 0.45–0.75 | Likely eligible but one element is uncertain; match_reasons states what is uncertain. |
| low | 0–0.45 | Weak or circumstantial link. Returned only when min_confidence is set below 0.45. |
Expired settlements (deadline in the past) are never returned.
If the matching engine is unreachable, the endpoint falls back to keyword matching: confidence is capped at 0.5, meta.model is "keyword-fallback", and meta.degraded is true. Treat degraded results as a rough screen, not a determination.
| Scope | Limit |
|---|---|
| Free endpoints | 100 requests per 60 seconds per IP; contact us if you need more |
| Pro — all endpoints | 5,000 requests/day per API key |
Pro — /v1/eligibility/check | 60 requests/hour per key · 200 purchases per request · max_results ≤ 100 |
On Pro endpoints, exceeding a limit returns 429 with a retry_after field (seconds). Free endpoints are static files served through a CDN; the free limit above applies per IP.
All errors use a standard envelope:
{
"ok": false,
"error": "invalid_api_key",
"message": "The API key is missing or invalid."
}
| HTTP | error | Meaning |
|---|---|---|
| 400 | bad_request | Malformed JSON or wrong content type. |
| 401 | invalid_api_key | Missing or unknown Pro API key. |
| 405 | method_not_allowed | Wrong HTTP method for the endpoint. |
| 422 | validation_error | Request failed validation. Includes a fields array: [{"field": "purchases[3].date", "issue": "must be YYYY-MM-DD"}]. |
| 429 | rate_limited | Over quota. Includes retry_after (seconds). |
| 503 | engine_unavailable | Matching engine unreachable and fallback failed. Retry later. |
Purchase history is sensitive financial data. The eligibility endpoint: