# Sanctions screening: is this person on the OFAC list?

**Published:** October 13, 2026 | **Authors:** Cristian Correa

---

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

```mermaid
flowchart TD
  A["Name, plus birth date, country or ID if you have them"] --> B["Find every party whose name comes close"]
  B --> C["Score each one from 0 to 100"]
  C --> D["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:

```mermaid
flowchart TD
  A["A party whose name comes close"] --> B{"ID number matches"}
  B --> C["Yes: score 100"]
  B --> D["No: name 60, birth date 25, country 15"]
  C --> E["Kept if it reaches the threshold"]
  D --> E
  E --> F["Hits closest first, each with its breakdown"]
```

| What you send | Weight | What it does |
| --- | --- | --- |
| `name` | 60 | Required. Matched through typos, order, accents and aliases |
| `birth_date` | 25 | Same day adds, same year counts in part, another year subtracts |
| `country` | 15 | A tie to the country adds, no tie subtracts. English name or ISO code |
| `id_number` | decides | A 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

```bash
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:

```json
{
  "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](https://docs.usecroma.com/datasets), so it answers in milliseconds.

**Can I screen a whole portfolio?** Call it once per subject. A [monitor](https://docs.usecroma.com/monitors) 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](https://docs.usecroma.com/mcp-server) as `ofac_sanctions_screen`.

Every field is in [the OFAC guide](https://docs.usecroma.com/guides/united-states/ofac). To browse the list by words instead, there is [the free OFAC search tool](/us/tools/ofac-sanctions-search), and every other US source is under [United States](/us).

---

**More updates:** [View all changelog entries](/en/changelog/sitemap.md) | [Croma](https://usecroma.com)
