The two login interfaces apply the same account, school, and Access-PIN rules and issue compatible access and refresh tokens. Choose one lifecycle and use it consistently in your client.
GraphQL authentication lifecycle
REST compatibility lifecycle
Confirm current REST fields in Swagger or ReDoc.
Authorize GraphQL calls
viewer.accessContext, and fuller application data through the appropriate school-scoped GraphQL queries.
Refresh and revocation
After every successful refresh, replace both stored tokens with the returned
access and refresh, even when the refresh value is unchanged by the current server policy. This keeps a client correct if token rotation is enabled later. If refresh fails with INVALID_TOKEN, clear local authentication and require sign-in. Coalesce concurrent refresh attempts so the same token is not submitted several times, and do not create an infinite retry loop.

