Analytics Conversations Aggregates query failing with 400 Bad Request on interval

Trying to build a custom interval report for call handling times using the Genesys Cloud Analytics API. I’m hitting a 400 Bad Request error when I try to set a custom start and end time for the aggregate query. The docs say it should work, but the response body is vague. Just want the data for the last 4 hours, broken down by 15-minute intervals. Nothing fancy.

Here’s the payload I’m sending to POST /api/v2/analytics/conversations/aggregates:

{
 "viewId": "conversations",
 "select": [
 { "type": "interval", "interval": "PT15M" },
 { "type": "metric", "metric": "handle-time" }
 ],
 "where": [
 { "type": "equals", "field": ".queue.id", "value": "my-queue-id" }
 ],
 "groupBy": [
 { "type": "interval", "interval": "PT15M" }
 ],
 "from": "2023-10-27T10:00:00.000Z",
 "to": "2023-10-27T14:00:00.000Z"
}

The error comes back as:

{
 "code": "badRequest",
 "message": "Invalid request body",
 "details": "[from] must be a valid datetime"
}

I’ve checked the timezone, used UTC, tried ISO 8601 with and without the Z. Same error. If I remove the from and to fields, it works fine and gives me the default last 24 hours. But I need specific intervals for this dashboard. The view ID is definitely correct, and the queue ID exists. I’m using the Python SDK genesys.cloud.analytics.api.conversations_api.get_conversations_aggregates method. Is there a limit on how far back or how small the window can be? Or is the interval field in the select array conflicting with the groupBy? I’ve tried moving the interval definition around but nothing changes. The API just keeps rejecting the datetime format even though it looks standard. Anyone else hit this wall with custom date ranges on aggregates?