Rate Limiting

The Brandsearch API enforces rate limits and quotas to ensure fair usage. This page explains the limits by tier and how to handle them.

Rate limits by tier

Rate limits are applied per API key. Each tier has different limits across multiple time windows.

  • Name
    Starter
    Type
    tier
    Description

    3 req/s, 15 req/min, 300 req/hr, 3,000 req/day

  • Name
    Outscaler
    Type
    tier
    Description

    10 req/s, 60 req/min, 1,000 req/hr, 10,000 req/day

  • Name
    Agency
    Type
    tier
    Description

    30 req/s, 200 req/min, 5,000 req/hr, 50,000 req/day

Rate limit exceeded response

{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded.",
    "details": {
      "retry_after": 12,
      "window": "1m"
    }
  }
}

Quotas

In addition to rate limits, each API key has daily and monthly request quotas.

TierDaily QuotaMonthly Quota
Starter3,00050,000
Outscaler10,000200,000
Agency50,0001,000,000

Quotas reset automatically — daily quotas reset at midnight UTC, and monthly quotas reset on the 1st of each month.


Quota response headers

Every API response includes headers showing your current quota usage:

  • Name
    X-Quota-Daily-Remaining
    Type
    integer
    Description

    Requests remaining for the current day.

  • Name
    X-Quota-Monthly-Remaining
    Type
    integer
    Description

    Requests remaining for the current month.

  • Name
    X-Quota-Daily-Limit
    Type
    integer
    Description

    Your total daily limit.

  • Name
    X-Quota-Monthly-Limit
    Type
    integer
    Description

    Your total monthly limit.


Handling rate limits

When you hit a rate limit, the API returns a 429 status with a Retry-After header. The best practice is to implement exponential backoff:

Handling rate limits

async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options)

    if (response.status === 429) {
      const retryAfter = parseInt(response.headers.get('Retry-After') || '1')
      await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000))
      continue
    }

    return response
  }

  throw new Error('Max retries exceeded')
}

Was this page helpful?