Rate Limits & Quotas
CrowdProof uses a sliding-window rate limiter per API key. Limits vary by tier.
Tier Limits
| Tier | Requests/Second | Monthly Queries | Webhooks | Price |
|---|---|---|---|---|
| Free | 10 | 100 | — | $0/mo |
| Starter | 100 | 10,000 | 3 | $49/mo |
| Growth | 500 | 100,000 | 10 | $199/mo |
| Enterprise | 2,000 | Unlimited | 50 | Contact us |
Rate Limit Headers
Every API response includes rate limit information in headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per second for your tier |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait (only on 429 responses) |
Checking Usage
GET /api/v1/billing/usage
X-API-Key: cp_live_abc123...
{
"queriesThisMonth": 847,
"monthlyLimit": 10000,
"remaining": 9153
}
What Counts as a Query?
| Action | Counts? |
|---|---|
GET /api/v1/reputation/{address} | Yes (1 query) |
GET /api/v1/reputation/{address}/{category} | Yes (1 query) |
POST /api/v1/reputation/batch (10 addresses) | Yes (10 queries) |
POST /api/v1/reputation/prove | Yes (1 query) |
POST /api/v1/reputation/verify | No (free) |
GET /api/v1/identity/{did} | No (free) |
GET /api/v1/billing/usage | No (free) |
GET /health | No (free) |
Handling Rate Limits
When you hit a rate limit, the API returns 429 Too Many Requests:
{
"error": "Rate limit exceeded",
"details": "Free tier allows 10 requests per second. Upgrade at /api/v1/billing/checkout"
}
Recommended Strategy
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status !== 429) return response;
const retryAfter = parseInt(response.headers.get('Retry-After') || '1');
await new Promise(r => setTimeout(r, retryAfter * 1000));
}
throw new Error('Rate limit exceeded after retries');
}
Upgrading
To upgrade your tier, create a Stripe checkout session:
POST /api/v1/billing/checkout
{
"planId": "growth",
"successUrl": "https://your-app.com/billing/success"
}