---
title: "Verify self-hosted wallet ownership"
method: POST
path: "/counterparty/self-hosted/verify-wallet"
tags: ["Counterparty"]
---

# Verify self-hosted wallet ownership

`POST /counterparty/self-hosted/verify-wallet`

## Request body

- VerifySelfHostedWalletRequest
  - `userId` string, uuid — Owner user id. Provide exactly one of userId / businessId.
  - `businessId` string, uuid — Owner business id. Provide exactly one of userId / businessId.
  - `counterpartyId` string, required
  - `method` 'WALLET_SIGNATURE', required — EIP-191 wallet ownership proof. SumSub liveness uses POST /counterparty/wallet-verification/sumsub/initiate instead.
  - `signature` string, required — Cryptographic proof over `message`. **EVM** — EIP-191 hex; **Bitcoin** — compact base64 (65 bytes) or Electrum/Sparrow armor; **Solana** — Ed25519 base58.
  - `signed_address` string, required
  - `signatureScheme` 'bip137' | 'electrum' — Bitcoin message-signing format. Defaults to `bip137` (Trezor, Ledger, Bitcoin Core). Use `electrum` for Electrum and Sparrow.
  - `message` string, required — The exact UTF-8 string the wallet signed. After extracting the embedded date, the text must match character-for-character: `I am verifying ownership of the wallet address {signed_address} as {ownerId}. This message was signed on {DD/MM/YYYY} to confirm my control over this wallet.` `{signed_address}` is the same value as in this request body. `{ownerId}` is the same value as `userId` or `businessId` (whichever owner field you sent). `{DD/MM/YYYY}` is the calendar date in **UTC** and must be **yesterday, today, or tomorrow** relative to the server's current UTC date when the request is processed.

## Response `200`

OK

- PatchDeclaredCounterpartyWalletVerificationResponse
  - `status` 'VERIFIED', required
  - `walletVerificationId` string, uuid, required
  - `counterparty` TRCounterpartyPublic, required — Public counterparty row returned by VASP declare (`201`) and in the `counterparty` field of wallet verification.
    - `counterpartyId` string, uuid, required
    - `userId` string, uuid
    - `businessId` string, uuid
    - `identityType` 'CONSUMER' | 'BUSINESS', required
    - `counterpartyAddress` string — Set for on-chain counterparties.
    - `paymentHash` string — Set for Lightning (non-invoice) counterparties.
    - `invoice` string — Set when declared with a bolt11 Lightning invoice.
    - `memo` string — Decoded memo from the bolt11 invoice, when present.
    - `network` string, required
    - `type` 'SELF_HOSTED' | 'VASP', required
    - `subType` 'OWNED' | 'THIRD_PARTY' | 'VASP', required
    - `counterpartyData` object — IVMS-oriented payload; shape depends on counterparty `type` / `subType`.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required

## Other responses

- `400` — Validation failed
- `401` — Invalid authentication header
- `404` — Counterparty or wallet verification record not found.
- `422` — Verification method rejected or wallet does not match the pending verification.

---

[API](https://skmtc.net/striga/apis/striga-v1.md) · [All operations](https://skmtc.net/striga/apis/striga-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/striga/striga-v1/revisions/63e57aa7df45/schema)
