Sanctions screening: is this person on the OFAC list?

Screen a person or company against the OFAC sanctions lists by name, with typos, accents and any word order, and get each possible match scored from 0 to 100.

New endpoint

Sanctions screening means checking whether a customer, supplier or counterparty is on a sanctions list before you do business with them. In the United States the list that matters is OFAC's: the Treasury's Specially Designated Nationals (SDN) list plus its non-SDN lists, about 20,000 people, companies, vessels and aircraft.

As of today, POST /us/ofac/sanctions-screen/v1 takes the name you have, with whatever else you know, and returns the parties on those lists that may be the same one. Each comes with a score from 0 to 100 and what decided it.

Why a name search is not enough#

Names never arrive the way the list writes them. OFAC records MADURO MOROS, Nicolas. Your onboarding form says Nicholas Maduro Moros. An exact search finds nothing, and in screening, "nothing" is the most expensive wrong answer there is.

The screen matches names the way a compliance analyst reads them:

  • Any word order: Nicolas Maduro and MADURO MOROS, Nicolas are the same person.
  • Typos and transliterations: Nicholas finds Nicolas, and Aero Carribean finds AERO CARIBBEAN.
  • Accents and punctuation: Nicolás and Nicolas match.
  • Words joined or split: Al Qaida and Alqaida match.
  • Aliases too: every primary name and every alias OFAC records is compared.

It also knows what does not make two names alike. Legal forms such as LLC or S.A. do not, so two unrelated companies that share a suffix stay apart. And two names that differ only by a number, such as two vessels in a fleet, do not match.

How it works#

How sanctions screening works A top down flow: send a name, plus a birth date, country or ID number if you have them; Croma finds every party whose name comes close, scores each one from 0 to 100 and returns the ones at or above your threshold. Name, plus birth date, country or ID if you have them Find every party whose name comes close Score each one from 0 to 100 Return the ones at or above your threshold

The score weighs what you send. The name decides most of it, and the rest confirms or rules out the hit:

How the screening score is decided A top down flow: for a party whose name comes close, if an ID number matches the score is 100; otherwise the score weighs the name at 60, the birth date at 25 and the country at 15. The party is kept if it reaches the threshold, and hits come back closest first, each with its breakdown. A party whose name comes close ID number matches Yes:score 100 No: name 60,birth date 25, country 15 Kept if it reaches the threshold Hits closest first,each with its breakdown
What you sendWeightWhat it does
name60Required. Matched through typos, order, accents and aliases
birth_date25Same day adds, same year counts in part, another year subtracts
country15A tie to the country adds, no tie subtracts. English name or ISO code
id_numberdecidesA passport, national ID or tax number that matches one OFAC records sets the score to 100

A part you leave out, or that OFAC does not record for a party, is not compared, and the others share its weight. With a name alone, the name is the whole score.

Try it#

curl https://api.croma.run/us/ofac/sanctions-screen/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Nicolas Maduro",
    "birth_date": "1962-11-23",
    "country": "VE"
  }'

The name is written in a different order from the list and without the second surname, and it still finds the party:

{
  "as_of": "2026-10-13T21:30:34.860Z",
  "threshold": 85,
  "matched": true,
  "count": 1,
  "hits": [
    {
      "score": 97,
      "matched_name": "MADURO MOROS, Nicolas",
      "matched_on": "name",
      "breakdown": {
        "name": { "score": 95, "weight": 0.6 },
        "birth_date": { "result": "match", "score": 100, "weight": 0.25, "value": "23 Nov 1962" },
        "country": { "result": "match", "score": 100, "weight": 0.15, "value": "Venezuela" },
        "id_number": { "result": "not_compared", "value": null }
      },
      "party": {
        "id": "sdn-22790",
        "list": "sdn",
        "name": "MADURO MOROS, Nicolas",
        "party_type": "individual",
        "programs": ["VENEZUELA", "IRAN-CON-ARMS-EO"]
      }
    }
  ]
}

matched answers the yes or no question in one field. breakdown shows why: the name scored 95, and the date of birth and the country both matched. Without birth_date, the same name also returns his son, who shares it, which is exactly why the date is worth sending.

Tuning it#

  • threshold (50 to 100, default 85) is how close a party must be to come back. Raise it for fewer, closer hits; lower it to review more.
  • party_type limits the screen to individual, entity, vessel or aircraft.
  • list screens against sdn or non_sdn alone.
  • limit (1 to 50, default 10) caps the hits.

Questions#

Does an empty hits mean the person is clear? It means no party on the lists comes close to the name at your threshold. That is a complete answer, not an error.

Is a hit a determination? No. A name match is a starting point. OFAC's own guidance is to confirm a hit against the party's other identifiers before acting on it, and the list holds many similar names. Sending a date of birth, a country or an ID number is how you tell them apart.

How current is it? The lists are brought up to date every day, and every answer carries as_of. It is a dataset endpoint, so it answers in milliseconds.

Can I screen a whole portfolio? Call it once per subject. A monitor on a screen emails you when its answer changes after a daily update, which is how you catch a customer added to the list after you onboarded them.

Can an agent use it? Yes. It is on the MCP server as ofac_sanctions_screen.

Every field is in the OFAC guide. To browse the list by words instead, there is the free OFAC search tool, and every other US source is under United States.

Build on government data

The official records of the United States, Brazil, Mexico, Peru and Colombia in one typed API, ready for your agents.