Skip to content

Sanctions and restrictions

Two endpoints answer "is this party sanctioned?" and "is this product restricted?":

  • GET /v1/sanctions/check screens 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

  1. INN hit: an exact identifier match. Treat as strong, then confirm the name and country.
  2. Name hit with similarity 1.0: same normalised name. Compare countries, program, inn and 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 is UA and its INN differs from Sberbank of Russia's 7707083893).
  3. Both INN and name agree: this is what the company card of 7708503727 shows (CSL entry for the same INN and name). Strongest case.
  4. 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 Airlines returns Iranian airlines such as KISH AIRLINES (0.63) and TOOS AIRLINES because "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

curl -s -H "Authorization: Bearer $TRRU_KEY" -G "https://trru.atapinar.com/v1/sanctions/check" \
  --data-urlencode "name=Сбербанк" --data-urlencode "inn=7707083893" --data-urlencode "min_similarity=0.7"
body = get("/v1/sanctions/check", name="Сбербанк", inn="7707083893", min_similarity=0.7)
d = body["data"]
print("INN hits:", [(h["list"], h["name"]) for h in d["inn_hits"]])
for h in d["name_hits"]:
    print(h["list"], h["similarity"], h["name"], h["countries"], h["program"])
const { data } = await get("/v1/sanctions/check", { name: "Сбербанк", inn: "7707083893", min_similarity: "0.7" });
console.log("INN hits:", data.inn_hits.map((h) => [h.list, h.name]));
for (const h of data.name_hits) console.log(h.list, h.similarity, h.name, h.countries, h.program);

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).

curl -s -H "Authorization: Bearer $TRRU_KEY" "https://trru.atapinar.com/v1/restrictions/382440"
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:

  • hs is 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.
  • eu combines 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 of 382440: 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 an excluded entry of 3 brands) and a specific entry 3824400000 limited to 9 brands (plus a small excluded entry for that code, omitted from the example).
  • as_of is null for bis_chpl and parallel_import: those lists have no single data date. Use fetched_at to 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

curl -s -H "Authorization: Bearer $TRRU_KEY" "https://trru.atapinar.com/v1/restrictions/854231"
d = get("/v1/restrictions/382440")["data"]
print("US CHP:", d["hs"]["on_chp_list"])
for a in d["eu"]["eu_833_annexes"]:
    print(a["annex"], a["match"], a["restriction"], a["article_ref"], a["consolidated_date"])
for p in d["eu"]["ru_parallel_import"]:
    print(p["tnved_code"], p["mode"], p["rows"])
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.