Docs

Enforcement actions & document datalake

ExChek exposes U.S. export-control enforcement in two free surfaces that agents should use for different jobs:

  1. Live feed — recent actions from public sources (Federal Register, DOJ, BIS charging letters, DDTC consent agreements). Best for “what’s new?” and trend scans.
  2. 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)

SourceWhat it coversFreshness
Federal RegisterBIS denial/settlement orders; DDTC ITAR noticesLive + edge cache (~6h)
DOJ National Security DivisionCriminal export / sanctions press releasesLive + edge cache (~6h)
BIS charging letters pageShort recent charging-letter table on bis.govLive + edge cache (~24h)
DDTC consent agreementsPenalties & oversight agreements portalWeekly Browser Rendering snapshot

Normalized live record

FieldMeaning
idStable source-prefixed id (e.g. fr:2025-01234).
agencyBIS, DDTC, or DOJ.
action_typedenial_order, temporary_denial, settlement, charging_letter, criminal, consent_agreement, …
partyNamed party when the source states one.
title / datePublished title and date.
statutesCited authorities (IEEPA, ECRA, 15 CFR, 22 CFR, …).
source_url / doc_urlHuman 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) and text_url (parsed text)

Agent workflow (preferred)

  1. Call MCP search_enforcement_documents with a party, case id (e.g. E3052), product, or keyword.
  2. From each hit, give the user file_url to open/download the PDF on api.exchek.us.
  3. Optionally call get_enforcement_document with include_text: true for the full parsed markdown, or open text_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

EndpointUse
GET /api/enforcement/docs?q=termKeyword search over party/title/parsed body. Free.
GET /api/enforcement/docs?agency=BIS&limit=25List recent catalog rows (count + total).
GET /api/enforcement/docs?stats=1Fill health: totals by parse_status / agency.
GET /api/enforcement/docs/:idOne document’s metadata + file_url / text_url.
GET /api/enforcement/docs/:id/textFirecrawl-parsed markdown body.
GET /api/enforcement/docs/:id/filePDF 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)

ToolWhat it returns
search_enforcement_documentsHits with id, party, match_snippet, file_url, text_url, original_doc_url, and a short how_to_use hint for agents.
get_enforcement_documentFull 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 table
  • ddtc:<sys_id> — DDTC attachment when snapshotted
  • doj:<uuid> — DOJ press release (usually parse_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.

Next steps

  • API Reference/api/enforcement and /api/enforcement/docs
  • MCP server — connect agents to live + datalake tools
  • Pricing — Enterprise for check_party_enforcement