Okta APIs and SDKs
This domain tests whether you can drive Okta from code: which API surface and credential to use, how to page through large collections, how to read an error body, and how to stay inside rate limits. Vague answers about "calling the REST API" lose marks; the exam wants exact conventions.
Two surfaces, two credentials
- Core Okta API -
https://{yourOktaDomain}/api/v1/...covers users, groups, apps, policies, sessions and log events. Authenticate with a scoped OAuth 2.0 service app (private-key JWT, scopes such asokta.users.manage) or a legacy SSWS token sent asAuthorization: SSWS {token}. - OIDC/OAuth 2.0 and Identity Engine endpoints -
/oauth2/{authServerId}/v1/...and/idp/idx/...use client-based flows; they never accept SSWS.
Paging and querying
Pagination is cursor-based, not offset-based. Send limit (capped at 200 for users, groups and apps) and follow the Link header's rel="next" URL, which already carries after=<cursor>. Stop when no next link is returned. filter is a legacy parameter with a fixed allowlist (for users: status, lastUpdated, id, provider), while search takes a SCIM-style grammar with a narrow operator set - check the endpoint before relying on or.
Errors and throttling
Error bodies carry errorCode, errorSummary, errorId and sometimes errorCauses. A 429 includes X-Rate-Limit-Limit, X-Rate-Limit-Remaining and X-Rate-Limit-Reset (epoch seconds). Okta also enforces a per-org concurrency ceiling, so raising parallelism still produces 429s.
SDK choice
Management SDKs (Java, .NET, Go, Node, Python, PHP, Ruby) wrap the Core API with typed models, retries and paging helpers. Authentication SDKs such as okta-auth-js implement OIDC flows in the browser. Never embed an SSWS token in a single-page app.
Worked example
List every ACTIVE user. Call GET /api/v1/users?search=status eq "ACTIVE"&limit=200, then request the absolute next URL verbatim - it already carries after, so no offset arithmetic is needed. Loop until next disappears. If a page returns 429, wait until X-Rate-Limit-Reset and retry only that page; restarting the whole scan is how jobs exhaust their quota.
Traps
Treating after as an offset; assuming filter accepts any profile attribute; retrying 429s immediately; and mixing org and custom authorization server URLs in one client.