Guides
Rate limits
Forkbit tracks two independent limits on every request: a monthly credit budget for what you are billed for, and a per-minute request rate for how fast you can call us.
Credits vs. request rate
Credits reset monthly and cost different amounts per endpoint because endpoints have different unit economics: a search hits Postgres, a parse hits an LLM. Request rate resets every 60 seconds and is the same regardless of which endpoint you call. Running out of either one returns a 429, but with a different error code and different response headers.
Credit weights
| Endpoint | Cost |
|---|---|
| GET /v1/foods/search | 1 credit |
| GET /v1/foods/{id} | 1 credit |
| POST /v1/foods/batch | 1 credit per item |
| POST /v1/parse | 10 credits |
| POST /v1/recipes/analyze | 10 credits per ingredient line |
Every response, success or error, includes your current credit status:
X-Credits-Consumed: 10
X-Credits-Remaining: 48990
X-Credits-Reset: 2026-07-01T00:00:00ZWhen a request would push you over your monthly limit, the API returns 429 with code CREDIT_LIMIT_REACHED. The check is atomic: partial-cost endpoints like batch and recipe analysis are charged the full cost of the request or rejected outright. You are never charged for a rejected request.
Request rate limits
Independent of credits, each account can send a limited number of requests per minute. The limit is shared across every API key on the account, not per key, and the window resets every 60 seconds.
| Plan | Requests / minute |
|---|---|
| Free | 60 |
| Starter | 300 |
| Growth | 1,000 |
| Pro | 6,000 |
Every response also includes your current rate-limit status:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1751328000Exceeding the window returns 429 with code RATE_LIMITED, distinct from a credit-limit 429. X-RateLimit-Reset is a Unix timestamp (seconds) marking when the window resets. Back off until that time and retry. This is a request-rate problem, not a billing problem, so upgrading your plan raises the ceiling but a short retry usually resolves it immediately.
Caching
You may cache responses for the duration of your active subscription. There is no mandatory TTL and no attribution requirement.