Skip to main content
Proves that a platform user owns a wallet, with the same on-chain payment verification as the CabalSpy ID website: the user sends a tiny, unique amount from the wallet, directly and not through an exchange or a contract. Once the payment is final, the wallet is verified on that chain. Verification is optional. Use it as a trust badge, or because your instance only counts verified wallets (wallet_trust: verified_only). Whoever verifies an address owns it: unverified copies of it on other accounts stop counting.
The amount is a non-refundable verification fee. Show the user the instructions and make clear that the exact amount must be sent from that wallet before expires_at.

Flow

1

Start

POST /v1/platform-users/wallets/verify with the user, the chain and the address. If the address is not yet one of the user’s wallets, it is added.
2

Show the payment

Show amount, currency, receiver and expires_at, the payment_uri as a link for wallet apps, or the QR code from GET /v1/platform-users/wallets/verification/qr.
3

Wait for the payment

Poll GET /v1/platform-users/wallets/verification until status is verified. If the window passes without payment, the status turns expired and you receive the verification.expired webhook.

Start a verification

POST /v1/platform-users/wallets/verify
string
required
Your id of the user. Alternatively pass csid_id.
string
required
The chain to verify on: solana, bnb, base, eth or rh.
string
required
The wallet. It must match the chain: a Solana address on solana, an EVM address on an EVM chain.
Answers 201 with the verification object and external_id.

Response

The verification object, returned by every endpoint on this page.
string
The verification’s id.
string
pending, verified, expired or cancelled.
string
Chain id, for example solana.
string
Chain name, for example Solana.
string
The wallet that must send the payment.
string
The exact amount to send, in the chain’s currency.
string
The same amount in base units (lamports, wei).
string
SOL, BNB or ETH.
integer
Decimals of the currency.
string
The address to send the payment to.
string
End of the payment window.
integer
Seconds until expires_at while pending, otherwise 0.
string
solana:<receiver>?amount=... or ethereum:<receiver>@<chain id>?value=..., for wallet apps and QR codes.
integer
EVM chain id (56, 8453, 1 or 4663), null on Solana.
string
A ready-made sentence to show the user.
string
The payment transaction once seen, otherwise null.
string
Explorer link of the payment, or null.
string
When the verification was started.
string
Your id of the user.

Check the status

GET /v1/platform-users/wallets/verification?id=<verification_id> Returns the verification object with external_id. Open verifications are also listed in the user’s pending_verifications.

QR code

GET /v1/platform-users/wallets/verification/qr?id=<verification_id> Returns the payment_uri as a QR code, an SVG image (image/svg+xml), not the JSON envelope. Fetch it from your backend and pass it on to your page; your API key must not reach the browser.

Cancel

POST /v1/platform-users/wallets/verification/cancel Cancels an open verification, for example when the user closes the dialog. Returns the verification object with status cancelled and external_id.
string
required
The verification_id.

Errors

See Errors for the full list.