API Reference
OIDC
Platform

Frontend endpoint index

AdminUpdated Sep 11, 2026

Frontend endpoint index

The complete Frontend API surface — 122 endpoints. FAPI is browser- and native-facing: authenticated with a publishable key (x-publishable-key) plus the Atlas session (cookie on web, bearer on native). Most routes live under /v1/client/…. These are normally driven by an SDK, not called by hand.

Other client routes

Method & path

Description

GET /v1/appearance

The embeddable widget's public themeenabled providers/strategies, resolved by publishable key or host. Public only — no secrets, no customCss/customHtml.

POST /v1/client/telemetry

Anti-bot signal beacon: the SDK posts anonymised devicebehavioural signals for the sign-in/sign-up form; the server enriches (salt-hashed IP, coarse geo, heuristic score) and appends to the bot_signals lake. Fire-and-forget (202), never blocks a sign-in.

GET /v1/assets/*

Public read for an uploaded image (avatar/logo) — streamed from object storage with an immutable long cache-control. Unauthenticated by design; only validated images are ever stored here.

GET /v1/client/environment

The instance's enabled social providers (and native client ids) for a publishable-key client. Never exposes secrets.

Sign-in & sign-up

Method & path

Description

POST /v1/client/sign_ups

Start an emailpassword sign-up. Returns an attempt whose status drives the next step.

POST /v1/client/sign_ups/:id/prepare_verification

Reissue a verification code. Rate limited to 1/30s and 5/hour per address.

POST /v1/client/sign_ups/:id/attempt_verification

Submit an email verification code. Three attempts, then the code is invalidated.

POST /v1/client/password_resets

Request a reset. Identical response for an address that does not exist.

POST /v1/client/password_resets/:id/attempt_verification

Submit the emailed code. Advances to MFA when the account has it.

POST /v1/client/password_resets/:id/attempt_second_factor

Second factor during a reset. Reset never bypasses MFA.

POST /v1/client/password_resets/:id/set_new_password

Set the new password, revoke every session, and bump sessions_version.

POST /v1/client/sign_ins

Start a sign-in. Returns the instance factor list, identical for unknown identifiers.

POST /v1/client/qr_sign_ins

Start a QR cross-device sign-in: returns the QR token/verification URL, a number-match code, and this tab’s poll secret. Opt-in; unauthenticated (publishable key).

GET /v1/client/qr_sign_ins/:qr_token

Phone lookup for a pending QR sign-in: the requesting browser’s devicecoarse location and the match code to confirm. Requires the phone’s session.

POST /v1/client/qr_sign_ins/:qr_token/approve

Phone approves a pending QR sign-in after confirming the number-match code; completes the attempt so the browser’s poll mints a session. Requires the phone’s session.

POST /v1/client/qr_sign_ins/:qr_token/deny

Phone denies a pending QR sign-in, abandoning the attempt so the browser’s poll never completes. Requires the phone’s session.

POST /v1/client/sign_ins/:id/prepare_first_factor

Send an email code or magic link. Returns the polling secret to this tab.

GET /v1/client/sign_ins/verify

Magic-link target. Completes the attempt; signs in no one here.

GET /v1/client/sign_ins/:id

Poll an attempt with its poll_secret; returns a ticket once complete.

POST /v1/client/sign_ins/:id/attempt_first_factor

Submit a first factor. Advances to MFA or completes, as the server decides.

POST /v1/client/sign_ins/:id/prepare_second_factor

Offer a passkey as the second factor. Credentials are named safely here.

POST /v1/client/sign_ins/:id/prepare_mfa_enrollment

Start TOTP enrollment for an attempt parked by a required MFA policy.

POST /v1/client/sign_ins/:id/attempt_mfa_enrollment

Confirm enrollment with two consecutive codes and complete the sign-in.

POST /v1/client/sign_ins/:id/attempt_second_factor

Submit a TOTP or recovery code. The only route out of needs_second_factor.

POST /v1/client/sign_ins/passkey/begin

Begin passwordless sign-in. Names no user and lists no credentials.

POST /v1/client/sign_ins/passkey/finish

Verify an assertion and issue a session. The credential names the user.

POST /v1/client/sign_ins/oauth

Begin an OAuth sign-in and receive the provider authorization URL.

POST /v1/client/sign_ins/id_token

Native / One-Tap sign-in: verify a provider id_token (Google GSI, Apple, Facebook Limited Login) and complete the sign-in, honouring the MFA gate.

POST /v1/client/sign_ins/ldap

LDAP/AD inbound sign-in: authenticate against a configured directory (connection_idusernamepassword) and JIT create/link the Atlas account, honouring the MFA gate.

POST /v1/client/sign_ins/kerberos

Kerberos / Integrated Windows Auth (IWA / SPNEGO) sign-in: a reverse proxy authenticates the principal and forwards it in a header; Atlas trusts it only behind a matching x-atlas-kerberos-secret, then resolves/JIT-links the account honouring the MFA gate. Opt-in, fail-closed.

POST /v1/client/sign_ins/external_jwt

Migration interop: verify a foreign provider JWT (a configured externalJwt issuer) against its JWKS and complete the sign-in (JITMFA gate), to run Atlas alongside an old provider.

POST /v1/client/sign_ins/sso

Begin an enterprise SSO sign-in. Resolves an OIDC connection by id or email domain and returns the IdP authorization URL.

POST /v1/client/sign_ins/saml

Begin an enterprise SAML sign-in. Resolves a SAML connection by id or email domain and returns the IdP AuthnRequest URL.

Account management (me)

Method & path

Description

POST /v1/client/me/avatar

Upload the signed-in user's avatar. The RAW image bytes are the body (Content-Type image/png|jpeg|gif|webp), validated by magic number; sets the user's image_url. Returns 503 when image storage is not configured.

GET /v1/client/me/passkeys

List the signed-in user passkeys. Never returns credential material.

POST /v1/client/me/passkeys/begin

Options for navigator.credentials.create, with a single-use challenge.

POST /v1/client/me/passkeys/finish

Verify and store a new passkey. Requires a session.

PATCH /v1/client/me/passkeys/:id

Rename a passkey so the user can tell their devices apart.

DELETE /v1/client/me/passkeys/:id

Remove a passkey. Another user passkey id is 404, never 403.

GET /v1/client/me/trusted_devices

List browsers trusted to skip 2FA (). Never returns the token hash.

DELETE /v1/client/me/trusted_devices/:id

Revoke one trusted device; its next sign-in must pass 2FA again.

DELETE /v1/client/me/trusted_devices

Revoke every trusted device for the signed-in user.

GET /v1/client/me/oauth_grants

List the third-party apps this user authorized (Sign in with <Tenant>).

DELETE /v1/client/me/oauth_grants/:id

Disconnect an authorized app: forget consent and revoke its live tokens.

GET /v1/client/me

The signed-in user with emails, linked accounts and passkeys.

POST /v1/client/me/api_tokens

Mint a scoped personal access token (uat_) so an agent or script can drive your own account over the me-surface with a bearer header. Session-only; the one-time secret is shown exactly once.

GET /v1/client/me/api_tokens

List your own personal access tokens with their scopes, expiry and last-used time. Never returns a secret or its hash.

DELETE /v1/client/me/api_tokens/:id

Revoke one of your own personal access tokens. Revocation is immediate and a revoked token fails closed on every later use.

GET /v1/client/me/mcp

Discover the user-scoped MCP tools your personal access token can use, plus the recommended scope set for an account-management agent.

POST /v1/client/me/mcp

JSON-RPC MCP endpoint: manage your own account as MCP tools (read/update profile, list sessions, revoke-all, list factors and more), authenticated by a personal access token.

POST /v1/client/me/data_export

Request an export of your own data (Article 15/20). Creates an async job; poll for the produced package. Rate-limited: one in flight, and a cooldown between requests.

GET /v1/client/me/data_export

List your own data-export requests and their status.

GET /v1/client/me/data_export/:id

A data-export request with, once ready, the produced package — your profile, emails, linked accounts, memberships and more, with no password hash, token or secret.

POST /v1/client/me/deletion_request

Request erasure of your own account (Article 17). Scheduled after a grace/cancellation window, then fulfilled through the same soft-deletePII-purge path a backend user-delete uses.

GET /v1/client/me/deletion_request

List your own erasure requests and their status.

POST /v1/client/me/deletion_request/:id/cancel

Cancel a pending erasure within the grace window. A fulfilled one is a 409.

DELETE /v1/client/me/deletion_request/:id

Cancel a pending erasure within the grace window (alias of /cancel).

PATCH /v1/client/me

Update profile and unsafe_metadata. public_metadata is refused.

POST /v1/client/me/change_password

Change your password. Verifies the current one, applies the sign-up policy, and revokes other sessions.

POST /v1/client/me/set_password

Set a first password on an account that has none (anonymous guest or OAuth-only). Applies the sign-up policy; may graduate a guest to a permanent account.

POST /v1/client/me/email_addresses

Add an address. Starts unverified and sends a code.

POST /v1/client/me/email_addresses/:id/attempt_verification

Verify an added address with its emailed code.

POST /v1/client/me/email_addresses/:id/primary

Make a verified address primary. Unverified addresses are refused.

DELETE /v1/client/me/email_addresses/:id

Remove an address. Removing the last verified one is refused.

DELETE /v1/client/me/external_accounts/:id

Unlink a provider. Removing the only sign-in method is refused.

GET /v1/client/me/external_accounts/:provider/token

The signed-in user's own provider access token, refreshed single-flight if stale. Never returns the refresh token.

POST /v1/client/me/external_accounts/connect

Start an OAuth flow to link a NEW provider to the signed-in user (for a custom "Connect GitHub" button); returns the authorize URL. Binds to the current user, so no new session and no email resolution.

POST /v1/client/me/external_accounts/:id/reauthorize

Re-initiate the provider OAuth flow to request additional scopes for a linked account; returns the authorize URL. On callback the account scopes/token update.

POST /v1/client/me/external_accounts/:id/revoke

Revoke the stored provider token (best-effort at the provider) and clear it locally WITHOUT unlinking the account.

GET /v1/client/me/organizations

Organization memberships for the signed-in user.

POST /v1/client/me/organization_membership_requests

Request to join an organization whose verified domain matches your verified email.

GET /v1/client/me/organization_suggestions

Organizations you could join, discovered via your verified email domain.

POST /v1/client/me/organization_suggestions/:organizationId/accept

Accept a suggestion, creating a pending join request an admin then decides.

POST /v1/client/me/reauthenticate

Step-up re-authentication: re-prove a credential (strategy "password" or "id_token") to refresh the session step-up window in place — no sign-out — so the next 2FA change is permitted. An id_token must already be linked to this user; it never attaches a new identity.

GET /v1/client/me/backchannel_requests

List the current user’s pending CIBA backchannel approval requests.

POST /v1/client/me/backchannel_requests/:id

Approve or deny a pending CIBA backchannel request (session-only; a PAT cannot approve).

Organizations (client)

Method & path

Description

POST /v1/client/organizations

Create an organization, if the instance allows user-created ones.

GET /v1/client/organizations/:id

Read the active organization. Gated by the ACTIVE org role.

PATCH /v1/client/organizations/:id

Update the active organization. Requires org:sys_profile:manage.

GET /v1/client/organizations/:id/memberships

List members of the active organization as a display directory.

POST /v1/client/organizations/:id/invitations

Invite someone. Requires org:sys_memberships:manage.

DELETE /v1/client/organizations/:id/memberships/:userId

Remove a member. Removing the last admin returns LAST_ADMIN.

POST /v1/client/organization_invitations/:invitationId/accept

Accept an invitation addressed to one of your verified emails. Seats you as a member.

GET /v1/client/organizations/:id/membership_requests

List pending requests to join the active org. Requires org:sys_memberships:manage.

POST /v1/client/organizations/:id/membership_requests/:reqId/accept

Accept a join request, seating the user at the default member role (never admin).

POST /v1/client/organizations/:id/membership_requests/:reqId/reject

Reject a pending join request. No membership is created.

Multi-factor (me)

Method & path

Description

GET /v1/client/me/mfa

List the signed-in user second factors. Never returns secrets or codes.

POST /v1/client/me/mfa/totp

Begin authenticator enrollment. Returns the secret exactly once.

POST /v1/client/me/mfa/totp/:id/verify

Confirm enrollment with a code, and receive recovery codes once.

POST /v1/client/me/mfa/sms

Enroll a phone as an SMS second factor. Texts a code; returns the number masked.

POST /v1/client/me/mfa/sms/:id/verify

Confirm SMS enrollment with the texted code, and receive recovery codes once.

POST /v1/client/me/mfa/push

Register a device for in-house push MFA. Pushes a number-matching challenge; never returns the device token.

GET /v1/client/me/mfa/push

List registered push devices. Never returns the raw device token.

POST /v1/client/me/mfa/push/challenges/:id/respond

Device approve/denyselected number for a push challenge (enrollment or sign-in).

DELETE /v1/client/me/mfa/push/:deviceId

Remove a push device. Removing the last verified one removes the push factor.

POST /v1/client/me/mfa/backup_codes

Issue a fresh set of recovery codes, invalidating the previous set.

DELETE /v1/client/me/mfa/:id

Remove a factor. Removing the last one also drops recovery codes.

Web3, SAML-IdP & other sign-in

Method & path

Description

GET /v1/saml/idp/sso

Atlas-as-SAML-IdP SSO endpoint (session-gated). IdP-initiated (?sp=) or SP-initiated (SAMLRequest); returns a signed SAML Response auto-POST form.

POST /v1/saml/idp/sso

Atlas-as-SAML-IdP SSO endpoint (session-gated), HTTP-POST binding — see GET /v1/saml/idp/sso.

PUT /v1/saml/idp/sso

Atlas-as-SAML-IdP SSO endpoint (app.all method fan-out; behaves as GET/POST) — see GET /v1/saml/idp/sso.

PATCH /v1/saml/idp/sso

Atlas-as-SAML-IdP SSO endpoint (app.all method fan-out; behaves as GET/POST) — see GET /v1/saml/idp/sso.

DELETE /v1/saml/idp/sso

Atlas-as-SAML-IdP SSO endpoint (app.all method fan-out; behaves as GET/POST) — see GET /v1/saml/idp/sso.

POST /v1/oauth/telegram

Telegram Login Widget sign-in: verify the widget payload HMAC against the bot token and complete the sign-in, honouring the MFA gate.

POST /v1/oauth/siwe/nonce

Sign-in with Ethereum (EIP-4361): mint a single-use nonce bound to a new attempt.

POST /v1/oauth/siwe/verify

Sign-in with Ethereum (EIP-4361): verify a signed message (domain, chain, nonce, validity, EIP-191/EIP-1271) and complete the sign-in, honouring the MFA gate.

POST /v1/oauth/siws/nonce

Sign-in with Solana (SIWS): mint a single-use nonce bound to a new attempt.

POST /v1/oauth/siws/verify

Sign-in with Solana (SIWS): verify a signed message (domain, network, nonce, validity, ed25519 signature) and complete the sign-in, honouring the MFA gate.

POST /v1/oauth/siwf/nonce

Sign-in with Farcaster (SIWF): mint a single-use nonce bound to a new attempt.

POST /v1/oauth/siwf/verify

Sign-in with Farcaster (SIWF): verify a signed SIWE message (domain, chain, nonce, validity, signature), prove on-chain that the custody address owns the claimed FID (Optimism ID Registry), and complete the sign-in, honouring the MFA gate.

GET /discourse/sso

DiscourseConnect provider endpoint. Verifies the forum HMAC (constant-time), authenticates via the hosted session, and signs the identity payload back to the return_sso_url whose origin is pinned to the connection.

Tickets

Method & path

Description

POST /v1/client/tickets/exchange

Exchange a one-time ticket for session cookies.

Client & sessions

Method & path

Description

GET /v1/client

Boot the client. Returns session: null for a signed-out visitor, never 401.

GET /v1/client/sessions

List the signed-in user's own active sessions/devices, flagging the current one.

POST /v1/client/sessions/revoke_all

Sign out of every other device. Spares the current session; bumps sessions_version.

POST /v1/client/sessions/:id/touch

Switch the active organization. Membership is resolved server-side.

POST /v1/client/sessions/:id/tokens

Rotate the refresh token and mint a session JWT. Reads the refresh cookie only.

POST /v1/client/sessions/:id/revoke

Revoke one session and clear its cookies.

POST /v1/client/sessions/:id/tokens/:template

Mint a short-lived JWT for the active session using a named JWT template (getToken).

Billing (client)

Method & path

Description

GET /v1/client/billing/plans

Public list of the instance's active end-user billing plans for display (no Stripe price ids or secrets).

POST /v1/client/billing/checkout

Create a Stripe Checkout Session to subscribe the signed-in user (or an org they administer) to a plan. Returns {url}; never changes subscription state.

GET /v1/client/billing/subscription

Read the signed-in user's subscription, or an org's (org_id) when the caller is a member — status plus the active plan and its features.

POST /v1/client/billing/portal

Create a Stripe Billing Portal session for the subject's customer (self, or an org the caller administers) to manage or cancel. Returns {url}.

Was this page helpful?