# Screening & AML Cases

Every counterparty checked against the public sanctions lists before your wallets sign, a match held for your compliance team to decide, and the Travel Rule's originator and beneficiary sent with a transfer.

## Overview

- **Screening.** Before Aurea signs, hands out to sign or sends an operation, its counterparty — the address it goes to, a token transfer's recipient, an approval's spender, the contract it calls — is checked against OFAC's SDN list, the EU consolidated list and the UN consolidated list. A transfer into one of your wallets is checked by its sender.
- **A match, where screening is enforced,** stops the operation before anything is signed and opens an **AML case** in your tenant. Your compliance roles read the case — the list entries matched, the counterparty — and decide it: **release** (the operation goes on) or **confirm** (it is rejected).
- **The caller is told nothing of the match**: a held operation answers `202` with the operation to follow, a refused call `403` `SCREENING_REVIEW_REQUIRED`. Only the AML cases say why.
- **The Travel Rule.** [Create Transaction](https://docs.aureahub.com/docs/tx-create.md) takes the transfer's originator, beneficiary and their VASPs in IVMS101, optionally: checked, stored and answered with the transfer.

## Modes

Every tenant's counterparties are screened and recorded today (`log`); holding and refusing (`enforce`) is on request [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md):

| Mode | What your operations meet |
| --- | --- |
| off | Nothing is screened or kept; every answer is as before. |
| log | **Every tenant today.** Each counterparty is screened and the screening kept, and **nothing is held or refused**: every answer is the one it would be without it. A match is recorded as what `enforce` would stop, opens no case, and your policy reads its result. |
| enforce | A match holds or refuses the operation and opens an AML case (below). A tenant on the institutional security profile is in `enforce` by its profile. |

- A screening that cannot complete — no list imported yet, no answer within its time (2 seconds by default), an error — is `PENDING`: it holds and refuses nothing, and your policy decides (Your Policy and the Screening).
- The Travel Rule needs nothing enabled.

## What Is Screened

- **At every signing point** — a send, a token approval, a swap, a dApp's transaction or signature, an MPC signing ceremony, the [Earn](https://docs.aureahub.com/docs/guide-earn.md) products, the broadcast of what was prepared —: the counterparty the point names or its transaction decodes to, in its chain family. A point that names none screens nothing.
- **The Travel Rule's beneficiary**, when the transfer gives one (`travelRule.beneficiary`, The Travel Rule below): its names too.
- **Addresses**: an EVM address matches on every EVM chain, whatever its letters' case; a Solana address exactly.
- **Names** are matched only against the list entries that give no address: accents, case and punctuation ignored, the words in any order, the whole name — never a partial or fuzzy match —, and a name too short to tell (under four letters, or one word under six) matches nothing.
- **In order**: after the [address book](https://docs.aureahub.com/docs/guide-address-book.md), the message rules and the simulation ([Signing Rules](https://docs.aureahub.com/docs/guide-signing-rules.md)), and before your policy, which reads its result.

## The Lists

| source | List |
| --- | --- |
| ofac_sdn | The U.S. Treasury OFAC's Specially Designated Nationals list, with the digital currency addresses it lists. |
| eu_consolidated | The EU consolidated list of financial sanctions, with the wallet addresses its entries' remarks give. |
| un_consolidated | The UN Security Council consolidated list: names. |

- Imported daily from their official publications where Aurea screens. A list that cannot be read keeps its last good version.
- Each screening records the versions it read (`lists`), and each match the list's own reference of the entry, its name, kind and programmes, what matched (`address` or `name`) and the list's date (`matches`).

## A Match Where It Is Enforced

- **Held** — on the money routes that start an operation, with a custodial wallet, where your tenant has operation records: [Create Transaction](https://docs.aureahub.com/docs/tx-create.md), [Approve Token](https://docs.aureahub.com/docs/swap-approve.md), [Execute Swap](https://docs.aureahub.com/docs/swap-execute.md), [Execute Solana Swap](https://docs.aureahub.com/docs/swap-execute-solana.md) and [Execute Gasless](https://docs.aureahub.com/docs/swap-gasless.md). The route answers `202`; the operation waits in `PENDING_SCREENING` `under_review`, quarantined, with nothing signed or sent, until your AML case decides:

```json
{
  "operationId": "1d7a3c52-8e4b-4f19-a0c6-2b9e7d5f3a18",
  "state": "PENDING_SCREENING",
  "subState": "under_review"
}
```

- Follow it with [Get an Operation](https://docs.aureahub.com/docs/operation-get.md) or the `operation.*` events. Released, it moves to `PENDING_SCREENING` `bypassed` and goes on as the call that started it would have — Aurea signs and sends it, once. Confirmed, it ends `REJECTED`, `failureReason` `AML_CASE_CONFIRMED`. The request's `Idempotency-Key` answers the same `202` again: never a second operation.
- **Refused** everywhere else — a client-side or MPC wallet's preparation, a broadcast, a dApp's signature, an MPC signing ceremony, a later step of a call, or a custodial call while Aurea does not record operations: `403` `SCREENING_REVIEW_REQUIRED`, nothing signed or sent, and a recorded operation ends `FAILED` `not_sent`. The case is opened all the same. Released, the same counterparty passes for 24 hours for the same list entries (`decision.exemptionUntil`): send the operation again.
- **No match**: the operation passes `PENDING_SCREENING` `screened` and goes on.

## Received Transfers

- Once the transfers your wallets receive are recorded (coming: [Feature Availability](https://docs.aureahub.com/docs/feature-availability.md)), each recorded transfer's sender is screened once.
- A match where screening is enforced **quarantines the receiving wallet**: it signs nothing — `423` `OPERATION_QUARANTINED` — until your AML case releases it. Confirmed, the quarantine stays, for one of your administrators who lift quarantines to lift once the funds are dealt with ([Freezes & Quarantines](https://docs.aureahub.com/docs/guide-freezes.md)).
- A release never lets a sender through for later: the 24 hours apply to what your wallets send.

## AML Cases

- **One case per match** where screening is enforced, opened by the screening: `status` `open`, then `released` or `confirmed` — once. The routes are under **AML Cases** in the API Reference — [List](https://docs.aureahub.com/docs/aml-cases-list.md), [Get](https://docs.aureahub.com/docs/aml-case-get.md), [Assign](https://docs.aureahub.com/docs/aml-case-assign.md), [Comment](https://docs.aureahub.com/docs/aml-case-comment.md), [Decide](https://docs.aureahub.com/docs/aml-case-decide.md) —, on the caller's own tenant, with an access token.
- **Who reads**: `owner`, `tenantadmin`, `non_signing_admin`, `auditor`, `security_admin` and `security_auditor`. **Who acts** — assigns, comments, decides: `owner`, `tenantadmin`, `non_signing_admin` and `security_admin`, the roles that freeze and quarantine ([Roles](https://docs.aureahub.com/docs/authentication.md)). Any other role: `403`.
- **A case carries its screening**: the counterparty's `address`, chain and family, whether names were screened (`counterpartyNamed`), each list entry matched (`source`, `entryRef`, `kind`, `name`, `programs`, `matchedOn`, `currency`, `listDate`) and the lists' versions read.
- `direction` `outbound` or `inbound` — or `onboarding` (below); `held`: an operation waits for it (`operationId`); `inboundTransferId`: the received transfer's; `quarantineId`: the quarantine it decides; `walletId`: your wallet.
- Assign it to one who decides these cases — an active user of your tenant whose role acts on them — or to nobody; comment it (up to 2000 characters, kept with the case).
- **Onboarding cases.** Where your tenant has [identity verification](https://docs.aureahub.com/docs/guide-identity.md) [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md), a screening match on a person or company being verified opens a case with `direction` `onboarding`, whatever the mode: its screening has `point` and `direction` `onboarding`, `provider` `identity_verification`, no list entries (they stay with the verification service) and the verification's id in `identityVerificationId`. Your roles read it and receive its events; **Aurea's compliance decides it**: assigning, commenting or deciding it answers `403` `AML_CASE_AUREA_DECIDES`.

## Release or Confirm

[Decide](https://docs.aureahub.com/docs/aml-case-decide.md) once, with a written reason (up to 1000 characters, kept with the case only):

| decision | What follows |
| --- | --- |
| release | The match is bypassed: the screening becomes `BYPASSED`, the quarantine is lifted. A held operation goes on with the request it was held with — Aurea signs and sends it once, and the case's `continuation` says when and the status its call answered. A refused call's counterparty passes on the way out for 24 hours, for the same list entries (`decision.exemptionUntil`). A received transfer's wallet signs again. |
| confirm | The match stands (`FROZEN`). A held operation ends `REJECTED` (`AML_CASE_CONFIRMED`), its quarantine lifted: nothing is left to hold. A received transfer's wallet stays quarantined until one of your administrators who lift quarantines lifts it. |

- A second decision answers `409` `AML_CASE_DECIDED`, and so does assigning a decided case; a decided case still takes comments.
- While a case is open, its quarantine is lifted only by its decision: [Lift a Quarantine](https://docs.aureahub.com/docs/quarantine-lift.md) answers `409` `QUARANTINE_HELD_BY_CASE`.

## Your Policy and the Screening

- A rule's `screeningResults` matches the operation's result ([Policy Sets](https://docs.aureahub.com/docs/guide-policy-sets.md)): `PASSED` (no match), `FLAGGED` (a match, recorded in `log`), `PENDING` (it could not complete), `BYPASSED` (a match your case released).
- An institutional tenant's `SCREEN` verdict signs, as an `ALLOW`, once the screening is `PASSED` or `BYPASSED`; otherwise it answers `503` `POLICY_SCREENING_UNAVAILABLE`.

## The Travel Rule

- [Create Transaction](https://docs.aureahub.com/docs/tx-create.md) takes an optional `travelRule` in the data model and JSON names of IVMS101, the interVASP Messaging Standard: `originator` (`originatorPersons`, `accountNumber`), `beneficiary` (`beneficiaryPersons`, `accountNumber`), `originatingVasp` and `beneficiaryVasp`. Give at least one of the four; nothing else is required.
- **A person** is exactly one of `naturalPerson` (`name`, `geographicAddress`, `nationalIdentification`, `customerIdentification`, `dateAndPlaceOfBirth`, `countryOfResidence`) and `legalPerson` (`name`, `geographicAddress`, `customerNumber`, `nationalIdentification`, `countryOfRegistration`); up to 10 persons, names, addresses and account numbers each.
- **IVMS101's rules** apply to what you give: a name's identifier and its type, a legal person's legal name (`LEGL`) among its names, an address's lines or its street and town, a date of birth in the past, ISO 3166 country codes. **A LEI** is a legal person's `nationalIdentification` of type `LEIX`, checked by ISO 17442 — its two check digits — with no country of issue or registration authority; a natural person has none.
- **Refused whole**, nothing sent: a value of the wrong form — a length, a code, a country — answers `400` `Request validation failed`; one IVMS101 does not allow, or a field it does not have, `422` `Validation failed`, with each problem's `path` in `details`.
- **Stored with the transfer**, answered in its `201` as `travelRule`, and read again with [Travel Rule Data](https://docs.aureahub.com/docs/tx-travel-rule.md) by the transfer's sender. Never logged, never in an event or the audit trail.
- Where screening is on, the beneficiary's names are screened with the destination. Without `travelRule`, the call is the same as before.

```json
"travelRule": {
  "originator": {
    "originatorPersons": [
      {
        "legalPerson": {
          "name": { "nameIdentifier": [{ "legalPersonName": "Acme Treasury SpA", "legalPersonNameIdentifierType": "LEGL" }] },
          "nationalIdentification": { "nationalIdentifier": "98450000EXAMPLE0AA58", "nationalIdentifierType": "LEIX" },
          "countryOfRegistration": "IT"
        }
      }
    ]
  },
  "beneficiary": {
    "beneficiaryPersons": [
      {
        "naturalPerson": {
          "name": { "nameIdentifier": [{ "primaryIdentifier": "Rossi", "secondaryIdentifier": "Giulia", "nameIdentifierType": "LEGL" }] },
          "geographicAddress": [{ "addressType": "HOME", "streetName": "Via Roma", "buildingNumber": "10", "townName": "Milano", "country": "IT" }]
        }
      }
    ]
  }
}
```

## Events and the Audit Trail

- `aml_case.opened`, `aml_case.released` and `aml_case.confirmed` — only to the endpoints that name them ([Event Types](https://docs.aureahub.com/docs/guide-events.md)): the case as Get a Case answers it, without its comments or the decision's reason.
- Your [audit trail](https://docs.aureahub.com/docs/audit-events.md) [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md), records each case opened, assigned, commented, released, confirmed and continued (category `security`), and the quarantines placed and lifted — by ids and codes: never an address, a comment or a reason.

## Refusals

The usual envelope, the code in `details.code`:

| Status | details.code | message |
| --- | --- | --- |
| 403 | SCREENING_REVIEW_REQUIRED | `This operation needs the tenant's compliance review: nothing was signed or sent.` — a match where the operation cannot be held |
| 423 | OPERATION_QUARANTINED | `This operation is quarantined: it will not be signed or sent until the quarantine is lifted.` — a wallet whose received transfer matched |
| 409 | QUARANTINE_HELD_BY_CASE | `This quarantine is held by an open AML case: its decision lifts it.` — Lift a Quarantine |
| 404 | AML_CASE_NOT_FOUND | `No such AML case here.` — also another tenant's |
| 409 | AML_CASE_DECIDED | `This AML case is already decided.` |
| 400 | AML_CASE_INVALID | `A reason of 1 to 1000 characters is required.`, `A comment of 1 to 2000 characters is required.` — with `details.field`; one made only of spaces counts as empty |
| 400 | AML_CASE_ASSIGNEE_INVALID | `The assignee must be an active user who decides these AML cases.` |
| 404 | TRAVEL_RULE_NOT_FOUND | `This transfer carries no Travel Rule data` — Travel Rule Data |

---

Web version: https://docs.aureahub.com/#guide-screening
