403 Forbidden on /api/v2/routing/queues despite having routing:queue:read scope

I’m hitting a wall with the Genesys Cloud API from my Kotlin Android app. The app uses the Web Messaging SDK for user sessions, but I need to fetch queue details separately via REST. I’ve set up OAuth 2.0 client credentials flow using com.auth0.android.jwt to generate the access token.

Here’s the curl equivalent of what’s happening:

curl -X GET https://api.mypurecloud.com/api/v2/routing/queues \
 -H "Authorization: Bearer <token>"

The response is a hard 403 Forbidden with this JSON body:

{
 "errors": [
 {
 "code": "forbidden",
 "message": "The request is forbidden."
 }
 ]
}

I’ve checked the scope configuration in the Genesys Cloud admin portal. The client application definitely has routing:queue:read selected. I can see it listed in the decoded JWT payload under the scope claim:

"scope": "webmessaging:session:read routing:queue:read gc_api"

Stranger still, I can successfully call /api/v2/webmessaging/sessions with the same token. No 403 there. Just the routing endpoints are blocked. I’ve tried refreshing the token multiple times. Cleared cache. Even recreated the integration in the GC portal with identical settings.

Is there a hidden scope dependency? Maybe routing:queue alone isn’t enough without routing:queue:write? That feels wrong for a read-only fetch. Or is this an org-level permission issue that overrides the API key scopes? I’m running out of things to check.