Rate Limits
The Sharpe API enforces rate limits per API key to ensure fair usage and platform stability. Limits are applied as requests per minute and requests per month depending on your plan tier.
Tier overview
| Tier | Requests / min | Requests / month | Price |
|---|---|---|---|
| Free | 30 | 10,000 | $0 |
| Analyst | 500 | 500,000 | $129/mo |
| Pro | 1,000 | 3,000,000 | $499/mo |
| Enterprise | 5,000 | 50,000,000 | Custom |
Need higher limits? Contact us for Enterprise pricing with custom rate limits, dedicated support, and SLAs.
Rate limit headers
Every API response includes headers so you can track your usage in real time:
- Name
X-RateLimit-Limit- Type
- integer
- Description
Maximum requests allowed per minute for your tier.
- Name
X-RateLimit-Remaining- Type
- integer
- Description
Requests remaining in the current one-minute window.
- Name
X-RateLimit-Reset- Type
- integer
- Description
Unix timestamp (seconds) when the current window resets.
- Name
X-Request-Id- Type
- string
- Description
Unique identifier for this request. Include when contacting support.
HTTP/2 200
x-ratelimit-limit: 500
x-ratelimit-remaining: 347
x-ratelimit-reset: 1743062460
x-request-id: req_abc123def456
429 Too Many Requests
When you exceed the per-minute rate limit, the API returns a 429 status. If you exceed your monthly quota, it returns a 403 with type monthly_quota_exceeded.
The response body follows the standard RFC 9457 error format. The detail field tells you whether you hit the per-minute rate limit or the monthly quota.
Response properties
- Name
type- Type
- string
- Description
rate_limit_exceeded(429) for per-minute limits,monthly_quota_exceeded(403) for monthly caps.
- Name
detail- Type
- string
- Description
Human-readable explanation of which limit was exceeded.
- Name
doc_url- Type
- string
- Description
Link to relevant documentation page for the error.
{
"type": "https://www.sharpe.ai/errors/rate_limit_exceeded",
"title": "Rate Limit Exceeded",
"status": 429,
"detail": "Rate limit of 500 requests per minute exceeded.",
"request_id": "req_abc123def456",
"doc_url": "https://www.sharpe.ai/docs/rate-limits",
"suggested_action": "Wait until the time in the X-RateLimit-Reset header before retrying. Upgrade your plan for higher limits."
}
HTTP/2 429
x-ratelimit-limit: 500
x-ratelimit-remaining: 0
x-ratelimit-reset: 1743062472
x-request-id: req_abc123def456
Best practices
Monitor your usage
Read the X-RateLimit-Remaining header on every response. When it drops below 10% of your limit, slow down or queue requests.
Implement backoff
When you receive a 429, use the X-RateLimit-Reset header to calculate how long to wait before retrying.
async function fetchWithRetry(url: string, headers: HeadersInit) {
const res = await fetch(url, { headers })
if (res.status === 429) {
const reset = parseInt(res.headers.get('X-RateLimit-Reset') ?? '0', 10)
const waitMs = Math.max(reset * 1000 - Date.now(), 1000)
await new Promise((resolve) => setTimeout(resolve, waitMs))
return fetch(url, { headers })
}
return res
}
Cache responses
Many Sharpe API endpoints return data that updates on a known schedule (e.g., funding rates update every 8 hours). Cache responses locally to avoid redundant requests.
Use bulk endpoints
Prefer endpoints that return data for multiple symbols in a single request rather than making one request per symbol. For example, /v1/funding/rates?type=current without a coin parameter returns all rates at once.