Authentication
Ishtaran has three separate authentication principals. They authenticate different actors, carry different scopes, and are never interchangeable — a credential valid for one is rejected outright by routes that require another.
1. Application API Key
What it is: a machine-to-machine credential, one per Environment (sandbox/production),
generated via POST /v1/environments/{environmentId}/api-keys. See
Organization, Application, and Environment for how it's scoped.
How to send it: the X-Api-Key HTTP header.
Who it represents: your backend, not a person. This is the credential almost every code
example on this site uses — it's what IshtaranClient.create({ apiKey: ... }) (or the
equivalent constructor in each SDK) takes.
Never put it in frontend or mobile code. It's a bearer credential with the full permissions of its Environment — treat it exactly like a database password, injected server-side only.
2. Member JWT
What it is: the session token for a human user of your Organization (someone with a login on
the platform's control plane), obtained via POST /v1/auth/login.
How to send it: the standard Authorization: Bearer <token> header.
Who it represents: a person, for control-plane and a few specifically-gated operations. A
handful of routes explicitly require a Member session and reject an API Key even if one is
provided — for example accounts.authorizeApplication/freeze/unfreeze/close/
revokeRelationship, and managing WebhookEndpoints (Permissions.WebhookEndpointManage, see
Webhooks § Configuration). If a route's reference page doesn't
say API Key works, assume it needs a Member JWT.
3. AccountHolder JWT
What it is: the session token for your end customer — the person the platform calls an
AccountHolder, not your own Organization's staff. Obtained via accountHolders.signUp/login,
or via signUpAndClaimInvitation when accepting an invitation to an existing AccountHolder
relationship.
Who it represents: an individual end user with their own identity, isolated from your
Organization's Member/API Key context. This is a third, independent authentication context —
never derived from, or convertible to, an API Key or a Member JWT, and its session token is never
shared with client.auth (Member) on the same client instance even within the same SDK process.
Use this when your end users need to act on their own behalf (e.g. see their own balance, claim an invitation) rather than through your backend acting on their behalf via the API Key.
Summary
API Key != Member JWT != AccountHolder JWT
(your backend) (your staff) (your end customer)
None of the three is a superset of another — each opens a different, deliberately separate door.
Platform Owner (Ishtaran-internal) administrative operations use a fourth mechanism entirely
(/v1/admin/* routes) that is not part of the public integration surface — see
Sandbox for what's available to integrators in Sandbox.