Skip to main content

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:

const project = client.project("your-project-id");
await project.sessions.list();
await project.gatherings.create({ name: "Standup" });

And in the REST API, most paths are nested under the project id:

/api/projects/{projectId}/sessions
/api/projects/{projectId}/gatherings
/api/projects/{projectId}/webhooks
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 tenantId and projectId, so downstream consumers can filter precisely.
  • There is no cross-tenant “get everything” — isolation is mandatory, not optional.

Scoping your access

API keys can be scoped down to a single project (and to specific resource families). For production integrations, prefer a project-scoped key so a credential for one environment can never reach another.