Skip to content

Authentication

The Sidedoor API authenticates with an opaque bearer token, sent as an Authorization: Bearer <token> header on every request. The recommended way to obtain one is an API token - a scoped, revocable credential you create once from your operator account. This is the canonical auth flow - other pages refer back here.

Create an API token from your operator account: open Access in the sidebar, then the API tab, and click Create Token. You give it a name, a role that sets exactly what it can do, and an optional IP allow-list and expiry. The secret is shown once at creation:

sk_<secret>

Copy it into your secrets store straight away - it is not shown again. See API tokens for the full walkthrough, including rotation and revocation.

An API token is bound to your operator account and authorised by the role you give it, so it presents the same identity to the API as a logged-in operator - your Authorization: Bearer <token> handling stays unchanged.

Send the token as a bearer header. Store it in the SIDEDOOR_TOKEN environment variable and reuse it across calls. GET /api/auth/me is a good check that a token is valid.

Terminal window
curl "https://thesidedoor.co/api/auth/me" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "user": { "id": "usr_123", "role": "client", "name": "Jo Operator" } }

For interactive use - where a person signs in - log in with POST /api/auth/login to mint a temporary session token instead. This suits attended use; for unattended server-to-server integrations, prefer an API token.

Method Path Purpose Auth
POST /api/auth/login Log in, mint a session token public
GET /api/auth/me Return the authenticated user session
POST /api/auth/logout Invalidate the current session session

The body takes email and password. A successful login returns { user, token } - store token and send it on subsequent requests.

Terminal window
curl -X POST "https://thesidedoor.co/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"operator@example.com","password":"your-password"}'
{
"user": { "id": "usr_123", "role": "client", "name": "Jo Operator" },
"token": "sdt_9f2a7c…redacted"
}

The token is an opaque credential - treat it as a secret string; its internal structure is not part of the contract and may change.

If the account has two-factor authentication enabled, the login is completed with a second step: an authenticator code challenge. Once the challenge is satisfied you receive the same { user, token } result. Handle it interactively (a person enters their code); it isn’t suited to unattended server-to-server use - use an API token there instead.

An API token stays valid until it expires (if you set an expiry) or you revoke it - manage that from Access → API in your operator account.

A session token from interactive login is stored server-side and slides on use - each authenticated request extends the expiry. An operator/staff session lasts 3 days on a sliding window (any authenticated request extends it).

A missing, invalid, or expired token on any /api/* route returns 401:

{ "error": "Unauthorized" }

Re-run the login flow, or issue a fresh API token, to obtain a new token.

POST /api/auth/logout invalidates the current session server-side. Discard the token afterwards. (To retire an API token, revoke or roll it from Access → API rather than logging out.)

Terminal window
curl -X POST "https://thesidedoor.co/api/auth/logout" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "success": true }