Legal data

Realtime queries for due-diligence negative signals and disclosure links: US sanctions & export-control screening (CSL), competition cases (EU DG COMP · UK CMA), US lobbying disclosures (LDA), the UK political-funds register (UK EC), international arms transfers (SIPRI), US regulatory search across the Federal Register, the current Code of Federal Regulations (eCFR), federal/state case law (CourtListener) and UK court judgments (TNA Find Case Law). All commands run locally on your machine with no credentials: no platform-side quota, each upstream's own limits apply, and repeats within a cache lifetime are served from your local cache without hitting it.

Commands at a glance

Every direct-lookup face in this domain — each has its own section below (one-line positioning / parameters / a real example / boundaries).

Command Jurisdiction What it answers
legal afdb_debarred_entities GLOBAL African Development Bank debarment screening (cross-debarment edges included)
legal ca_sema_sanctions CA Canada SEMA sanctions screening (persons/entities/ships, IMO join key)
legal co_sic_sanctions CO Colombian SIC firm-sanctions register search.
legal courtlistener_opinions_search US US federal & state case-law search (CourtListener)
legal csl_screening_list US US sanctions & export-control list screening (CSL)
legal dgcomp_cases_search EU EU competition case search (DG COMP)
legal ecfr_search US US federal regulations search (eCFR)
legal ecfr_titles US US federal regulations title map (eCFR)
legal federalregister_documents US US Federal Register document search
legal gb_cma_case GB Single CMA case dossier (history + decision documents)
legal gb_cma_cases GB UK Competition & Markets Authority case search
legal gb_ec_donations GB UK political donations (Electoral Commission)
legal gb_ec_loans GB UK political loans (Electoral Commission)
legal gb_gazette_notices GB UK official gazette notice search (The Gazette, insolvency-code preset)
legal gb_tna_caselaw_judgment GB Single UK judgment dossier (party roles / judges / full text)
legal gb_tna_caselaw_search GB UK court-judgment search (The National Archives Find Case Law)
legal idb_debarred_entities GLOBAL Inter-American Development Bank sanctions search (violation family × cross-debarment marker)
legal ie_revenue_defaulters IE Irish Revenue tax-defaulters list (court penalties / settlements, two tables)
legal lda_filings US US lobbying disclosure search (LDA)
legal sipri_trades_search GLOBAL International arms-transfer search (SIPRI)
legal us_occ_enforcements US US OCC monthly enforcement actions (bank orders/CMPs + IAP prohibition orders, docket key)
legal wb_debarred_firms GLOBAL World Bank debarred firms (SUPP_ID shared with the award stream)

Realtime queries

The examples below are real command output, excerpts only, unmodified. Queries are realtime — running a command returns whatever the official source holds at that moment, so figures shift as upstreams update.

The examples below omit the leading executable name — prepend agentdata (or python -m agentdata ) for a full command.

African Development Bank debarment screening (cross-debarment edges included)

Parameters:

Flag Required Meaning
--name no Entity or individual name — matches any part of the name, ignoring case
--type no Subject type: FIRM or INDIVIDUAL (exact match, ignoring case)
--basis no Debarment reason — matches any part of the Basis text. Cross-debarments are marked by bank token (WBG / ADB / IDB / EBRD), and the same marker is written both with spaces and with hyphens, so match the token alone
--limit no Rows to return, 1–100 (default 20). The whole register is screened locally, so total_matched in the result is the exact number of hits

**Note:**Upstream punctuation is inconsistent ("CROSS DEBARMENT : WBG" with spaces vs "CROSS-DEBARMENT: ADB" hyphenated) — --basis is a contains-match, don't quote the full phrase; individual rows ship surnames in full caps (ATABEKOV), verbatim. The site sits behind a Cloudflare UA-fingerprint gate; the SDK carries the full browser-header suite built in, nothing to configure.

$ legal afdb_debarred_entities --name "CHINA RAILWAY" --limit 3
{
  "reason": "AfDB debarment register: 39 of 1440 rows matched (name contains \"CHINA RAILWAY\"), returning top rows — Basis carries the cross-debarment edge (WBG/ADB/IDB/EBRD tokens; To empty = ongoing); zero hits = not on the AfDB register",
  "result": {
    "rows": [
      { "Type": "FIRM", "Name": "China Railway 20th Bureau Group Corporation Ltd", "Nationality": "China",
        "From": "2026-09-24", "To": "2027-10-23", "Basis": "DEBARMENT:AFDB", "Notes": "" }
    ],
    "total_matched": 39,
    "scanned_rows": 1440,
    "limit_applied": 3,
    "params": { "name": "CHINA RAILWAY", "type": null, "basis": null }
  },
  "evidence": [
    { "quote": "China Railway 20th Bureau Group Corporation Ltd (FIRM, China) 2026-09-24→2027-10-23 · DEBARMENT:AFDB",
      "url": "https://www.afdb.org/en/projects-operations/debarment-and-sanctions-procedures" }
  ],
  "source": { "provider": "afdb", "execution": "local", "from_cache": false },
  "jurisdiction": "GLOBAL"
}

**Reading it:**An empty To means the debarment is ongoing (169 rows ship that way); Basis is itself the cross-debarment edge — the four MDBs honouring each other's debarments, self-evidenced here. Narrow with --type FIRM/INDIVIDUAL and --basis by bank token (WBG/ADB/IDB/EBRD). The whole register is cached for 24h; any number of screenings after that cost no network.

Canada SEMA sanctions screening (persons/entities/ships, IMO join key)

Parameters:

Flag Required Meaning
--name no Designated name — matches any part of the name or of an alias, ignoring case; the result echoes which one hit
--country no Country — matches any part of the country cell, which is written in both languages (Syria and Syrie both hit)
--limit no Rows to return, 1–100 (default 20). The whole list is screened locally, so total_matched in the result is the exact number of hits

**Note:**Tags and values are bilingual, verbatim (paired tag names like Country-Pays, values like "Syria / Syrie", ship types carrying a pipe between the language halves); a few EntityOrShip values ship a trailing semicolon — upstream data quality, kept as-is; person rows assemble GivenName × LastName with the surname in full caps.

$ legal ca_sema_sanctions --country Syria --limit 3
{
  "reason": "Canada SEMA sanctions list: 262 of 5708 listings matched, country contains \"Syria\" — bilingual cells verbatim (Syria / Syrie), schedule = the SEMA schedule reference; zero hits = not designated under SEMA",
  "result": {
    "rows": [
      { "kind": "entity", "name": "General Intelligence Directorate;", "aliases": [],
        "country": "Syria / Syrie", "ship_imo": null, "schedule": "Part 1", "item": "1",
        "date_of_listing": "2011-05-24", "matched_on": null }
    ],
    "total_matched": 262,
    "scanned_rows": 5708,
    "limit_applied": 3,
    "params": { "name": null, "country": "Syria" }
  },
  "evidence": [
    { "quote": "General Intelligence Directorate; (entity, Syria / Syrie) · listed 2011-05-24",
      "url": "https://www.international.gc.ca/world-monde/international_relations-relations_internationales/sanctions/consolidated-consolide.aspx?lang=eng" }
  ],
  "source": { "provider": "ca_sema", "execution": "local", "from_cache": false },
  "jurisdiction": "CA"
}

Reading it:--name screens both the primary name and aliases (matched_on echoes the hit face); --country is a contains-match over the bilingual cell — Syria and Syrie both hit. 731 ship rows carry an IMO number (ship_imo), joining straight onto the THETIS-MRV / Paris MoU faces. The 2.9MB register is cached for 24h.

Colombian SIC firm-sanctions register search.

Parameters:

Flag Required Meaning
--where no SoQL filter passed through verbatim (e.g. upper(multado) like '%ECOPETROL%' — multado is the sanctioned-party column; 3,938 firm sanctions since 2013)
--limit no Rows per page, 1–500 (default 20)
--offset no Paging offset, 0-based (no total echo on this register — page by offset)
--order no Sort order (e.g. fecha_emitida DESC; the default is ingestion order, not time)

**Note:**The company key is the sanctioned-party name (the multado column, name-only — the register carries no NIT column; joining onto co_rues_companies NITs is the corpus line's job); filter by name via --where 'upper(multado) like '%ECOPETROL%'' (raw SoQL passthrough); no total echo on this register — page by --offset, don't guess depth from the reply.

$ legal co_sic_sanctions --limit 3 --order "fecha_emitida DESC"
{
  "reason": "Colombia SIC sanctions register: 3 rows returned (enumerate from the head of the register; the corpus holds 3,938 firm sanctions 2013→, counted at admission) — row = multado (sanctioned party) × valor (COP) × conducta × sector; name-only key, join onto NIT via co_rues_companies on the corpus line",
  "result": {
    "rows": [
      { "radicado": "24 503714", "res_sancion": "40639", "fecha_emitida": "2026-05-29T00:00:00.000",
        "multado": "MICREDITOYA MICROFINANCIERA SAS", "valor": "353999520",
        "conducta": "Usura", "sector": "Servicios de financiación" },
      { "radicado": "23 155249", "res_sancion": "40643", "fecha_emitida": "2026-05-29T00:00:00.000",
        "multado": "COOPERATIVA DE AHORRO Y CREDITO FINCOMERCIO LTDA - FINCOMERCIO", "valor": "98333200",
        "conducta": "Falta de información para conocer las características del crédito", "sector": "Servicios de financiación" },
      { "radicado": "24 224232", "res_sancion": "40197", "fecha_emitida": "2026-05-28T00:00:00.000",
        "multado": "GABRIEL AMARANTO SUAREZ MANOTAS", "valor": "2809520",
        "conducta": "Presentar documentación falsa o adulterada al Ministerio de Comercio, Industria y Turismo, a las Cámaras de Comercio o a las entidades oficiales que la soliciten", "sector": "Turismo" }
    ],
    "count": 3,
    "limit_applied": 3,
    "params": { "$limit": 3, "$offset": 0, "$order": "fecha_emitida DESC" }
  },
  "evidence": [
    { "quote": "MICREDITOYA MICROFINANCIERA SAS — Usura (Servicios de financiación), COP 353999520, res. 40639 of 2026-05-29",
      "url": "https://www.datos.gov.co/Comercio-Industria-y-Turismo/Sanciones-impuestas-en-firme-por-la-SIC/73dx-n59j" }
  ],
  "source": { "provider": "co_sic", "execution": "local", "from_cache": false },
  "query": { "source": "raw", "upstream": { "$limit": 3, "$offset": 0, "$order": "fecha_emitida DESC" } },
  "jurisdiction": "CO"
}

Reading it:$order is the only sorting channel (the default is ingestion order, not time — page the register newest-first with --order "fecha_emitida DESC"). The seven columns pass through verbatim with no masking slot: multado includes individual names, the SIC's own public record. 24h TTL (Socrata anonymous tier, same platform as co_secop/co_rues).

US federal & state case-law search (CourtListener)

Parameters:

Flag Required Meaning
--q no Full-text query
--case-name no Case-name filter
--court no Court id, e.g. calctapp / scotus
--judge no Judge name filter
--docket-number no Docket number filter
--filed-after no Filed on/after YYYY-MM-DD
--filed-before no Filed on/before YYYY-MM-DD
--order-by no Sort, e.g. score desc
--cursor no Opaque cursor (feed next_cursor)

**Note:**The full ~8.3M-opinion corpus travels on the S3 batch line — this is the search face, not bulk download; give at least one search condition.

$ legal courtlistener_opinions_search --q "misappropriation of trade secrets"
{
  "reason": "CourtListener:q=misappropriation of trade secrets共 9,021 判例,本页 20 条,首选 Home Preferred Home Care, Ltd. v. Hiscox Ins. Co.(Ohio Court of Appeals,2023-03-30)——next_cursor 续页",
  "result": {
    "total": 9021,
    "count": 20,
    "rows": [
      { "cluster_id": 9388138, "docket_id": 67110914,
        "case_name": "Home Preferred Home Care, Ltd. v. Hiscox Ins. Co.",
        "court": "Ohio Court of Appeals", "court_id": "ohioctapp",
        "date_filed": "2023-03-30", "docket_number": "2022CA00122",
        "status": "Published", "judge": "King",
        "citations": ["2023 Ohio 1059"] }
    ],
    "next_cursor": "cz0zMC45MzA0OTYmcz0yNzM2OTM4JnQ9byZkPTIwMjYtMTAtMjYmcD0y …"
  },
  "evidence": [
    { "quote": "Home Preferred Home Care, Ltd. v. Hiscox Ins. Co. — Ohio Court of Appeals — 2023-03-30 — 2023 Ohio 1059",
      "url": "https://www.courtlistener.com/opinion/9388138/home-preferred-home-care-ltd-v-hiscoh-ins-co/" }
  ]
}

Reading it:citations holds the citation form (report-ready as-is); court names the court and --court narrows by court id (e.g. scotus / calctapp); --case-name / --judge / --docket-number / --filed-after filter further. Upstream pages are fixed at 20 rows — feed next_cursor back to page.

US sanctions & export-control list screening (CSL)

Parameters:

Flag Required Meaning
--name no Subject name (substring, case-insensitive; matches name + alt_names; required — a missing name returns a JSON usage-error envelope)
--source no List-family filter, substring (e.g. "Entity List", "SDN", "Sectoral")
--type no Subject type: Entity / Individual / Vessel / Aircraft (many rows carry no type)
--limit no Rows (default 20, cap 100; total_matched echoes the full count)

**Note:**Zero hits = a clean screen (a legal answer, not an error); --source / --type narrow by list family / subject type; this face covers the US consolidated lists only — UN/EU/UK lists are not in it.

$ legal csl_screening_list --name "Rosneft" --limit 3
{
  "reason": "CSL 合并筛查阳性:全册 26173 行(12 名单族)命中 10 条「Rosneft」,返回 3 行——matched_on=name|alt_names 命中面,零命中=筛查通过",
  "result": {
    "total_matched": 10,
    "scanned_rows": 26173,
    "limit_applied": 3,
    "rows": [
      { "name": "Open Joint-Stock Company Rosneft Oil Company",
        "alt_names": ["OJSC Rosneft Oil Company", "Rosneft Oil Company", "Rosneft"],
        "matched_on": "name",
        "matched_value": "Open Joint-Stock Company Rosneft Oil Company",
        "type": "Entity",
        "source_list": "Sectoral Sanctions Identifications List (SSI) - Treasury Department" }
    ]
  },
  "evidence": [
    { "quote": "Open Joint-Stock Company Rosneft Oil Company — SSI (Treasury)",
      "url": "https://trade.gov/consolidated-screening-list" }
  ]
}

Reading it:matched_on names the matching face — a document saying “Rosneft Oil Company” still lands the full-name row through the alt_names pool, so don't stop at the first row; total_matched is the full-register hit count (10 here, across SDN/SSI and other families). source_list names the list family and agency. The full CSV is cached 24h and scanned locally — no per-query upstream calls.

EU competition case search (DG COMP)

Parameters:

Flag Required Meaning
--query no Raw ES bool query, JSON text, e.g. {"bool":{"must":\[{"term":{"caseInstrument":"SA"}}\]}}
--name no Party/case-name shortcut: text query over caseTitle and two sibling fields (XOR with --query; use --query for raw DSL)
--instrument no Case type: AT antitrust / M merger / SA state aid / DMA Digital Markets Act
--text no Extra full-text condition (empty = none)
--page no Page number
--limit no Rows, 1–100 (larger asks silently yield 100)

**Note:**A hit means the case/party name contains the term (wide recall — human review required); results are case cards — follow each row's official link to the case page for decision documents. --limit caps at 100 — larger asks silently return 100 (probed upstream).

$ legal dgcomp_cases_search --name "Google" --limit 3
{
  "reason": "DG COMP:命中 20 案(当事方名/案名含「Google」),返回 3 行——SA 案 title=受益企业名(补贴事件流)",
  "result": {
    "total": 20,
    "rows": [
      { "case_number": "SA.124330", "title": "SPOT - Google", "instrument": "SA", "member_state": "BEL",
        "decision_date": null, "initiation_date": "2026-07-23",
        "url": "https://competition-cases.ec.europa.eu/search?caseNumber=SA.124330" },
      { "case_number": "M.4731", "title": "GOOGLE / DOUBLECLICK", "instrument": "M",
        "decision_date": "2008-03-10",
        "url": "https://competition-cases.ec.europa.eu/search?caseNumber=M.4731" }
    ],
    "limit_applied": 3
  },
  "evidence": [
    { "quote": "SA.124330 SPOT - Google(SA,—)",
      "url": "https://competition-cases.ec.europa.eu/search?caseNumber=SA.124330" }
  ],
  "source": { "provider": "dgcomp", "execution": "local", "from_cache": true, "fetched_at": "2026-10-21T03:05:32.900Z" }
}

Reading it:--instrument AT/M/SA filters by case type (antitrust / merger / state aid) — the SA face is a state-aid event stream. case_number is the stable key; decision documents come from each row's official link. 7-day TTL.

US federal regulations search (eCFR)

Parameters:

Flag Required Meaning
--q no Topic term (required — otherwise a JSON usage-error envelope)
--page no Page number (default 1)
--limit no Rows (default 20, cap 100)
--date no Point-in-time date YYYY-MM-DD — section versions in force on that date (omit = current text; e.g. asbestos: 1,436 sections current vs 339 at 2024-01-01)

Note:--q is required (a missing one returns a JSON usage-error envelope, not a crash); --limit caps at 100; hit counts are section-level, not full-text-level — for full-text search over the Federal Register's daily release stream use federalregister_documents.

$ legal ecfr_search --q asbestos --limit 3
{
  "reason": "eCFR 现行态:全库命中 1436 节(页 1/479),返回 3 行——coords=法典七级坐标;starts_on~ends_on=该版条款生效窗(节级变化语义,非全文检索);现行全文流走 legal fulltext(FR 日报)",
  "result": {
    "rows": [
      { "coords": "40 CFR Part 763 Subpart E Appendix D to Subpart E of Part 763",
        "hierarchy": { "title": "40", "subtitle": null, "chapter": "I", "subchapter": "R", "part": "763", "subpart": "E",
                       "subject_group": null, "section": null, "appendix": "Appendix D to Subpart E of Part 763" },
        "headings": { "title": "Protection of Environment", "subtitle": null, "chapter": "Environmental Protection Agency",
                      "subchapter": "Toxic Substances Control Act", "part": "<strong>Asbestos</strong>",
                      "subpart": "<strong>Asbestos</strong>-Containing Materials in Schools", "subject_group": null, "section": null,
                      "appendix": "Transport and Disposal of <strong>Asbestos</strong> Waste\n" },
        "type": "Appendix", "starts_on": "2019-08-16", "ends_on": "2019-08-22",
        "change_types": ["effective_cross_reference"], "removed": false, "reserved": false,
        "structure_index": 340276, "score": 44.185383,
        "excerpt": "activities from receipt of the containerized <strong>asbestos</strong> waste at the generation site until it has<span class=\"elipsis\">…</span>pickup site, the estimated quantity of <strong>asbestos</strong> waste, types of containers used, and the<span class=\"elipsis\">…</span>operator to transfer responsibility for the <strong>asbestos</strong> waste. A copy of the form signed by the" }
    ],
    "count": 3, "limit_applied": 3, "total": 1436, "total_pages": 479, "current_page": 1,
    "description": "Changes to sections matching 'asbestos'"
  },
  "evidence": [
    { "quote": "40 CFR Part 763 Subpart E Appendix D to Subpart E of Part 763|Appendix|Asbestos|生效 2019-08-16~2019-08-22",
      "url": "https://www.ecfr.gov/current/title-40" },
    { "quote": "40 CFR Part 763 Subpart E Appendix D to Subpart E of Part 763|Appendix|Asbestos|生效 2019-07-17~2019-08-15",
      "url": "https://www.ecfr.gov/current/title-40" }
  ],
  "source": { "provider": "ecfr", "execution": "local", "from_cache": false, "observed_at": "2026-10-29T11:26:37.266Z" }
}

**Reading it:**Hits are a section-level version stream — a provision amended repeatedly yields multiple rows, one per effective window (the two evidence rows above are consecutive versions of the same appendix); coords is the legal citation and hierarchy/headings carry the same coordinate in structured and human-readable form (hit terms carry <strong> highlighting); excerpt is a highlighted, ellipsized window of the source text; --date point-in-time search (e.g. 2024-01-01) keeps only versions in force that day — asbestos shrinks from 1,436 current sections to 339.

US federal regulations title map (eCFR)

**Note:**A zero-parameter catalog face — all 50 titles return in one call, no filters, no paging; it is the title-level catalog, section-level queries go through ecfr_search.

$ legal ecfr_titles
{
  "reason": "eCFR 目录:50 册(现行 49),日更水位 as_of=2026-10-27——册号+册名+最近修正/发布日;search 按节级查现行态走 ecfr_search",
  "result": {
    "count": 50,
    "active": 49,
    "as_of": "2026-10-27",
    "titles": [
      { "number": 1, "name": "General Provisions", "latest_amended_on": "2022-12-29", "latest_issue_date": "2026-08-10", "up_to_date_as_of": "2026-10-27", "reserved": false },
      { "number": 35, "name": "Reserved", "latest_amended_on": null, "latest_issue_date": null, "up_to_date_as_of": null, "reserved": true },
      { "number": 41, "name": "Public Contracts and Property Management", "latest_amended_on": "2026-10-26", "latest_issue_date": "2026-10-26", "up_to_date_as_of": "2026-10-27", "reserved": false }
    ]
  },
  "evidence": [
    { "quote": "Title 1 General Provisions(修正 2022-12-29,整合至 2026-10-27)", "url": "https://www.ecfr.gov/current/title-1" }
  ],
  "source": { "provider": "ecfr", "execution": "local", "from_cache": true, "fetched_at": "2026-10-29T10:08:43.673Z" }
}

Reading it:number+name are the title number and name (the volume you cite CFR by, e.g. 40 = environmental protection); latest_amended_on is the last amendment date and latest_issue_date the last issue date (two different semantics); as_of is the library-wide integration watermark (eCFR integrates daily); title 35 is a reserved placeholder (all date columns null) — 49 titles are actually in force.

US Federal Register document search

Parameters:

Flag Required Meaning
--q yes Query term (quoted phrases go exact)
--startdt no Publication date YYYY-MM-DD from (a bare end auto-completes to 1994-01-01)
--enddt no Publication date to (a bare start auto-completes to today)
--order no Result order: relevance / newest / oldest / executive_order_number (the fourth sorts by executive-order number)
--doc-type no Document type, closed set: RULE / PRORULE / NOTICE / PRESDOCU (wrong values silently yield 0 rows upstream — validated locally)
--agencies no Agency slug, e.g. environmental-protection-agency (the full list lives at GET /api/v1/agencies)
--cfr-title no CFR title number, e.g. 40 (environment)
--cfr-part no CFR part or range, e.g. 763 or 1-50 (requires --cfr-title)
--page no Page number
--limit no Rows (cap 50 — a platform-side limit; the upstream allows 1000)

**Note:**Coverage starts at 1994; --limit politeness cap 50 (upstream allows 1000); quoted phrases match exactly.

$ legal federalregister_documents --q "sanctions" --limit 3
{
  "reason": "Federal Register:10000 命中(1994+ 全文级),返回 3 行——document_number 是稳定键,单档 raw_text_url 供语料批线取全文",
  "result": {
    "total": 10000,
    "rows": [
      { "document_number": "2026-19678", "title": "Sanctions Penalties Regulations", "type": "Rule",
        "publication_date": "2026-09-25",
        "abstract": "The Department of the Treasury's Office of Foreign Assets Control (OFAC) is adding the Sanctions Penalties Regulations…",
        "citation": null }
    ],
    "limit_applied": 3
  },
  "evidence": [
    { "quote": "Sanctions Penalties Regulations — Rule, 2026-09-25",
      "url": "https://www.federalregister.gov/documents/2026-19678" }
  ]
}

Reading it:document_number is the stable key (citations and full-text retrieval hang off it); type is the document type (Rule / Proposed Rule / Notice …); a single date end auto-completes the other (1994-01-01 / today).

Single CMA case dossier (history + decision documents)

Parameters:

Flag Required Meaning
--slug yes Case slug (from gb_cma_cases rows; pasting the full gov.uk link also works — the prefix is stripped)

**Note:**The single-case face requires --slug — take it from an gb_cma_cases row (pasting the full gov.uk link also works, the prefix is stripped); a slug outside the register returns zero rows.

$ legal gb_cma_case --slug google-beatthatquote-com
{
  "reason": "UK CMA 单案:Google / BeatThatQuote.com——1 段演变(最近:First published.),1 份决定/通告 PDF;首次发布 2011-07-01T10:00:00+01:00",
  "result": {
    "slug": "google-beatthatquote-com",
    "content_id": "99eb6c35-f8f3-4e6a-bb0f-d31bdae4e7c6",
    "title": "Google / BeatThatQuote.com",
    "description": "OFT closed case: Completed acquisition by Google Inc. of BeatThatQuote.com Limited.",
    "document_type": "cma_case",
    "first_published_at": "2011-07-01T10:00:00+01:00",
    "public_updated_at": "2011-07-01T10:00:00+01:00",
    "updated_at": "2026-10-14T11:55:15+01:00",
    "withdrawn": false,
    "change_history": [
      { "note": "First published.", "public_timestamp": "2011-07-01T09:00:00Z" }
    ],
    "attachments": [
      { "title": "Google-BeatThatQuote.pdf",
        "url": "https://assets.digital.cabinet-office.gov.uk/media/555de311ed915d7ae200005f/Google-BeatThatQuote.pdf",
        "content_type": "application/pdf", "content_id": "bd0691a5-fa72-4e07-8ebf-9eb5d8639568" }
    ],
    "body_html": "<p>Full text of the decision: <span id=\"attachment_bd0691a5-fa72-4e07-8ebf-9eb5d8639568\" class=\"attachment-inline\"><a href=\"https://assets.digital.cabinet-office.gov.uk/media/555de311ed915d7ae200005f/Google-BeatThatQuote.pdf\">Google-BeatThatQuote.pdf</a></span></p>",
    "organisations": ["Competition and Markets Authority"],
    "url": "https://www.gov.uk/cma-cases/google-beatthatquote-com"
  },
  "evidence": [
    { "quote": "Google-BeatThatQuote.pdf(application/pdf)",
      "url": "https://assets.digital.cabinet-office.gov.uk/media/555de311ed915d7ae200005f/Google-BeatThatQuote.pdf" }
  ],
  "source": { "provider": "gb_cma", "execution": "local", "from_cache": false, "observed_at": "2026-10-30T07:35:12.802Z" }
}

Reading it:content_id is the stable UUID key (list rows don't carry it — persist against it); change_history runs newest→oldest, [0] is the latest development (this case has only its First published entry); attachments holds the decision/notice PDF family — this case's Google-BeatThatQuote.pdf opens directly; body_html is the case page's summary verbatim. This one is an OFT-era transferred record (the description says "OFT closed case") — cases from before competition powers moved into the CMA in 2014 are still covered.

UK Competition & Markets Authority case search

Parameters:

Flag Required Meaning
--q no Case query (matches titles/descriptions; omit to enumerate the full ~2,600-case register — case names are party pairs, e.g. "Google / BeatThatQuote.com")
--count no Rows per page, 1–100 (default 20; the 100 cap is our politeness limit — the upstream has no wall)
--start no Offset pagination: row to start from (default 0)

**Note:**Upstream is param-minimalist: only --q/--count/start (organisations/order combos return 422); list rows carry no content_id (upstream _id is the page path, not a UUID — don't use it as a key).

$ legal gb_cma_cases --q google --count 5
{
  "reason": "UK CMA 案库:命中 24 案,返回 5 行(检索词「google」)——案名=当事公司对(并购/调查案),单案详情走 gb_cma_case(slug=行内 slug)",
  "result": {
    "total": 24,
    "rows": [
      { "slug": "google-beatthatquote-com", "title": "Google / BeatThatQuote.com",
        "public_timestamp": "2011-07-01T09:00:00Z",
        "organisations": ["Competition and Markets Authority"],
        "url": "https://www.gov.uk/cma-cases/google-beatthatquote-com" },
      { "slug": "googles-mobile-platform", "title": "Google's mobile platform",
        "public_timestamp": "2026-08-14T11:08:23Z",
        "organisations": ["Competition and Markets Authority"],
        "url": "https://www.gov.uk/cma-cases/googles-mobile-platform" }
    ],
    "count": 5, "limit_applied": 5
  },
  "evidence": [
    { "quote": "Google / BeatThatQuote.com — 2011-07-01", "url": "https://www.gov.uk/cma-cases/google-beatthatquote-com" }
  ]
}

Reading it:slug is the join key — agentdata legal gb_cma_case --slug <row slug> fetches the full dossier (the stable content_id UUID lives on the detail face; change_history runs newest→oldest, [0] is the latest development; attachments holds the decision/notice PDFs). --count is politeness-capped at 1-100; omit --q to enumerate the whole live register (~2,591 cases).

UK political donations (Electoral Commission)

Parameters:

Flag Required Meaning
--query yes Donor / regulated-entity name (contains match; required)
--from no Window start YYYY-MM-DD (default = register origin 2001-02-16)
--to no Window end (default today)
--start no Offset
--limit no Rows, 1–50 (larger asks silently yield 50)

**Note:**Donor names use the full legal form (J C Bamford Excavators Ltd ≠ the brand "JCB") — try both forms. --limit caps at 50 (upstream hard clamp); page deeper with --start.

$ legal gb_ec_donations --query "J C Bamford" --limit 3
{
  "reason": "UK EC 政治捐款:167 笔(「J C Bamford」,窗口 2001-02-16~2026-10-27;上限 50 行——上游 rows 硬钳 2026-10-26 实测)",
  "result": {
    "total": 167,
    "rows": [
      { "donor_or_lender": "J C Bamford Excavators Ltd",
        "recipient": "Conservative and Unionist Party", "recipient_registration": "00561597",
        "value_gbp": 10000.0, "date": "2026-04-22", "type_description": "Cash", "ec_ref": "C0840321" },
      { "donor_or_lender": "J C Bamford Excavators Ltd",
        "recipient": "Conservative and Unionist Party", "recipient_registration": "00561597",
        "value_gbp": 5000.0, "date": "2026-04-01", "type_description": "Cash", "ec_ref": "C0838114" }
    ],
    "date_range": { "from": "2001-02-16", "to": "2026-10-27" }
  },
  "evidence": [
    { "quote": "捐款 J C Bamford Excavators Ltd → Conservative and Unionist Party £10000.0(2026-04-22)",
      "url": "https://search.electoralcommission.org.uk/" }
  ],
  "source": { "provider": "ukec", "execution": "local", "from_cache": false, "observed_at": "2026-10-27T10:03:01.338Z" }
}

Reading it:--from/--to defaults to the register's full history (from 2001-02-16); ec_ref is the official lookup anchor. 24h TTL (quarterly cadence).

UK political loans (Electoral Commission)

Parameters:

Flag Required Meaning
--query yes Lender / borrower name (contains match; required)
--start no Offset
--limit no Rows, 1–50 (larger asks silently yield 50)

**Note:**Lender names use the full legal form too (try both forms); --limit caps at 50 (upstream hard clamp); page deeper with --start.

$ legal gb_ec_loans --query "J C Bamford" --limit 3
{
  "reason": "UK EC 零命中:「J C Bamford」无政治贷款记录(空结果是合法答案)",
  "result": {
    "total": 0,
    "rows": []
  },
  "evidence": [],
  "source": { "provider": "ukec", "execution": "local", "from_cache": false, "observed_at": "2026-10-27T10:03:02.907Z" }
}

**Reading it:**Zero hits is a legal answer, not a failure — no political loan on record is a different statement from "no donations either"; never read the two faces as one. The upstream loans endpoint takes no date-window parameters (only the donations face has --from/--to). 24h TTL.

UK official gazette notice search (The Gazette, insolvency-code preset)

Parameters:

Flag Required Meaning
--text no Full-text contains term (over the notice body and title)
--noticetypes no Notice code(s), comma- or +-joined (e.g. 2410,2432) — event filtering is by notice code only; the lookalike noticecode= param is ignored upstream, so rewrite commands copied from elsewhere onto this one
--insolvency no The corporate-insolvency code-chapter preset (13 codes: winding-up resolutions, liquidator appointments, administrators, cessations…), union'd with --noticetypes
--start-date no Publish-window start YYYY-MM-DD
--end-date no Publish-window end YYYY-MM-DD
--page no Page number (default 1)
--page-size no Rows per page, 1–100 (default 20; 100 is the upstream hard cap)
--sort no Sort: latest-date (default) or oldest-date

**Note:**Give at least one filter (--text/--noticetypes/--insolvency/a date window) — a bare search means enumerating all 4,887,099 notices and is refused locally; whole-register needs go through the official bulk-download batch line, this is a targeted search face. Upstream page-size hard cap: 100.

$ legal gb_gazette_notices --text "acme" --insolvency --page-size 5
{
  "reason": "The Gazette: 25 notices match, 5 rows on page 1, text \"acme\", codes 2404+…+2702 — title = the company name on corporate insolvency codes (2432 liquidator, 2410 administrator, 2431 cessation); placed_by = liquidator/administrator or the edition; geo = the registered office",
  "result": {
    "total": 25,
    "count": 5,
    "page": 1,
    "page_size": 5,
    "rows": [
      { "notice_id": "L-56774-157", "notice_code": "2431", "category": "Resolutions for Winding-up",
        "title": "Resolutions for Winding-up", "placed_by": "User Migration", "status": "published",
        "published": "2002-12-06T00:00:00", "place_lat": null, "place_long": null,
        "url": "https://www.thegazette.co.uk/notice/L-56774-157",
        "content": "<div><p>Name of Company: ACME …" }
    ],
    "params": { "text": "acme", "results-page": 1, "results-page-size": 5, "noticetypes": "2404+2408+2410+2411+2414+2421+2422+2423+2424+2431+2432+2607+2702" }
  },
  "evidence": [
    { "quote": "Resolutions for Winding-up — 2002-12-06 — company name inside the notice content (a legacy migration row)", "url": "https://www.thegazette.co.uk/notice/L-56774-157" }
  ],
  "source": { "provider": "gazette", "execution": "server", "from_cache": false },
  "jurisdiction": "GB"
}

**Reading it:**Event filtering is by notice code only: --insolvency expands the 13-code corporate-insolvency chapter (2432 liquidator appointment, 2410 administrator, 2431 winding-up resolution…) or build your own with --noticetypes. On modern rows title is the company name and placed_by the insolvency practitioner; on legacy 2002 migration rows title = the category and placed_by = "User Migration" — the company name lives in content (the example is that shape). The upstream total arrives as a string and is converted locally.

Single UK judgment dossier (party roles / judges / full text)

Parameters:

Flag Required Meaning
--document-uri yes Document URI (any of the three uri forms from search rows: legacy ewhc/admin/2026/2298, new-style d-, tna.; a pasted full link is stripped automatically)

**Note:**Same Open Justice Licence gate: targeted fetches are fine, feeding them to bulk computational analysis requires the (free) licence first; text is extracted plain text, not the typeset original — for report citations defer to the official XML at the row's data_url.

$ legal gb_tna_caselaw_judgment --document-uri ewhc/admin/2026/2298
{
  "reason": "UK judgment dossier: [2026] EWHC 2298 (Admin) (EWHC-KBD-Admin, judged 2026-09-07) — 2 parties (claimant 1/defendant 1) · 1 judges · body 32786 chars; licence = Open Justice (reuse compliant, bulk analysis requires an application)",
  "result": {
    "uri": "ewhc/admin/2026/2298",
    "neutral_citation": "[2026] EWHC 2298 (Admin)",
    "title": "Barclays Bank UK PLC & Ors, R (on the application of) v Financial Ombudsman Service Limited",
    "case_number": "AC-2024-LON-003318",
    "court_code": "EWHC-KBD-Admin",
    "date": "2026-09-07",
    "parties": [
      { "name": "BARCLAYS BANK UK PLC", "role": "claimant" },
      { "name": "FINANCIAL OMBUDSMAN SERVICE LIMITED", "role": "defendant" }
    ],
    "judges": ["MR JUSTICE DEXTER DIAS"],
    "text": "1. This is the judgment of the court. …",
    "text_length": 32786
  },
  "evidence": [
    { "quote": "claimant: BARCLAYS BANK UK PLC", "url": "https://caselaw.nationalarchives.gov.uk/ewhc/admin/2026/2298" }
  ]
}

Reading it:parties are the official party-to-role edges (the XML's as="#claimant" mapped to claimant/defendant, companies and individuals mixed) — more reliable than guessing from the "A v B" title; text is the plain-text extraction of the judgment body (text_length is the full size — the example is trimmed); --document-uri takes all three uri forms from search rows, and a pasted full link is stripped automatically.

UK court-judgment search (The National Archives Find Case Law)

Parameters:

Flag Required Meaning
--query no Full-text query (a quoted phrase matches words in order)
--court no Court code, repeatable (e.g. uksc ewhc; tribunal codes also go here)
--tribunal no Tribunal code, repeatable (alias segment of court, e.g. eat)
--party no Party name, full-word match (e.g. Barclays — partial words don't hit)
--judge no Judge name, full-word match
--order no Sort: date/-date (default newest first)/updated/-updated/transformation/-transformation
--page no Page number (total pages in the result's total_pages)
--per-page no Rows per page, 1–50 (default 50 = the upstream default and our politeness cap)
--minimum-availability no Minimum representation level: metadata/document/full-text (default full-text)

**Note:**Open Justice Licence: reuse including commercial is allowed, but bulk computational analysis is forbidden until you apply for the (free) licence — keep this a targeted search face, not a whole-library crawl; the official rate is 1,000 requests per rolling 5 minutes and we pace at half of it.

$ legal gb_tna_caselaw_search --party Barclays --per-page 3
{
  "reason": "UK caselaw library (TNA Find Case Law): page 1/18, 3 rows — row = case name (party string)/court/judgment date/neutral citation; the full judgment text goes through gb_tna_caselaw_judgment (uri = the row's uri)",
  "result": {
    "total_pages": 18,
    "license": "https://caselaw.nationalarchives.gov.uk/open-justice-licence",
    "rows": [
      { "uri": "d-2d120c68-0546-4435-8b8c-4190ae3b3c68",
        "neutral_citation": "[2026] EWHC 2298 (Admin)",
        "fcid": "t68nwv3m",
        "title": "Barclays Bank UK PLC & Ors, R (on the application of) v Financial Ombudsman Service Limited",
        "court": "High Court (Administrative Court)",
        "published": "2026-09-07T00:00:00+00:00",
        "contenthash": "586fea31a748b820a69ff380bb445583a729d980209e79bc3f476eb798412f06",
        "data_url": "https://caselaw.nationalarchives.gov.uk/ewhc/admin/2026/2298/data.xml" }
    ],
    "count": 3
  },
  "evidence": [
    { "quote": "[2026] EWHC 2298 (Admin) Barclays Bank UK PLC & Ors, R (on the application of) v Financial Ombudsman Service Limited (High Court (Administrative Court), 2026-09-07)", "url": "https://caselaw.nationalarchives.gov.uk/ewhc/admin/2026/2298" }
  ]
}

Reading it:neutral_citation is the official citation (report-ready as-is); uri is the per-judgment join key in three coexisting forms (legacy ewhc/admin/2026/2298, new-style d-<uuid>, tna.<fcid>); --party/--judge match whole words only (Barclays hits, fragments don't); repeat --court to narrow to several courts; total_pages comes straight from the feed header — page with --page; each row's contenthash tells you whether the version changed.

Inter-American Development Bank sanctions search (violation family × cross-debarment marker)

Parameters:

Flag Required Meaning
--q no Full-text search across every field of the register (the register's own q parameter)
--filters no Filter by field values, as JSON text of field→value exact matches (the register's own filters parameter), e.g. {"To": "Ongoing"} or {"Entity": "Firm"}
--limit no Rows per call, 1–100 (default 20) — the register is queried live, so this is the page size
--offset no Rows to skip before the first row returned (the register's own offset parameter); the result carries the register's total row count
--sort no Sort order, e.g. "From desc" (the register's own sort parameter)

**Note:**The live register counts 1,343 (the census-era 2,603 counts cumulative history — don't mix the two); /dataset/download/<id>/csv returns dataset metadata, not rows — row data lives on datastore_search; Country / Prohibited Practice ship leading spaces upstream, which the SDK trims at the mapping layer.

$ legal idb_debarred_entities --q SHANDONG --limit 3
{
  "reason": "IDB sanctioned-firms register: 5 rows total, 3 returned (q \"SHANDONG\") — Entity=Firm rows are the company roster; Source carries cross-debarment markers (ADB/WBG cross debarment); page through offset",
  "result": {
    "rows": [
      { "_id": 43939, "Title": "Shandong Hualong Landscaping Engineering Co., Ltd.", "Entity": "Firm",
        "Nationality": "China", "Country": "China",
        "From": "2015-06-09 00:00:00.000000000", "To": "Ongoing",
        "Prohibited Practice": "Fraud", "Source": "WBG cross debarment", "rank": 0.0573 }
    ],
    "total": 5,
    "limit_applied": 3,
    "offset": 0
  },
  "evidence": [
    { "quote": "Shandong Hualong Landscaping Engineering Co., Ltd. (Firm, China) 2015-06-09→Ongoing · Fraud · WBG cross debarment",
      "url": "https://www.iadb.org/en/transparency/sanctioned-firms-and-individuals" }
  ],
  "source": { "provider": "idb", "execution": "local", "from_cache": false },
  "query": { "source": "raw", "upstream": { "resource_id": "cd0bd9ac-18c6-44bc-8592-9be468c2efd9", "limit": 3, "offset": 0, "include_total": "true", "q": "SHANDONG" } },
  "jurisdiction": "GLOBAL"
}

**Reading it:**The one server-side search face of the debarment line — --q full-text, --filters exact-match JSON (e.g. '{"To": "Ongoing"}'), --offset paging, include_total always sent (so total is exact). From arrives as nanosecond text ("2015-06-09 00:00:00.000000000"), kept verbatim.

Irish Revenue tax-defaulters list (court penalties / settlements, two tables)

Parameters:

Flag Required Meaning
--part no List part: 1 = court-determined penalties (issue type/fine/sentence/charges), 2 = Revenue settlements (five amount columns + unpaid) — the two parts are two different tables and the result's kind echoes the row schema (default 1)
--year no Publication year (together with --month; omit for the latest quarter on the index)
--month no Quarter name: march/june/september/december (together with --year)

**Note:**Names and addresses are statutory-published content (the Section 977 TCA 1997 quarterly obligation) — a public register carried verbatim, not leaked data; the list is the court-confirmed / above-threshold subset, so absence ≠ clean; --year and --month must be given together.

$ legal ie_revenue_defaulters --part 1
{
  "reason": "Irish Revenue defaulters june 2026 part 1: 55 rows — statutory quarterly publication, part 1 = court-determined penalties (fine + sentence + charges); quarters on the index: march 2026, june 2026",
  "result": {
    "quarter": "june 2026",
    "part": 1,
    "kind": "court_penalties",
    "count": 55,
    "rows": [
      { "issue_type": "PENALTIES DETERMINED BY A COURT RELATING TO THE NON-DECLARATION OR UNDER-DECLARATION OF TAX",
        "name": "COLLINS, FIONNUALA", "address": "39 THE CHANTRIES, BALBRIGGAN, CO. DUBLIN",
        "occupation": "NOT KNOWN", "sentence_imposed": null, "fine_amount": 24172, "charges": null },
      { "issue_type": "FAILURE TO LODGE INCOME TAX RETURN(S)",
        "name": "COSS, JOHN", "address": "PALLAS, PORTLAOISE, CO. LAOIS",
        "occupation": "HAIRDRESSER", "sentence_imposed": "6 MONTHS IMPRISONMENT", "fine_amount": 0, "charges": 1 }
    ],
    "available_quarters": ["march 2026", "june 2026"],
    "params": { "csv_path": "/en/corporate/press-office/list-of-defaulters/2026/defaulters-list-part-1-june-2026.csv" }
  },
  "evidence": [
    { "quote": "COLLINS, FIONNUALA (NOT KNOWN) · fine €24,172", "url": "https://www.revenue.ie/en/corporate/press-office/list-of-defaulters/index.aspx" }
  ],
  "source": { "provider": "ie_revenue", "execution": "server", "from_cache": false },
  "jurisdiction": "IE"
}

Reading it:****--part picks between two different tables: part 1 = court-determined penalties (issue type/fine/sentence/charges), part 2 = Revenue settlements (five amount columns + unpaid), with kind echoing the row schema. A fine of 0 is a fact, not "no data"; on part 2 an empty unpaid = fully settled. Omit year/month to take the latest quarter on the index; the index lists the current year only — older years live on archive pages this face deliberately does not walk.

US lobbying disclosure search (LDA)

Parameters:

Flag Required Meaning
--client-name no Lobbied company name (contains match)
--registrant-name no Lobbying firm name
--filing-year no Filing year (from 1999)
--page no Page number (upstream pages hold at most 25 rows)
--ordering no Sort (default -dt_posted)
--limit no Rows, 1–25 (larger asks silently yield 25)

**Note:**Intermediary filings carry "OBO" (on behalf of) in the client name — brand-name queries miss subsidiary filings; try both names. --limit caps at 25 (upstream hard clamp); page deeper with --page.

$ legal lda_filings --client-name "Google" --limit 3
{
  "reason": "LDA 游说面:命中 1626 申报,返回 3 行(被游说企业「Google」)——income/expenses 只在季报型(RR/RA 注册型恒 null);翻页用 page(每页上限 25,上游硬钳)",
  "result": {
    "rows": [
      { "filing_uuid": "81e6f7a8-2f6b-49c4-a04f-f39bff79adcc", "filing_type": "Q3", "filing_year": 2026,
        "income": "30000.00",
        "registrant": { "name": "JGB & ASSOCIATES, LLC", "state": "VA" },
        "client": { "client_id": 59919, "name": "CORNERSTONE GOVERNMENT AFFAIRS OBO GOOGLE CLIENT SERVICES LLC",
                    "state": "DC", "country": "US" },
        "issues": ["Labor Issues/Antitrust/Workplace", "Copyright/Patent/Trademark"] }
    ],
    "total": 1626,
    "limit_applied": 3
  },
  "evidence": [
    { "quote": "3rd Quarter (July 1 - Sep 30) CORNERSTONE GOVERNMENT AFFAIRS OBO GOOGLE CLIENT SERVICES LLC ← JGB & ASSOCIATES, LLC income=$30000.00",
      "url": "https://lda.gov/filings/public/filing/81e6f7a8-2f6b-49c4-a04f-f39bff79adcc/print/" }
  ],
  "source": { "provider": "lda", "execution": "local", "from_cache": true, "fetched_at": "2026-10-21T03:05:44.014Z" }
}

Reading it:--registrant-name switches the view, --filing-year narrows the filing year (from 1999); income/expenses appear on quarterly filings only (Q1–Q4). Filing documents link directly via document_url. 7-day TTL.

International arms-transfer search (SIPRI)

Parameters:

Flag Required Meaning
--filters no Raw filter list, JSON text, e.g. \[{"field":"Recipient","listData":\[8\]}\] (countries are numeric ids)
--supplier no Supplier-country shortcut: full English name, e.g. United States (XOR with --filters; the name is resolved to its numeric id)
--recipient no Recipient-country shortcut: full English name, e.g. Angola (XOR with --filters; the name is resolved to its numeric id)
--type no Measure: delivered = trend-indicator value / orders = orders placed
--page no Page number
--limit no Rows (cap 100)

**Note:**Use full English country names (United States / Soviet Union); zero hits is a legitimate answer, not a failure (e.g. United States→Angola has no major transfers on record) — try another supplier; order_year_est/units_est are SIPRI estimate flags. --limit caps at 100.

$ legal sipri_trades_search --supplier "Soviet Union" --recipient "Angola" --limit 5
{
  "reason": "SIPRI 军贸(delivered):供应商 Soviet Union × 受让 Angola 返回 5 行(型号级,Est 位=估计值;trades 是国别面非公司面——公司级宇宙在 Top-100 XLSX 批线件)",
  "result": {
    "rows": [
      { "trade_id": 1902, "supplier": "Soviet Union", "recipient": "Angola",
        "order_year": 1975, "order_year_est": true, "delivery_year": 1976,
        "units": 74, "units_est": true,
        "designation": "BTR-60PB", "description": "armoured personnel carrier", "category": "Armoured vehicles" },
      { "trade_id": 1903, "supplier": "Soviet Union", "recipient": "Angola",
        "order_year": 1977, "order_year_est": true, "delivery_year": 1978,
        "units": 200, "units_est": true,
        "designation": "BRDM-2", "description": "armoured reconnaissance vehicle", "category": "Armoured vehicles" }
    ],
    "limit_applied": 5,
    "resolved_countries": {
      "supplier": { "entity_id": 1150759, "name": "Soviet Union" },
      "recipient": { "entity_id": 1150549, "name": "Angola" }
    }
  },
  "evidence": [
    { "quote": "1976 Soviet Union → Angola:BTR-60PB ×74(est)",
      "url": "https://www.sipri.org/databases/armstransfers" }
  ],
  "source": { "provider": "sipri", "execution": "local", "from_cache": false, "observed_at": "2026-10-27T10:03:05.875Z" }
}

**Reading it:**A country-level view, not company-level (buyer/seller are country names) — positioned as a geopolitical risk signal; --type delivered/orders switches the measure. resolved_countries shows the upstream entity ids the country names resolved to. 30-day TTL.

US OCC monthly enforcement actions (bank orders/CMPs + IAP prohibition orders, docket key)

Parameters:

Flag Required Meaning
--year no Year 2005–current (the by-year news-release listing range; default = this year)
--month no Full month name January–December — picks that month's enforcement release (omit for the year's latest)
--all no Walk every enforcement release of the year (rows carry their release_nr)

**Note:**Month selection crosses eras: 2026+ titles carry "for October 2026", 2020/2010 titles carry no month — the listing's date column is the fallback; requesting a missing month lists what each release of the year actually covers. The year floor is 2005 (the verified listing range); actions back to 1989 live in the EASearch database, deliberately out of SDK scope (the docket number is the official join key). A published release is immutable (TTL 30d); the by-year listing grows monthly (12h). Row counts drift with the month's release (2026-10 is a 4-row small month; the 2020-02 table form carries 20).

$ legal us_occ_enforcements --year 2026 --month October
{
  "reason": "OCC 2026 enforcement actions: 4 rows from 1 release(s) (NR 2026-93), form=sentences — docket No. AA-ENF-* is the official key (joins the EASearch database, 1989+, out of SDK scope); cmp_amount is scaled from the \"$750 million\" wording; IAP = institution-affiliated party (individual prohibition orders — names published by statute, the co_sic precedent)",
  "result": {
    "year": 2026,
    "form": "sentences",
    "count": 4,
    "rows": [
      { "kind": "bank", "multi": false, "action_types": "Cease and Desist Order and Civil Money Penalty",
        "name": "American Express National Bank", "city": "Sandy", "state": "Utah",
        "violations": "deficiencies in the bank’s Bank Secrecy Act compliance program, failure to timely file suspicious activity reports, …",
        "action_docs": ["https://www.occ.gov/static/enforcement-actions/eaAA-ENF-2026-46.pdf",
                        "https://www.occ.gov/static/enforcement-actions/eaAA-ENF-2026-47.pdf"],
        "cmp_amount": 350000000, "related_release": "2026-87", "dockets": ["AA-ENF-2026-46", "AA-ENF-2026-47"],
        "release_nr": "NR 2026-93", "release_title": "OCC Announces Enforcement Actions for October 2026" },
      { "kind": "bank", "multi": false, "action_types": "Civil Money Penalty",
        "name": "Bank of America, National Association", "city": "Charlotte", "state": "North Carolina",
        "action_docs": ["https://www.occ.gov/static/enforcement-actions/eaAA-ENF-2026-41.pdf"],
        "cmp_amount": 750000000, "dockets": ["AA-ENF-2026-41"], "release_nr": "NR 2026-93", "…": "…" },
      { "kind": "iap", "action_types": "Order of Prohibition", "name": "Jennifer Hamblin",
        "role": "Vault Teller at a Cincinnati, Ohio, branch of Fifth Third Bank, N.A., Cincinnati, Ohio",
        "reason": "embezzling customer funds. The Bank suffered a loss of approximately $292,000",
        "city": "Cincinnati", "state": "Ohio", "cmp_amount": null,
        "dockets": ["AA-ENF-2026-43"], "release_nr": "NR 2026-93", "…": "…" }
    ],
    "releases_in_year": [
      { "nr": "NR 2026-3", "title": "OCC Announces Enforcement Actions for January 2026", "date": "01/15/2026", "path": "/news-issuances/news-releases/2026/nr-occ-2026-3.html" },
      "… 8 more …",
      { "nr": "NR 2026-93", "title": "OCC Announces Enforcement Actions for October 2026", "date": "10/22/2026", "path": "/news-issuances/news-releases/2026/nr-occ-2026-93.html" }
    ],
    "selected": [{ "nr": "NR 2026-93", "title": "OCC Announces Enforcement Actions for October 2026", "path": "/news-issuances/news-releases/2026/nr-occ-2026-93.html" }],
    "params": { "year": 2026, "month": "October", "release_path": ["/news-issuances/news-releases/2026/nr-occ-2026-93.html"] }
  },
  "evidence": [
    { "quote": "American Express National Bank (Sandy, Utah) · CMP $350,000,000 · dockets AA-ENF-2026-46/AA-ENF-2026-47 · NR 2026-93",
      "url": "https://www.occ.gov/news-issuances/news-releases/2026/nr-occ-2026-93.html" },
    { "quote": "Bank of America, National Association (Charlotte, North Carolina) · CMP $750,000,000 · dockets AA-ENF-2026-41 · NR 2026-93",
      "url": "https://www.occ.gov/news-issuances/news-releases/2026/nr-occ-2026-93.html" }
  ],
  "source": { "provider": "occ", "execution": "local", "from_cache": false, "observed_at": "2026-11-03T07:38:02.471Z" },
  "jurisdiction": "US"
}

Reading it:****Three row shapes by kind: bank (sentence-form bank actions — action types × institution × state × violations × cmp_amount × dockets × order PDFs on action_docs), iap (individual prohibition orders: name/role/reason — statutory public disclosure, the co_sic precedent), order (≤2020 table rows: ea_no/who/state/date/order_type, with the name+bank+city crammed into one cell and split at the last comma). cmp_amount scales the "$750 million" wording (→ 750000000). The multi-entity variant ("against three subsidiary banks of X : B1 ; B2 ; and B3" sharing one allegations sentence) explodes to one row per bank with holder/holder_city/holder_state carrying the parent, abbreviated dockets ("55, 56, and 57") kept verbatim. No --month = the year's latest enforcement release; --all walks every one of the year.

World Bank debarred firms (SUPP_ID shared with the award stream)

Parameters:

Flag Required Meaning
--name no Supplier name — matches any part of the name, ignoring case
--country no Country — matches any part of the country name, or the two-letter country code exactly (China and CN both hit)
--type no Supplier type: F firm, I individual, U unspecified, C conglomerate (exact match, ignoring case)
--limit no Rows to return, 1–100 (default 20). The whole register is screened locally, so total_matched in the result is the exact number of hits

**Note:**The DNB/REGISTER identifier fields ship empty across the register — joins go through name × country; the row count drifts as the live register regenerates (1,546 at admission → 1,540 at acceptance); the row's "Cross Debarment: AfDB" cross-checks against the same-name row on the afdb face (both registers end 2027-10-23). The gateway apikey is a page-embedded browser-public constant, not a registration credential.

$ legal wb_debarred_firms --name "CHINA RAILWAY" --country CN --limit 3
{
  "reason": "World Bank debarred-firms register: 1 of 1540 rows matched (name contains \"CHINA RAILWAY\", country contains \"CN\") — DEBAR_REASON cites the procurement-guidelines clause; DEBAR_TO_DATE 2999-12-31 = indefinite; zero hits = not on the WB register",
  "result": {
    "rows": [
      { "SUPP_ID": 1136471, "SUPP_NAME": "CHINA RAILWAY 20TH BUREAU GROUP CORPORATION LTD", "SUPP_TYPE_CODE": "F",
        "LAND1": "CN", "COUNTRY_NAME": "China",
        "SUPP_ELIG_STAT": "X-DEBARRED", "DEBAR_FROM_DATE": "2026-10-16", "DEBAR_TO_DATE": "2027-10-23",
        "DEBAR_REASON": "Cross Debarment: AfDB", "INELIGIBLY_STATUS": "Ongoing" }
    ],
    "total_matched": 1,
    "scanned_rows": 1540,
    "limit_applied": 3,
    "params": { "name": "CHINA RAILWAY", "country": "CN", "type": null }
  },
  "evidence": [
    { "quote": "CHINA RAILWAY 20TH BUREAU GROUP CORPORATION LTD (China) 2026-10-16→2027-10-23 · Cross Debarment: AfDB",
      "url": "https://www.worldbank.org/en/projects-operations/procurement/debarred-firms" }
  ],
  "source": { "provider": "wb", "execution": "local", "from_cache": false },
  "jurisdiction": "GLOBAL"
}

Reading it:--country matches either channel: a name substring or the LAND1 code (China/CN both hit). DEBAR_TO_DATE 2999-12-31 is the indefinite-sentinel, kept verbatim. SUPP_ID is the WB supplier key — the same key as awarded_firms[].supp_id on wb_procnotices, so the award × debarment cross-check runs between those two faces.

The fine print

  • A hit is a lead, not a conclusion: verify against the official URL carried on each row before it enters a due-diligence conclusion.