import time
import requests
from typing import Optional
class RateLimitedClient:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.hopx.dev"
self.headers = {"Authorization": f"Bearer {api_key}"}
def request(self, method: str, path: str, **kwargs) -> requests.Response:
max_retries = 5
for attempt in range(max_retries):
response = requests.request(
method,
f"{self.base_url}{path}",
headers=self.headers,
**kwargs
)
# Success
if response.status_code < 400:
return response
# Rate limited
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 2 ** attempt))
print(f"Rate limited. Waiting {retry_after}s (attempt {attempt + 1}/{max_retries})")
time.sleep(retry_after)
continue
# Other errors - don't retry
response.raise_for_status()
raise Exception("Max retries exceeded due to rate limiting")
def get(self, path: str, **kwargs) -> requests.Response:
return self.request("GET", path, **kwargs)
def post(self, path: str, **kwargs) -> requests.Response:
return self.request("POST", path, **kwargs)
# Usage
client = RateLimitedClient("$HOPX_API_KEY")
response = client.get("/v1/sandboxes")
sandboxes = response.json()