Stablecoin Settlement AML: Screening at Sub-100ms

Stablecoin Settlement AML: Screening at Sub-100ms

Crypto APIs Team

Sep 23, 2026 • 4 min

TL;DR — SoFi's stablecoin card settlement is live on the Mastercard network, with annualized volume expected to exceed $25 billion. If you run a payment platform or PSP touching that flow, you need real-time AML screening before settlement hits your books. This post shows the webhook plus address-screening architecture that keeps settlement moving without added latency.

The problem

SoFi began settling stablecoin transactions on the Mastercard network for a program expected to exceed $25 billion in annualized volume, according to The Block. Settlement volume at that scale moves through payment service providers (PSPs), acquirers, and settlement banks that now hold on-chain stablecoin legs alongside fiat rails.

Here is the build problem a payments backend engineer hits. A stablecoin settlement lands on-chain. Before you credit it, mark it settled, or forward it, you have to know whether the counterparty address is sanctioned or tied to a mixer. Do that check synchronously in the settlement path and you add latency to every transaction. Skip it and you carry sanctions exposure under the Financial Action Task Force (FATF) Travel Rule and the EU Markets in Crypto-Assets (MiCA) regulation. The engineering job is to screen every settlement leg without slowing the settlement pipeline.

What you need

  • A way to detect inbound stablecoin transfers per address in near real time. This is the webhook layer.
  • An AML screening call that returns a risk band and sanctions categories for any address or transaction hash.
  • Coverage across the chains your stablecoin legs actually settle on — USDC and other stablecoins move across Ethereum, Solana, Tron, and others.
  • An honest read on the hard part: screening must run off the hot settlement path. If your credit decision blocks on a synchronous third-party lookup, you have moved the bottleneck, not removed it.

Crypto APIs supplies the two pieces this needs: Blockchain Events for sub-100ms webhook delivery and Verify Address for AML and sanctions screening across 20+ chains. For teams building on the settlement side, the payment processors use case covers the wider flow.

How it works

The pattern is event-driven. You subscribe a webhook to the settlement addresses you control. When a stablecoin transfer confirms, the webhook fires. Your handler then calls the AML endpoint on the counterparty, applies a policy on the returned riskBand, and only then credits or holds the settlement. The screening call runs after the event, not inside the settlement transaction.

First, register a token-transaction webhook for a settlement address. Stablecoins are token transfers, so use the confirmed token-transactions event.

POST https://rest.cryptoapis.io/blockchain-events/ethereum/mainnet/address-tokens-transactions-confirmed
Header: X-API-Key: <your key>

{
  "data": {
    "item": {
      "address": "0xYourSettlementAddress",
      "callbackUrl": "https://your-backend.example/webhooks/settlement"
    }
  }
}

When a confirmed stablecoin transfer arrives at that address, Crypto APIs posts to your callbackUrl. From that payload you extract the sender address. Then screen it. The AML endpoint is GET, with the address in the path — there is no request body.

GET https://rest.cryptoapis.io/aml/addresses/0xCounterpartyAddress
Header: X-API-Key: <your key>

A flagged counterparty returns the risk detail your policy engine reads:

{
  "apiVersion": "2024-12-12",
  "requestId": "6aa3c4642f6f68835e3dbd6c",
  "data": {
    "item": {
      "blockchain": "ethereum",
      "isFlagged": true,
      "riskScore": 80,
      "riskBand": "high",
      "severity": "high",
      "categories": ["malicious", "sanctions"],
      "sources": [{
        "provider": "graphsense",
        "label": "tornado.cash",
        "categories": ["malicious"],
        "severity": "high",
        "listingTimestamp": 1784210009,
        "sanctionPrograms": []
      }],
      "attribution": {
        "entity": "tornado-cash",
        "type": "mixer",
        "label": "Tornado.Cash: Donate"
      },
      "listingTimestamp": 1784210009
    }
  }
}

A clean counterparty returns a low band, and optional fields are omitted rather than set to null:

{
  "apiVersion": "2024-12-12",
  "requestId": "6aa3c48d2f6f68835e3dbf05",
  "data": {
    "item": {
      "isFlagged": false,
      "riskScore": 0,
      "riskBand": "low",
      "severity": "none",
      "categories": [],
      "sources": []
    }
  }
}

If you would rather screen the whole transaction's counterparties at once, use the transaction endpoint with the hash from the webhook payload: GET /aml/transactions/{blockchain}/{transactionHash}. It returns isFlagged, riskBand, and a flaggedAddresses array. Your policy: credit on low, hold and route to manual review on high or severe. For a fuller walkthrough of the webhook side, see the guide on monitoring addresses with webhooks.

What to watch for

Confirmed versus unconfirmed. The event above fires on confirmed transfers. If you screen on unconfirmed transactions to shave time, a reorg can change what you screened. Decide whether your settlement policy credits on first confirmation or waits, and pick the matching event type.

riskBand and severity are enumerated. riskBand is one of low, medium, high, severe. severity is one of critical, high, medium, low, info, none. Do not build a policy that assumes other values. Map each band to an explicit action so an unexpected combination fails closed, not open.

Screen the right side. On an inbound settlement leg, the risk sits with the sender. On an outbound forward or sweep, screen the destination before you broadcast. A single webhook handler that always screens the same field will miss half the exposure.

Multi-chain coverage. Stablecoin settlement does not stay on one chain. Register events and run screening per chain — USDC on Solana and USDC on Tron are separate legs with separate addresses. Screening across chains is covered in AML screening across chains.

Freezes. Sanctioned USDC and USDT addresses can be frozen by the issuer. Detecting a freeze before you credit is a related check worth wiring in; see detecting USDT and USDC freezes.

SoFi's Mastercard integration is live now, which puts a clock on every PSP and settlement platform downstream of that $25 billion. Wire Verify Address screening onto your Blockchain Events webhooks before settlement volume reaches your infrastructure. The free tier needs no credit card, and the pricing calculator sizes it against your expected transaction count.

Infrastructure optimized for growth

35+

Networks Supported

25ms

Avg Processing Time

25,000+ rq/s

Enterprise-ready

100+ TB

of Big Data

Related articles

Share