Every API call carries a token. Here's how to get one and how long it lasts.
Every API call carries a token. Here's how to get one and how long it lasts. Send it on every protected call as an Authorization: Bearer <bearer-token> header.
Ways to obtain a token
- Personal access token (recommended) — generate it on the dashboard's API Keys page (API Keys, then Manage token, then Generate token). It never expires, stays viewable on that page, and acts as the user who generated it. Regenerate at any time to rotate it — the previous token stops working immediately.
- App credentials (OAuth 2.0) — a browser sign-in for apps that act on behalf of your own customers: they enter their password on our page, never in yours, and your server receives the token. Most partners don't need this.
If your integration authenticates with an email and password, it keeps working. New integrations should use a personal access token.
Signing users in to the dashboard with your identity provider (JumpCloud) is covered in Single sign-on; it doesn't give your app an API token.
Every token acts as the user behind it: an account user's token sees that account; a partner Owner or Admin token has partner-level access.
Using the token
Send it on every protected call:
Authorization: Bearer <bearer-token>
Token lifecycle
Tokens are OAuth 2.0 bearer tokens issued by our authorization server (RS256-signed JWTs).
- Personal access tokens do not expire — rotate them from the API Keys page (regenerating revokes the previous token immediately).
- App credentials (OAuth 2.0) access tokens last 1 day. Their refresh tokens last 30 days (see App credentials (OAuth 2.0) for the refresh call).
- Check any token with
GET /verify-token— it returns the user and company while the token is valid, and 401 once it expires or is revoked. - Revoke a token at any time (for example on sign-out) with
GET /sso/revoking-token, sending the token as the Bearer header.
Locked accounts
Five wrong password attempts temporarily lock an account (starting at 1 minute and growing to a 15-minute maximum, lifting automatically). While locked, new sign-ins are refused; tokens issued earlier keep working until they expire or are revoked.
Public vs protected
Public (no token): POST /auth/discover, email OTP verification, the SSO redirect / callback / exchange legs, and the OAuth endpoints at the server root (/oauth/authorize, /oauth/token). Everything else requires a bearer token.
Before you begin
Create your app credentials (client_id + client_secret) on the dashboard's API Keys page — they are needed for App credentials (OAuth 2.0). The client secret is shown once, at creation. Personal access tokens need no app credentials.
Prerequisites
- A bearer token in the
Authorizationheader. Any endpoint that needs no token says so on its own page. - The id of each record the call targets. Every endpoint page lists the ids it needs.
Errors
| Status | Meaning |
|---|---|
401 | The bearer token is missing, expired or invalid |
403 | The token is valid but the record sits outside your account |
422 | The request failed validation — the response names the fields |
500 | Unexpected server error |
Individual endpoints may return more; each page lists its own.
Sections
| Section | Description |
|---|---|
| App credentials (OAuth 2.0) | The authorization-code flow for apps that sign your customers in to Shout About Us — they enter their password on our page, your server gets a token. |
| Single sign-on | Let your users sign in to the dashboard with your identity provider, so they don't need a separate password. |
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | Check your token | Validate the supplied bearer token and restores the dashboard session: returns the authenticated user, their company, theme, white-label and (for account companies) plan context. |
POST | Verify email OTP | Verify the email OTP previously sent for a forgot-password / change-password / signup flow. |
POST | Resend email OTP | Resend an email OTP for a change-password / forgot-password / signup flow. |
POST | Reset password | Reset the authenticated user's password to the supplied value, revokes all of their existing tokens, and returns a fresh access token. |
POST | Change password | Start an authenticated password change: verifies the current password, then emails a change_password OTP rather than changing the password directly. |
