Run a single Permify deployment that serves multiple isolated tenants — each with its own schema, relationship data, and permission rules.
Permify supports multi-tenancy natively. A single Permify service can manage authorization for any number of independent applications or organizations (tenants). Each tenant has its own schema and its own relationship and attribute data, completely isolated from every other tenant.This makes Permify well-suited for SaaS platforms where each customer needs a customized authorization model, as well as for organizations that run multiple internal applications from a shared authorization service.
Tenant isolation is enforced at the data layer. Every relationship tuple, attribute value, and schema definition in the Permify database carries a tenant_id column. Permify will never return or evaluate data belonging to a different tenant, regardless of the permission being checked. The authorization schema for tenant A can be completely different from the schema for tenant B.
When you start a Permify service, a default tenant with id t1 is pre-created. If you are building a single-tenant application, you can use t1 for all requests without any tenant management overhead.
Permify exposes a dedicated Tenancy Service for creating, listing, and deleting tenants. All tenant management operations are available via REST and gRPC.
Permify adds a tenant_id column to every authorization data table. No row is ever read or written without a tenant scope.
tables├── migrations├── relation_tuples ← includes tenant_id column├── schema_definitions ← includes tenant_id column├── tenants├── transactions
The tenants table stores tenant metadata. The relation_tuples and schema_definitions tables store authorization data partitioned by tenant_id. A query for tenant acme will never touch rows belonging to tenant globex.
Consider a SaaS project management tool with two customers: Acme Corp and Globex Inc. Each customer has different roles and different users.
Acme Corp (acme)
Globex Inc (globex)
Schema
admin, member roles on project
owner, editor, viewer roles on project
Users
alice (admin), bob (member)
carol (owner), dave (viewer)
Data isolation
✅ Fully isolated
✅ Fully isolated
Both tenants run on the same Permify service. Their schemas are independent — Acme’s schema change never affects Globex’s permissions. A check request to /v1/tenants/acme/permissions/check is evaluated entirely against Acme’s schema and data.
Tenant IDs are arbitrary strings you define. Use your existing customer or organization identifiers (e.g., a UUID, a slug) so you don’t need a separate mapping table.