Mark crypto wallet ownership as verified

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

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.
📘

Note

Verification 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: GREEN and unhostedWallet.type: manualByClient mean the wallet is now verified. verifiedBySubject shows 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 codeWhen occurs
400The action is not of type paymentMethod, or it has no crypto wallet payment source.
403Unhosted wallet verification is not enabled for the client.
409Wallet ownership is already verified.
409The action belongs to a Travel Rule level, but the SDK has not sent the counterparty data yet. Send that data through the SDK first.
Path Params
string
required

Unique applicant action identifier in the Sumsub system.

You can get this identifier in response to action submission or by calling this method.

⚠️ The action must be of type paymentMethod and contain a crypto wallet payment source. Travel Rule SDK actions are also of type paymentMethod, so they are accepted as well.

Response
200
Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here!