import time
import random
import requests
def call_with_retry(url, headers, payload, max_retries=4):
delay = 1.0 # Base delay in seconds
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
return response.json()
if response.status_code in [429, 503]:
# Jittered exponential backoff: delay * (2^attempt) + random jitter
sleep_time = delay * (2 ** attempt) + random.uniform(0.1, 0.5)
print(f"Rate limited or busy. Retrying in {sleep_time:.2f}s...")
time.sleep(sleep_time)
continue
# Do not retry on client-side errors like 400 or 401
response.raise_for_status()
raise Exception("Max retry attempts reached")