Screen a name against official government watchlists
Sanctions Screening API returns live Sanctions Screening data as clean JSON for sanctions screening The primary endpoint, screen, returns status, query, matches[]{uid, score, status, matched_name, matched_via, matched_fields[], source, source_authority, jurisdiction, list_re….
4 active endpoints, on 1 and 2 credit tiers.
- POST/sanctions/v1/screen
- POST/sanctions/v1/batch
- POST/sanctions/v1/entity
- POST/sanctions/v1/sources_status
What Sanctions Screening endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Sanctions Screening API
3 of 4 endpoints, ready to run
One name screened against every list in scope, returning each match with its score, which list it came from, whether it matched a primary name or an alias, the sanctions programmes, the identifiers and the source's own remarks.
{ "ok": true, "meta": { "api": "sanctions", "endpoint": "screen", "mode": "live", "latency_ms": 202.5, "record_count": 5, "cache_hit": false }, "data": { "query": "Rosneft", "status": "match", "matches": [ { "uid": "ofac_sdn:17022", "score": 1, "name_score": 1, "status": "match", "matched_name": "ROSNEFT OIL COMPANY", "matched_via": "alias", "matched_fields": [ "name" ], "source": "ofac_sdn", "source_authority": "US Treasury OFAC", "jurisdiction": "US", "list_ref": "17022", "entity_type": "entity", "name": "OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY", "aliases": [ "OJSC ROSNEFT OIL COMPANY", "ROSNEFT OIL COMPANY", "OAO ROSNEFT OIL COMPANY" ], "programs": [ "UKRAINE-EO13662", "RUSSIA-EO14024" ], "dobs": [], "places_of_birth": [], "nationalities": [], "countries": [ "Russia" ], "ids": [ { "type": "Registration ID", "number": "1027700043502", "country": "Russia" }, { "type": "Government Gazette Number", "number": "00044428", "country": "Russia" }, { "type": "Tax ID No.", "number": "7706107510", "country": "Russia" } ], "vessel_info": null, "remarks": "For more information on directives, please visit the following link: http://www.treasury.gov/resource-center/sanctions/Programs/Pages/ukraine.aspx#directives." }, { "uid": "ofac_consolidated:17022", "score": 1, "name_score": 1, "status": "match", "matched_name": "ROSNEFT OIL COMPANY", "matched_via": "alias", "matched_fields": [ "name" ], "source": "ofac_consolidated", "source_authority": "US Treasury OFAC", "jurisdiction": "US", "list_ref": "17022", "entity_type": "entity", "name": "OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY", "aliases": [ "OJSC ROSNEFT OIL COMPANY", "ROSNEFT OIL COMPANY", "OAO ROSNEFT OIL COMPANY" ], "programs": [ "UKRAINE-EO13662", "RUSSIA-EO14024" ], "dobs": [], "places_of_birth": [], "nationalities": [], "countries": [ "Russia" ], "ids": [ { "type": "Registration ID", "number": "1027700043502", "country": "Russia" }, { "type": "Government Gazette Number", "number": "00044428", "country": "Russia" }, { "type": "Tax ID No.", "number": "7706107510", "country": "Russia" } ], "vessel_info": null, "remarks": "For more information on directives, please visit the following link: http://www.treasury.gov/resource-center/sanctions/Programs/Pages/ukraine.aspx#directives." }, { "uid": "ofac_consolidated:18300", "score": 1, "name_score": 1, "status": "match", "matched_name": "ROSNEFT TRADE LIMITED", "matched_via": "primary_name", "matched_fields": [ "name" ], "source": "ofac_consolidated", "source_authority": "US Treasury OFAC", "jurisdiction": "US", "list_ref": "18300", "entity_type": "entity", "name": "ROSNEFT TRADE LIMITED", "aliases": [ "TNK TRADE LIMITED" ], "programs": [ "UKRAINE-EO13662" ], "dobs": [], "places_of_birth": [], "nationalities": [], "countries": [ "Cyprus" ], "ids": [ { "type": "Registration ID", "number": "C122790", "country": null }, { "type": "Email Address", "number": "[email protected]", "country": null }, { "type": "Secondary sanctions risk:", "number": "Ukraine-/Russia-Related Sanctions Regulations, 31 CFR 589.201 and/or 589.209", "country": null } ], "vessel_info": null, "remarks": "For more information on directives, please visit the following link: http://www.treasury.gov/resource-center/sanctions/Programs/Pages/ukraine.aspx#directives.; (Linked To: OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY)" } ], "match_count": 5, "audit": { "query": "Rosneft", "type": null, "country": null, "dob": null, "threshold": 0.85, "records_checked": 24937, "screened_sources": [ { "id": "ofac_sdn", "authority": "US Treasury OFAC", "jurisdiction": "US", "reachable": true, "record_count": 19321, "source_updated_at": "08/28/2026" }, { "id": "ofac_consolidated", "authority": "US Treasury OFAC", "jurisdiction": "US", "reachable": true, "record_count": 481, "source_updated_at": "07/27/2026" }, { "id": "uk_ofsi", "authority": "UK HM Treasury OFSI", "jurisdiction": "GB", "reachable": true, "record_count": 5135, "source_updated_at": "03/06/2026" } ] }, "guidance": "name-only screening returns many false positives; add type/country/dob to narrow, and human-review every match against the official source", "legal": { "disclaimer": "SCREENING TOOL — NOT a compliance certification and NOT legal advice. This result reports name matches (or the absence of a name match) against the published government sanctions lists screened at the time of this request. A 'no_match' means no name match was found in the screened lists; it does NOT mean the party is cleared, safe, approved, or compliant. Treat every match as REVIEW-REQUIRED and confirm against the official source. You are responsible for your own compliance obligations.", "advice": false, "certification": false, "status_language": "review_required" } } }
How the Sanctions Screening API works
Sanctions Screening is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Screen, then narrow, then take the audit block with you
A name-only screen is the loosest question you can ask, and it answers accordingly. The two parameters that turn it into something usable are the record type and the threshold — and whatever you decide, the response carries the evidence you will need to show later.
{"name": "Rosneft"}Five matches across three lists, every one scoring 1.0, each naming the list, the programmes and whether it hit a primary name or an alias.
{"name": "...", "type": "person", "threshold": 0.95}Narrowing is what removes the noise. A made-up name that returned a possible match at the default threshold returned a clean no match at 0.95, and also with type set to person.
Every response carries how many records were checked, which lists were screened, and the update date each list reported. That is the part that makes a screening result defensible six months later.
One credit per name, or one call for a list. What you are buying is not a verdict — the response says so itself — it is a dated, sourced, reproducible name check.
curl -X POST https://api.reefapi.com/sanctions/v1/screen \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"name":"Ismail Haniya","type":"person"}'{
"ok": true,
"data": { … },
"meta": {
"api": "sanctions",
"endpoint": "screen",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}The same designated person, described differently by each list
A screen hits several lists at once and they do not agree on format, wording or even on the facts. This is one measured query returning the same individual from two authorities. If you deduplicate by comparing fields across sources, this table is why that fails.
| Field | ofac_sdn (US Treasury OFAC) | uk_ofsi (UK HM Treasury OFSI) |
|---|---|---|
| list_ref | 35096 | 14196 |
| dobs | "07 Oct 1952" — day, abbreviated month, year | "07/10/1952" — UK day-first slashes |
| places_of_birth | ["Leningrad, Russia"] | ["Russia", "St Petersburg (then Leningrad)"] |
| programs | ["RUSSIA-EO14024"] — the US executive order | ["Russia"] — the UK regime name |
| nationalities | [] (empty) | ["Russia"] |
| remarks | null | a 552-character note carrying the UK Sanctions List reference and the specific measures |
| ids | pseudo-entries: {type: "Gender", number: "Male"} and {type: "Secondary sanctions risk:", number: "See Section 11 of Executive Order 14024."} | [] (empty) |
Three lists are screened per query, measured at 24,935 records total: OFAC SDN (19,319 records, source_updated_at 08/26/2026), OFAC Consolidated non-SDN (481, 07/27/2026) and UK OFSI. Note that source_updated_at is US month-first MM/DD/YYYY, not ISO. EU and UN consolidated lists are not among the three — if your obligation covers them, this is not sufficient on its own, and we would rather name the gap than let you assume coverage.
Which lists, how current, and what a match actually means
Measured on 2026-08-28 by reading the source status, forcing a refresh, and screening real sanctioned entities, an invented name, a Cyrillic spelling and the most common name in English. Read every row of this one before you use it.
In scope: the US OFAC SDN list, the US OFAC Consolidated non-SDN list, and the UK OFSI consolidated list — 24,935 records between them at the time of measurement, each with its authority and its licence named on the response. The EU consolidated list and the UN list are NOT screened. If your obligation covers those, this does not cover your obligation.
At measurement the US primary list reported a source date two days old and the US non-SDN list one month old, while the UK list's own stamp was months old — and it stayed months old through a forced refresh, so that is the source's date and not our lag. The index behind a normal call is refreshed on a six-hour cycle: a forced refresh mid-cycle pulled a same-day version of the primary list with two more records in it. Read the update date on the audit block of the call you actually made.
The most common first name and surname in English screened as status match at a score of 1.0, because a person on the UK list carries that first name on its own as one of ten recorded aliases. A one-token alias hit reads as a perfect score. This is inherent to name screening, not a defect, and it is exactly why the response calls every result review-required and returns the matched name, the alias list and the field that matched, so a human can see what happened.
A name we made up returned a possible match at 0.857 against a vessel, because the default threshold is 0.85. Raising it to 0.95 returned a clean no match; so did setting the record type to person. A second invented name returned no match at the default. Choose a threshold deliberately and set the type when you know it.
One search on a Russian energy company matched five records across all three lists — some on the primary name, some on an alias, including an entity whose registered name is completely different. The same query written in Cyrillic returned the identical five records. Aliases, alternate transliterations and former names are all indexed.
Every response carries a legal block stating that this is a screening tool and not a certification, that no match means no name match was found in the lists screened rather than that a party is cleared, and that every match is review-required. That text is part of the payload, not a footnote on this page, and it is the correct reading of what a name check can prove.
What people build with Sanctions Screening
The jobs this data is most often used for.
endpoints
credits per call
Fintech apps use Sanctions Screening to screen ONE name against the official sanctions lists → status (match | possible_match | no_ma….
Portfolio dashboards use Sanctions Screening to screen up to 100 names in one call (in-memory → cheap).
Analysts use Sanctions Screening to fetch ONE full normalized list record by its uid ('<source>:<list_ref>', from a screen match).
Data teams use Sanctions Screening to list freshness + reachability of every sanctions source (the trust signal).
What Sanctions Screening data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/sanctions/v1/screen \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"name":"Ismail Haniya","type":"person"}'import requests
r = requests.post(
"https://api.reefapi.com/sanctions/v1/screen",
headers={"x-api-key": REEF_KEY},
json={
"name": "Ismail Haniya",
"type": "person"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Sanctions Screening.
Get a free key →Why does a common name return matches for people who are obviously not the same person?▾
Because fuzzy name screening is supposed to over-match, and any tool that did not would be dangerous. A measured screen for "Muhammed Ali" at threshold 0.7 returned score 1.0 hits for "Ahmed Mohammed Hamed ALI" and for an alias of "Fazul Abdullah MOHAMMED" — neither is the person a user typing that name has in mind. Transliteration means one Arabic name has a dozen Latin spellings, so a screen that required exact matches would miss real designations. The output is a list to review, not a verdict, which is exactly what the response's own status_language field says.
Can I use a no-match result as proof that a customer is clear?▾
No, and every response says so in a legal block carrying advice: false, certification: false and status_language "review_required". This is a screening tool against three published government lists at a point in time. It is not a compliance certification, it is not legal advice, and it cannot see lists it does not cover or designations made after the index was built. Use it as the first filter in a process that has a human at the end of it.
How do I control how many matches I get?▾
threshold, which defaults to 0.85. Lower it to catch transliteration variants at the cost of noise, raise it to cut noise at the cost of misses. Each match reports both score and name_score plus matched_via — measured values "primary_name" and "alias" — so you can see whether a hit came from the designated name itself or from one of the aliases, which a record can carry more than a dozen of. Filtering on matched_via alias is a cheap way to triage a long result list.
Are the ids fields actually identity documents?▾
Not reliably. OFAC packs non-identifier content into that array, and the measured record proves it: ids contained {type: "Gender", number: "Male"} and {type: "Secondary sanctions risk:", number: "See Section 11 of Executive Order 14024."} — note the trailing colon in that second type string, which comes straight from the source. Do not treat ids[] as a passport or tax-number list without filtering on type first, and expect the type vocabulary to be open-ended rather than an enum.
How do I parse the dates of birth?▾
Carefully, and per source. Measured on one individual, OFAC returned "07 Oct 1952" while UK OFSI returned "07/10/1952" for the same date. A parser that guesses will read the UK form as 7 October in one library and 10 July in another. dobs is also an array because sanctioned individuals frequently have several claimed birth dates — one measured record carried three. Read source alongside dobs and never coerce to a single date.
What is in the audit block and why should I keep it?▾
It is the evidence that a screen happened and against what. A measured screen returned audit with the exact query, the type, country and dob filters applied, the threshold used, records_checked 24,935, and screened_sources listing each list's authority, jurisdiction, reachability, record_count and source_updated_at. That is the record an auditor asks for. Store the whole block with the result rather than storing just a boolean — a clean screen against a stale index is a different fact from a clean screen against a current one.
How fresh is the index?▾
Every screen reports index_age_seconds and the refresh window — measured at 3,868 seconds old against a refresh_ttl_seconds of 21,600, so six hours. sources_status gives you the picture on its own, including reachable, http_status, fetch_s and the record count per list, so you can check whether a list was actually retrievable before trusting a no-match. A source that went unreachable is the case where a clean result means nothing, and reachable_count is how you catch it.
Can I screen a whole customer list?▾
batch takes a names array with shared filters and returns per-name results plus a summary counting match, possible_match and no_match, so you get the triage split without walking the array. Matches per name are capped in batch mode; when a name needs the full picture, re-screen it individually or pull the record by uid with the entity action, which returns the complete designation including every alias, program, address and, for shipping designations, vessel_info.
What is the Sanctions Screening API?▾
Sanctions Screening API is a ReefAPI endpoint group for sanctions screening It returns live JSON through POST requests under /sanctions/v1.
Is the Sanctions Screening API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Sanctions Screening calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Sanctions Screening login or account?▾
No login to Sanctions Screening is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Sanctions Screening data?▾
The page example is captured from a live screen call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Sanctions Screening API use?▾
Sanctions Screening actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Sanctions Screening from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call sanctions actions with the same key, credit pool and JSON envelope used by normal REST requests.
5 Finance & Data APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Sanctions Screening, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.