---
title: "Register"
method: POST
path: "/api/v1/auth/register"
tags: ["grandline-auth"]
---

# Register

`POST /api/v1/auth/register`

## Request

- Base URL: `https://grandline.luzomi.com`
- URL: `https://grandline.luzomi.com/api/v1/auth/register`
- Auth: none declared

Registration. Two modes:

* **Conventional (password present)** — create the account with a hashed
  password (`status='pending'`, email unverified), send an email-verification
  link. No API key is minted yet; the user gets one from the Keys page after
  verifying. This is the flow the web UI uses.
* **Legacy (password absent)** — the original emailed-API-key behaviour:
  create the account, mint a key, email it, verify on first sign-in via
  `/activate`. Kept for back-compat / API-first onboarding.

Names are auto-capitalised (whole name preserved). The company label is
derived from the email domain.

## Request body

- RegisterRequest
  - `full_name` string, required: Full name; stored auto-capitalised, kept whole.
  - `email` string, required: Company email (not generic, not a free provider)
  - `password` string, nullable: Account password (conventional sign-in). When omitted, the legacy emailed-API-key flow is used instead (back-compat).

## Response `200`

Successful Response

- RegisterResponse
  - `message` string, required
  - `email` string, required

## Other responses

- `400`: Validation error
- `422`: Validation Error
- `429`: Rate-limit exceeded

---

[API](https://skmtc.dev/luzomi/apis/grandline-api.md) · [All operations](https://skmtc.dev/luzomi/apis/grandline-api/llms.txt) · [OpenAPI document](https://skmtc.dev/luzomi/apis/grandline-api/revisions/4ce06aea012b?raw)
