dash.joinmarkt.com). Browser clients send cookies automatically with same-site requests.
Browser / dashboard
- Sign in at the dashboard
- Call
/api/...from the same origin - Include credentials (
fetchwithcredentials: 'include')
Server-to-server
For backend jobs, prefer:- A trusted server that holds the user session is not recommended long-term
- Use routes that accept store-scoped secrets where documented (webhooks use provider signatures)
- Platform admin routes require an admin session
Merchant API keys (Bearer)
For Scriptable, bots, and server integrations, create a key under Account → Developers in the dashboard.mk_live_. Anything else is rejected before a key lookup.
Keys are limited to the shops and scopes chosen in the wizard. The scope ids are listed in API keys. On a restricted key, a stored scope satisfies a read route when the stored id is that read id with :read replaced by :write (for example theme:write satisfies theme:read). store:update, product:update, order:update, and the other write ids that are not named :write do not.
Merchant routes allow 120 requests per minute per client. Over the limit the response is 429.
Outgoing shop events use HMAC
X-JoinMarkt-Signature. See Outgoing webhooks. That is separate from payment-provider IPN.
Permissions
Dashboard session routes also check store membership and plan entitlements (for example custom domains on Premium+). A403 on those routes is a missing role or plan, not a bad password.

