GET /iban/screen

Returns a risk verdict on an IBAN in a single call: is the issuing bank/BIC on a sanctions list (OFAC / EU / UN), is the account’s jurisdiction risky (FATF black/grey lists, embargoes, EU-AML), and what is the aggregated risk band. Built for the KYB / onboarding persona that has to clear a counterparty’s IBAN before paying it.

The verdict is derived from official public lists (sanctions registries and jurisdiction risk lists) refreshed into a local snapshot. The lookup is purely local → response in milliseconds. The bank, BIC and country come from the same engine as GET /iban/resolve, so the shared fields match across both endpoints.

x402 golden rule: the agent pays for the answer to its question. “This IBAN is invalid” or “this jurisdiction is high-risk” is a successful answer → 200. The 4xx range is reserved for requests the service cannot answer.

Scope and limits

This endpoint screens bank/BIC against sanctions lists and jurisdiction risk only. It does not screen the account holder’s name (sanctions/PEP name matching) — that is a distinct concern. A clear verdict means no signal was found on the covered lists; it is not a legal compliance opinion and does not replace your own AML obligations.

Parameters

ParameterTypeRequiredDescription
ibanstringyesIBAN to screen; spaces and dashes tolerated, any case

200 response — UnifiedResponse

{
  "data": { ... },
  "provenance": {
    "source": "ofac-eu-un-sanctions",
    "fetched_at": "2026-06-20T09:30:00Z",
    "freshness": { "kind": "snapshot", "as_of": "2026-06-19T00:00:00Z" }
  }
}
  • provenance.source: stable composite identifier of the screening lists.
  • freshness.as_of: date of the lists snapshot — the determining factor of the verdict (a hit reflects the lists as of this date).

Fields of data — ScreenResult

FieldTypeDescription
ibanstringElectronic form if valid, otherwise the input as received
validboolStructural validity (country format + mod-97 checksum)
countrystring | nullISO 3166-1 alpha-2 country code, if extracted
bank_codestring | nullBank code, if the country defines its position
bankobject | null{ "name": string, "bic": string | null }
screeningobject | nullRisk verdict; null when the IBAN is invalid (nothing to screen)
coveragestring"full" | "partial" | "structure_only" — reused from the resolution engine (see coverage); gates clear (see below)
issuestring | nullDiagnostic code when valid: false

Fields of screening

FieldTypeDescription
riskstringAggregated band: prohibited | high | elevated | clear | unknown
bank_sanctionedboolWhether the issuing bank/BIC matched a sanctions list
jurisdictionobject{ "level": string, "lists": string[] } for the account’s country
hitsarrayMatched signals (possibly empty); see below

Each element of hits is { "type": "bank_sanction" | "jurisdiction", "source": "OFAC" | "EU" | "UN" | ..., "detail": "<programme/list>" }.

jurisdiction.level is one of clear, monitored (FATF grey), high_risk (FATF black / EU-AML), sanctioned (embargo), or unknown (country outside the covered lists). jurisdiction.lists names the sources that placed it there.

Risk band semantics

riskMeaning
prohibitedSanctioned bank/BIC or a sanctioned (embargoed) jurisdiction
highHigh-risk jurisdiction (FATF black list / EU-AML), bank not sanctioned
elevatedMonitored jurisdiction (FATF grey list)
clearNo signal found on the covered lists and coverage: "full"
unknownValid IBAN but bank/BIC or country outside coverage — no claim is made

clear requires full coverage. A clear verdict is only returned when the bank is resolvable against a complete national register (coverage: "full") and nothing matched. When coverage is partial (FR / GB / PT, curated subset) or structure_only and no signal is found, the verdict is unknown, not clear — the absence of a hit on an incompletely-known bank is not a clean bill of health. Sanctions and jurisdiction hits still fire under any coverage (a prohibited/high/elevated verdict does not need full).

Case 1 — clean IBAN (risk: "clear")

{
  "iban": "DE77100000000000000000",
  "valid": true,
  "country": "DE",
  "bank_code": "10000000",
  "bank": { "name": "Bundesbank", "bic": "MARKDEF1100" },
  "screening": {
    "risk": "clear",
    "bank_sanctioned": false,
    "jurisdiction": { "level": "clear", "lists": [] },
    "hits": []
  },
  "coverage": "full",
  "issue": null
}

Case 2 — sanctioned bank (risk: "prohibited")

{
  "iban": "RU0204452560040702810412345678901",
  "valid": true,
  "country": "RU",
  "bank_code": "044525600",
  "bank": { "name": "Example Bank", "bic": "EXMPRUMMXXX" },
  "screening": {
    "risk": "prohibited",
    "bank_sanctioned": true,
    "jurisdiction": { "level": "sanctioned", "lists": ["EU", "OFAC"] },
    "hits": [
      { "type": "bank_sanction", "source": "OFAC", "detail": "SDN" },
      { "type": "jurisdiction", "source": "EU", "detail": "restrictive-measures" }
    ]
  },
  "coverage": "full",
  "issue": null
}

Case 3 — monitored jurisdiction, clean bank (risk: "elevated")

{
  "iban": "...",
  "valid": true,
  "country": "XX",
  "bank_code": "...",
  "bank": { "name": "Example Bank", "bic": "EXMPXXMMXXX" },
  "screening": {
    "risk": "elevated",
    "bank_sanctioned": false,
    "jurisdiction": { "level": "monitored", "lists": ["FATF-grey"] },
    "hits": [
      { "type": "jurisdiction", "source": "FATF", "detail": "increased-monitoring" }
    ]
  },
  "coverage": "full",
  "issue": null
}

Case 4 — valid IBAN, incomplete coverage, no signal (risk: "unknown")

The IBAN is structurally valid but the bank/BIC or country is not fully covered — either structure_only (outside the registry) or partial (FR / GB / PT, a curated subset where the bank was not found). With no sanctions or jurisdiction signal, the service returns unknown, not clear.

{
  "iban": "...",
  "valid": true,
  "country": "XX",
  "bank_code": "...",
  "bank": null,
  "screening": {
    "risk": "unknown",
    "bank_sanctioned": false,
    "jurisdiction": { "level": "unknown", "lists": [] },
    "hits": []
  },
  "coverage": "structure_only",
  "issue": null
}

The same unknown verdict applies to a partial-coverage IBAN (FR/GB/PT) whose bank is not in the curated subset and carries no other signal.

Case 5 — invalid IBAN (successful answer → 200)

Nothing can be screened, so screening is null.

{
  "iban": "DE89370400440532013001",
  "valid": false,
  "country": null,
  "bank_code": null,
  "bank": null,
  "screening": null,
  "coverage": "structure_only",
  "issue": "BAD_CHECKSUM"
}

Possible issue codes: BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY, INVALID_BBAN.

Errors

StatuscodeCase
400MISSING_PARAMETERiban parameter missing or empty
500INTERNALInternal error (detail logged, not exposed)
{ "error": "missing or empty required parameter: iban", "code": "MISSING_PARAMETER" }

See also