Rate Limits

Tier rate limits, 429 handling, and retry strategies.

Rate Limits by Tier

Each pricing tier has a per-minute rate limit and a monthly request quota:

| Tier | Rate Limit | Monthly Quota | Overage | |------|-----------|---------------|---------| | Free | 10 req/min | 50 req/month | Blocked (no overage) | | Starter | 60 req/min | 1,000 req/month | $0.03/request | | Growth | 300 req/min | 25,000 req/month | $0.01/request | | Enterprise | Custom | Unlimited | Custom |

Handling 429 Responses

When you exceed the per-minute rate limit, the API responds with 429 Too Many Requests and a Retry-After header (seconds until the window resets):

Code
HTTP/1.1 429 Too Many Requests
Retry-After: 45
Code
{
  "error": "Rate limit exceeded.",
  "limit": 10,
  "retryAfterSeconds": 45
}

Monthly Quota

Your monthly quota resets at the start of each billing period. When the quota is exhausted, requests are blocked with 429 and a body that includes the reset date:

Code
{
  "error": "Monthly request limit exceeded.",
  "limit": 50,
  "used": 50,
  "resetDate": "2026-09-01T00:00:00.000Z"
}

Track your quota usage on the dashboard -- the Overview page shows requests used, remaining, and the current period.

On the Free tier, requests beyond the monthly quota are blocked. On paid tiers, overage requests are allowed but billed at the per-request overage rate for your tier.

Retry Strategy

For per-minute 429 responses, honor the Retry-After header:

Code
async function fetchWithRateLimit(url: string, apiKey: string): Promise<Response> {
  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${apiKey}` },
  });

  if (res.status === 429) {
    const body = await res.clone().json().catch(() => null);
    // Quota exhaustion won't succeed on retry -- bail out
    if (body && "resetDate" in body) {
      throw new Error(`Monthly quota exhausted until ${body.resetDate}`);
    }
    const retryAfter = parseInt(res.headers.get("Retry-After") ?? "60", 10);
    await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
    return fetchWithRateLimit(url, apiKey); // Retry once
  }

  return res;
}

Usage Alerts

Configure usage alerts in the dashboard to get notified when your quota reaches 80%, 100%, or any custom threshold. Alerts can be sent via email or webhook.

Tips

  • Batch requests where possible instead of making many individual lookups
  • Cache responses for data that does not change frequently (parcel geometry, county lists)
  • Contact us for custom rate limits if your use case needs more than 300 req/min