429 Too Many Requests.
To make your app production-ready, use these four patterns to prevent this or handle errors when it happens:
- Client-side caching for hot domains.
- Backoff on 429, honoring the
Retry-Afterheader. - Prefetch to shift slow work ahead of bursts.
- Tier-aware fallbacks when the limit holds.
Rate limits per plan
Rate limits apply per API key, are measured per minute, and are visible on your dashboard. The current tiers:| Plan | Credits per month | Rate limit | Overage |
|---|---|---|---|
| Free | 500 one-time* | 10 requests/min | None |
| Starter | 30,000 | 120 requests/min | $19 per 10K credits |
| Pro | 200,000 | 300 requests/min | $9 per 10K credits |
| Scale | 2,500,000 | 1,200 requests/min | $6 per 10K credits |
| Enterprise | Custom | Custom | Contact sales |
What a 429 looks like
The API returns a JSON envelope:credits_consumed is always 0 on a 429 — throttled requests are never charged.
Every 429 response also includes a Retry-After header with the number of seconds (1–60) until your per-minute window resets:
status === 429. The SDK does not retry automatically. You wire that in.
Pattern 1: Client-side cache for hot domains
The cheapest way to stay under the cap is to skip the call. Brand data changes on the order of months, so a 24-hour client cache is safe for most products:Pattern 2: Backoff on 429 with Retry-After
When you hit rate limits, you get a 429 status code on the response:
Retry-After header tells you exactly how many seconds until your window resets, so use it as the wait time when it’s present. Fall back to exponential backoff (wait 1 second before the first retry and double the delay on each subsequent attempt) if you can’t read the header.
Here’s an example of a retry script that honors Retry-After and falls back to exponential delays:
Pattern 3: Prefetch to shift slow work ahead of bursts
Bursty traffic (like when a marketing email triggers 200 signups in 60 seconds) can get you rate limited. Prefetching doesn’t reduce the number of Brand API calls that count against your limit; every user-facing/brand/retrieve still spends rate-limit budget. What it does is shift the slow crawl work earlier, so each call during the burst completes in under a second instead of stalling for up to a minute and piling up retries on top of an already-saturated window.
Here’s how it works:
- During the burst, your application calls
/brand/prefetch(if it has a domain) or/brand/prefetch-by-email(if it has an email) right when it first receives the target domain or email. These prefetch endpoints are rate-limit-free, so 200 calls in a minute is fine. - A few seconds later, when the user actually submits and the user-facing client hits the Brand API, the request lands on a warm cache and returns in under a second. That call still counts toward your per-minute limit; it’s just fast.
Pattern 4: Degrade gracefully when the limit holds
If exponential backoff has run out of retries and you are still seeing 429s, the user is better served by a missing-data fallback than an error screen. Some examples:- Onboarding form. Skip the prefilled fields. Let the user enter them by hand and do not block on the API.
- Logo wall. Render the customer’s name in a styled box instead of the logo.
- CRM enrichment. Queue the contact for an offline enrichment job that runs overnight.
Related resources
Prefetch
Warm the cache so burst-time calls return fast.
Best practices
Cache, fallback, and proxy patterns end to end.
Troubleshooting
Other status codes, retry logic, and SDK gotchas.
Pricing
Per-plan credit, rate limit, and overage details.