tech
API for developers
The public API of Storekeeper is a thin, well-shaped REST surface over the platform. One token, flat responses, an OpenAPI spec, and a live reference you can call from the browser. No SDK required — though we generate one for your language anyway.
Auth in three calls
Your Storekeeper administrator creates one in the Storekeeper app and gives you a client_id and a client_secret. No password, no login endpoint.
Add Authorization: Bearer <access_token> to every other request. It has to be a token minted from an API key: a browser session's token is refused here with a 401, whatever role it carries. Trust the expires_in you were handed rather than a number printed anywhere; when it runs out, exchange the key again.
GET /api/me resolves the token to account, roles, and locked location.
# 1. exchange your API key for a token, at Storekeeper — not here
TOKEN=$(curl -s -X POST https://api-$ACCOUNT.storekeepercloud.com/oauth/token \
-u "$SK_CLIENT_ID:$SK_CLIENT_SECRET" \
-d grant_type=client_credentials | jq -r .access_token)
# no key yet? then you have no token. The read-only demo account was
# withdrawn in 2026-09, and there is no password endpoint to fall back on.
# 2. call an endpoint
curl -s "https://api-dev.storekeeper.software/api/orders?from=2026-07-01&limit=25" \
-H "Authorization: Bearer $TOKEN"
# 3. who am i
curl -s https://api-dev.storekeeper.software/api/me \
-H "Authorization: Bearer $TOKEN"
# 4. server-to-server? skip the browser entirely: exchange an API key
# at your own account's token endpoint. Nothing is brokered here.
curl -s -X POST https://api-$ACCOUNT.storekeepercloud.com/oauth/token \
-u "$SK_CLIENT_ID:$SK_CLIENT_SECRET" \
-d grant_type=client_credentials
The surface
Plus shops, tax-rates, turnover-groups, payment-methods, and locations to resolve the ids reports emit. Full list in the reference.
Conventions
YYYY-MM-DD in Europe/Amsterdam. Ranges inclusive._wt = incl. VAT, plain/_ex = excl. VAT.{count, total, data}; paginated add {start, limit}.{error, message, status}: 400 / 401 / 404 / 429 / 502.Access & limits
Tokens are short-lived — trust the expires_in you were handed, not a number printed here. There is no renew endpoint: exchange the key again, which is cheap and consumes nothing. Every call acts as you, on your account, within your rights.
/api takes an access token minted from an API key — a browser session's token is a 401 — and request volume is capped per key, per minute, with a separate and tighter ceiling for writes. Every authenticated response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and two more that name the ceiling those numbers belong to: RateLimit-Policy, every ceiling that applies to the key with its quota and window, and RateLimit, the state of the one closest to refusing you next. Over a ceiling the answer is 429 with Retry-After in seconds. Pace off the headers rather than a hard-coded rate — no figure is published, so tuning one never makes this page wrong.
The interactive reference lets you authorize and fire real requests from the browser. The guide walks the common flows end to end.
API voor ontwikkelaars
De publieke API van Storekeeper is een dun, goedgevormd REST-oppervlak over het platform. Eén token, platte responses, een OpenAPI-spec en een live referentie die je vanuit de browser kunt aanroepen. Geen SDK nodig — maar we genereren er toch één voor je taal.
Auth in drie aanroepen
Je Storekeeper-beheerder maakt er een aan in de Storekeeper-app en geeft je een client_id en een client_secret. Geen wachtwoord, geen login-endpoint.
Voeg Authorization: Bearer <access_token> toe aan elk ander verzoek. Het moet een token zijn dat uit een API-sleutel is aangemaakt: het token van een browsersessie wordt hier geweigerd met een 401, welke rol het ook draagt. Vertrouw op de expires_in die je hebt gekregen en niet op een getal dat ergens staat; is hij op, wissel de sleutel dan opnieuw in.
GET /api/me vertaalt de token naar account, rollen en vaste locatie.
# 1. wissel je API-sleutel in voor een token, bij Storekeeper — niet hier
TOKEN=$(curl -s -X POST https://api-$ACCOUNT.storekeepercloud.com/oauth/token \
-u "$SK_CLIENT_ID:$SK_CLIENT_SECRET" \
-d grant_type=client_credentials | jq -r .access_token)
# nog geen sleutel? dan heb je geen token. Het alleen-lezen demo-account is
# in 2026-09 ingetrokken, en een wachtwoord-endpoint is er niet.
# 2. roep een endpoint aan
curl -s "https://api-dev.storekeeper.software/api/orders?from=2026-07-01&limit=25" \
-H "Authorization: Bearer $TOKEN"
# 3. wie ben ik
curl -s https://api-dev.storekeeper.software/api/me \
-H "Authorization: Bearer $TOKEN"
# 4. server-naar-server? sla de browser over: wissel een API-sleutel in
# bij het token-endpoint van je eigen account. Hier wordt niets bemiddeld.
curl -s -X POST https://api-$ACCOUNT.storekeepercloud.com/oauth/token \
-u "$SK_CLIENT_ID:$SK_CLIENT_SECRET" \
-d grant_type=client_credentials
Het oppervlak
Plus shops, tax-rates, turnover-groups, payment-methods en locations om de ids te vertalen die rapporten teruggeven. Volledige lijst in de referentie.
Conventies
JJJJ-MM-DD in Europe/Amsterdam. Bereiken inclusief._wt = incl. btw, zonder/_ex = excl. btw.{count, total, data}; gepagineerd voegt {start, limit} toe.{error, message, status}: 400 / 401 / 404 / 429 / 502.Toegang & limieten
Tokens zijn kortlevend — vertrouw op de expires_in die je hebt gekregen, niet op een getal dat hier staat. Er is geen vernieuw-endpoint: wissel de sleutel opnieuw in, dat is goedkoop en verbruikt niets. Elke aanroep handelt namens jou, op jouw account, binnen je rechten.
/api neemt een access token dat uit een API-sleutel is aangemaakt — het token van een browsersessie levert een 401 op — en het verzoekvolume is begrensd per sleutel, per minuut, met een apart en strenger plafond voor schrijfacties. Elk geauthenticeerd antwoord draagt RateLimit-Limit, RateLimit-Remaining en RateLimit-Reset, plus twee die erbij noemen om welk plafond het gaat: RateLimit-Policy, elk plafond dat voor de sleutel geldt met quotum en venster, en RateLimit, de stand van het plafond dat je als eerste gaat weigeren. Boven een plafond is het antwoord 429 met Retry-After in seconden. Bepaal je tempo op de headers en niet op een hard gecodeerd tempo — er wordt geen getal gepubliceerd, dus bijstellen maakt deze pagina nooit onwaar.
Met de interactieve referentie kun je autoriseren en echte verzoeken vanuit de browser afvuren. De gids loopt de veelvoorkomende flows van begin tot eind door.