Documentation

Rate limits

Last updated

Quota model

Each Farshore service enforces a monthly request budget per API key, per service. The counter rolls over at 00:00 UTC on the first of each calendar month and is reset lazily on the first request of the new month (no scheduler).

The default budget is 20,000 requests per service per month. Subscriptions that need higher throughput can request an increase from support@farshorelabs.com.

What counts

  • Every authenticated request that reaches the service handler consumes one unit, regardless of HTTP method or response code (including 4xx).
  • Pre-flight OPTIONS requests are free.
  • Web-app traffic (session-cookie authentication) does not count against API-key quotas; it has its own per-user rate limiter.
  • Quotas are tracked per service ID. Calling Azure availability does not consume the sanctions-screening budget.

Response headers

Every API response includes:

X-RateLimit-Limit:     20000
X-RateLimit-Remaining: 19978
X-RateLimit-Reset:     2026-06-01T00:00:00Z
  • X-RateLimit-Limit — the budget assigned to this key for this service.
  • X-RateLimit-Remaining — calls left in the current window.
  • X-RateLimit-Reset — RFC 3339 UTC timestamp at which the window resets.

When the budget is exhausted

Once the budget is reached the service responds with HTTP 429 Too Many Requests and a problem-details body. The response also includes a Retry-After header giving the number of seconds until the next UTC month begins.

HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 821391

{
  "type": "https://farshorelabs.com/errors/quota-exceeded",
  "title": "Monthly quota exceeded.",
  "status": 429,
  "detail": "API key has consumed its monthly budget for service 'azure-availability'.",
  "outcome": "quota_exceeded",
  "limit": 20000,
  "resetAt": "2026-06-01T00:00:00Z"
}

Best practices

  • Treat X-RateLimit-Remaining as a soft warning — log it and alert your team when it drops below a safety threshold (e.g. 10%).
  • Respect Retry-After on 429 responses. Do not implement aggressive auto-retry; the budget will not reset until the next month boundary.
  • For high-volume workloads, cache results on your side where the underlying data does not change frequently (e.g. Azure region/SKU availability changes daily, not per-request).
  • Use separate API keys for production vs. development so a runaway dev script cannot exhaust your production budget.

See Error format for the canonical problem-details schema all services emit.