Enforcement actions & document datalake
ExChek exposes U.S. export-control enforcement in two free surfaces that agents should use for different jobs:
- Live feed — recent actions from public sources (Federal Register, DOJ, BIS charging letters, DDTC consent agreements). Best for “what’s new?” and trend scans.
- Document datalake — archived notice PDFs (especially the full BIS export-violations docket, ~1,100 cases) with keyword search, parsed text, and ExChek-hosted file links. Best for lookalike cases, party history, and opening the actual PDF.
Both are public information only — never send CUI or classified material. Federal Register notices stay live-only (not snapshotted into the datalake).
1. Live feed — recent actions
REST: GET /api/enforcement · MCP: get_enforcement_actions. Newest first; every upstream fails soft.
Sources (live)
| Source | What it covers | Freshness |
|---|---|---|
| Federal Register | BIS denial/settlement orders; DDTC ITAR notices | Live + edge cache (~6h) |
| DOJ National Security Division | Criminal export / sanctions press releases | Live + edge cache (~6h) |
| BIS charging letters page | Short recent charging-letter table on bis.gov | Live + edge cache (~24h) |
| DDTC consent agreements | Penalties & oversight agreements portal | Weekly Browser Rendering snapshot |
Normalized live record
| Field | Meaning |
|---|---|
id | Stable source-prefixed id (e.g. fr:2025-01234). |
agency | BIS, DDTC, or DOJ. |
action_type | denial_order, temporary_denial, settlement, charging_letter, criminal, consent_agreement, … |
party | Named party when the source states one. |
title / date | Published title and date. |
statutes | Cited authorities (IEEPA, ECRA, 15 CFR, 22 CFR, …). |
source_url / doc_url | Human page and upstream PDF when available. |
Live REST example
curl -sS "https://api.exchek.us/api/enforcement?agency=BIS&limit=5"Returns { actions, count, sources }.
Live MCP example
curl -sS -X POST https://api.exchek.us/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_enforcement_actions","arguments":{"agency":"BIS","limit":5}}}'2. Document datalake — searchable PDFs for agents
The datalake is the table of truth for archived notice PDFs. Primary BIS catalog is https://www.bis.gov/enforcement/export-violations (Case ID · Case Name · Order Date → /media/documents/*.pdf), plus charging letters, DDTC attachments when available, and DOJ metadata (usually no PDF).
- Metadata + full-text keyword index in D1 (FTS5)
- PDF bytes + Firecrawl-parsed markdown in R2
- Nightly Worker ingest (and ops backfill) until the catalog is fully parsed
- Stable public URLs agents can hand to users:
file_url(PDF) andtext_url(parsed text)
Agent workflow (preferred)
- Call MCP
search_enforcement_documentswith a party, case id (e.g.E3052), product, or keyword. - From each hit, give the user
file_urlto open/download the PDF onapi.exchek.us. - Optionally call
get_enforcement_documentwithinclude_text: truefor the full parsed markdown, or opentext_url.
If parse_status is still pending, metadata may exist without file_url yet — retry later or fall back to original_doc_url (upstream bis.gov) when present.
Datalake REST
| Endpoint | Use |
|---|---|
GET /api/enforcement/docs?q=term | Keyword search over party/title/parsed body. Free. |
GET /api/enforcement/docs?agency=BIS&limit=25 | List recent catalog rows (count + total). |
GET /api/enforcement/docs?stats=1 | Fill health: totals by parse_status / agency. |
GET /api/enforcement/docs/:id | One document’s metadata + file_url / text_url. |
GET /api/enforcement/docs/:id/text | Firecrawl-parsed markdown body. |
GET /api/enforcement/docs/:id/file | PDF bytes (ExChek R2 archive). Clickable in browsers and agent UIs. |
Datalake REST examples
# Keyword search
curl -sS "https://api.exchek.us/api/enforcement/docs?q=Bosch&limit=5"
# One document (note: encode colon in ids like bis-case:E3052)
curl -sS "https://api.exchek.us/api/enforcement/docs/bis-case%3AE3052"
# PDF download / open
curl -sS -o bosch.pdf "https://api.exchek.us/api/enforcement/docs/bis-case%3AE3052/file"
# Fill progress
curl -sS "https://api.exchek.us/api/enforcement/docs?stats=1"Datalake MCP tools (free)
| Tool | What it returns |
|---|---|
search_enforcement_documents | Hits with id, party, match_snippet, file_url, text_url, original_doc_url, and a short how_to_use hint for agents. |
get_enforcement_document | Full metadata for one id. Set include_text: true to embed parsed markdown. Always surface file_url when the user needs the notice PDF. |
# Search (agent path)
curl -sS -X POST https://api.exchek.us/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_enforcement_documents","arguments":{"query":"Bosch","limit":3}}}'
# Fetch one doc + optional full text
curl -sS -X POST https://api.exchek.us/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_enforcement_document","arguments":{"id":"bis-case:E3052","include_text":true}}}'Example document ids
bis-case:E3052— BIS export-violation Case ID (preferred stable id)bis-media:993— media-entity style id from the short charging-letters tableddtc:<sys_id>— DDTC attachment when snapshotteddoj:<uuid>— DOJ press release (usuallyparse_status: no_pdf)
Free vs. Enterprise
Live feed, datalake search, parsed text, and PDF file links are all free, no auth. check_party_enforcement remains an Enterprise MCP tool: named counterparty check across live sources plus the trade.gov Denied Persons List when configured. See Pricing.