Error shape
Every error response is JSON with at least:error— a short machine-readable code (see table below).message— a human-readable description.request_id— unique per call; include this if you contact support about a specific request.credits_remaining— present on most errors that occur after authentication, so you can tell your balance without a separate/v1/usagecall. Absent on errors that happen before your key is even charged (e.g. bad auth, bad request body).
422 (“no result found”) response additionally includes
credits_charged, since some endpoints still charge on a clean miss — see
Credits & Pricing. In the rare
case a compensating refund itself fails, you may also see
"refund_issue": true — this means the charge may not have been refunded
yet; contact support with the request_id and it’ll be reconciled.
Status codes
A
200 response is always success — a real payload with a normal charge, or
in a couple of specific cases (see the “charged on success only” endpoint in
Credits & Pricing) a payload with credits_charged: 0.
Rate limit
10 requests per minute for free-trial keys, 60 requests per minute for any paid credit pack — per API key, enforced with a fixed one-minute window. Need a higher ceiling for a large account? Ask us. Going over returns429 before any credits are touched or any vendor is called.
There’s no separate burst allowance today — spread out high-volume
workloads across the minute rather than bursting.
Deleting a cached result
Person/company enrichment, search, and email-find results are cached for up to 24 hours (60 days foremail.verify) — see
Credits & Pricing. If you need a specific
lookup re-fetched fresh before its cache window expires (for example,
after a data-subject deletion request), call:
params is exactly the same request body you’d send to the original
endpoint. endpoint must be one of the cacheable endpoints:
person.enrich, person.email, person.search, email.verify,
company.enrich, company.people, company.search. This call is free
(no credits charged) and returns { "deleted": true|false } — false
just means there was nothing cached for those exact params. Note the
cache is shared across all Horizon customers, so this evicts the one
shared entry for those params; it doesn’t reach into another customer’s
own systems.