data set to null and the human-readable reason in error. Understanding the specific message — not just the status code — is the fastest path to a working fix.
Error Envelope
Every error response has this shape:Always
null on error responses.A plain-English description of what went wrong. The message is stable and safe to log, display in developer tooling, or use in conditional logic.
Always
null on error responses.HTTP Status Codes
400 — Bad Request
The request was well-formed HTTP but contained invalid or missing parameters. Theerror field explains exactly which parameter is the problem. Do not retry a 400 — fix the request first.
401 — Unauthorized
The request was rejected because no valid API key was found. Check that:- The
x-api-keyheader is present on every request. - The key value is copied exactly — no leading/trailing whitespace.
- The key has not been revoked.
403 — Forbidden
Your API key is valid but does not have the access level required for the requested dataset or endpoint.sample → sandbox → production. If your key has sandbox access and the endpoint requires production, you will receive a 403. Contact your account manager to upgrade entitlements.
When a 403 is returned for a dataset access violation, the response also includes diagnostic headers:
| Header | Value |
|---|---|
X-HSD-Dataset | The dataset key that was checked (e.g. finance_fees) |
X-HSD-Access-Required | The minimum access level needed (e.g. production) |
X-HSD-Access-Current | Your current effective access level (e.g. sandbox) |
404 — Not Found
The requested resource does not exist. This can mean a nonexistent endpoint path, or an entity ID that is not in the database. Verify the URL path and any ID parameters.429 — Rate Limited
Your API key has exceeded either its per-minute request rate or its monthly quota.| Header | Description |
|---|---|
X-RateLimit-Limit | The maximum requests allowed per minute for your key |
X-RateLimit-Remaining | Requests remaining in the current window |
Retry-After | Seconds to wait before retrying (per-minute limit only) |
X-MonthlyQuota-Limit and X-MonthlyQuota-Remaining: 0. Monthly quotas reset at UTC midnight on the first of each month.
500 — Internal Server Error
An unexpected error occurred on the server. The platform team is automatically alerted. Retry with exponential backoff (see below). If the error persists for more than a few minutes, contact support.503 — Service Unavailable
The rate-limiting subsystem is temporarily unavailable. The request was not counted against your limit. Treat this the same as a 500 and retry with backoff.Retry Strategy
Use exponential backoff with jitter for 429 and 5xx errors:- Start with a 1-second base delay and double on each retry.
- Add random jitter (up to 500 ms) to avoid thundering-herd effects.
- Cap the maximum wait at 30 seconds.
- Stop retrying after 4 attempts and surface the error to your monitoring system.
- Always honour the
Retry-Afterheader value on 429 responses — it tells you exactly when the rate-limit window resets.