Use this file to discover all available pages before exploring further.
Fastest path — skip the OAuth library entirely. Simkl’s OAuth flow is two HTTP steps:
Redirect the user to https://simkl.com/oauth/authorize?response_type=code&client_id=...&redirect_uri=...&state=... — they approve in the browser, Simkl bounces back to your redirect_uri with ?code=...&state=... in the query string.
POST that code to https://api.simkl.com/oauth/token with client_id, client_secret, redirect_uri, and grant_type=authorization_code in the body — the response is {"access_token": "...", "token_type": "bearer", "scope": "public", "expires_in": 157680000}. Send that token as Authorization: Bearer ... on every authenticated request.
That’s it. No refresh-token rotation, no scope dance — Simkl tokens are long-lived (expires_in is 5 years) and only invalidate when the user revokes from Connected Apps. For the full walkthroughs, see OAuth 2.0 flow (server-side with client_secret) or PKCE flow (mobile / SPA / desktop without client_secret).
Simkl’s POST /oauth/token accepts both application/x-www-form-urlencoded (the RFC 6749 §3.2 default) and application/json, and reads client credentials from either the request body or an Authorization: Basic header (RFC 6749 §2.3.1). Discovery metadata is at https://simkl.com/.well-known/oauth-authorization-server (RFC 8414) — modern libraries can auto-configure from it.
Every library below was driven through the full browser-consent → real authorize code → real token mint flow against api.simkl.com. Each one returned a real access_token we then used to call /users/settings successfully.
Most libraries need no configuration beyond the two endpoint URLs and your credentials. The only outliers are openid-client v6 and oauth4webapi — both default to OIDC discovery (/.well-known/openid-configuration), but Simkl is OAuth2-only, so they need an explicit { algorithm: 'oauth2' } option to use our RFC 8414 metadata endpoint. One-line fix shown in their snippets.
// Maven: com.nimbusds:oauth2-oidc-sdk:11.21import com.nimbusds.oauth2.sdk.*;import com.nimbusds.oauth2.sdk.auth.*;import com.nimbusds.oauth2.sdk.id.ClientID;import java.net.URI;TokenRequest req = new TokenRequest( new URI("https://api.simkl.com/oauth/token"), new ClientSecretBasic(new ClientID("YOUR_CLIENT_ID"), new Secret("YOUR_CLIENT_SECRET")), new AuthorizationCodeGrant( new AuthorizationCode("AUTHORIZATION_CODE_FROM_REDIRECT"), new URI("YOUR_REDIRECT_URI") ));AccessTokenResponse tok = TokenResponse.parse(req.toHTTPRequest().send()).toSuccessResponse();System.out.println(tok.getTokens().getAccessToken().getValue());
Spring fetches /.well-known/oauth-authorization-server from the issuer-uri and wires up authorization_endpoint + token_endpoint automatically. Default client_secret_basic works.
Other OAuth libraries (inferred from RFC compliance)
These libraries aren’t in our live test harness, so the status below is read from each library’s source/docs — not from a captured request to api.simkl.com. Most wrap one of the live-tested libraries above; the rest follow the same RFC defaults Simkl now accepts.
Language
Library
Inferred
Python
Django allauth, python-social-auth, fastapi-users
Wraps requests-oauthlib — should work as-is.
Node.js
NextAuth.js / Auth.js, express-openid-connect
Wraps openid-client — works with {algorithm: 'oauth2'} discovery.
Both “Send as Basic Auth header” and “Send client credentials in body” modes accepted.
OpenAPI Generator
Generated clients (all languages)
Generators emit RFC-conformant clients.
If you hit a library not on this list, the sanity check is one HTTP capture: confirm the token POST hits https://api.simkl.com/oauth/token, sends client_id / code / redirect_uri / grant_type (and client_secret either in the body or in Authorization: Basic), and see what comes back. If the request looks RFC-shaped and you still hit an error, let us know — we’d appreciate the capture so we can promote the library to the live matrix.