Authentication
All auth endpoints are prefixed /api/v1/auth/. Use the Authorization: Bearer <token> header for authenticated requests.
Endpoints
Section titled “Endpoints”| Method | Path | Description | Auth |
|---|---|---|---|
| GET | /v1/health | Health check (public) | No |
| POST | /v1/auth/register | Create a new account | No |
| POST | /v1/auth/login | Authenticate and get a token | No |
| POST | /v1/auth/verify | Verify email address | No |
| POST | /v1/auth/forgot-password | Request a password reset email | No |
| POST | /v1/auth/reset-password | Reset password with a token | No |
| POST | /v1/auth/passkey/authenticate-options | Get a WebAuthn login challenge | No |
| POST | /v1/auth/passkey/authenticate | Complete WebAuthn login | No |
| POST | /v1/auth/logout | Revoke current token | Yes |
| POST | /v1/auth/logout-all | Revoke all tokens except current | Yes |
| POST | /v1/auth/refresh | Issue a new token | Yes |
| GET | /v1/auth/tokens | List all active tokens | Yes |
| POST | /v1/auth/revoke-token | Revoke a specific token | Yes |
| POST | /v1/auth/passkeys/register-options | Get a WebAuthn registration challenge | Yes |
| POST | /v1/auth/passkeys/register | Register a new passkey | Yes |
| GET | /v1/auth/passkeys | List passkeys | Yes |
| PUT | /v1/auth/passkeys/{passkey} | Rename a passkey | Yes |
| DELETE | /v1/auth/passkeys/{passkey} | Delete a passkey | Yes |
Register
Section titled “Register”POST /v1/auth/registerRequest Body:
| Field | Type | Rules |
|---|---|---|
name | string | required |
email | string | required, valid email, unique |
password | string | required, min 12 characters |
password_confirmation | string | required, must match password |
Rate limited to 10 requests per hour per IP.
POST /v1/auth/loginRequest Body:
| Field | Type | Rules |
|---|---|---|
email | string | required |
password | string | required |
Rate limited to 5 requests per minute per email/IP.
Response (200):
{ "success": true, "data": { "token": "1|abc123...", "token_type": "Bearer", "token_expires_at": "2026-06-27T00:00:00Z", "user": { "id": 1, "name": "...", "email": "..." } }}Verify Email
Section titled “Verify Email”POST /v1/auth/verifyRequest Body:
| Field | Type | Rules |
|---|---|---|
user_id | string | required |
token | string | required |
Forgot Password
Section titled “Forgot Password”POST /v1/auth/forgot-passwordSends a password reset link (valid 60 minutes). Rate limited to 10 requests per hour per IP.
| Field | Type | Rules |
|---|---|---|
email | string | required |
platform | string | optional (web/mobile/desktop) |
Reset Password
Section titled “Reset Password”POST /v1/auth/reset-password| Field | Type | Rules |
|---|---|---|
token | string | required |
email | string | required |
password | string | required, min 12 characters |
Passkeys
Section titled “Passkeys”WebAuthn passkey login and management.
| Method | Path | Description |
|---|---|---|
| POST | /v1/auth/passkey/authenticate-options | Get a login challenge |
| POST | /v1/auth/passkey/authenticate | Complete login |
| POST | /v1/auth/passkeys/register-options | Get a registration challenge |
| POST | /v1/auth/passkeys/register | Register a new passkey |
| GET | /v1/auth/passkeys | List passkeys |
| PUT | /v1/auth/passkeys/{passkey} | Rename a passkey (name) |
| DELETE | /v1/auth/passkeys/{passkey} | Delete a passkey |
Passkey authentication is rate limited to 10 requests per minute per IP/email.
Health
Section titled “Health”GET /v1/healthPublic health check. Returns status, timestamp, app, and version.
Logout
Section titled “Logout”POST /v1/auth/logoutRevokes the token used in the Authorization header.
Logout All Other Sessions
Section titled “Logout All Other Sessions”POST /v1/auth/logout-allRevokes every token except the one making the request.
Refresh Token
Section titled “Refresh Token”POST /v1/auth/refreshReturns a new token. The old token is revoked.
Response (200):
{ "success": true, "data": { "token": "2|def456...", "token_type": "Bearer", "token_expires_at": "2026-07-27T00:00:00Z" }}List Tokens
Section titled “List Tokens”GET /v1/auth/tokensReturns all active tokens for the authenticated user. Each token includes an is_current boolean.
Revoke a Token
Section titled “Revoke a Token”POST /v1/auth/revoke-tokenRequest Body:
| Field | Type | Rules |
|---|---|---|
token_id | integer | required |