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.
Quick library status
Every library below was driven through the full browser-consent → real authorize code → real token mint flow againstapi.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.
The wire format
client_secret for code_verifier.
Python authlib
Python requests-oauthlib
Python httpx-oauth
Node openid-client v6
Node oauth4webapi
Node simple-oauth2
Node passport-oauth2
Node @badgateway/oauth2-client
Java Nimbus OAuth 2.0 SDK
Java Spring Security OAuth2 Client
/.well-known/oauth-authorization-server from the issuer-uri and wires up authorization_endpoint + token_endpoint automatically. Default client_secret_basic works.
Java Google OAuth Client for Java
Java scribejava-core
Go golang.org/x/oauth2
PHP league/oauth2-client
Raw HTTP
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 toapi.simkl.com. Most wrap one of the live-tested libraries above; the rest follow the same RFC defaults Simkl now accepts.
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.
See also
OAuth 2.0 walkthrough
Confidential (server-side) flow.
Public PKCE walkthrough
Mobile / SPA / desktop flow without
client_secret.PIN flow
TV / console / CLI flow with a 5-character code.