Sanctions and restrictions¶
Two endpoints answer "is this party sanctioned?" and "is this product restricted?":
GET /v1/sanctions/checkscreens a name and/or an INN against sanctions lists.GET /v1/restrictions/{hs}shows trade restrictions that apply to an HS code.
A screening aid, not a legal determination
Results are matches from stored copies of public lists. They can be incomplete, out of date (check meta.sources[].fetched_at and each entry's as_of) or wrong for your case. A candidate is not a confirmed hit, and an empty result is not clearance. Decisions on a counterparty or a shipment need the primary sources and, where it matters, legal advice.
GET /v1/sanctions/check¶
curl -s -H "Authorization: Bearer $TRRU_KEY" \
"https://trru.atapinar.com/v1/sanctions/check?name=Sberbank&limit=3"
Parameters¶
| Parameter | Type | Default | Meaning |
|---|---|---|---|
name |
string | empty | Company or person name to screen. Cyrillic, Latin and Turkish spellings work. |
inn |
string | empty | Russian tax number for an exact identifier match. Keep it a string. |
min_similarity |
number | 0.45 |
Lowest name similarity to return, 0 to 1. Higher means fewer, closer candidates. A value above 1 returns no name hits. |
only_active |
boolean | true |
true returns entries currently in force. false also returns entries marked inactive (active: false, with delisted_on when known). |
limit |
integer | 15 |
Maximum name hits, capped at 50 (larger values are clamped, 0 returns none). inn_hits is capped at 50 on its own. |
You can send name, inn, or both. With neither (or a name that normalises to fewer than 3 characters, such as ab), the response is 200 with inn_hits and name_hits empty and all five lists in meta.sources; this is not an error, so check that you sent something.
How matching works¶
By INN is an exact string comparison against the INN field of list entries. It is the strongest signal when it hits. But many list entries carry no INN (in the samples above the EU entries for Sberbank and Putin have none), so an empty inn_hits says little: always screen the name as well.
By name is fuzzy. The query and every listed name (including aliases) are normalised the same way: Cyrillic to Latin, accents and Turkish letters folded, punctuation removed, legal forms dropped (ООО, PJSC, LLC, A.Ş., Joint Stock Company and similar). similarity is the trigram similarity of the two normalised strings:
| similarity | Reading |
|---|---|
1.0 |
Identical after normalisation. Not the same as identical entity: Sberbank and Joint Stock Company Sberbank both normalise to sberbank. |
| 0.8 to 0.99 | Near-identical spelling, often a transliteration or a suffix. Check manually. |
| 0.45 to 0.79 | Shares some words. Frequently a different company. |
Hits are sorted by similarity, then by list. The same real-world entity commonly appears several times: once per list and, within one list, once per alias that matched.
Lists covered¶
list code |
List | Source id in meta.sources |
|---|---|---|
EU |
EU consolidated financial sanctions list | eu_fsf |
OFAC |
US Treasury OFAC SDN list | ofac_sdn |
UK |
UK sanctions list (FCDO) | uk_fcdo |
UN |
UN Security Council consolidated list | un_sc |
CSL |
US Consolidated Screening List (includes the BIS Entity List and the OFAC sectoral lists) | us_csl |
meta.sources lists the lists that produced hits; with no hits it lists all five. Freshness of each list: /v1/sources/freshness.
Example response¶
Request: GET /v1/sanctions/check?name=Sberbank&limit=3
{
"data": {
"query": { "name": "Sberbank", "inn": "", "normalized": "sberbank" },
"inn_hits": [],
"name_hits": [
{
"list": "CSL",
"entry_id": "18715",
"name": "JOINT STOCK COMPANY SBERBANK",
"entity_type": "entity",
"program": "Sectoral Sanctions Identifications List: UKRAINE-EO13662; RUSSIA-EO14024",
"countries": ["UA"],
"inn": "259597826652",
"listed_on": null,
"active": true,
"delisted_on": null,
"as_of": "2026-11-13",
"matched_name": "sberbank",
"similarity": 1.0
},
{
"list": "CSL",
"entry_id": "17018",
"name": "PUBLIC JOINT STOCK COMPANY SBERBANK OF RUSSIA",
"entity_type": "entity",
"program": "Sectoral Sanctions Identifications List: UKRAINE-EO13662; RUSSIA-EO14024",
"countries": ["RU", "CN", "IN"],
"inn": "7707083893",
"listed_on": null,
"active": true,
"delisted_on": null,
"as_of": "2026-11-13",
"matched_name": "sberbank",
"similarity": 1.0
},
{
"list": "EU",
"entry_id": "EU.8537.32",
"name": "Сбербанк",
"entity_type": "entity",
"program": "UKR",
"countries": ["RU"],
"inn": null,
"listed_on": "2022-07-21",
"active": true,
"delisted_on": null,
"as_of": "2026-10-23",
"matched_name": "sberbank",
"similarity": 1.0
}
]
},
"meta": {
"sources": [
{ "source_id": "eu_fsf", "fetched_at": "2026-11-13T06:15:29.885405+00:00", "as_of": "2026-10-23" },
{ "source_id": "us_csl", "fetched_at": "2026-11-13T06:17:04.741878+00:00", "as_of": "2026-11-13" }
],
"request_id": "87ce630b56e94e03b25a50f7c918c7b4",
"truncated": false
}
}
The list was limited to three hits by limit=3; with the default limit of 15 more entries and alias rows appear.
Field notes¶
| Field | Meaning |
|---|---|
query.normalized |
The query after normalisation: this is what was matched. |
list |
List code, see the table above. |
entry_id |
The list's own entry id (EU EU.8537.32, UK RUS0251, UN QDe.004; OFAC numeric; CSL numeric or a hash). Use it to find the entry on the publisher's site. |
name |
The primary name of the entry as published. |
matched_name |
The normalised name or alias that matched your query (name hits only). |
similarity |
0 to 1, see above (name hits only). |
entity_type |
entity or individual. |
program |
Sanctions programme or list label as published, for example RUSSIA-EO14024, UKR, Entity List. |
countries |
Countries on the entry. The format follows the list: RU on EU and CSL entries, Russia on OFAC and UK entries. Can be empty. |
inn |
INN on the entry, when the list has one. |
listed_on |
Date the entry was listed, when the list publishes it; null otherwise. |
active, delisted_on |
Whether the entry is in force and, if not, when it was removed. |
as_of |
Date of the list snapshot the entry comes from. |
How to read a hit¶
- INN hit: an exact identifier match. Treat as strong, then confirm the name and country.
- Name hit with similarity 1.0: same normalised name. Compare
countries,program,innand the entity type with what you know about the party. In the example, the first row is a different legal entity with a similar name (its country isUAand its INN differs from Sberbank of Russia's7707083893). - Both INN and name agree: this is what the company card of
7708503727shows (CSL entry for the same INN and name). Strongest case. - Name only, similarity below about 0.8: usually a false positive.
False positives¶
The matcher is deliberately loose, so expect noise:
- Generic words dominate short names. Screening
Turkish Airlinesreturns Iranian airlines such asKISH AIRLINES(0.63) andTOOS AIRLINESbecause "airlines" is the shared token. - Short, common names (a surname, a single word) match many unrelated entries.
- Two different companies can share a normalised name (legal form is ignored).
To cut noise: add the INN, raise min_similarity to 0.7 or 0.8, and compare countries and program with the party. To avoid misses on a transliterated name, try the Cyrillic and the Latin spelling and keep the default 0.45.
Errors¶
Malformed numbers (for example min_similarity=abc) return 400 invalid or missing parameter(s): min_similarity. There is no 404: no match is an empty list.
Code¶
A step-by-step workflow is in the Counterparty screening guide.
GET /v1/restrictions/{hs}¶
Trade restrictions that touch an HS code (Harmonized System; Russian TN VED and Turkish GTİP share the first 6 digits).
| Parameter | Type | Default | Meaning |
|---|---|---|---|
hs (path) |
string | required | An HS code of at least 4 digits; any length above that. Dots, spaces and other non-digits are ignored (3824.40 equals 382440). Fewer than 4 digits returns 400 hs must have at least 4 digits .... |
The response has two blocks, hs and eu:
hsis the US Common High Priority Items (CHP) list. It compares the first 6 digits of your code, as a prefix: a 4-digit code returns every CHP item below it.eucombines the EU Regulation 833/2014 annexes, Russia's parallel-import list, and a copy of the US CHP hits (us_chp). For the annex and parallel-import lookups the full digit string you sent is used, up to the length of the code in each list.
Example response¶
Request: GET /v1/restrictions/382440
{
"data": {
"hs": {
"query": "382440",
"on_chp_list": false,
"items": []
},
"eu": {
"query": "382440",
"eu_833_annexes": [
{
"annex": "XXI",
"code": "3824",
"match": "covers",
"description": "Prepared binders for foundry moulds or cores; chemical products and preparations for the chemical or allied industries, incl. mixtures of natural products, n.e.s.",
"restriction": "import ban (revenue-generating goods)",
"article_ref": "Art. 3i(1)",
"consolidated_date": "2026-07-24"
},
{
"annex": "XXIII",
"code": "3824",
"match": "covers",
"description": "Prepared binders for foundry moulds or cores; chemical products and preparations for the chemical or allied industries, (including those consisting of mixtures of natural products), not elsewhere specified or included",
"restriction": "industrial-capacity goods export ban",
"article_ref": "Art. 3k(1)",
"consolidated_date": "2026-07-24"
}
],
"ru_parallel_import": [
{
"tnved_code": "38",
"mode": "brand",
"rows": 47,
"brands_sample": "ACURA, ALFA ROMEO, AUDI, BENTLEY, BMW, CADILLAC, CASTROL, CHEVROLET, CHRYSLER, DAEWOO, DAIHATSU, DATSUN, DODGE, elf, FERRARI, FIAT, GENERAL MOTORS (GM), GMC, HONDA, HUMMER, INFINITI, JAGUAR, JEEP, LAND ROVER, LEXUS, LINC…"
},
{
"tnved_code": "38",
"mode": "excluded",
"rows": 3,
"brands_sample": "AIR WICK, Finish, Vanish"
},
{
"tnved_code": "3824400000",
"mode": "brand",
"rows": 9,
"brands_sample": "BENTONORIT, BONDERITE, DOMINO, FLOPAM, GCP (GCP APPLIED TECHNOLOGIES), HYDRAIZER (Polymer systems), ILUKA, MAGNAFLOC, Miltenyi Biotec"
}
],
"us_chp": []
}
},
"meta": {
"sources": [
{ "source_id": "bis_chpl", "fetched_at": "2026-11-13T06:17:05.185599+00:00", "as_of": null },
{ "source_id": "eu_regs", "fetched_at": "2026-11-13T11:23:35.245395+00:00", "as_of": "2026-07-24" },
{ "source_id": "parallel_import", "fetched_at": "2026-11-13T10:47:35.313472+00:00", "as_of": null }
],
"request_id": "9b3381750f09444f98ec5ba109101e0c",
"truncated": false
}
}
The ru_parallel_import list above is trimmed to three items; the live response also has a fourth: 3824400000 in mode excluded with 3 rows.
The hs block (US CHP list)¶
| Field | Meaning |
|---|---|
query |
The first 6 digits that were checked. |
on_chp_list |
true if at least one CHP item matched. |
items[] |
Matches: hs_code (6 digits), tier, description, as_of. |
tier is a string. Tiers seen: 1, 2, 3.A, 3.B, 4.A. Tier 1 is the highest priority. For example GET /v1/restrictions/854231 returns one item, tier 1, "Electronic integrated circuits: Processors and controllers…".
The eu block¶
eu_833_annexes[]: entries of Council Regulation (EU) No 833/2014 whose code overlaps yours.
| Field | Meaning |
|---|---|
annex |
Annex number (Roman numerals, for example XXI, VII, XL). |
code |
The CN/HS code as the annex lists it, for example 3824 or 854231. |
match |
covers: the annex code is a prefix of your code, so the restriction applies to your code (an [ex] marker in the description means only part of the code). narrower: the annex lists longer codes under your code, so only some sub-codes are restricted. |
description |
Annex text for the code. |
restriction |
Plain label of the measure (see below). |
article_ref |
Article of the regulation that carries the measure. |
consolidated_date |
Date of the consolidated regulation text this entry was read from. Quote it. |
Labels in use include: import ban (revenue-generating goods) (Annex XXI), industrial-capacity goods export ban (XXIII, XXXVII), dual-use/advanced tech export ban (VII), common high priority items (CHPL) export/due-diligence (XL), aviation & space goods export ban (XI), luxury export ban (XVIII), jet fuel & fuel additives export ban (XX), iron & steel import ban (XVII), crude oil & petroleum products import ban (XXV), gold import ban (XXVI), oil price cap (services ban above cap) (XXVIII). The annexes XXXI and XXXII are derogation and quota lists, not bans.
At most 200 annex rows are returned, covering matches first. A short code (4 digits) can match many narrower rows: for 8708 most rows are narrower sub-codes.
ru_parallel_import[]: entries of Russia's list of goods allowed for parallel import, grouped by code and mode.
| Field | Meaning |
|---|---|
tnved_code |
Russian TN VED code of the list entry, for example 38 (a whole chapter) or 3824400000 (a 10-digit code). |
mode |
any: parallel import is allowed for any trademark under this code. brand: allowed only for the listed brands. excluded: the listed brands are carved out and not allowed. |
rows |
Number of list rows grouped here (brands or entries). |
brands_sample |
Comma-separated brand names, cut at 300 characters with …. |
At most 50 groups are returned. Which brands apply to your product is decided by the code-and-brand combination, so read brands_sample together with mode.
us_chp[]: the same CHP items as hs.items (hs_code, tier, description) matched in both directions (your code is a prefix of the item, or the reverse), without as_of.
Reading the 382440 example¶
- Not on the US CHP list (
on_chp_list: false). - Two EU annexes cover code
3824, which is a prefix of382440: Annex XXI (import ban, Art. 3i(1)) and Annex XXIII (export ban, Art. 3k(1)). Both were read from the consolidated text of 2026-07-24. - The parallel-import list has a chapter-wide entry (
38, brand mode, 47 rows; and anexcludedentry of 3 brands) and a specific entry3824400000limited to 9 brands (plus a smallexcludedentry for that code, omitted from the example). as_ofisnullforbis_chplandparallel_import: those lists have no single data date. Usefetched_atto judge age.
Errors and edge cases¶
| Case | Response |
|---|---|
Fewer than 4 digits (/v1/restrictions/38) |
400 hs must have at least 4 digits ... |
Letters mixed in (382440abc) |
Non-digits are dropped, so the code is 382440 |
| Code not restricted | 200 with empty arrays and on_chp_list: false |
For the full text of a regulation or a US licence, use /v1/docs/search.
Code¶
const { data: d } = await get("/v1/restrictions/382440");
console.log("US CHP:", d.hs.on_chp_list);
for (const a of d.eu.eu_833_annexes) console.log(a.annex, a.match, a.restriction, a.article_ref, a.consolidated_date);
for (const p of d.eu.ru_parallel_import) console.log(p.tnved_code, p.mode, p.rows);
The same restriction data is part of the product dossier under restrictions: see Trade and product check.