404 no-match response is a completed lookup result, not a transport failure.
Response outcomes
| HTTP status | Body | Meaning |
|---|---|---|
400 | {"error":"invalid_request"} | The JSON body is malformed or unsupported fields were sent. |
400 | {"error":"invalid_email"} | The email field is missing, empty, malformed, or unusable. |
400 | {"error":"unsupported_email"} | The submitted email is outside the current API scope. |
401 | {"error":"unauthorized"} | The bearer key is missing, invalid, or revoked. |
402 | {"error":"insufficient_credits"} | The workspace cannot accept another lookup at this time. |
404 | {"lookup_id":"lookup_...","status":"not_found"} | Hanto completed the lookup and could not return a match. |
429 | {"error":"rate_limited"} | The workspace exceeded the public API burst limit. |
502 | {"error":"lookup_error"} | Hanto could not complete resolver work for this request. |
503 | {"error":"rate_limit_unavailable"} | Hanto could not verify the rate-limit state, so the request was not executed. |
5xx | {"error":"server_error"} | Hanto encountered a temporary service failure. |
Rate limit
The public API allows up to 500 requests per minute per workspace. When the API returns429, use the response headers to decide when to retry:
| Header | Meaning |
|---|---|
RateLimit-Limit | Maximum requests in the current window. |
RateLimit-Remaining | Remaining requests in the current window. |
RateLimit-Reset | Time when the current window resets. |
Retry-After | Minimum time to wait before retrying. |
Retry guidance
- Do not retry
400or401responses until the request or key is corrected. - Treat
404as a final no-match result. - Retry
429afterRetry-After. - Retry
502,503, and other5xxresponses with backoff.