Understand when and how wallet ownership verification works for onramp transactions
When onramping to non-Crossmint wallets, the onramp may require the user to prove they own the recipient wallet by signing a message. This is a legal requirement under anti-money laundering (AML) and counter-terrorism financing (CTF) regulations, which mandate verification of the beneficiary wallet owner’s identity above certain transaction thresholds. This page explains when proof of ownership is required and how it works.
The API responds with a verification challenge following the CAIP-122 standard:
{ "address": "0x1234...5678", "chain": "base-sepolia", "type": "external-wallet", "ownership": { "verified": false, "verificationChallenge": "crossmint.com wants you to sign in with your blockchain account:\n0x1234...5678\n\n..." }}
2
Create Order
Create the onramp order as usual. If verification is required, the order response will have status requires-recipient-verification:
{ "order": { "payment": { "status": "requires-recipient-verification", "preparation": { "message": "crossmint.com wants you to sign in with your blockchain account:\n0x1234...5678\n\n..." } } }}
3
Sign the Message
Have the user sign the preparation.message using their wallet’s private key:
import { Wallet } from "ethers";const wallet = new Wallet("YOUR_PRIVATE_KEY");const message = order.payment.preparation.message;const signature = await wallet.signMessage(message);
4
Submit Signature
Submit the signature as proof of ownership using the same Link External Wallet API:
You can verify wallet ownership at the time of linking (before any order is created) by including the proof field in the initial Link External Wallet call. This avoids requiring verification during the checkout flow.