## TL;DR
Stop and back off: Hunter's free tier allows only a handful of requests per minute, so burst scripts 429 almost immediately. Add jittered backoff, pace calls under the limit, and check your monthly search quota in the dashboard before assuming it is a transient spike.

```text
hunter.io 429 too many requests
```

## Use this when
- Hunter /v2/domain-search or /v2/email-finder returns 429
- A lead-list builder that loops over domains starts failing after a few calls
- Free-tier scripts work in testing but 429 in production bursts

## Not for this skill when
- Hunter returns 401 (API key missing or invalid)
- Results return 200 but emails come back unverified (data quality, not quota)
- The 429 is from Clearbit, Apollo, or another enrichment API

## Steps
1. Pause the loop immediately on the first 429; do not retry in a tight loop. Expected: the burst stops growing.
2. Retry with exponential backoff plus jitter: 5s, 15s, 30s, 60s, max 4 attempts. Expected: transient per-minute 429s clear within a minute.
3. Pace all future calls: keep domain searches well under 10 requests per minute on free tiers, and serialize rather than parallelize. Expected: no 429s on a clean full run.
4. Check the Hunter dashboard for monthly quota: domain searches and email verifications draw from separate pools. Expected: you know whether you are rate-throttled or quota-exhausted.
5. If quota is exhausted, wait for the monthly reset or upgrade; cache domain-search results locally so reruns never re-spend quota. Expected: the pipeline survives reruns without new spend.

## Variant phrasings
### hunter domain search rate limited
Free tier is roughly 10 requests per minute; serialize the loop.
### hunter.io api too many requests free plan
Quota triage first: the monthly search pool is small and empties fast in bulk jobs.

## Tool/version compatibility
Hunter.io API v2 (api.hunter.io/v2). The email-verifier endpoint has its own quota pool and the same 429 behavior.

## Why it happens
Hunter enforces per-minute rate limits that are tight on free and starter plans, plus a hard monthly quota of searches and verifications. A loop over a CSV of domains hits the per-minute ceiling within seconds. Tight-loop retries then keep the window exhausted, which is why pausing and backing off beats retrying fast.

## Edge cases / pitfalls
- Domain search and email finder share nothing; triage each pool separately.
- A 429 mid-run means some rows are enriched and some are not: make the loop idempotent with a checkpoint file so reruns skip completed rows.
- Do not create extra accounts to multiply quotas; that violates Hunter's terms.
- Read the key via os.environ.get("HUNTER_API_KEY") and never print it.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_5q26ECtXlh5aW7tl72iSxQ
