Class Action Hero

API Documentation

Free settlement data for everyone. Pro tier for eligibility matching and higher limits. Base URL for all endpoints: https://classactionhero.app

Tiers: Free vs Pro

FreePro — $29/mo
Settlement inventory JSONYesYes
Story leads, RSS feedYesYes
Eligibility matching (/v1/eligibility/check)NoYes
Rate limit100 requests per 60 seconds per IP5,000 requests/day per key
API keyNot requiredRequired (Bearer)
SupportCommunityEmail

Pro signup: classactionhero.app/api/pro/

Journalist access

Independent journalists get the full API free — including six datasets built for investigative reporting. Commercial buyers pay. The public API stays free for everyone.

The four shelves

FreeJournalistPro — $29/moData / Enterprise — $299 / $999 / custom
Settlement inventory, story leads, RSSYesYesYesYes
Six journalist datasets (see below)NoYes — freeNoYes — paid
Eligibility matching (/v1/eligibility/check)NoNoYesYes
Rate limit100 requests per 60 seconds per IP5,000 requests/day5,000 requests/dayNegotiated
AttributionRequired — cite Class Action HeroRequired — cite Class Action HeroOptionalOptional
Bulk dumps, daily diffs, webhooks, white-label embeds, SLANoNoNoYes

The six datasets

Built for reporting; not available as APIs anywhere else, free or paid:

DatasetWhat it holds
Take ratesClaims filed ÷ class size, per settlement — what share of eligible people actually file
Advertised vs actual payoutsPublished "up to $X" vs the per-person amounts people actually received
Repeat offendersCompanies settling repeatedly: counts, totals paid, categories, over time
Unclaimed money + cy presUnclaimed funds per settlement; where cy pres awards go
Breach-to-settlement lagDays from breach disclosure to payout, per company and industry
Administrator performanceClaims 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.

Who qualifies

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.

Apply

Email press@classactionhero.app with:

  1. Your name
  2. Your outlet — or "independent"
  3. Who owns your outlet
  4. Two bylines (links to published pieces with your name on them)
  5. One line on the story you're reporting

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.

The press@classactionhero.app inbox is not live yet — applications open as soon as it is. The base API needs no key and works now.

Authentication

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.

Free endpoints

No key required. CORS open. Cached at the edge (5-minute stale-while-revalidate).

GET/api/settlements.jsonfree

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.

Settlement object

Schema v2: every record carries every field; a value that does not exist is null, never a missing key.

FieldTypeNotes
idstringStable record ID (the detail-page slug when a page exists). Cite this, not the name.
namestringSettlement name, display text.
statusstringopen | closed
deadlinestring | nullClaim deadline, YYYY-MM-DD; null when no date has been announced.
deadline_statusstringdated | tbd (tbd exactly when deadline is null)
deadlineLabelstringHuman-readable deadline.
fundstringPublished fund figure as display text.
fundNumnumber | nullTotal settlement fund in dollars. Set only when fundType is aggregate or verdict_estimate — never a per-person amount.
fundTypestringaggregate | per_person | verdict_estimate | unknown
perPersonMaxnumber | nullLargest stated per-person amount in dollars (cap, flat payment, or per-day rate).
currencystringISO 4217: USD (US files) | CAD (Canada file)
eligibilitystringWho qualifies, in plain language.
proofstringProof label, derived from proof_enum.
proof_enumstringnone | notice_id_only | tiered | required | automatic | unknown
proof_verbatimstring | nullProof language quoted from the official notice or claim form, when captured.
tier_capstring | nullPer-tier cap text quoted from the official notice, when captured.
statesarray | nullState codes the settlement is restricted to, sorted; null means nationwide.
urlstring | nullOfficial claim-filing URL; null when there is no public claim site (see url_note).
url_notestring | nullWhy there is no public claim URL, when recorded.
unverifiedbooleanTrue when the record has not yet been verified against the official source.
administratorstring | nullSettlement administrator, detected from the official claim site.
courtstring | nullCourt of record, when captured from primary documents.
case_numberstring | nullCase number, when captured from primary documents.
last_verifiedstring | nullDate the record's proof language was verified against the official source.
castringAnalyst notes on the record (may be empty).
bonusstringDerived from ca: the note itself when it is a CA-enhanced note, else empty.
sourcestringAlways "Class Action Hero".
source_urlstringAttribution URL.
listing_urlstring | nullDetail-page URL for the settlement, when one exists.
GET/api/closed-settlements.jsonfree

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.

GET/api/settlements-ca.jsonfree

Canadian settlements, same schema; amounts are in CAD — read the currency field. Sidecar: /api/settlements-ca.meta.json.

GET/api/settlements.meta.jsonfree

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).

GET/api/court-filings.jsonfree

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.

GET/api/cuts/free

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.

GET/api/openapi.jsonfree

OpenAPI 3.0 spec for this surface, generated from the baked payload — field types and nullability are measured from the data, not hand-written.

GET/api/story-leads.jsonfree

Pre-computed story leads for journalists: the 10 largest funds, the 10 closing soonest, and every settlement requiring no proof of purchase.

GET/api/feed.xmlfree

RSS 2.0 feed of open settlements ordered by deadline.

Pro endpoints

Require Authorization: Bearer YOUR_PRO_API_KEY. Served by the cah-api-tiers worker.

POST/v1/checkoutpro

Creates a Stripe checkout session for the $29/month Pro subscription. Returns a checkout URL to redirect the customer to.

Response

{
  "ok": true,
  "checkout_url": "https://checkout.stripe.com/..."
}
GET/v1/key-for-sessionpro

Returns your Pro API key after checkout completes. Call with the checkout session ID:

GET /v1/key-for-session?session_id=cs_test_abc123

Response

{
  "ok": true,
  "api_key": "cah_live_...",
  "created": "2026-10-17T00:00:00Z"
}
Store this key securely. It is shown once — if you lose it, contact support for a rotation.
POST/v1/stripe-webhookpro

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.

GET/v1/statuspro

Worker health check. No auth required.

{
  "ok": true,
  "service": "cah-api-tiers"
}

POST /v1/eligibility/check — reference

POST/v1/eligibility/checkpro new

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.

Request

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

Request fields

FieldRequiredNotes
purchasesyesArray of 1–200 items. Each: description (string, required), merchant (string, optional), date (YYYY-MM-DD, optional), amount (number, optional).
statenoTwo-letter US state code. Filters state-restricted classes.
options.min_confidencenoDefault 0.35. Matches below this are dropped. Range 0–1.
options.max_resultsnoDefault 25. Max 100.
options.include_unverifiednoDefault false. When false, settlements flagged unverified are excluded.

Response

{
  "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
  }
}

Match fields

FieldNotes
settlement_idThe eligibility service's slug for the settlement. The dataset's canonical record id is the id field in settlements.json.
confidence0–1. Never 1.0 — the API suggests, it does not determine eligibility.
confidence_labelhigh (≥0.75) · medium (0.45–0.75) · low (<0.45).
match_reasonsPlain-language sentences, one concrete fact each. No invented claims.
estimated_payoutFrom the inventory, or "not published". Never estimated by the model.
proof_requiredno proof | id | documents | automatic | unverified.
verifiedtrue when verified against the official settlement site.
state_restrictione.g. "CA only", or null.

Confidence rubric

BandRangeMeaning
high0.75–1.0Product, date range, and geography all clearly align.
medium0.45–0.75Likely eligible but one element is uncertain; match_reasons states what is uncertain.
low0–0.45Weak or circumstantial link. Returned only when min_confidence is set below 0.45.

Expired settlements (deadline in the past) are never returned.

Degraded mode

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.

Rate limits

ScopeLimit
Free endpoints100 requests per 60 seconds per IP; contact us if you need more
Pro — all endpoints5,000 requests/day per API key
Pro — /v1/eligibility/check60 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.

Errors

All errors use a standard envelope:

{
  "ok": false,
  "error": "invalid_api_key",
  "message": "The API key is missing or invalid."
}
HTTPerrorMeaning
400bad_requestMalformed JSON or wrong content type.
401invalid_api_keyMissing or unknown Pro API key.
405method_not_allowedWrong HTTP method for the endpoint.
422validation_errorRequest failed validation. Includes a fields array: [{"field": "purchases[3].date", "issue": "must be YYYY-MM-DD"}].
429rate_limitedOver quota. Includes retry_after (seconds).
503engine_unavailableMatching engine unreachable and fallback failed. Retry later.

Privacy

Purchase history is sensitive financial data. The eligibility endpoint: