Python SDK: Handling 429s while paginating analytics data to S3

Hey folks,

Building a daily cron job to pull queue performance metrics from Genesys Cloud and dump them into S3. We’re using the official Python SDK (genesyscloud-platform-client-python) for the API calls and boto3 for the storage side.

The issue is rate limiting. The analytics endpoints are pretty strict. When the script tries to paginate through a large dataset (say, 30 days of hourly data for 100 queues), it hits the 429 Too Many Requests wall almost immediately. The SDK doesn’t seem to have a built-in retry mechanism that respects the Retry-After header specifically for analytics, so I’m rolling my own wrapper.

Here’s the rough flow:

def get_analytics_data(api_client, query):
 results = []
 while True:
 try:
 response = api_client.get_query_analytics(query)
 results.extend(response.entities)
 if not response.next_page_token:
 break
 query.page_token = response.next_page_token
 except Exception as e:
 if "429" in str(e):
 time.sleep(5) # crude retry
 continue
 raise
 return results

This works okay for small volumes, but when the dataset gets big, the 5-second sleep isn’t dynamic enough. I keep getting throttled. Is there a better way to handle the pagination tokens and backoff logic with the SDK? Or should I just drop the SDK for this part and use raw requests with a proper exponential backoff decorator?

Also, writing to S3 via boto3 is straightforward, but I’m batching the rows into CSV chunks. If the API call fails mid-stream, the script crashes and leaves a partial file in S3. Should I write to a temp file first and then upload_fileobj once the batch is complete? That feels safer but uses more disk I/O.

Any thoughts on the best practice here?