Multi-Tenancy & Projects
Cortex is multi-tenant by construction. Every durable resource is scoped, every query is filtered, and there is no API that crosses tenant boundaries.
Projects
A project is your top-level unit of organization — and it’s the same 4Players project you use for Voice, Rooms and Fleet. One project, one set of products, one billing relationship.
In Cortex, nearly every resource lives under a project. That’s why almost everything in the SDK starts from a project scope:
And in the REST API, most paths are nested under the project id:
A project id is the alphanumeric identifier from the 4Players platform — the same value everywhere across Voice, Rooms, Fleet and Cortex. You can have many projects (for example Dev, Staging and Production) under one account.
Tenants and isolation
Above projects sits a tenant — your account in Cortex. A single tenant can own many
projects. Every durable resource (sessions, messages, participants, gatherings, sanctions,
webhook subscriptions, functions…) carries a tenant and (almost always) a project
scope, and:
- Every API call is scoped to the caller’s tenant by their credentials.
- Every domain event carries
tenantIdandprojectId, so downstream consumers can filter precisely. - There is no cross-tenant “get everything” — isolation is mandatory, not optional.
Scoping your access
API keys live under your tenant and only ever reach
projects that your tenant owns and has configured for Cortex — a request for any other
project id is rejected with 403, whether that project exists or not. On top of that, a key
can be bound to a single project and limited
to specific scopes. For production integrations,
bind every key to its project so a credential for one environment can never reach another.
A 4Players project can be configured for Cortex by exactly one tenant. Trying to save Cortex
settings for a project that another tenant already configured returns 409 Conflict.