How Trade Risk Works
BetaRestricted-party screening is easy to start and tedious to finish. Finding names that look like a listed party is the simple part. Deciding which of those hits is a true match and which is a false positive is where the time goes, because most hits are noise. This skill is built for that second step.
Beta. Live, with the measured results below published, but it has not been certified by Proofwork yet. Screening aid, not legal advice. It does not decide whether a party is restricted or a transaction permitted, and it is no substitute for a sanctions and export-control compliance programme. Verify against the official agency list and the Federal Register before anyone acts on a result.
False-positive triage is the value
You give your AI assistant a party name and whatever else you know: country, address, party type, date of birth, an ID number. The server returns candidate list entries, each with:
- A match tier (strong, probable, possible) and a score with a per-component breakdown: which listed name or alias matched, how the tokens aligned, and how each discriminator you supplied moved the score.
- The full evidence: every alias, the list and sanctions programs, addresses, identifiers, dates and places of birth, remarks, and the official source URL of the entry.
- Triage instructions for your LLM: decide true match, false positive or needs escalation for each candidate; state the evidence; ask you for the missing discriminators instead of guessing; and never clear a party on name dissimilarity alone when an identifier matches.
Proofwork is never in the inference path. The server normalises names, retrieves and scores; your LLM does the reasoning, in your workspace. No model is called on our side and no machine learning is involved, so the same query against the same data always returns the same result. Weak candidates go in the possible tier rather than being hidden: a missed true match is the costly error in screening, so conflicting details lower a candidate's tier and never drop a name match from the results.
How names are matched
- Unicode folding and romanisation: diacritics, Cyrillic and Greek script, and spelling variants such as Mohammed / Muhammad or Aleksandr / Alexander.
- Word order ("LASTNAME, First" and "First Lastname"), punctuation, spacing and hyphenation.
- Corporate forms (LLC, Ltd, GmbH, OOO, JSC and their long forms) and honorifics count for little, and generic words such as "Trading" count for less than distinctive ones.
- Typos, within an edit budget that grows with the length of the word. Numbers must match exactly: "Institute 46" is not "Institute 47".
- Every alias (AKA) of every list entry is searched, not only the primary name.
How often it finds the right entry
Measured on 2026-09-22 against 303 names that are real list entries written differently — misspelt, transliterated, reordered, shortened, given a different corporate suffix — and 165 look-alike names that are on no list at all. The matcher was tuned on a separate set of names; these ones were kept back from tuning and run once, so none of them shaped it.
95.7%
right entry ranked first, of 303 names
98.7%
right entry in the top 10, of 303 names
1.3%
right entry not returned at all
0.6%
of 165 look-alike names got a strong match
Acting on strong matches alone would miss 14.8% of those names; on strong and probable, 3.0%. Of the look-alike names, 6.7% reached probable or strong and 40.0% returned a candidate of some kind. That is the noise your LLM triages. A screen takes 5.71 ms on a laptop, 17.1 ms in the slowest one in twenty.
By kind of name variation
| Family | n | Ranked first | In top 10 | Not returned |
|---|---|---|---|---|
| Listed alias (AKA) | 27 | 96.3% | 100.0% | 0.0% |
| Corporate suffix variation | 29 | 93.1% | 100.0% | 0.0% |
| Cyrillic script (individuals) | 5 | 100.0% | 100.0% | 0.0% |
| Diacritics added / stripped | 35 | 94.3% | 100.0% | 0.0% |
| Exact primary name | 26 | 100.0% | 100.0% | 0.0% |
| Extra tokens (title, city, The) | 29 | 96.5% | 96.5% | 3.5% |
| Token order (LAST, First) | 14 | 100.0% | 100.0% | 0.0% |
| Romanisation variant | 29 | 100.0% | 100.0% | 0.0% |
| Spacing / hyphenation | 27 | 100.0% | 100.0% | 0.0% |
| Truncated / partial name | 30 | 83.3% | 96.7% | 3.3% |
| Two typos | 26 | 92.3% | 92.3% | 7.7% |
| One typo | 26 | 100.0% | 100.0% | 0.0% |
By list
| List | n | Ranked first | In top 10 | Not returned |
|---|---|---|---|---|
| CMIC | 15 | 93.3% | 100.0% | 0.0% |
| DPL | 47 | 100.0% | 100.0% | 0.0% |
| DTC | 48 | 93.8% | 100.0% | 0.0% |
| EL | 45 | 95.6% | 97.8% | 2.2% |
| ISN | 13 | 100.0% | 100.0% | 0.0% |
| MBS | 20 | 90.0% | 90.0% | 10.0% |
| MEU | 21 | 100.0% | 100.0% | 0.0% |
| PLC | 8 | 87.5% | 100.0% | 0.0% |
| SDN | 49 | 93.9% | 98.0% | 2.0% |
| SSI | 20 | 95.0% | 100.0% | 0.0% |
| UVL | 17 | 100.0% | 100.0% | 0.0% |
What this does not prove
- The test names are synthetic — real list entries rewritten by rule, not real data-entry errors collected from real filings. They show how reliably the matcher surfaces the right entry. They say nothing about whether an analyst, or an LLM, then judges a candidate correctly.
- The look-alike names are large legitimate companies, ordinary personal names and near-miss strings, each checked automatically to be absent from the list snapshot.
- Two typos in a short name is the weakest case, and it stays that way: 7.7% of those 26 names are not returned at all. The limit is a real one rather than a setting left untuned — once both typos land in the only distinctive word of a short name, nothing is left to look the party up by. Those names can be bought back by loosening how far a word may drift before it stops counting as the same word, and that was measured and rejected: it raises the rate at which ordinary, unlisted names draw a probable-tier candidate, a cost paid on every name screened in order to rescue an input that is rare.
- Shortened names are now nearly always returned — 3.3% of 30 are not — but often not first: a shorter listed name that the fragment covers completely outranks the longer true one, which is genuine ambiguity rather than a matcher error. Read every candidate returned for a partial name.
- Some rows in the tables above cover few names, so a single case moves them a lot. The two-typo row is 26 names: read it as a wide interval, not a point.
- Reproducible from the repository with no API spend: the results are tied to the
list snapshot
6440b98cec0c8ee1…and to a fixed random seed, 20260920.
Data and freshness
The data is the US Consolidated Screening List (CSL), published by the International Trade Administration, US Department of Commerce. It consolidates these lists: OFAC SDN, FSE, SSI, CAPTA, NS-MBS, CMIC, PLC; BIS Entity, Denied Persons, Unverified, Military End User; State ITAR-debarred and nonproliferation.
Refreshed from the official bulk file about every 12 hours. Every response states data_as_of (when the data used was retrieved) and warns when it is more than 48 hours old. A bundled snapshot is the offline fallback.
Sanctions lists change daily, so freshness is treated as a safety property. A refresh runs in the background and never delays a screening call. A downloaded file is checked before it is used, and if a refresh fails the last good data stays in place and the response says how old it is. This product uses the International Trade Administration's Data API but is not endorsed or certified by the International Trade Administration.
Ownership is not screened
Under OFAC's 50 Percent Rule, an entity owned 50 percent or more, directly or indirectly and in the aggregate, by one or more blocked persons is itself blocked, even though it is not named on any list. This skill screens names against lists. It does not know who owns a company, so a result with no candidates says nothing about ownership. If a counterparty's owners are known, screen them too.
Known limitations
- Ownership is not screened. Under the OFAC 50 Percent Rule an entity owned 50% or more by blocked persons is itself blocked without being named on any list.
- US lists only: no UN, EU, UK or other national lists, no PEPs, no adverse media.
- Names are matched in Latin script. Cyrillic and Greek are romanised; Arabic, Chinese and other scripts must be supplied romanised.
- Two typos in a short name is the weakest case and stays that way: 7.7% of those names are not returned at all. Once both typos land in the only distinctive word of a short name, nothing is left to look the party up by; the looser word matching that would find them was measured and rejected because it draws more candidates on ordinary unlisted names, a cost paid on every screen. Shortened names are now mostly found (3.3% not returned) but often not first, so read every candidate.
- The test names are real list entries rewritten by rule, not real data-entry errors. They measure how reliably the right entry is surfaced, not whether the triage judgement that follows is right.
- A screening aid: not legal advice and not a substitute for a compliance programme.
Available tools
Screen one party: candidate list entries with match tier, score breakdown, full evidence and triage instructions
screen_party_payload
Get the complete list entry for a record id
get_party_record_payload
Screen up to 50 counterparties in one call, compact results
screen_parties_batch_payload
Ready to try it?
Connect the skill to your LLM workspace and screen your first party in under a minute.
Get started