---
title: "Verify email with OTP code"
method: POST
path: "/v1/signup/verify"
tags: ["signup"]
---

# Verify email with OTP code

`POST /v1/signup/verify`

## Request

- Base URL: `https://api.framelane.io`
- URL: `https://api.framelane.io/v1/signup/verify`
- Auth: none declared

Submit the 6-digit OTP sent to the email supplied during signup. On success the workspace is marked as email-verified and the OTP is consumed. After 5 wrong guesses the code is invalidated and a new signup call is required to obtain a fresh one.

## Request body

- SignupVerifyRequest
  - `email` string, email, required: The email address used during signup.
  - `otp_code` string, required: The 6-digit OTP sent to the email.

## Response `200`

Successful Response

- WorkspaceOut
  - `id` string, required: Unique workspace ID.
  - `name` string, required: Display name for the workspace.
  - `email` string, nullable: Contact email for the workspace owner.
  - `email_verified` boolean: Whether the email address has been verified via OTP.
  - `plan` 'free' | 'pro' | 'enterprise'
  - `plan_status` 'active' | 'past_due' | 'cancelled' | 'trialing'
  - `created_at` string, date-time, required: ISO-8601 UTC timestamp when the workspace was created.
  - `is_admin` boolean: Whether this is an admin workspace, which curates the public template gallery (POST, PATCH and DELETE /v1/templates) and sees its draft listings.

## Other responses

- `400`: Invalid or expired OTP code.
- `404`: No workspace found for this email.
- `422`: Validation Error
- `429`: Rate limit exceeded.

---

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