Rate Limits
Each SDK call or direct REST call counts as one API request. Cache misses also count against origin-miss budgets.
Limits
| Tier | Requests/minute | Origin misses/minute |
|---|---|---|
| Anonymous IP | 1200 | 120 |
X-Gfin-Contact / SDK contact= | 6000 | 600 |
| API key | 30000 | 3000 |
Anonymous usage works without signup. For scripts, services, notebooks, and agents, declare a contact identity to use the higher public tier:
curl "https://api.gfin.dev/v1/quote/AAPL/summary?exchange=NASDAQ" \
-H "X-Gfin-Contact: you@example.com"
from gfin import Client
client = Client(contact="you@example.com")
429 Shape
{
"error": {
"code": "rate_limited",
"message": "Request limit exceeded."
},
"rate_limit": {
"tier": "anonymous",
"scope": "request",
"retry_after_seconds": 42
}
}
429 responses also include a Retry-After header.
For SDK exceptions and retry guidance across all status codes, see Errors.
Origin Misses
Normal cached reads are cheaper than refreshes. A request with refresh=1
bypasses gfin cache and spends origin-miss quota:
curl "https://api.gfin.dev/v1/search?q=apple&refresh=1"
Use refresh for explicit user actions, not routine polling.