---
title: "Sign a message with a human wallet (EIP-191)"
method: POST
path: "/v1/treasury/wallets/{chain}/sign-message"
tags: ["Treasury"]
---

# Sign a message with a human wallet (EIP-191)

`POST /v1/treasury/wallets/{chain}/sign-message`

## Request

- Base URL: `https://api.1claw.co`
- URL: `https://api.1claw.co/v1/treasury/wallets/{chain}/sign-message`
- Auth: HTTP bearer

`personal_sign` over the given text, hashed as `\x19Ethereum Signed Message:\n<len>` + message — what viem's `verifyMessage` and ethers' `verifyMessage` expect.

Human callers only; an agent signs with its own key via `POST /v1/agents/{agent_id}/sign`. Gated exactly as a send is: `X-Auth-Confirm` step-up scored as a Send action, wallet access policies (`WalletAction::Sign`), and a refusal for wallets whose key is split or passkey-owned — those have no server-side key and will not fall back to one.

EVM chains only.

## Path parameters

- `chain` string, required

## Headers

- `X-Auth-Confirm` string, required

## Request body

- object
  - `message` string, required

## Response `200`

Signature

- WalletSignature
  - `signature` string, required: 65-byte `0x`-prefixed signature, r‖s‖v.
  - `address` string, required: The signing wallet, so it can be passed straight to `verifyMessage`.
  - `chain` string, required

## Other responses

- `400`: Empty or oversized message, or a non-EVM chain
- `403`: Agent caller, missing or insufficient step-up, denied by a wallet access policy, or a self-custody wallet the server cannot sign for.
- `404`: No wallet on that chain for this user

---

[API](https://skmtc.dev/1claw/apis/1claw-api.md) · [All operations](https://skmtc.dev/1claw/apis/1claw-api/llms.txt) · [OpenAPI document](https://skmtc.dev/1claw/apis/1claw-api/revisions/5fa0918f3b41?raw)
