---
title: "Create an engine account, name its responsible owner, and get its API key (shown once)."
method: POST
path: "/api/agents/signup"
tags: ["Account"]
---

# Create an engine account, name its responsible owner, and get its API key (shown once).

`POST /api/agents/signup`

## Request

- Base URL: `https://tomorrowlives.com`
- URL: `https://tomorrowlives.com/api/agents/signup`
- Auth: none required

owner_email is the person or business responsible for the agent. The only personal data kept is that address: it is asked to confirm by an emailed link, it receives the billing mail (every receipt and the notices that a pass is ending), and it can remove itself from the account. An address that is not accepted is refused before anything is made. Signing up never waits for the confirmation: the agent can read the catalogue, run cost checks and buy a pass at once, and the free plan starts when the owner confirms. accept_terms must equal the current terms version (2026-10-12.5); the account records that version and the time. Free plan: 50 units a month, no card needed; it starts when the owner confirms their email. Queued renders need a pass or the card plan. We limit free plans and first-pass offers to prevent abuse.

## Request body

- object
  - `accept_terms` '2026-10-12.5', required: The engine terms version, read at https://tomorrowlives.com/engines/terms
  - `owner_email` string, email, required: The email of the person or business responsible for this agent. They are asked to confirm it.
  - `label` string: Optional: a name for this agent. Do not put personal data here.
  - `operator_country` string: Optional, never stored: the country of the person or business running the agent. Available in the United States. Any country but US is refused with 403 region_not_supported.

## Response `201`

The account, and its API key, which is never shown again

- Signup
  - `account` string
  - `api_key` string
  - `terms` object
    - `version` string
    - `accepted_at` string, date-time
  - `owner` object: The owner named: status (unconfirmed until they confirm), the address hidden in the middle, and whether the confirmation was sent
  - `free_plan` object: Free plan: 50 units a month, no card needed; it starts when the owner confirms their email. Queued renders need a pass or the card plan. We limit free plans and first-pass offers to prevent abuse.
    - `units_per_month` 50

## Other responses

- `400`: The input is not valid
- `403`: The account is suspended, the paying card is not from the United States (region_not_supported), or the address named as its owner said it is not theirs and costed runs are paused until a new owner is named (owner_removed)
- `409`: The request conflicts with the account's state
- `413`: The input or the output is over its cap; a job stopped by the output cap is not charged
- `422`: The engine refused the input, a limit of the service's refused it (error: video_limit or pull_limit) or stopped the job, or the content policy refused the input (error: content_policy)
- `429`: A limit was hit; reset_at says when it lifts (also in Retry-After)

---

[API](https://skmtc.dev/tomorrowlives/apis/tomorrow-lives-engines.md) · [All operations](https://skmtc.dev/tomorrowlives/apis/tomorrow-lives-engines/llms.txt) · [OpenAPI document](https://skmtc.dev/tomorrowlives/apis/tomorrow-lives-engines/revisions/afc3d67322ac?raw)
