Grail

Rate limits & quotas

Cached reads are effectively unlimited; live acquisition is paced by our own pool and queued.

The honest version: served-from-cache reads are cheap and fast; a live, uncached pull is paced.

We don't advertise a big live requests-per-minute number, because a live rate depends on our acquisition pool. What we guarantee is: repeated queries hit our corpus in milliseconds, and bursty work is queued rather than failed.

Two limits

  • Per-minute — protects the pool when a key goes live-heavy. Free 10/min, Developer 30/min, Pro 60/min, Scale 120/min.
  • Monthly — total requests per calendar month on the plan (Free 100, Developer 2,000, Pro 10,000, Scale 50,000).

Failed requests are not charged. Check remaining quota any time via GET /v1/usage or the X-Usage-Remaining header.

Caching

Identical queries are served from our corpus for a short TTL (default 15 min). Responses carry cache: { served, source, ttlSec } so you always know whether you hit cache or went live.

When you exceed a limit

You get 429 with {"error":"quota_exceeded"}. For bursts, use the async queue instead of retrying in a loop.

Response headers

You never have to guess your remaining allowance — every metered call returns it:

HeaderMeaning
X-Usage-LimitMonthly allowance on your plan.
X-Usage-RemainingRequests left this calendar month.
X-RateLimit-LimitPer-minute allowance (or “unlimited”).
X-RateLimit-RemainingRequests left in this minute window.
X-RateLimit-ResetSeconds until the minute window resets.

Credits & rollover

  • Failed requests are never charged — a 4xx/5xx does not consume quota.
  • Cache hits cost you a request but are billed at the same metered unit as live pulls, so pricing stays predictable.
  • Monthly reset, no rollover — your allowance refreshes at the start of each calendar month. Unused requests do not carry forward.
  • Need more mid-cycle? Upgrade — the new allowance applies immediately, and overage credits can be arranged on high-volume plans.