
When to use this
How it works
Setting up an OAuth application
Developer → Apps → Create Application
After creating the app, you’ll receive a Client ID and Client Secret. Store the secret securely — it’s shown only once.
Apps you create here are confidential clients. Developers can also self-register public clients against your tenant without admin involvement; those get no secret and are limited to the same member-level access. See Authentication for that path.
Read-only or acting on behalf
Every app is either read-only or permitted to act on the member’s behalf. New apps can act by default. A read-only app may useGET, HEAD and OPTIONS only. Anything else is rejected with 403 and the message “This application has read-only access and may not act on your behalf.”
Whichever setting applies is shown to the member on the consent screen before they approve.
What an app can never do
A token issued to an app is capped to member level, no matter who authorizes it. If one of your administrators connects the app, it still cannot perform administrator actions. This is deliberate and not configurable. An app acts as a member, never as an administrator — so connecting a third-party app cannot escalate that party to admin access over your tenant.OAuth endpoints
Clients should read these from the discovery document at/.well-known/oauth-authorization-server rather than hardcoding them.
All of these live on your tenant’s own host —
acme.orgo.space, or your custom domain.
Orgo includes a built-in OAuth documentation page that developers can reference when building integrations:

Implementation
Step 1: Redirect to authorization
Send users to Orgo’s authorization endpoint. PKCE is required — including for confidential apps like the ones you create here:Step 2: Exchange code for token
After the user authorizes, Orgo redirects to your URI with a code. Exchange it server-side:Step 3: Get user info
Use the access token to retrieve the user’s profile:Available scopes
Request only the scopes your app needs — fewer scopes means less data exposure and a simpler consent screen for users.
Common scenarios
I get 'invalid redirect URI' errors
I get 'invalid redirect URI' errors
The redirect URI in your authorization request must exactly match one of the URIs registered in the OAuth app settings. Watch for trailing slashes, http vs https, and port numbers.
Access tokens are expiring
Access tokens are expiring
Access tokens last one hour. Use the refresh token to get a new one without sending the member back through consent. Refresh tokens last 30 days and rotate — each refresh returns a new one and invalidates the previous, so the app must store the new value every time.
Can I use this with a single-page app (SPA)?
Can I use this with a single-page app (SPA)?
Yes. A SPA should self-register as a public client rather than using an app created here — it gets no Client Secret, and PKCE alone authenticates it. PKCE is mandatory for every client either way, so a confidential app sends both its secret and the
code_verifier.How do I map Orgo roles to permissions in my app?
How do I map Orgo roles to permissions in my app?
Use the
roles scope to get the user’s Orgo roles. In your app, map these roles to your permission system — e.g., Orgo ADMIN_TENANT → your app’s admin role.Related
- Integrations — Connect third-party services to Orgo
- Members — User data that OAuth provides access to

