Flows
Yotel supports three grant types:| Grant type | When to use |
|---|---|
authorization_code (with PKCE) | Interactive — user consents in a browser. SPAs, installed web apps, Salesforce, HubSpot. Default choice. |
refresh_token | Renew an expired access token without user reauth. Rotated on every refresh. |
urn:ietf:params:oauth:grant-type:jwt-bearer | Server-to-server. No user browser. Partner signs a short-lived JWT with their private key. |
Discovery
Our provider implements OpenID Connect Discovery. Fetch/.well-known/openid-configuration to auto-configure any OIDC
client library:
| Endpoint | Purpose |
|---|---|
/oauth/authorize | Redirect here to start interactive flow |
/oauth/token | Exchange code / refresh / JWT assertion for tokens |
/oauth/introspect | RFC 7662 — check if a token is still active |
/oauth/revoke | RFC 7009 — explicitly invalidate a token |
/oauth/userinfo | OIDC — fetch the user’s profile |
/.well-known/jwks.json | RSA public keys for offline JWT verification |
Registering a client
Tenant admins register partner apps in the Yotel dashboard (Connected Apps settings). Each client gets:client_id— public identifier, safe to ship in app metadataclient_secret— confidential; show once at creation time- An allowlist of
redirect_uris - An allowlist of
scopesthis client may request - (Optional) A registered public key PEM for JWT Bearer
Authorization Code + PKCE
The interactive flow for SPAs and traditional web apps. PKCE (RFC 7636) is required for all clients — noplain method
accepted.
Required parameters
| Param | Value |
|---|---|
response_type | code |
client_id | From Connected Apps |
redirect_uri | Must exact-match one of the registered redirect URIs |
scope | Space-separated scopes — must be subset of client’s allowed_scopes |
state | Your CSRF token. Verify on callback |
code_challenge | S256 hash of your verifier |
code_challenge_method | S256 |
nonce | Optional but recommended when using OIDC openid scope |
JWT Bearer (RFC 7523)
Salesforce’s async Apex jobs, batch integrations, any server-to-server context where a user browser isn’t available.iss— your registered issuersub— the user to impersonateaud— yourclient_idtenant_id— the Yotel tenantiat/exp— 5-minute TTL enforced server-side
Refresh
Tokens default to 1-hour TTL. Refresh before expiry using therefresh_token returned with the access token:
refresh_token
and issues a new one. Reusing an old refresh token triggers a
cascade-revoke of the entire token family — so you can detect when
a refresh_token has leaked.
Token format
Access tokens are RS256-signed JWTs. Claims include:Scopes
See Scope reference for the full catalog. Common ones:openid profile email— OIDC identity claimsoffline_access— required to receive a refresh_tokencampaigns:read,campaigns:writeleads:read,leads:writecalls:read,calls:writeagents:read
Security review
Partners embedding our OAuth in their AppExchange / marketplace listings: our provider satisfies the baseline requirements —- OAuth 2.1 + PKCE (no
plainmethod) - HTTPS-only endpoints
- Refresh-token rotation with reuse detection
- Per-client allowlisted scopes and redirect URIs
- Token introspection + revocation per RFCs 7662 / 7009
- Pen-test artifact available under NDA