---
title: "Create an account (agent signup)"
method: POST
path: "/v1/agent/register"
---

# Create an account (agent signup)

`POST /v1/agent/register`

## Request

- Base URL: `https://api.myotp.app`
- URL: `https://api.myotp.app/v1/agent/register`
- Auth: none declared

Create a MyOTP.App account without a browser. No authentication. The 201 body carries the API key exactly once; store it and send it as X-API-Key on every later request.

Rules: no trial credits and no phone verification. The balance starts at zero, so the account can send nothing until it is topped up with POST /v1/topup. USDC top-ups work immediately; card top-ups are offered only after the account email is confirmed. The IP allowlist is open ("*") for agent accounts. Five registrations per IP address per 24 hours. The human signup at https://myotp.app/sign-up is unchanged: 15 free credits, email and phone verification.

Email confirmation: the address receives "Confirm your MyOTP.App account email" from raya@myotp.app with a link to /v1/agent/verify-email. A human has to open it and press Confirm; the agent cannot confirm on the user's behalf. The link is single use and valid for 24 hours.

Agent flow: register, save the api_key, tell the human to click the email link (optional, only needed for cards), GET /v1/topup/quote, POST /v1/topup and pay the 402 (USDC works without the email step), then POST /generate_otp as usual. A 403 "Insufficient balance" on any send means: top up again.

## Request body

- object
  - `email` string, email, required: Account email. Receives the confirmation link.
  - `name` string: Optional account or company name.

## Response `201`

Account created. The api_key is shown once.

- AgentRegistration: An agent-created account, as returned by GET /v1/agent/account.
  - `account_id` string, required: Account identifier, "a" followed by 12 hex characters.
  - `email` string, email, required
  - `email_verified` boolean, required: True once the human has pressed Confirm on the emailed link. Unlocks card top-ups.
  - `balance` number, required: Credits on the balance. Zero at registration.
  - `plan_id` integer, required: The Starter pay-as-you-go pricing table (per-country credits).
  - `status` string, required: Account status, "active" when the key can be used.
  - `topup` object: Where to buy credits.
    - `quote` string, uri
    - `endpoint` string, uri
    - `note` string
  - `docs` string, uri
  - `api_key` string, required: Shown once, in this response only. Send it as the X-API-Key header.
  - `api_key_note` string
  - `verification_email_sent` boolean: Whether the confirmation email was queued.

## Other responses

- `400`: The email is missing or invalid, or name is longer than 64 characters.
- `409`: An account with this email already exists.
- `429`: Too many requests. Either the registration limit (5 per IP address per 24 hours) or the API-wide edge limit (100 requests a minute per IP address, 500 for raised accounts). Retry-After carries the seconds to wait.
- `503`: Account creation is temporarily unavailable. Retry later.

---

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