Two different things are called OAuth on a Core dna site, and the error means something different in each.
Your application gets tokens from the site (the site is the OAuth server):
- The client's credentials are in a Basic header. The site's metadata lists
client_secret_basic, but the token endpoint readsclient_idandclient_secretfrom the request body only. A Basic header is taken as a backend user's username and password instead, and the request is refused with a 403 HTML page before the OAuth server sees it. Send both in the body. Many OAuth libraries default to Basic, so set this explicitly. (Checked on two sites, 5 October 2026.) - The client id does not exist here. The answer is HTTP 400,
{"error":"invalid_client"}. Clients are stored per environment, so an id registered on staging does not exist on production. - A confidential client sent no secret, or an old one. A client registered with a secret must send it on every token request, refreshes included. Regenerating the secret in the admin invalidates the old one at once.
At the authorize step, an unknown client id or an unregistered redirect URI is not sent back to your application: the site shows the error itself, because it cannot trust a redirect URI it cannot match to a client.