---
title: "Verify email OTP and get JWT"
method: POST
path: "/v1/auth/email-otp/verify"
tags: ["Authentication"]
---

# Verify email OTP and get JWT

`POST /v1/auth/email-otp/verify`

## Request

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

Verifies the 6-digit code sent to the user's email. Optionally
auto-provisions treasury wallets for the specified chains. Returns a JWT
for subsequent API calls.

An unrecognized address is rejected unless the request carries
`platform_app_id` or sets `allow_signup`.

## Request body

- object
  - `email` string, email, required
  - `code` string, required: 6-digit OTP code
  - `platform_app_id` string, uuid
  - `auto_provision_chains` string[]: Chains to auto-generate wallets for (e.g. ["ethereum", "base"])
  - `allow_signup` boolean: Opt in to creating an account when the address is not recognized. Without it an unknown address is rejected rather than silently given a new user and org — a valid code proves control of an inbox, not consent to sign up. Not required when `platform_app_id` is present: creating the end user on first login is the embedded-wallet flow.

## Response `200`

Existing user authenticated

- EmailOtpVerifyResponse
  - `token` string, required: JWT access token
  - `user_id` string, uuid, required
  - `org_id` string, uuid, required
  - `is_new_user` boolean, required
  - `email` string, email, required
  - `wallet_address` string, nullable: Ethereum address if auto_provision_chains included an EVM chain

## Other responses

- `201`: New user created and authenticated
- `400`: Invalid or expired code
- `429`: Rate limited

---

[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/ae109b496830?raw)
