Skip to main content

API keys

Every request must include your API key in the X-API-Key header:
Keys are prefixed by type:
  • hsh_sandbox_: sandbox keys (free, curated universe)
  • hsh_live_: live keys (the Plus plan or the Developer plan, full universe)
Create and revoke keys from your API dashboard.
Live keys come with the Plus plan and with the Developer plan. On Plus they’re for your own use: research, automations, and internal workflows. To show halal.sh results to the users of your product, you need the Developer plan, a separate subscription with a commercial license and higher limits. See Licensing.A live key’s access depends on the plans your account has now, not on when you created the key. If the Developer plan ends while you have Plus, your keys keep the full universe at the Plus limits. With neither plan active, existing hsh_live_ keys keep working but fall back to the sandbox universe and its limits, and out-of-universe symbols start returning 403 sandbox_restricted. When you renew, full access returns within five minutes on the keys you already have.
Treat your API key like a password. Never put it in client-side code, a public repository or a browser request. Call the API from your backend.

The sandbox

Sandbox keys (hsh_sandbox_) return real data in the same response schema as live keys, for these instruments: They include both determinations (AAPL is compliant, JPM and GS are non-compliant) across a range of sectors, so you can build and test both paths. All 12 are analyzed, so no sandbox stock comes back pending. Any other symbol returns 403 sandbox_restricted. Filter-based screening (/screen without symbols) needs Plus or the Developer plan. The same scope applies to every sandbox key, and to a live key or a signed-in session whose account has neither Plus nor the Developer plan.

Rate limits

A sandbox key always has the sandbox limits. A live key or a signed-in session has the limits of your account’s current plan, and with the Developer plan that’s the Developer limits, whether or not you also have Plus. Developer limits are per account: every live key, connected app and signed-in session on the account shares the same 10,000 requests a day and 300 a minute. Plus limits apply to each live key separately. Every response has your daily limit state in these headers:
When you exceed a limit, the API returns 429 with a Retry-After header and a retry_after field (seconds). When you are on the sandbox, the message also says what the Plus plan includes and costs, and upgrade gives your code the same offer as fields:
A 403 sandbox_restricted has the same upgrade object. The daily window resets at midnight UTC.

Error handling

Every error uses the same envelope:
On the sandbox, a 403 sandbox_restricted and a 429 also have an upgrade object, so your code can show what full access costs: A caller on a paid plan gets no upgrade. Log meta.request_id: it identifies the request, so we can trace it when you contact support.

Response envelope

Every success response has the same shape:
Responses with a compliance result have meta.methodology, the exact methodology version behind it. See Methodology versioning.

Versioning and stability

The API is versioned in the URL path (/v1). Within a version we guarantee:
  • no fields are removed or renamed,
  • no field types change,
  • no URL structure changes.
We may add fields, endpoints, optional parameters, and enum values within a version. Design your client to ignore unknown fields and to treat an unrecognized status as pending. We will release breaking changes as a new version (/v2), with a migration guide and a deprecation window for the previous one.

Support

Stuck, or seeing something that looks wrong? Contact us, and include the meta.request_id of any failing request so we can trace it.