The rule that matters most
A request never states which tenant it belongs to. Scope is derived from the verified token on the server. That is the difference between an API that is multi-tenant and one that merely has a tenant column.
Resource
The console is a client of the same REST API you get. Responses share one envelope, errors share one taxonomy, and the tenant is taken from a verified token — never from the request body.
Versioned under /api/v1 with a machine-readable OpenAPI description.
Every response carries success, code, message, data and a request id.
Validation 400, authentication 401, permission 403, not found 404, upstream 502.
RS256 JWTs with refresh families and server-side revocation.
Organisation and branch come from the verified token, so a body field cannot widen scope.
Kafka topics for audit, sync, notification and domain events.
A request never states which tenant it belongs to. Scope is derived from the verified token on the server. That is the difference between an API that is multi-tenant and one that merely has a tenant column.
Requests are rate limited per identity and per endpoint class. Write endpoints accept an idempotency key, so a retried request cannot produce a second charge.