Files
bookhoard/docs/developer/api/authentication/login.md
T
john-okeefe f65db5ab4f docs(api): align auth/devices/libraries/media-items docs with handlers
Verified against the Echo routes and handler structs, fixing drift that
would break API clients:

- login: response field is access_token, not token (AuthResponse struct)
- register status: status is only pending|approved; expiry is HTTP 410
  (not a status value), approved responses are single-use, and pending
  registrations do not survive server restarts
- visible libraries: endpoint is GET /api/libraries/visibility and
  returns a top-level array of full library rows, not a wrapped object
- media items list: response is {"data": [...]}, library_id is optional,
  limit defaults to 50 (max 1000), no total field; document the sort
  parameter, the two response shapes, and raw-vs-resolved file paths

refresh and device-registration docs verified accurate; no changes.
2026-08-28 22:15:42 -04:00

61 lines
1.4 KiB
Markdown

# Login User
Authenticate with email and password.
**Endpoint**: `POST /api/auth/login`
**Auth**: Not required
**Content-Type**: `application/json` or `application/x-www-form-urlencoded`
## Request Body
| Field | Type | Required | Description |
| -------- | ------ | -------- | -------------------------------- |
| login | string | Yes | User's email address or username |
| password | string | Yes | User's password |
### Example Request
```json
{
"login": "user@example.com",
"password": "SecureP@ss123!"
}
```
## Response (200 OK)
```json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "d4f5g6h7...",
"token_type": "Bearer",
"expires_in": 604800,
"user": {
"id": "uuid-here",
"email": "user@example.com",
"username": "john",
"first_name": "John",
"last_name": "Doe",
"role": "user"
}
}
```
Note: the access token field is `access_token` (not `token`). Nullable profile fields (`first_name`, `last_name`) may be empty strings.
**Set-Cookie Header**:
```
Set-Cookie: token=eyJhbG...; Max-Age=604800; Path=/; HttpOnly
```
**Session Duration**: 7 days (604800 seconds)
## Error Responses
| Code | Description |
| ---- | ------------------------- |
| 401 | Invalid email or password |
| 400 | Missing required fields |
| 429 | Too many login attempts |