OAuth PKCE verification failing with 400 Bad Request

Building a single-page app to fetch user context. Using the Authorization Code flow with PKCE. Generated the code_verifier and code_challenge correctly on the client side. Exchanged the code for a token, but the final /api/v2/oauth/token request returns a 400 error. The payload looks right, but the response says invalid_grant. Here is the request body. Any idea what’s missing?