import requests
import time
import random
def request_with_retry(url, headers, payload=None, method="post",
max_retries=5, content_type="json"):
for attempt in range(max_retries):
if method == "post":
if content_type == "json":
resp = requests.post(url, headers=headers, json=payload)
else:
resp = requests.post(url, headers=headers, data=payload)
else:
resp = requests.get(url, headers=headers, params=payload)
if resp.status_code != 429:
resp.raise_for_status()
return resp.json()
limit_type = resp.headers.get("X-RateLimit-Type", "minute")
retry_after = int(resp.headers.get("Retry-After", 5))
if limit_type == "daily":
raise Exception("Daily rate limit reached. Try again tomorrow.")
wait = max(retry_after, (2 ** attempt) + random.uniform(0, 1))
time.sleep(wait)
raise Exception("Max retries exceeded")