Skip to content

Authentication

All auth endpoints are prefixed /api/v1/auth/. Use the Authorization: Bearer <token> header for authenticated requests.

MethodPathDescriptionAuth
GET/v1/healthHealth check (public)No
POST/v1/auth/registerCreate a new accountNo
POST/v1/auth/loginAuthenticate and get a tokenNo
POST/v1/auth/verifyVerify email addressNo
POST/v1/auth/forgot-passwordRequest a password reset emailNo
POST/v1/auth/reset-passwordReset password with a tokenNo
POST/v1/auth/passkey/authenticate-optionsGet a WebAuthn login challengeNo
POST/v1/auth/passkey/authenticateComplete WebAuthn loginNo
POST/v1/auth/logoutRevoke current tokenYes
POST/v1/auth/logout-allRevoke all tokens except currentYes
POST/v1/auth/refreshIssue a new tokenYes
GET/v1/auth/tokensList all active tokensYes
POST/v1/auth/revoke-tokenRevoke a specific tokenYes
POST/v1/auth/passkeys/register-optionsGet a WebAuthn registration challengeYes
POST/v1/auth/passkeys/registerRegister a new passkeyYes
GET/v1/auth/passkeysList passkeysYes
PUT/v1/auth/passkeys/{passkey}Rename a passkeyYes
DELETE/v1/auth/passkeys/{passkey}Delete a passkeyYes
POST /v1/auth/register

Request Body:

FieldTypeRules
namestringrequired
emailstringrequired, valid email, unique
passwordstringrequired, min 12 characters
password_confirmationstringrequired, must match password

Rate limited to 10 requests per hour per IP.

POST /v1/auth/login

Request Body:

FieldTypeRules
emailstringrequired
passwordstringrequired

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": "..." }
}
}
POST /v1/auth/verify

Request Body:

FieldTypeRules
user_idstringrequired
tokenstringrequired
POST /v1/auth/forgot-password

Sends a password reset link (valid 60 minutes). Rate limited to 10 requests per hour per IP.

FieldTypeRules
emailstringrequired
platformstringoptional (web/mobile/desktop)
POST /v1/auth/reset-password
FieldTypeRules
tokenstringrequired
emailstringrequired
passwordstringrequired, min 12 characters

WebAuthn passkey login and management.

MethodPathDescription
POST/v1/auth/passkey/authenticate-optionsGet a login challenge
POST/v1/auth/passkey/authenticateComplete login
POST/v1/auth/passkeys/register-optionsGet a registration challenge
POST/v1/auth/passkeys/registerRegister a new passkey
GET/v1/auth/passkeysList 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.

GET /v1/health

Public health check. Returns status, timestamp, app, and version.

POST /v1/auth/logout

Revokes the token used in the Authorization header.

POST /v1/auth/logout-all

Revokes every token except the one making the request.

POST /v1/auth/refresh

Returns 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"
}
}
GET /v1/auth/tokens

Returns all active tokens for the authenticated user. Each token includes an is_current boolean.

POST /v1/auth/revoke-token

Request Body:

FieldTypeRules
token_idintegerrequired