Rate Limits & Pricing
Rate Limits & Pricing
The Quote Gallery API uses rate limiting to ensure fair usage and reliable performance for all developers. Your rate limit depends on your subscription tier.
Tiers
| Tier | Requests / Hour | Price | Best For |
|---|---|---|---|
| Free | 100 | Free | Testing, prototyping, personal projects |
| Hobby | 500 | €4.99/mo | Small apps, side projects, indie developers |
| Premium | 2,000 | €14.99/mo | Production applications, high-traffic integrations |
How Rate Limiting Works
Rate limits are applied per API key and reset every hour on a rolling window basis.
Rate Limit Headers
Every API response includes headers that help you track your usage:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per hour for your tier |
X-RateLimit-Remaining | Number of requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the rate limit window resets |
Example Response Headers
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 487
X-RateLimit-Reset: 1704070800
Exceeding Your Rate Limit
When you exceed your rate limit, the API returns a 429 Too Many Requests response:
{
"error": "Rate limit exceeded",
"status": 429
}
The response will also include the rate limit headers so you know when you can retry.
Handling Rate Limits Gracefully
Here's a recommended pattern for handling rate limits with automatic retry:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const response = await fetch(url, options)
if (response.status === 429) {
const resetTime = response.headers.get('X-RateLimit-Reset')
const waitMs = resetTime
? (Number(resetTime) * 1000) - Date.now()
: Math.pow(2, attempt) * 1000 // Exponential backoff fallback
console.log(`Rate limited. Retrying in ${Math.ceil(waitMs / 1000)}s...`)
await new Promise((resolve) => setTimeout(resolve, Math.max(waitMs, 1000)))
continue
}
return response
}
throw new Error('Max retries exceeded due to rate limiting')
}
import time
import requests
def fetch_with_retry(url, headers, params=None, max_retries=3):
for attempt in range(max_retries + 1):
response = requests.get(url, headers=headers, params=params)
if response.status_code == 429:
reset_time = response.headers.get('X-RateLimit-Reset')
if reset_time:
wait_seconds = max(int(reset_time) - int(time.time()), 1)
else:
wait_seconds = 2 ** attempt # Exponential backoff
print(f'Rate limited. Retrying in {wait_seconds}s...')
time.sleep(wait_seconds)
continue
return response
raise Exception('Max retries exceeded due to rate limiting')
Best Practices
limit parameter to fetch smaller pages if you don't need all results at once.X-RateLimit-Remaining header regularly. If you're consistently approaching your limit, consider upgrading your tier.Monitoring Your Usage
You can monitor your API usage in real time from the Quote Gallery Dashboard. The dashboard shows:
- Current usage — requests made in the current window
- Historical usage — charts showing your usage over time
- Tier information — your current tier and rate limit
Upgrading Your Tier
To upgrade your API tier:
- Sign in to your Quote Gallery account
- Navigate to API Pricing
- Select the tier that fits your needs
- Complete the checkout process
Your new rate limit takes effect immediately after payment.
Bundle Discount
If you already have a Supporter subscription for the Quote Gallery website, you receive a 25% discount on all paid API tiers:
| Tier | Regular Price | With Bundle Discount |
|---|---|---|
| Hobby | €4.99/mo | €3.74/mo |
| Premium | €14.99/mo | €11.24/mo |
The discount is applied automatically at checkout when you're logged in with an active Supporter subscription.
Cancellation
You can cancel your API subscription at any time from your dashboard. When cancelled:
- Your access immediately reverts to the Free tier (100 requests/hour)
- There are no long-term commitments or cancellation fees
- Your API key remains valid — only the rate limit changes
FAQ
What counts as a request?
Every API call counts as one request, regardless of the endpoint or whether it returns data or an error (except 429 responses, which are not counted against your limit).
Can I get a higher rate limit?
For enterprise needs exceeding 2,000 requests/hour, please contact us to discuss custom plans.
Do rate limits apply to all endpoints equally?
Yes, all endpoints share the same rate limit pool for your API key. There are no per-endpoint limits.
What happens if I need a temporary burst?
The rate limit is based on a rolling hour window. If you need occasional bursts, consider upgrading to a higher tier. Contact us for enterprise solutions with burst allowances.