---
title: "Enforcement + litigation matters — list, filter and search"
method: GET
path: "/enforcement/matters"
---

# Enforcement + litigation matters — list, filter and search

`GET /enforcement/matters`

## Request

- Base URL: `https://ai-law-tracker.com/api/v1`
- URL: `https://ai-law-tracker.com/api/v1/enforcement/matters`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Regulatory enforcement actions and private litigation involving AI, at MATTER level: forum, agency, parties, status, relief and the statutes invoked. One row per dispute, not per press release — an agency action with a complaint, a settlement and a final order is three rows on /v1/enforcement and ONE matter here.

OPEN AT EVERY TIER since 2026-08-22. It used to answer a hard 403 below Enterprise, which made the dataset invisible and therefore unsellable. What is metered instead is DEPTH: the assembled chain on /enforcement/matters/{matter_uid} — parties, relief amounts, the event timeline and the cited statutes — is sampled below the paid step. A record budget would have been theatre on a 91-row registry.

A SECOND GATE THAT IS NOT ABOUT MONEY: 30 of 91 matters are duplicates of another row or still carry an untranslated CAPTION, and are withheld from every caller not licensed for the raw registry — `meta.registry.withheld_not_publish_ready` reports how many THIS query hid. A further 6 ARE published with one descriptive field nulled and named in `unavailable_fields`; withholding a $1.4bn settlement because its forum_name has an untranslated clause would have been a worse answer. See /enforcement/coverage for the full breakdown.

READ `verification` BEFORE QUOTING ANYTHING. Every matter currently held is `single_source`.

An empty data[] means no matter matched — never that an agency has taken no action. /enforcement/sources says which of the 254 monitored sources are actually answering.

## Query parameters

- `jurisdiction` string
- `jurisdiction_level` string
- `forum_type` string
- `matter_type` string
- `matter_status` string
- `agency` string
- `ai_role` string
- `domain` string
- `verification` string
- `date_from` string, date
- `date_to` string, date
- `q` string
- `tier` string
- `sort` 'filed_date' | 'decided_date' | 'first_seen_at' | 'last_verified_at' | 'closed_date'
- `order` 'asc' | 'desc'
- `limit` integer
- `offset` integer

## Response `200`

Matching matters, plus what the tier and the readiness gate withheld.

- object
  - `api_version` string
  - `data` EnforcementMatter[]
    - `matter_uid` string: Stable key for fetching this matter again. AN OPAQUE KEY, NOT A DESCRIPTION — do not render it as a name. It is generated from whatever the ingest could parse and is demonstrably unreliable (one uid names RealPage for what is in fact the DOJ/LivCor consent decree). Read `caption`.
    - `caption` string: The matter as a human should read it. This is its name.
    - `jurisdiction_level` string
    - `jurisdiction_slug` string
    - `jurisdiction_name` string, nullable
    - `forum_type` string: See /enforcement/categories.
    - `forum_name` string, nullable
    - `matter_type` string: enforcement_action | civil_litigation | guidance_document | investigation | inquiry_6b. See /enforcement/categories.
    - `matter_status` string
    - `docket_number` string, nullable
    - `agency_code` string, nullable: FTC, DOJ, SEC, CFPB, EEOC, a state AG… Free text, not a closed vocabulary.
    - `ai_roles` string[]: How AI figures in the matter. See the ai_role vocabulary.
    - `filed_date` string, date, nullable: The date the SOURCE states the action was filed or opened, verbatim. NEVER our scrape date — that is `first_seen_at`, and confusing the two is the defect this field was rebuilt to remove. Null means the source did not state one; it is never inferred, and `date_source` below names where a non-null value came from.
    - `decided_date` string, date, nullable: The date the SOURCE states the matter resolved — settlement announced, consent order entered, final order, judgment. Null when unresolved or unstated.
    - `date_source` string, nullable: Which source field `filed_date` was lifted from, e.g. `ftc_case_timeline_oldest_entry`, `cfpb_listing_date_filed`, `tx_ag_listing_meta`, `doj_release_published_meta`. Published so a date can be traced rather than trusted. Always present when filed_date is.
    - `closed_date` string, date, nullable
    - `summary` string, nullable: Null on 42 of 91 matters.
    - `source_authority` string
    - `source_url` string: Where the claim came from. Never withheld at any tier — it is how you check our work.
    - `verification` string: Corroboration level. MEASURED 2026-08-22: every matter currently held is `single_source`, i.e. recorded from ONE official source with no second confirmation. Never withheld at any tier; read it before relying on any claim here.
    - `first_seen_at` string, date-time
    - `last_verified_at` string, date-time, nullable
    - `primary_domain_id` string
    - `primary_domain_label` string
    - `primary_branch_id` string
    - `primary_branch_label` string
    - `domains` object[]: All assigned subject domains, primary and secondary.
    - `is_canonical` boolean: False when another matter_uid already publishes this same source document.
    - `duplicate_of` string, nullable: The matter_uid to read instead. Present only on a non-canonical row.
    - `publish_ready` boolean: Canonical AND its CAPTION is in English. Rows where this is false are served only to a caller licensed for the raw registry.
    - `unavailable_fields` string[]: Present only when a DESCRIPTIVE field (forum_name, agency_code or summary) was nulled because it still carries untranslated internal working language. The matter itself is published; only these fields are not. A null WITHOUT this list means the source simply did not state a value.
    - `unavailable_reason` string: Why the fields above are null. Present only alongside unavailable_fields.
    - `enforcement_tier` string, nullable: A = an enforcement DECISION (complaint filed, consent order, settlement, civil penalty, judgment, cease-and-desist). B = an enforcement-adjacent SIGNAL (opened investigation, sweep, CID, enforcement advisory, 6(b) study order). NULL means the tier was never assessed — true of every matter recorded before 2026-08-22 — and does NOT mean B. Filter `tier=A` when the question is how many real enforcement decisions exist.
    - `ai_basis` object: WHY this matter is in an AI dataset. `matches` lists each term that fired, the field it fired in, the ai_role it implies, and a VERBATIM excerpt of the source text around it; `method` says whether the agency's own classification was used (e.g. the FTC industry tag "Technology > Artificial Intelligence") or only keywords. Published deliberately: it is the citation for the inclusion decision, so the corpus can be audited without re-reading every source.
    - `source_absent_fields` string[]: Fields the ingest LOOKED FOR and the source did not state. NOT the same as `unavailable_fields`, which is what WE withheld. This one is the agency's gap; that one is ours.
    - `industry_labels` string[]: Sector labels the SOURCE applied, verbatim (FTC industry/topic tags, DOJ ATR "Industry Code(s)"). Never inferred from the respondent's name.
    - `violation_labels` string[]: Violation types the SOURCE stated, verbatim (FTC "Enforcement Type"/"Type of Action", DOJ ATR "Case Violation(s)"). Never inferred from the conduct described.
    - `ingest_lane` string, nullable: Which writer produced the row. Provenance, not classification.
  - `meta` object
    - `total` integer: EXACT, never an estimate — the registry is 91 rows.
    - `total_is_estimate` boolean: Always false here. Present so a consumer need not remember which endpoints can promise an exact count.
    - `count` integer
    - `limit` integer
    - `offset` integer
    - `tier` string
    - `gated` string[]
    - `registry` object
      - `raw_registry_access` boolean
      - `withheld_not_publish_ready` integer
      - `withheld_reason` string, nullable
      - `chains` 'sample' | 'full'
      - `chains_open_at` string, nullable
    - `disclaimer` string
  - `attribution` string

## Other responses

- `400`: Invalid parameter.
- `503`: Enforcement backend unavailable.

---

[API](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api.md) · [All operations](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ai-law-tracker/apis/ai-law-tracker-public-laws-api/revisions/25403268a853?raw)
