---
title: "Verify email OTP"
method: POST
path: "/api/v1/me/emails/add/{sessionId}/verify"
tags: ["Emails"]
---

# Verify email OTP

`POST /api/v1/me/emails/add/{sessionId}/verify`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/me/emails/add/{sessionId}/verify`
- Auth: API key in cookie `auth_token`

Submit OTP code to verify a new email address. If the address is the only sign-in of another account that holds nothing else, that empty account is closed and the address moves to this one. If that account holds data, the add is refused with `email_taken` and a message saying which account to sign in with — the message differs when this account is the empty one, telling the user to sign in to the other account and add the channel of this one from there. Only this code step combines accounts: the magic link in the same email adds an unowned address but refuses one that already signs in elsewhere.

## Path parameters

- `sessionId` string, required: Auth session ID

## Request body

- VerifyCodeRequest: OTP code submission
  - `code` string, required: OTP verification code

## Response `200`

Email verified

- SuccessResponse: Generic success response
  - `success` boolean, required
  - `message` string

## Other responses

- `400`: Invalid code, or `email_taken` — the address signs in to another account that cannot be combined into this one

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/b15f506de696?raw)
