import time
import random
def fetch_with_retry(url, headers, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
if response.status_code in [429, 500, 503]:
# Exponential backoff with jitter
wait = (2 ** attempt) + random.uniform(0, 1)
# Use server's retry-after if provided
if response.status_code == 429:
wait = response.json().get("data", {}).get("retry_after", wait)
time.sleep(wait)
continue
# Non-retryable error
response.raise_for_status()
raise Exception("Max retries exceeded")