Skip to main content

Wallet Verification

The Wallet Verification API enables you to verify ownership of wallet addresses through multiple verification flows. This supports compliance requirements and fraud prevention.

Create Wallet Verification

Create a new wallet verification request. Users prove ownership through SATOSHI_TEST, VISUAL_PROOF, SELF_DECLARED, or SIGNATURE_PROOF flows.

Create Wallet Verification is dispatched through Shufti's main verification endpoint by including a travel_rule block with type set to wallet_verification.

Endpoint

POST {{BASE_URL}}/
note

This is the same / endpoint used by other Shufti verification services. Authenticate using Basic Auth with your client_id and secret_key (or an Access Token), exactly as described in Get Started - Authentication.

Request Parameters

ParameterRequiredTypeDescription
travel_rule.typeYesstringMust be set to wallet_verification to route this request as a wallet verification.
travel_rule.assetYesstringCryptocurrency asset code to verify (e.g., BTC, ETH).
travel_rule.blockchainYesstringBlockchain network name (e.g., Bitcoin, Ethereum).
travel_rule.addressYesstringWallet address to verify.
travel_rule.allowed_flowsNoarrayVerification flow types to allow. See Verification Flows. If omitted or empty, all flows are allowed — which includes SATOSHI_TEST, so satoshi_flow then becomes required.
travel_rule.allowed_languagesNoarrayLanguage codes for the verification form (e.g., en, es). If omitted, all languages are allowed.
travel_rule.metadataNostringCustom metadata or notes.
travel_rule.satoshi_flowCond.objectConfiguration for SATOSHI_TEST flow. Required when SATOSHI_TEST is in allowed_flows.
travel_rule.satoshi_flow.deposit_addressCond.stringDeposit address. Required if using SATOSHI_TEST.
travel_rule.satoshi_flow.amountCond.numberDeposit amount, in the asset's smallest unit (e.g., satoshis for BTC, wei for ETH). Required if using SATOSHI_TEST.

Verification Flows

FlowDescription
SATOSHI_TESTUser sends a small amount to a deposit address to prove wallet ownership.
VISUAL_PROOFUser provides visual proof of wallet ownership (screenshot, etc.).
SELF_DECLAREDUser self-declares wallet ownership.
SIGNATURE_PROOFUser signs a message with the wallet's private key to prove ownership.

Supported Languages

CodeLanguage
enEnglish
esSpanish
frFrench
deGerman
itItalian
ptPortuguese
ruRussian
zhChinese
jaJapanese
koKorean
etEstonian
csCzech
huHungarian
plPolish
ukUkrainian

Sample Request - SELF_DECLARED (minimal)

The wallet verification payload is sent as a travel_rule block (with type: "wallet_verification") inside the standard Shufti verification envelope. This minimal example uses only the SELF_DECLARED flow.

create-wallet-verification-self-declared
{
"reference": "sp-tr-wv-001",
"callback_url": "https://webhook.site/your-unique-id",
"travel_rule": {
"type": "wallet_verification",
"asset": "BTC",
"blockchain": "Bitcoin",
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"allowed_flows": ["SELF_DECLARED"]
}
}

Sample Request - SATOSHI_TEST (full)

When SATOSHI_TEST is included in allowed_flows, the satoshi_flow object with deposit_address and amount is required.

create-wallet-verification-satoshi-test
{
"reference": "sp-tr-wv-satoshi-001",
"callback_url": "https://webhook.site/your-unique-id",
"travel_rule": {
"type": "wallet_verification",
"asset": "BTC",
"blockchain": "Bitcoin",
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"allowed_flows": ["SATOSHI_TEST", "VISUAL_PROOF", "SELF_DECLARED", "SIGNATURE_PROOF"],
"allowed_languages": ["en", "es"],
"metadata": "test wallet verification",
"satoshi_flow": {
"deposit_address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"amount": 100
}
}
}

Response

POST / returns the standard Shufti envelope with event: request.pending. The hosted verification form the end user must open is returned as the top-level verification_url (this is the most important field — redirect your user there). The verification then resolves asynchronously; the outcome is delivered to your callback_url (see Responses › Callbacks).

create-wallet-verification-response
{
"reference": "sp-tr-wv-001",
"event": "request.pending",
"verification_url": "https://{{VERIFICATION_DOMAIN}}/travel-rule/wallet-verification/TOKEN",
"email": null,
"country": null
}
info

verification_url is the hosted form — share it with the end user to complete verification (the embedded token typically expires in 24 hours). customer_unique_id is also echoed when you supply it.

Wallet Verification Object (returned by Read / Detail)

Querying the Read endpoint returns the full wallet-verification object with these fields:

ParameterDescription
_idUnique identifier of the wallet verification.
referenceYour own reference from the create request, attached by Shufti for correlation.
wallet_verification_idAlternative unique identifier (UUID format).
addressWallet address being verified.
assetCryptocurrency asset code.
blockchainBlockchain network name.
statusVerification status: pending, verified, or failed.
allowed_flowsArray of available verification flow types.
allowed_languagesArray of available language codes.
satoshi_flowSatoshi test configuration (deposit_address, amount); empty object if not configured.
metadataCustom metadata you supplied on create (may be null).
tokenJWT token for the verification form. Typically expires in 24 hours.
urlComplete URL for users to complete verification (surfaced as verification_url on create).
originOrigin recorded for the verification session (may be null).
redirect_urlURL the user is redirected to after completion (may be null).
created_byIdentifier of the user/system that created the verification.
created_atCreation timestamp (RFC 2822 format).
updated_atLast update timestamp (RFC 2822 format).

Read Wallet Verifications

Retrieve your own wallet verification records, scoped to your account. Results are paginated and filterable by asset, blockchain, status, and date range.

Endpoint

GET {{BASE_URL}}/travel-rule/wallet-verification/read

Query Parameters

All parameters are optional. Without parameters, returns the first 25 verifications.

ParameterRequiredTypeDescription
pageNointegerPage number. Defaults to 1.
per_pageNointegerResults per page. Defaults to 25, max 100.
searchNostringSearch by wallet address or _id. Your reference is included in every result for correlation.
start_dateNostringFilter by creation date, on or after. DD-MM-YYYY format.
end_dateNostringFilter by creation date, on or before. DD-MM-YYYY format.
assets[]NoarrayFilter by one or more asset codes (e.g. BTC, ETH). Repeat the parameter for multiple values.
blockchains[]NoarrayFilter by one or more blockchain names (e.g. Bitcoin, Ethereum). Repeat the parameter for multiple values.
statuses[]NoarrayFilter by verification status: pending, verified, failed. Repeat the parameter for multiple values.

Response

read-wallet-verifications-response
{
"error": false,
"status": "SUCCESS",
"message": "",
"data": {
"wallet_verifications": [ ],
"pagination": {
"page": 1,
"per_page": 25,
"total_count": 0,
"total_pages": 0,
"has_next": false,
"has_prev": false
}
}
}

Delete Wallet Verification

Permanently delete a wallet verification record owned by your account.

Endpoint

POST {{BASE_URL}}/travel-rule/wallet-verification/delete

Request Parameters

ParameterRequiredTypeDescription
wallet_verification_idYesstringIdentifier of the wallet verification to delete. Accepts either the UUID wallet_verification_id or the _id returned by Read.

Sample Request

delete-wallet-verification-request
{
"wallet_verification_id": "WALLET_VERIFICATION_ID"
}

Response

delete-wallet-verification-response
{
"data": {},
"error": false,
"message": "Wallet verification deleted successfully",
"status": "SUCCESS"
}