Understand API rate limits and implement proper retry logic.
SmartRetry applies rate limits to ensure fair usage and protect the platform from abuse. This page explains the limits and how to handle them gracefully.
Implement exponential backoff to handle rate limits and transient errors gracefully. This strategy progressively increases wait times between retries to avoid overwhelming the API.
import requestsimport timeimport randomdef make_request_with_backoff(url, headers, json_data, max_retries=5): """Make an API request with exponential backoff retry logic.""" base_delay = 1 # Start with 1 second max_delay = 60 # Cap at 60 seconds for attempt in range(max_retries): response = requests.post(url, headers=headers, json=json_data) if response.status_code == 200: return response.json() if response.status_code == 429: # Use Retry-After header if available retry_after = response.headers.get("Retry-After") if retry_after: delay = int(retry_after) else: # Exponential backoff with jitter delay = min(base_delay * (2 ** attempt), max_delay) delay += random.uniform(0, delay * 0.1) # Add 10% jitter print(f"Rate limited. Retrying in {delay:.1f} seconds...") time.sleep(delay) continue if response.status_code >= 500: # Server error - retry with backoff delay = min(base_delay * (2 ** attempt), max_delay) delay += random.uniform(0, delay * 0.1) print(f"Server error. Retrying in {delay:.1f} seconds...") time.sleep(delay) continue # Client error (4xx except 429) - don't retry response.raise_for_status() raise Exception(f"Max retries ({max_retries}) exceeded")# Example usageresponse = make_request_with_backoff( "https://api.smartretry.com/v1/payments/sale/ABC123", headers={ "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json", "Idempotency-Key": "order-123" }, json_data={ "amount": 49.99, "currency": "USD", # ... other fields })
Never retry 400 Bad Request errors automatically. These indicate a problem with your request that must be fixed before resubmitting.
For payment operations, a 409 Conflict with an idempotency key often means the original request succeeded. Check the response body for the transaction ID before retrying.