Cursor pagination returning 403 on /api/v2/analytics/conversations/details/query after 2 pages

Running into a weird block with the analytics API. I’m building a data export tool that pulls conversation details using the cursor-based pagination on /api/v2/analytics/conversations/details/query.

The first request works fine. I get the data and the nextPageToken in the response headers. I pass that token into the second request’s pageToken query param. That also works. But when I try to fetch the third page using the token from the second response, I hit a 403 Forbidden with no body.

Here’s the curl command for the failing request:

curl -X POST "https://{{organization}}.my.genesis.com/api/v2/analytics/conversations/details/query?pageToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \
-H "Authorization: Bearer {{token}}" \
-H "Content-Type: application/json" \
-d '{
 "dateRange": {"start": "2023-10-01T00:00:00Z", "end": "2023-10-01T23:59:59Z"},
 "viewId": "24h",
 "groupBy": ["conversationId"]
}'

I’ve checked the token validity. It’s good for another 50 minutes. The scope analytics:conversation-details:view is present. I’ve tried switching to the Python SDK analytics_api.get_analytics_conversations_details_query() but it throws the same genesyscloud.rest.rest.ApiException: 403.

Is there a hard limit on cursor hops I’m missing? The docs mention a max page size but nothing about a max number of pages. I’ve also tried clearing the cache and using a fresh token. Same result.

Any ideas why the cursor would expire or become invalid after just two iterations?