Authenticate with the Nora API
Sign up, log in, and manage your Nora account via the Auth API. Includes JWT token usage, profile updates, and password management.Every protected Nora API endpoint requires an authenticated identity — either a session JWT (covered on this page) or a workspace API key with scopes (see the API overview for the key-and-scope model). When the operator allows registration, a new user can sign up and then log in to obtain a JWT. Existing users can continue to log in when registration is disabled. A JWT is valid for 7 days, sent as a Bearer token in the
Authorization header of every subsequent request, and also accepted as an HttpOnly session cookie. This page covers all authentication endpoints and shows you exactly what each one returns.
Login and OAuth auth endpoints are rate-limited to 20 requests per 15-minute window per IP.
When enabled, public signup has stricter burst and daily rate limits, plus Turnstile or reCAPTCHA
verification when configured. Hosted PaaS mode requires one of those providers and fails closed
when neither is configured; self-hosted mode may explicitly use
none.Bootstrap status
Check whether a self-hosted server still needs its first admin. This drives the “claim this server” first-run flow: until the first user registers (that first account becomes the platform admin),needsFirstAdmin is true; afterward it is false. It is also false whenever public signup is
disabled. Hosted PaaS requires an explicit bootstrap administrator before startup and never reports
public first-admin claim. The response also contains runtime OAuth visibility, signup availability,
normalized platform mode, and signup-challenge metadata so published frontend images can render the
correct auth surface without build-time replacement. Verification secrets are never
returned. A user count or emails would aid account enumeration. See the security
overview for the broader claim flow.
Response
boolean
true only while an empty self-hosted installation permits first-account admin claim. Hosted PaaS
always reports false.boolean
Whether the running backend accepts OAuth login. Login and signup hide OAuth controls unless this
value is
true.string
Normalized deployment mode:
selfhosted or paas.boolean
Whether the operator currently allows new password or OAuth registrations. Existing-account login
remains available when this is
false.object
Safe public runtime configuration:
enabled, provider, public siteKey, configured, and a
user-safe configurationError. Secret verification keys remain backend-only.Sign up
Create a new user account when the operator has enabled public registration. On an empty self-hosted installation, the first registered user becomes the platform admin (the first-admin claim flow — see bootstrap status and the security overview). Hosted PaaS must seed its administrator before startup, so public signup there always creates a regular user. Operators can disable new password and OAuth registrations withSIGNUP_ENABLED=false; password login and sessions for existing users
are unaffected.
Request body
string
required
A valid email address, maximum 255 characters.
string
required
Password, minimum 8 characters and maximum 128 characters.
string
Optional challenge token. Required only when
SIGNUP_BOT_PROTECTION_PROVIDER is set to
turnstile or recaptcha.Response
string
The new user’s UUID.
string
The registered email address.
Error responses
When registration is disabled, the response has a stable machine-readable code:Log in
Exchange email and password for a JWT.Request body
string
required
Your registered email address.
string
required
Your password.
Response
string
A signed JWT valid for 7 days. Include this value in the
Authorization: Bearer <token> header on all subsequent requests.Error responses
Using the token
Pass the token you received from/auth/login in every request to a protected endpoint:
Get current user
Verify a token and retrieve the authenticated user’s profile.Response
string
User UUID.
string
Email address.
string
Display name, may be
null if not set.string
Account role. Typically
user or admin.string
OAuth provider (
github, google, etc.) or null for password accounts.string
Base64-encoded
data:image/... avatar, or null.string
ISO 8601 timestamp of account creation.
Update profile
Update your display name and/or avatar.Request body
string
Display name, 1–100 characters.
string
Base64-encoded image (
data:image/png;base64,...), maximum 500 KB. Pass null to remove the
avatar.Response
string
Updated display name.
string
Updated avatar value or
null.Change password
Replace your current password with a new one.Request body
string
required
Your existing password.
string
required
New password, minimum 8 characters and maximum 128 characters.
Response
boolean
true when the password was updated successfully.Error responses
OAuth login
Exchange a server-verified OAuth identity for a Nora session. On success this returns atoken plus the user record and sets the HttpOnly session cookie.
This endpoint is disabled by default. Unless
OAUTH_LOGIN_ENABLED=true, it returns 403.
Google or GitHub credentials must also be configured in the marketing OAuth bridge. Provider
tokens are verified server-side before Nora issues a session. Like password login, this endpoint
is rate-limited to 20 requests per 15-minute window per IP. When OAuth is enabled but public
signup is disabled, an existing linked OAuth user can still authenticate. A verified identity that
would create a new Nora user receives 403 with code: "SIGNUP_DISABLED".Request body
string
required
OAuth provider identifier (for example
github or google).string
Provider access token. Either this or
oauthIdToken is required.string
Provider ID token. Either this or
oauthAccessToken is required.Response
string
A signed JWT for the linked or newly created account.
object
The authenticated user record.
Upgrade session
Mirror an existing Bearer-token session into the browser’s HttpOnly session cookie. The supplied token is re-verified, so a forged Bearer is rejected.Authorization: Bearer <token> header.
Response
boolean
true when the cookie was set.Log out
Clear the session cookie.Response
boolean
true when the cookie was cleared.
