---
title: "Verify signature and link wallet"
method: POST
path: "/v1/account/wallets/verify"
tags: ["account"]
---

# Verify signature and link wallet

`POST /v1/account/wallets/verify`

Verify your wallet signature and complete the linking process.

**Prerequisites:**
1. Must have called `/account/wallets/challenge` first
2. Must sign the challenge message with the wallet being linked
3. Signature must be submitted within 5 minutes

**On success:**
- The wallet is linked to your account and can **receive tips**
- The wallet is also added as an **identity for login** (unified linking)
- If the wallet has an ENS name, it's automatically linked too

This is a unified operation - one link enables both earnings AND login.

Authentication: `Authorization: Bearer <CLIENT_JWT>`

## Headers

- `authorization` string, nullable — Bearer JWT issued by Grove that identifies the account.

## Request body

- WalletLinkVerifyRequest — Request model for verifying wallet link signature.
  - `address` string, required — Wallet address being linked (must match challenge)
  - `signature` string, required — Signature of the challenge message (EVM: hex 0x..., Solana: base58)
  - `network` string — Network for this wallet (base, base-sepolia, etc.)

## Response `200`

Successful Response

- WalletResponse — Response model for a single wallet.
  - `id` string, required — Wallet ID
  - `address` string, required — Wallet address
  - `network` string, required — Network (base, base-sepolia, etc.)
  - `wallet_type` string, required — Type of wallet (smart_account, eoa_embedded, server, external_linked)
  - `ens_name` string, nullable — ENS name associated with this wallet (e.g., vitalik.eth)
  - `base_name` string, nullable — Base name associated with this wallet (e.g., jesse.base.eth)
  - `display_name` string, nullable — User-provided display name for the wallet
  - `is_earning_wallet` boolean, required — Whether this wallet can earn tips (true for smart_account wallets)
  - `is_protected` boolean, required — Whether this wallet can be unlinked (EOA/smart_account/server wallets cannot)
  - `verified_at` string, required — When wallet ownership was verified (ISO 8601)
  - `verification_method` string, required — How ownership was verified (signature, cdp_auth, x402_payment)
  - `created_at` string, required — When the wallet was linked (ISO 8601)

## Other responses

- `400` — Invalid signature or challenge expired
- `409` — Wallet already linked to another account
- `422` — Validation Error

---

[API](https://skmtc.net/grove/apis/grove-api.md) · [All operations](https://skmtc.net/grove/apis/grove-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grove/grove-api/versions/f286b48a8105/schema)
