---
title: "Complete wallet sign-in and get a JWT"
method: POST
path: "/v1/auth/siwe/verify"
tags: ["Authentication"]
---

# Complete wallet sign-in and get a JWT

`POST /v1/auth/siwe/verify`

## Request

- Base URL: `https://api.1claw.co`
- URL: `https://api.1claw.co/v1/auth/siwe/verify`
- Auth: none required

Verifies the signature over the challenge message and returns an
ordinary user JWT — the same token social login and email-OTP
produce.

First sign-in for an address creates a user and org. That user's
email starts synthetic (`email_pending: true`) and unverified: a
wallet signature proves possession of a key, not a reachable
person. Staking redemption refuses until a real address is added
and confirmed.

The wallet recovered from the signature is stored on the account
and is the identity staking points are counted against. It is
never accepted from a request body anywhere.

## Request body

- object
  - `message` string, required: The challenge message, unmodified
  - `signature` string, required: Hex signature over the message

## Response `200`

Authenticated

- object
  - `token` string
  - `user_id` string, uuid
  - `org_id` string, uuid
  - `wallet_address` string
  - `is_new_user` boolean
  - `email_pending` boolean: True while the account email is still the synthetic wallet address. Redemption is blocked until a real one is verified.

## Other responses

- `400`: Expired or reused challenge, or a message signed for another domain
- `401`: Signature does not match the address in the message

---

[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)
