API keys
Every request must include your API key in theX-API-Key header:
hsh_sandbox_: sandbox keys (free, curated universe)hsh_live_: live keys (the Plus plan or the Developer plan, full universe)
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.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:
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:
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: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.
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 themeta.request_id of any failing request so we can trace it.
