Client_credentials grant returning 401 despite correct client_id/secret

I’m trying to get a bearer token for our custom digital channel integration using the client_credentials grant type. The goal is to have a backend service poll the CXone API without user context.

Here is the raw cURL command I’m running:

curl -X POST https://platform.dev01.nice-incontact.com/oauth/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=MY_CLIENT_ID&client_secret=MY_CLIENT_SECRET'

The response is consistently a 401 Unauthorized. The JSON body just says "error": "invalid_client".

I’ve triple-checked the credentials. They work fine for authorization_code flows in the browser. I even regenerated the secret just to be sure. The app has the admin scope assigned in the developer portal.

Is there a specific setting I’m missing on the application profile to allow this grant type? Or am I hitting a different endpoint than I should be for the Mexico region?

Here’s the exact error payload:

{
 "error": "invalid_client",
 "error_description": "Client authentication failed"
}

Nothing in the logs on our side shows a network timeout. It’s an immediate auth rejection. What am I missing here?