---
title: "Sign up for a free API key"
method: POST
path: "/signup"
tags: ["core"]
---

# Sign up for a free API key

`POST /signup`

## Request

- Base URL: `https://api.voygr.tech`
- URL: `https://api.voygr.tech/signup`
- Auth: none required

You do not need a key to call this. `delivery` decides how the person gets theirs.

- `email_key` (the default) emails the key. The response never contains it. If the address already has an account, we send no new key: recover it at `/recover`.
- `code` is for an agent signing someone up. We email them a 6-digit code and return a `verification_id`. Ask them for the code, then send both to `POST /signup/verify` within 10 minutes. We create nothing before then. We send at most 3 codes per address per 24 hours. Past that the response looks the same, but no email goes out.

In both modes, a 200 looks the same for every address. It does not tell you whether the address has an account. `terms_presented` only applies to `email_key`. With `code`, entering the code accepts the API Terms.

## Request body

- SignupRequest: Who to sign up, and how they get their key.
  - `name` string, required: The person's name.
  - `email` string, email, required: Their email address. We refuse disposable domains and domains that cannot receive mail.
  - `src` string, nullable: Optional. Where the signup came from, for attribution.
  - `terms_presented` boolean: `email_key` only. Set true only if, before submitting, you showed the person the API Terms and Privacy Policy and told them that continuing accepts them. Ignored for `code`, where entering the code accepts the API Terms.
  - `delivery` 'email_key' | 'code': `email_key` emails the key. `code` emails a 6-digit code to swap for the key at `POST /signup/verify`.

## Response `200`

`SignupKeyEmailed` for `email_key`, `SignupCodeSent` for `code`.

- union
  - SignupKeyEmailed: The response to `delivery: "email_key"`, the same for every address.
    - `success` boolean, required
    - `message` string, required
  - SignupCodeSent: The response to `delivery: "code"`, the same shape for every address.
    - `success` boolean, required
    - `verification_id` string, required: Send it to `POST /signup/verify` with the code.
    - `expires_in_seconds` integer, required: How long the code works.
    - `message` string, required

## Other responses

- `422`: We refused the address: a disposable email domain, a domain that cannot receive mail, or a malformed body. Nothing was sent.
- `429`: Too many signups from this IP address. Try again later.
- `503`: We could not send the email.

## Changes

- **2026-10-26** `6c644f08642e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/voygr/apis/voygr-calls-api/changes/signup/post.md)

---

[API](https://skmtc.dev/voygr/apis/voygr-calls-api.md) - [All operations](https://skmtc.dev/voygr/apis/voygr-calls-api/llms.txt) - [OpenAPI document](https://skmtc.dev/voygr/apis/voygr-calls-api/revisions/7199881ed19e?raw)
