Authentication
Every Quiddly API request is authenticated via a bearer JWT in the
Authorization header:
Authorization: Bearer <jwt>Integrators obtain a JWT from a Quiddly service account (Flow 1). Some partner integrations instead use Auth0-issued machine tokens that Quiddly provisions (Flow 2) - you do not call Auth0 yourself.
Flow 1 - Service account (HS256)
Section titled “Flow 1 - Service account (HS256)”The standard flow for server-to-server integrations.
- Quiddly provisions a service account for your tenant. Contact support; see Getting started. Self-service creation is on the roadmap.
- Mint a JWT with
PUT /service-accounts/{email}/generate-token(requiresGenerateTokenServiceAccount). The token is signed HS256 by Quiddly; use it directly. - A token from this endpoint has no
expclaim, so it does not expire. It stays valid until the service account secret is rotated, which invalidates every token signed with the old secret. Store the token like a secret.
The service-account secret never leaves Quiddly. Rotate it whenever needed
via PUT /service-accounts/{email}/rotate-secret (refused for an account that
does not allow rotation), then mint a new token.
Flow 2 - Machine tokens (RS256)
Section titled “Flow 2 - Machine tokens (RS256)”Some partner integrations authenticate with Auth0-issued machine-to-machine
tokens that Quiddly arranges for you. You do not call Auth0 directly -
Quiddly provisions the credentials and audience and sets this up with you. These
tokens are RS256; their rights come from the permissions claim (Auth0
RBAC), and the scope claim is informational only and not used for
authorization.
Errors
Section titled “Errors”| HTTP | Cause |
|---|---|
401 AUTHORIZATION_HEADER_MISSING |
No Authorization header sent. |
401 INVALID_HEADER |
Header malformed, wrong algorithm, or bad signature. |
401 TOKEN_EXPIRED |
JWT past its exp claim. Re-issue. |
403 ACCESS_DENIED |
Token valid, but principal lacks the required right. |
The API allows cross-origin requests from the developer portal of the same
tenant. The interactive reference uses fetch with credentials omitted; if
you build a browser-side integration, supply the JWT manually in the
Authorization header.