# A guide for calling /api/public with your organisation's API key, and three corrected texts

- Date: 2026-10-26
- Type: New
- Surface: Developer portal and CLI
- What you need to do: Nothing.
- Address: https://developers.rivr.io/changelog/2026-10-26-org-key-guide-for-api-public

The API keys page has a new guide, Calling /api/public with a key. It says how the key's token is fetched (from rivr-auth, form-encoded, with `resource=https://api.rivr.io`), that the `Rivr-Organization` header picks the clinic and when it can be left out (only when the key reaches exactly one clinic), which `/api/public` routes a key reaches and the capabilities each needs (`orders:read` for an order's status, `orders:read` and `customers:read` to read an order, `orders:manage` and `customers:read` to create, refund, cancel or send it to a device, `economy:read` for settlements, `settings:read` for devices and the clinic), what the key check answers with (`key_invalid`, `organization_required`, `organization_invalid`, `organization_not_accessible`, `route_not_available` and `access_check_unavailable`, each with its page under Error codes) and how a key differs from a platform token. The guide for the platform token on the `/api/public` reference page points to it. Three texts are corrected. The rate limits page named rivr-public-api's own address as the production address; it is `https://api.rivr.io`, since 26 October. That page and the rate limits section of the Error codes page also said that `/api/public` on api.rivr.io was being moved to public-api in steps, so that not every call was counted; since then all calls on api.rivr.io under `/api/public` go through public-api, where the limit is counted. And the page for `internal_error` now says that `PUT /api/public/orders/{orderId}` (createOrder) can be sent again with the same order id after a lost answer or a rare `500`, because a `PUT` with the same id is idempotent (when the same order is created at the same time, one of the requests gets `409`). For every other operation the page still says to check first, and the code's `retryWhen` is still `never`.

