PKCE code_verifier mismatch on CXone token endpoint

Building a SPA auth flow. Generated the challenge with SHA-256 and base64url encoding. Passed the code_verifier in the body to /oauth/token. Getting 400 Bad Request. Error says invalid_grant. Checked the logs, the verifier matches the challenge derivation exactly. Using standard fetch POST. Any idea why it’s rejecting the verifier?