| Method | Who uses it | Header |
|---|---|---|
| Api-Token | Servers, scripts, CRON jobs you control | Api-Token: <token> |
| Bearer JWT | A user who logged in with email + password | Authorization: Bearer <jwt> |
| OAuth 2.0 | A third-party app acting on behalf of an Orgo user | Standard OAuth flow |
| OTP | A user logging in via emailed one-time code | Returns a JWT, then Authorization: Bearer <jwt> |
| X-Contact-Hash | An emailed contact opening an event link | X-Contact-Hash: <hash> |
Api-Token (server-to-server)
Generate a token at Settings → Developers → API Access. Send it as a raw header — there is noBearer prefix and no encoding:
- Read/write — full access to whatever the owning user can do.
- Read-only — any
POST,PATCH,PUT, orDELETEis rejected with403 Forbidden. Useful for analytics integrations.
JWT (interactive login)
For sessions started by a user typing email + password, exchange those credentials for a JWT:POST /api/v1/token/refresh for a new pair.
JWTs are scoped to the tenant the login was made against — calling a different tenant’s host with the same JWT will fail with 401.
OAuth 2.0 (third-party apps)
When you want users to “Log in with Orgo” from a third-party site, register an OAuth app at Settings → Developers → OAuth Applications and use the Authorization Code flow:profile, email, groups, roles. Request only what you need — fewer scopes means a simpler consent screen for the user.
Full setup walkthrough: OAuth Server.
OTP (one-time password)
For users who do not have a password — or who prefer a magic-link flow — Orgo can send a 6-digit code by email. Two steps:X-Contact-Hash (anonymous contacts)
When Orgo emails a Contact (someone without a user account) an event invitation or a form link, the email contains a magic URL with a hash. That hash is also the auth header:Picking the right method
I'm building an integration that runs on a server I control
I'm building an integration that runs on a server I control
Api-Token. Read-only if you only need to fetch data; read/write if you need to create or update.
I'm building a mobile or web app that logs users in with their Orgo password
I'm building a mobile or web app that logs users in with their Orgo password
JWT. Call
POST /api/v1/login-check with the user’s credentials, store the returned JWT, and send it on every subsequent call.I want users to click 'Log in with Orgo' on my third-party site
I want users to click 'Log in with Orgo' on my third-party site
OAuth 2.0. Register an OAuth application and follow the Authorization Code flow.
I want password-less login by email code
I want password-less login by email code
OTP. Two-step:
request-login-otp then verify-login-otp. Returns a JWT.I'm building the receiving end of an Orgo-sent email link for non-members
I'm building the receiving end of an Orgo-sent email link for non-members
X-Contact-Hash. The hash is in the URL Orgo emails; lift it into the header on subsequent API calls.
Common authentication errors
| Status | What it means | Fix |
|---|---|---|
401 Unauthorized | Header missing, malformed, or invalid token | Re-send the header; if the token is right, it may have been revoked or expired |
403 Forbidden | Authenticated, but lacks permission OR token is read-only and you sent a write | Check Api-Token access level; check the user’s role for this resource |
404 Not Found | Resource exists but in a different tenant | Confirm you are calling the correct subdomain — see Tenancy |
Related
- Tenancy — getting the tenant context right is half of getting auth right
- Errors — full error envelope reference
- OAuth Server — admin-side setup for OAuth applications

