Screen a name against eight sanctions lists in one request
36,303 designated parties from the US, EU, UK, UN, Swiss, Japanese, Australian and Canadian lists, merged so one party is one record however many authorities carry it. Rebuilt every night from the official sources. No key needed to start.
See it work
Paste this into a terminal. Nothing to install, no signup.
curl -X POST "https://sanctionscope.com/api/v1/screen" -H "content-type: application/json" \
-d '{"names": ["Vladimir Putin"]}'
One request, and every authority that has designated the party comes back on one record:
{
"screened": 1, "flagged": 1,
"results": [{ "name": "Vladimir Putin", "matches": [{
"name": "PUTIN, Vladimir Vladimirovich",
"type": "Individual", "country": "RU",
"authorities": ["US", "EU", "AU", "CA"],
"programs": ["RUSSIA-EO14024", "EU:UKR", "AU:Autonomous (Russia)", "CA:Russia"],
"score": 1,
"url": "https://sanctionscope.com/api/v1/party/ofa%3A35096"
}]}]
}
Hitting OFAC's own file would have told you about the United States. The authorities array is the part that takes work to build, and it is why 8,612 of these parties resolve to one record here rather than five.
What it is used for
Onboarding customers and releasing payments. Screen at signup, again before a payout clears. One call covers every authority, so there is no separate OFAC, EU and UK check to reconcile afterwards. POST screen
Shipping goods or technology abroad. US export-control lists sit alongside OFAC here: the BIS Entity List, Denied Persons, Unverified and Military End User lists, and State Department debarments. Screening that only covers OFAC misses every one of them, and most cheap screening only covers OFAC. POST screen
Operating under more than one regime. US, EU and UK designations have diverged since 2022. The authorities field answers, in one call, whether a party is a problem for your London entity, your New York entity, or both. GET search
Fixing a vessel or checking a trade counterparty. Ships are listed as parties with the IMO number in the record, so a vessel resolves the same way a company does. GET search
Onboarding investors and fund subscribers. A subscription list goes through in one batch, and the response lines up with your input so it can go on the file as evidence. POST screen
Watching a book you already have. The counterparty who cleared in January and is designated in March is the one that matters. Names left under watch are rechecked against every nightly build. POST watchlist
What is loaded right now
Every list is downloaded fresh from the publishing authority each night. If a download or parse fails, that authority is marked failed here rather than quietly serving yesterday's copy.
| Authority | List | Records | This build |
|---|---|---|---|
| United States | Consolidated Screening List (OFAC SDN and non-SDN, BIS Entity, Denied Persons, Unverified and MEU, State Department) | 26,186 | loaded |
| European Union | Consolidated Financial Sanctions List | 6,269 | loaded |
| United Kingdom | UK Sanctions List (FCDO) | 6,420 | loaded |
| United Nations | Security Council Consolidated List | 1,007 | loaded |
| Australia | DFAT Consolidated List | 4,010 | loaded |
| Canada | SEMA and autonomous sanctions | 5,708 | loaded |
| Switzerland | SECO sanctions list | 7,100 | loaded |
| Japan | Ministry of Finance asset-freeze list | 2,897 | loaded |
What it costs
Screening is free, unlimited, and needs no key. Unlimited requests, 50 names in each, every static file, and an in-browser screener with no limit at all. That is not a trial. If screening is what you need, you are done, and nothing below applies to you.
Pro is $19.99 a month and exists for one reason: it keeps watching after you stop asking.
| Pro adds | |
|---|---|
| Monitoring | Included |
| Deeper candidate search | 200 per name |
| Bigger batches | 200 names per request 100 search results |
| Commercial use and support | Included |
Monitoring
Screening answers a question about today. Monitoring answers it every night without being asked. Post the names you want watched; every nightly build rechecks them against all eight lists and raises an alert when something changes.
# put a book of counterparties under watch
curl -X POST "https://sanctionscope.com/api/v1/watchlist" -H "content-type: application/json" \
-H "x-api-key: YOUR_KEY" \
-d '{"label": "Counterparties Q3",
"names": ["Acme Trading LLC", "Ivan Petrov"],
"threshold": 0.85,
"email": "[email protected]"}'
# what changed since a date
curl "https://sanctionscope.com/api/v1/alerts?since=2026-09-01" -H "x-api-key: YOUR_KEY"
Quick start
# search across all eight lists
curl "https://sanctionscope.com/api/v1/search?q=sberbank"
# one record
curl "https://sanctionscope.com/api/v1/party/ofa:31695"
# screen a list of names (50 per request free, 200 with a Pro key)
curl -X POST "https://sanctionscope.com/api/v1/screen" -H "content-type: application/json" \
-d '{"names":["Sberbank of Russia","John Smith"],"threshold":0.85}'
# rate limit: 120 requests a minute per IP, then 429 with a retry-after header
import requests
BASE = "https://sanctionscope.com/api/v1/"
hits = requests.get(BASE + "search", params={"q": "sberbank"}).json()["results"]
rec = requests.get(BASE + "party/" + hits[0]["id"]).json()
scr = requests.post(BASE + "screen", json={"names": ["Sberbank of Russia", "John Smith"]}).json()
for r in scr["results"]:
print(r["name"], "->", [(m["name"], m["score"]) for m in r["matches"]])
const BASE = "https://sanctionscope.com/api/v1/";
const hits = (await (await fetch(BASE + "search?q=sberbank")).json()).results;
const rec = await (await fetch(BASE + "party/" + encodeURIComponent(hits[0].id))).json();
const scr = await (await fetch(BASE + "screen", {
method: "POST", headers: {"content-type": "application/json"},
body: JSON.stringify({names: ["Sberbank of Russia", "John Smith"]})
})).json();
Reference
Endpoints
| Endpoint | What it does |
|---|---|
GET search | Name and alias search across all lists, accent-insensitive, word order ignored, scored 0 to 1. ?q= and &limit=. |
GET party/<id> | One merged party. Ids look like ofa:12345, eu:EU-123, uk:UK-RUS0001. |
POST screen | Body {"names": [...], "threshold": 0.85}. Up to five scored matches per name, and an empty array for a name with none, so the response lines up with your input. Names are processed in memory and not stored. For large lists use the in-browser screener, which runs on your own machine and has no limit. |
GET watchlistPOST watchlistGET watchlist/<id>DELETE watchlist/<id> | Names monitored against every nightly build. Pro. |
GET alerts | Additions, amendments and delistings affecting watched names. ?since=, and filter by type or list_id. Pro. |
GET me | Tier and limits for the supplied key. |
Matching and thresholds
Names are compared after accents are stripped and punctuation flattened, with word order ignored, so Putin Vladimir and Vladimir Putin score alike and the French spelling Poutine still matches. Each word is then weighted by how rare it is across the corpus: a surname carried by hundreds of designated parties counts for little, a distinctive one counts for a lot. Words in the listed name that your query does not account for pull the score down, so matching two words of a four-word name is weak even when both are exact.
| Threshold | What to expect |
|---|---|
| 0.90 and up | Close to exact. Few false positives, will miss transliteration variants. |
| 0.85 | The default. Catches spelling and word-order variation without burying you. |
| 0.75 to 0.80 | A wider net for a review queue. Expect more to clear. |
| Below 0.70 | Research only, not a screening posture. |
Limits and errors
| Status | What it means |
|---|---|
| 400 | The body was not JSON, or names was missing or empty. |
| 401 | The key is unknown or no longer active. |
| 403 | A Pro feature was requested without a Pro key. |
| 405 | Wrong method. Screening is POST, the rest are GET. |
| 413 | Too many names for your tier in one request; the cap is in the response. |
| 429 | Over 120 requests a minute from one IP. A retry-after header says how long to wait. |
Static files
Regenerated nightly. Cache them; they change once a day.
| Path | Contents |
|---|---|
| meta.json | Build time, counts, per-authority status, program and country lists |
| parties.json | Manifest of parts (8,000 parties each) holding every merged party with addresses, aliases, programs, authorities, coordinates and links |
| index.json | Compact index for client-side search: id, name, aliases, type, country, authorities, programs |
| changes.json feed.xml | Additions and removals by date, as JSON and RSS |
| programs.json | Programs with counts; programs/<slug>.json for parties in one program |
| countries.json | Countries with counts; countries/<iso2>.json for parties in one country |
| openapi.json | Machine-readable description |
Record shape
{
"id": "ofa:31695", "n": "Central Bank of the Russian Federation", "t": "Entity",
"au": ["US","EU","UK","AU","CA","CH","JP"], authorities listing this party (merged by name)
"p": ["RUSSIA-EO14024","EU:RUS", ...], programs; non-US prefixed by authority
"s": "OFAC other", "list": "Sectoral Sanctions Identifications List ...",
"cc": "RU", "lat": 55.75, "lon": 37.61, "city": "Moscow",
"inf": null, set when the location was inferred, not from an address
"a": [...addresses], "alt": [...aliases], "nat": [...], "dob": "", "ids": "...", "rem": "...",
"ly": 2022, earliest published listing year across records
"recs": [{"au":"EU","url":"...","p":[...],"listed":"2022-02-25"}, ...], one per authority when merged
"links": ["ofa:16681", ...], "Linked To" relationships
"page": "...", "map": "...#p=ofa:31695"
}
Terms
Source data are official government publications; the merged form is released CC0. No uptime guarantee on the free tier; please cache and keep request volume reasonable. Support for Pro subscribers at [email protected].