import time
import requests
def sorsa_request(method, endpoint, api_key, params=None, json_body=None, max_attempts=3):
"""GET/POST data retrieval with bounded retries; max_attempts includes the first call."""
method = method.upper()
if method not in {"GET", "POST"}:
raise ValueError("Use GET or POST")
if max_attempts < 1:
raise ValueError("max_attempts must be positive")
url = f"https://api.sorsa.io/v3{endpoint}"
for attempt in range(max_attempts):
try:
response = requests.request(
method, url, headers={"ApiKey": api_key},
params=params, json=json_body, timeout=30,
)
except (requests.Timeout, requests.ConnectionError):
if attempt + 1 == max_attempts:
raise
else:
if response.ok:
return response.json()
retryable = response.status_code == 429 or response.status_code >= 500
if not retryable or attempt + 1 == max_attempts:
try:
message = response.json().get("message", response.reason)
except (ValueError, AttributeError):
message = response.reason
raise requests.HTTPError(
f"HTTP {response.status_code}: {message}", response=response,
)
time.sleep(min(2 ** attempt, 8))
data = sorsa_request("GET", "/info", "YOUR_API_KEY", params={"username": "elonmusk"})
print(data["display_name"])