| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Overview
Use this method to mark the wallet ownership check of an applicant action as verified. It has the same effect as clicking Mark as verified in the Dashboard (Applicant → Actions → Wallet ownership verification), but via the API.
Use this endpoint when:
- You have already verified a wallet on your side before the user reaches Sumsub, so the user does not need to prove ownership again.
- The user started the wallet ownership check on our side but could not complete it (for example, due to an unsupported wallet type or a broken signature flow), and you subsequently verified the wallet on your side.
NoteVerification is reused by wallet address: once a wallet is marked as verified, any subsequent transaction using the same address is automatically treated as verified, without requiring a new check.
Request example
curl -X POST
'https://api.sumsub.com/resources/api/applicantActions/6932e4b1a2c3d40874f00000/unhostedWallet/manualVerify' \
-H 'X-App-Token: <your-app-token>' \
-H 'X-App-Access-Sig: <your-signature>' \
-H 'X-App-Access-Ts: <unix-timestamp>'Response explained
If the request is sent and processed successfully, you will receive a JSON response representing the applicant action with augmented and structured information.
You can see the response structure and possible content with descriptions on the following page.
Note
answer: GREENandunhostedWallet.type: manualByClientmean the wallet is now verified.verifiedBySubjectshows who confirmed it.
Response examples
If the request is successfully sent and processed, you will get a response like the following:
{
"id": "6932e4b1a2c3d40874f1a67a",
"applicantId": "68a1f0c25d4b1e0012ab34cd",
"externalActionId": "bene_e67a",
"type": "paymentMethod",
"createdAt": "2026-08-18 03:05:29",
"paymentSource": {
"fixedInfo": {
"type": "cryptoWallet",
"accountIdentifier": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
"currencyCode": "ETH",
"cryptoChain": "ethereum"
},
"ownershipChecks": [
{
"type": "unhostedWallet",
"answer": "GREEN",
"createdAt": "2026-08-18 03:06:10",
"unhostedWallet": {
"type": "manualByClient",
"provider": "client",
"address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
"verifiedBySubject": "API token my-integration"
}
}
]
}
}If the request fails, you will receive an HTTP response containing an error code along with a message explaining the error. For example:
{
"code": 400,
"description": "Human-readable description",
"correlationId": "0d3457fdac54803edf23c90000000000"
}Possible errors
| Error code | When occurs |
|---|---|
400 | The action is not of type paymentMethod, or it has no crypto wallet payment source. |
403 | Unhosted wallet verification is not enabled for the client. |
409 | Wallet ownership is already verified. |
409 | The action belongs to a Travel Rule level, but the SDK has not sent the counterparty data yet. Send that data through the SDK first. |
200