---
title: "Complete signup (verify OTP)"
method: POST
path: "/v1/account/verify-otp"
tags: ["Account"]
---

# Complete signup (verify OTP)

`POST /v1/account/verify-otp`

Step 2 of signup. Completes the flow started by POST /v1/account/send-otp. Pass the verificationId from that response and the one-time code from email. On success this creates the trial account and returns a live API key (sk_live_...) plus a companion sandbox API key (sk_test_...) when one was minted. Store both securely — they cannot be retrieved later. First-time users without a key yet must start at send-otp; existing users create extra sandbox keys via POST /v1/api-keys/create-sandbox.

<span>⚡ <strong>Rate limit:</strong> 12 requests per 1 minute</span>

<span>💰 <strong>Cost:</strong> FREE! No credits are charged for this API.&nbsp;<span title="Pricing shown is default pricing. Actual pricing may vary.">ⓘ</span></span>

## Request body

- object
  - `verificationId` string, required — The verification identifier returned by send-otp.
  - `otp` string, required — The one-time code delivered by email.

## Response `200`

Default Response

- object
  - `output` object, required
    - `status` 'created', required
    - `apiKey` string, required — The live API key for the new trial organization (starts with sk_live_). Store it securely — it cannot be retrieved later.
    - `sandboxApiKey` string, nullable — Companion sandbox API key (starts with sk_test_...) for local development and integration tests. Null if it was not minted at signup — create one via POST /v1/api-keys/create-sandbox.
    - `creditsAwarded` integer, required — Number of credits granted with this trial.
    - `organizationId` string, required
    - `message` string, required
  - `chargeInfo` union, required
    - object — Credits were charged immediately for this operation
      - `method` 'charged-now', required
      - `creditsCharged` number, required
      - `lowCreditAlert` object, nullable — Contains a link to get more credits, a warning message, and the remaining credit count.
        - `getMoreCreditsUrl` string, uri, required — URL to top up credits or restart billing cycle to get fresh credits.
        - `message` string, required — Human-readable credits warning.
        - `availableCredits` number, required — Number of credits remaining in the current billing period.
    - object — Credits will be charged after the operation completes
      - `method` 'charging-later', required
      - `message` string, required
      - `lowCreditAlert` object, nullable — Contains a link to get more credits, a warning message, and the remaining credit count.
        - `getMoreCreditsUrl` string, uri, required — URL to top up credits or restart billing cycle to get fresh credits.
        - `message` string, required — Human-readable credits warning.
        - `availableCredits` number, required — Number of credits remaining in the current billing period.
    - object — Credits that were charged for an asynchronous operation
      - `method` 'charged-for-async-process', required
      - `creditsCharged` number, required
      - `message` string, required
      - `lowCreditAlert` object, nullable — Contains a link to get more credits, a warning message, and the remaining credit count.
        - `getMoreCreditsUrl` string, uri, required — URL to top up credits or restart billing cycle to get fresh credits.
        - `message` string, required — Human-readable credits warning.
        - `availableCredits` number, required — Number of credits remaining in the current billing period.
    - object — No credits were charged for this operation
      - `method` 'free', required
      - `message` string, required
      - `lowCreditAlert` object, nullable — Contains a link to get more credits, a warning message, and the remaining credit count.
        - `getMoreCreditsUrl` string, uri, required — URL to top up credits or restart billing cycle to get fresh credits.
        - `message` string, required — Human-readable credits warning.
        - `availableCredits` number, required — Number of credits remaining in the current billing period.
    - object — Credits were refunded for this operation
      - `method` 'credits-refunded', required
      - `creditsRefunded` number, required
      - `message` string, required
      - `lowCreditAlert` object, nullable — Contains a link to get more credits, a warning message, and the remaining credit count.
        - `getMoreCreditsUrl` string, uri, required — URL to top up credits or restart billing cycle to get fresh credits.
        - `message` string, required — Human-readable credits warning.
        - `availableCredits` number, required — Number of credits remaining in the current billing period.
  - `warnings` object[], nullable — Warnings about extraneous fields in request
    - `field` string, required — Full path to extraneous field (e.g., 'searchParams.ExtraField')
    - `message` string, required — Warning message
  - `advice` string[], nullable — Tips, recommendations, and suggestions for using this API effectively.

## Other responses

- `400` — Default Response
- `401` — Default Response
- `402` — Default Response
- `403` — Default Response
- `404` — Default Response
- `409` — Default Response
- `410` — Default Response
- `422` — Default Response
- `429` — Default Response
- `500` — Default Response
- `503` — Default Response

## Changes

- **2026-09-01** `f8a78c729da9` — 1 info
  - added the optional property `output/sandboxApiKey` to the response with the `200` status
- **2026-08-19** `87ad9a3ecc4c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/fiber/apis/fiber-ai-api/changes/v1/account/verify-otp/post.md)

---

[API](https://skmtc.dev/fiber/apis/fiber-ai-api.md) · [All operations](https://skmtc.dev/fiber/apis/fiber-ai-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/fiber/fiber-ai-api/revisions/4124c1dafb12/schema)
