---
title: "Login"
method: POST
path: "/api/v1/auth/login"
tags: ["grandline-auth"]
---

# Login

`POST /api/v1/auth/login`

## Request

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

Email + password login. Requires a verified email. Issues an opaque,
revocable session token the web app stores and sends as
`Authorization: Bearer gl_sess_...`. Uniform error on bad credentials to
avoid revealing which accounts exist.

## Request body

- LoginRequest
  - `email` string, required
  - `password` string, required

## Response `200`

Successful Response

- LoginResponse
  - `session_token` string, required
  - `email` string, required
  - `name` string, nullable, required
  - `profile_complete` boolean, 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)
