Test Compliance Risk Checks
Exercising risk screening is hard to arrange on demand. For inbound payments you would normally need access to a wallet that already carries a risk score. In both directions it is not obvious which addresses correspond to which risk categories. To let you build and test your compliance handling against every outcome, Tesser provides two testing mechanisms in sandbox:
- Outbound: send a payout to one of the public test destination addresses below. Each address corresponds to a different risk severity.
- Inbound: call
POST /v1/payments/simulate-inboundand choose themocked_risk_statusyou want the screening verdict forced to.
With both mechanisms you get the same payment.risk_updated webhook, risk_status transitions, and manual-review flow as in production. See Compliance and Risk Management for how screening works and the Funds Movement Lifecycle and Data Model for the full risk_status taxonomy.
Sandbox only
These are testing tools for your sandbox integration. POST /v1/payments/simulate-inbound is blocked in production (returns payments-3053). The outbound test addresses are public on-chain addresses that Tesser does not control. Use them as payout beneficiaries in sandbox and never send meaningful value to them.
Test outbound risk checks
Outbound screening targets the beneficiary wallet, the on-chain address behind desired.to.account_id. To trigger a given outcome, create a payout whose destination account's crypto_wallet_address is one of the test addresses. A payout does not execute until risk is approved (see Payout risk review).
Outbound test destination addresses
These are EVM addresses and can be used on Ethereum Sepolia, Base Sepolia, and Polygon Amoy. In sandbox, use one as the beneficiary of a stablecoin payout.
Severity → risk_status | Destination address |
|---|---|
Medium → automatically_approved | 0xd3f72b3e91c8124dfc1b4273e93594bb00c9be6f |
High → awaiting_decision | 0x0a5b2bf3ccfb44c1d22f07eed9553ecba752d4ad |
Severe → automatically_rejected | 0xac4cc4b68ea24bbfaac8fd127b67ed445accce22 |
Steps
-
Create a beneficiary account at a test address. Create a counterparty and a stablecoin account whose
crypto_wallet_addressis the test address for the severity you want to exercise. Payouts to this account screen to the corresponding outcome. -
Create a payout to that account. Follow Create a Payout and set
desired.to.account_idto the beneficiary account. A minimal request:Code -
Observe the verdict. Once
desired.to.account_idis set, Tesser screens the beneficiary and emits apayment.risk_updatedwebhook carrying the mappedrisk_status:Code
Test inbound risk checks
POST /v1/payments/simulate-inbound sends a real, tiny test-USDC transfer from a Tesser-controlled faucet wallet into one of your managed wallets. It then forces the screening verdict to the mocked_risk_status you choose. The inbound itself is genuine. It is detected on-chain through the normal path, and balances, lifecycle, and webhooks all behave exactly as they would for a real inbound. Only the screening verdict is fabricated. It carries risk indicators that match your mocked_risk_status, so risk_status_reasons is populated the same way as in production. See Receive an Inbound Payment to a Wallet for the flow this exercises.
Prerequisites
- A managed
stablecoin_ethereumwallet with an on-chain address to receive the inbound (to_account). Provision one via Create an Account. An account that exists but is not an eligible managed wallet returnspayments-3055.
Request
| Field | Required | Description |
|---|---|---|
to_account | Yes | Managed account ID that should receive the simulated inbound. |
mocked_risk_status | Yes | The risk_status the screening verdict is forced to: automatically_approved, awaiting_decision, or automatically_rejected. |
network | No | EVM testnet to send on: BASE_SEPOLIA (default), ETHEREUM_SEPOLIA, or POLYGON_AMOY. Any other network returns payments-3054. |
The transfer is a fixed 1 USDC per call. The API returns the actual value.
Code
The mocked_risk_status you send is exactly the risk_status the resulting inbound screens to. If you choose awaiting_decision, record a decision afterward (see Review a payment awaiting a decision).
Response
Once the inbound payment is detected and screened, the endpoint returns the full payment with risk_status set to your mocked_risk_status:
Code
If the on-chain transfer is broadcast but not yet detected and screened within the request's wait budget, the endpoint returns 202 Accepted instead, with the transaction hash and (once known) the payment_id. Poll GET /v1/payments/{paymentId} for the screened payment:
Code
Inbound risk is advisory and does not gate the credit (see Spending the Inbound Funds).
Review a payment awaiting a decision
Whenever a payment lands in awaiting_decision, record a decision through the risk review decision API or in the Tesser dashboard:
Code
After the decision is recorded, risk_reviewed_by and risk_reviewed_at are populated. A payment.risk_updated webhook fires with risk_status transitioned to manually_approved (when is_approved is true) or manually_rejected (when false).