How Tenants Work
Workspace elements exist at two levels: Workspace level. Elements defined at the workspace level serve as shared templates available to all tenants. Tenants can read these but cannot modify them. Tenant level. Each tenant can have their own elements and customizations of workspace-level elements — for example, a workspace-level action may have tenant-specific configuration or parameters. Some elements are always workspace-level — for example, integrations are configured once for the whole workspace. Others are always tenant-level — connections, event subscriptions, and activity logs always belong to a specific tenant. Many elements, such as actions, flows, field mappings, data sources, and connectors, can exist at both levels — defined as workspace-wide templates with optional tenant-level customizations.Data Visibility
Tenants operate under strict data isolation:- Own data: Tenants can read and modify their own connections, customizations, and activity logs.
- Workspace data: Tenants can read workspace-level elements but cannot modify them.
- Membrane Universe: Tenants can read public connectors, external apps, actions, and other elements from the Membrane Universe but cannot modify them.
- Other tenants: Tenants can never see or access another tenant’s data. This is enforced at the database level.
Rate Limits
You can configure per-tenant rate limits in your workspace settings to control how many resources each tenant can consume (e.g., AI credits per rolling 30-day window). Workspace-level rate limits are shared across all tenants. For full environment isolation (separate configurations, connectors, etc.), use separate workspaces instead.Creating Tenants
Tenants are created automatically when someone authenticates with a newtenantKey in their JWT token (see Authentication). You can also create and manage them via the API — see Tenants API Reference.
How Tenant Scoping Works
When you generate a JWT token with a tenant’sid and use it to initialize the SDK or call the API, all operations are automatically scoped to that tenant. You don’t need to pass a tenantId to every API call — the token handles it: