Skip to main content

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/usage call. Absent on errors that happen before your key is even charged (e.g. bad auth, bad request body).
A 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 returns 429 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 for email.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.