Start an authorization (redirects to the consent screen)
GET/oauth/authorize
Where an app sends an admin to install it. Answers 302 to the consent screen on the app host —
https://app.kudoscrm.com/oauth/authorize?<the same query> — and checks nothing itself: the
consent screen reads the request through the consent API once it knows who is signed in, and
shows every problem there. The discovery document names the consent screen itself as
authorization_endpoint; both work.
The request is RFC 6749 §4.1.1 with PKCE (RFC 7636): response_type=code, your client_id
(app_<key>), a redirect_uri registered on your app's live version (exactly, character for
character), the catalog scopes you want (space-separated; leave it out for every scope your
version requests), an opaque state (≤500 characters, echoed back), and code_challenge with
code_challenge_method=S256. PKCE is required for every app (plain is refused).
On Allow the browser comes back to redirect_uri with code (a kac_… code, valid 10
minutes, single use), your state and iss (the issuer, RFC 9207); on Deny with
error=access_denied. An error the consent screen can send back only goes to a registered URI
of a public app's live version.
Throttle: oauth/authorize/ip, 120 a minute per IP.
Request
Responses
- 302
- 429
To the consent screen on the app host, with the query untouched.
Response Headers
https://app.kudoscrm.com/oauth/authorize?response_type=code&client_id=app_acme_dialer&redirect_uri=https%3A%2F%2Fapp.example.com%2Fintegrations%2Fkudos%2Fcallback&state=xyz&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&code_challenge_method=S256Every OAuth answer — a token response cached by a proxy is a leaked token (RFC 6749 §5.1).
A throttle refused the request. Wait Retry-After seconds — the time left in the refusing window
plus 0–3 s of jitter. The X-RateLimit-* headers describe the bucket that refused it.
Response Headers
Seconds until the window rolls.