---
title: "Create a workspace and send an OTP verification email"
method: POST
path: "/v1/signup"
tags: ["signup"]
---

# Create a workspace and send an OTP verification email

`POST /v1/signup`

## Request

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

Creates a new workspace and API key, then sends a 6-digit OTP to the supplied email address. Calling this endpoint again with the same email rotates the API key and re-sends the OTP (idempotent). The rotated key is gated until you re-verify with the new OTP, so knowing an email alone never yields a working key. Call `POST /v1/signup/verify` with the code to verify.

## Request body

- SignupRequest
  - `workspace_name` string, required: Display name for the new workspace.
  - `email` string, email, required: Email address for the workspace owner. An OTP will be sent here.
  - `api_key_name` string: Label for the first API key.

## Response `201`

Successful Response

- SignupResponse
  - `workspace` WorkspaceOut, required
    - `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.
  - `api_key` ApiKeyCreated, required: Returned once at creation time -- includes the plaintext secret.
    - `id` string, required: Unique API key ID.
    - `name` string, required: Human-readable label for this key.
    - `key_prefix` string, required: First 8 characters of the key, shown for identification.
    - `created_at` string, date-time, required: ISO-8601 UTC timestamp when this key was created.
    - `last_used_at` string, date-time, nullable: ISO-8601 UTC timestamp of the most recent authenticated request.
    - `revoked_at` string, date-time, nullable: ISO-8601 UTC timestamp when this key was revoked. Null if still active.
    - `key` string, required: Plaintext API key. Store it securely — this is the only time it is returned.
  - `otp_delivered` boolean: Whether the verification email was actually dispatched. When false, the returned key is inert and cannot be verified — email delivery failed (or is not configured), so retry signup once a working inbox is reachable.

## Other responses

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