Skip to main content
Errors are returned as an HTTP status with a short JSON body, usually { "message": "..." } or { "error": "..." }. Some endpoints answer with a bare status and no body at all, so read the status first and treat the body as a hint.
Failing to resolve a location is reported as 400, 401 or 404 depending on the endpoint. Treat all three the same way: the location id is wrong, or your key does not cover it.

Messages worth recognising

Every credential refusal answers identically: unknown key, revoked key, expired key, wrong IP address, or a location the key does not cover. Work down the checklist in Authentication.
The visitor and registered-visitor lists require paging parameters. Add count and page — and, on registered visitors, at least one sorting[field].
The location is on an expired trial. Data endpoints stay closed until it is on a paid plan.
The visitor export is capped at 200 rows per call. Pass count=200 with a page, or narrow the export with filters.
The export matched no visitors. Not a failure — there was simply nothing to write.
Thirty refused credentials from one address inside fifteen minutes. Stop retrying, fix the key, and wait out the window — retrying with the same broken key only extends it.

A note on 200s

A handful of older endpoints answer 200 with a message body instead of an error status — for example { "message": "company not found" } or { "message": "No Known Visitor found!" }. When you expect an object and get a body with only a message key, treat it as “not found”.

Retrying

  • 500 is worth one or two retries with a short backoff.
  • 400, 401, 403 and 404 never become successful on retry. Fix the request.
  • 429 needs you to stop entirely for the window — further attempts keep it open.