Skip to main content
NAWA enforces per-minute rate limits on each API key to ensure fair usage and platform stability.

Tier table

TierRequests/minHow you get it
Free10Free keys (nawa_test_sk_)
Growth120Live keys (nawa_live_sk_) with credits
Enterprise300Contact sales@trynawa.com
Enterprise+1,000Contact sales@trynawa.com
Free keys are rate-limited to 10 requests/minute and have a hard cap of 100 lifetime requests. Live keys start at the Growth tier (120/min). Enterprise tiers are available on request — contact sales@trynawa.com.

Rate limit headers

Every API response includes rate limit headers:
HeaderDescriptionExample
X-RateLimit-LimitMaximum requests allowed per minute for your tier120
X-RateLimit-RemainingRequests remaining in the current window42
X-RateLimit-ResetWhen the current window resets (RFC 3339)2025-01-15T12:01:00Z
On 429 responses, additional headers are included:
HeaderDescriptionExample
Retry-AfterSeconds to wait before retrying8
X-NAWA-RateLimit-ReasonWhich limit was hitminute_limit or sandbox_exhausted

Semantic cache and rate limits

Semantic cache hits (X-NAWA-Cache: HIT) do not count toward your rate limits. If you’re classifying similar comments repeatedly, caching effectively increases your throughput.

Handling 429 errors

Use exponential backoff with jitter to retry rate-limited requests:
async function classifyWithRetry(
  nawa: Nawa,
  params: ClassifyParams,
  maxRetries = 3
) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const { data, error } = await nawa.classify(params)

    if (!error) return data

    if (error.type === 'rate_limit_error' && attempt < maxRetries) {
      const baseDelay = Math.pow(2, attempt) * 1000
      const jitter = Math.random() * 1000
      await new Promise(resolve => setTimeout(resolve, baseDelay + jitter))
      continue
    }

    throw error
  }
}
Do not retry in a tight loop without backoff. This will extend your rate limit window and may result in longer delays.