API: Create Verify V2
Where should I integrate
Wallet Verify - Create Verify V2
Create a Wallet Verify request and return all available V2 verification mechanisms.
Please submit the following payload to this endpoint:
curl --silent --location --request POST "/api/verify/wallet/v2/verify" \
--cert-type P12 --cert ./certificate.p12:'[MY_PASSWORD_OF_CERT]' \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer [YOUR LOGIN TOKEN]" \
--header "Connection: keep-alive" \
--data-raw "{
\"requestId\": \"[GENERATE YOUR REQUEST ID]\",
\"beneficiaryAddress\": {
\"address\": \"[BENEFICIARY_OR_UNHOSTED_WALLET_ADDRESS]\",
\"tag\": \"[TAG: LEAVE EMPTY IF NO NEED]\"
},
\"originatorAddress\": {
\"address\": \"[ORIGINATOR_WALLET_ADDRESS]\",
\"tag\": \"[TAG: LEAVE EMPTY IF NO NEED]\"
},
\"blockchainInfo\": {
\"network\": \"[NETWORK SYMBOL]\",
\"ticker\": \"[TICKER SYMBOL]\",
\"txId\": \"[FOR DEPOSIT / POST-TRANSACTION FLOW ONLY; OTHERWISE NULL OR UNSET]\"
},
\"complianceInfo\": {
\"amount\": \"[AMOUNT OF CRYPTO CURRENCY TICKER]\",
\"fiatPrice\": \"[FIAT PRICE]\",
\"fiatName\": \"[FIAT NAME]\"
},
\"metadata\": \"{\\\"user_id\\\":\\\"123456\\\"}\",
\"sourceVaspCode\": \"[ONLY TRSP VENDOR NEED TO FILL THIS]\"
}"
The metadata field is optional. GTR stores it with the verify request and echoes it back in the Wallet Verify callback and query result.
⚠️ Address is case-sensitive
The
addressfield inbeneficiaryAddress/originatorAddressmust be submitted with its original casing, exactly as the wallet owner will present it when they sign.
- This applies to every supported network, including EVM-compatible chains (Ethereum, BSC, Polygon, etc.) where the address itself is not case-sensitive at the protocol level.
- The underlying wallet-verify mechanism enables case-sensitive matching for all networks. If the casing you submit here does not exactly match the casing the wallet owner signs with, GTR cannot broadcast / dispatch the signing request to that wallet, and the verification will not proceed.
- Do not normalize the address to lowercase or uppercase before submission. Preserve the checksummed / mixed-case form (e.g. EIP-55 for EVM chains).
Response Explained
The V2 response contains one envelope per verification mechanism. Each envelope uses:
availability: whether this mechanism can be used for this request.message:supportedwhen available, otherwise the reason it is unavailable.expiredAt: expiration timestamp for this mechanism. This field is outsideparams.params: mechanism-specific data.
{
"verifyStatus": 100000,
"verifyMessage": "Verify Success",
"data": {
"walletConnect": {
"availability": true,
"message": "supported",
"expiredAt": 1949384914,
"params": {
"qrCodeContent": "wc:abcdefxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"deeplinks": [
{
"type": "universal",
"appId": "com.wallet.app",
"name": "MyWallet",
"link": "https://wallet.example/verify?uri=wc%3Aabcdef..."
}
]
},
"manualSigning": {
"availability": true,
"message": "supported",
"expiredAt": 1949385214,
"params": {
"signMessage": "Wallet To Be Sign: 0xabc...\n--message--\n{\"user_id\":\"123456\"}\n--\nNonce:550e8400-e29b-41d4-a716-446655440000"
}
},
"universalWebPageVerify": {
"availability": true,
"message": "supported",
"expiredAt": 1949385514,
"params": {
"gtrWalletVerifyUrl": "/v2/verify?requestId=[REQUEST_ID]"
}
},
"gtrConnect": {
"availability": true,
"message": "supported",
"expiredAt": 1949384914,
"params": {
"qrCodeContent": "wc:abcdefxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"deeplinks": []
},
"satoshiTest": {
"availability": false,
"message": "EVM address does not support",
"expiredAt": 1949385514,
"params": null
},
"verifyExpiredAt": 1949385514
}
}
Expiration Fields
walletConnect.expiredAt/gtrConnect.expiredAt: current QR code session expiration.manualSigning.expiredAt: manual-signing message expiration. The default TTL is 5 minutes.universalWebPageVerify.expiredAt/satoshiTest.expiredAt: mechanism hard expiration.verifyExpiredAt: hard expiration of the whole Wallet Verify request. After this timestamp, do not re-issue the samerequestId.
Manual Signing Message
manualSigning.params.signMessage includes a server-generated Nonce value. The wallet owner must sign the message exactly as returned, including line breaks and the Nonce line.
Submit the produced signature to API: Verify Signed Message.
About address screening
This API does not return addressScreeningResult in its synchronous response.
If the wallet owner later completes the signing flow successfully, GTR may perform address screening on the verified address and include that result in the callback to your service.