ObjectStackObjectStack

Tenant

Tenant protocol schemas

Multi-Tenant Architecture Schema

Defines the schema for managing multi-tenant architecture with:

  • Global control plane: Single database for auth, org management, tenant registry

  • Tenant data plane: Isolated databases per organization (UUID-based naming)

Design decisions:

  • Database naming: {uuid}.turso.io (not org-slug, since slugs can be modified)

  • Each tenant has its own Turso database for complete data isolation

  • Global database stores user auth, organizations, and tenant metadata

Source: packages/spec/src/cloud/tenant.zod.ts

TypeScript Usage

import { PackageInstallation, PackageInstallationStatus, ProvisionTenantRequest, ProvisionTenantResponse, TenantContext, TenantDatabase, TenantDatabaseStatus, TenantIdentificationSource, TenantRoutingConfig } from '@objectstack/spec/cloud';
import type { PackageInstallation, PackageInstallationStatus, ProvisionTenantRequest, ProvisionTenantResponse, TenantContext, TenantDatabase, TenantDatabaseStatus, TenantIdentificationSource, TenantRoutingConfig } from '@objectstack/spec/cloud';

// Validate data
const result = PackageInstallation.parse(data);

PackageInstallation

Properties

PropertyTypeRequiredDescription
idstringUnique installation identifier
tenantIdstringTenant database ID
packageIdstringPackage identifier
versionstringInstalled package version
statusEnum<'installing' | 'active' | 'disabled' | 'uninstalling' | 'failed'>Installation status
installedAtstringInstallation timestamp
installedBystringUser ID who installed the package
configRecord<string, any>optionalPackage-specific configuration
updatedAtstringLast update timestamp

PackageInstallationStatus

Allowed Values

  • installing
  • active
  • disabled
  • uninstalling
  • failed

ProvisionTenantRequest

Properties

PropertyTypeRequiredDescription
organizationIdstringOrganization ID
regionstringoptionalDeployment region preference
planEnum<'free' | 'starter' | 'pro' | 'enterprise' | 'custom'>Tenant plan tier
storageLimitMbintegeroptionalStorage limit in megabytes
metadataRecord<string, any>optionalCustom tenant metadata

ProvisionTenantResponse

Properties

PropertyTypeRequiredDescription
tenantObjectProvisioned tenant database
durationMsnumberProvisioning duration in milliseconds
warningsstring[]optionalProvisioning warnings

TenantContext

Properties

PropertyTypeRequiredDescription
tenantIdstringCurrent tenant database ID
organizationIdstringCurrent organization ID
organizationSlugstringoptionalOrganization slug
databaseUrlstringTenant database URL
planEnum<'free' | 'starter' | 'pro' | 'enterprise' | 'custom'>Tenant plan tier
metadataRecord<string, any>optionalCustom tenant metadata

TenantDatabase

Properties

PropertyTypeRequiredDescription
idstringUnique tenant database identifier (UUID)
organizationIdstringOrganization ID (foreign key to sys_organization)
databaseNamestringDatabase name (UUID-based)
databaseUrlstringFull database URL
authTokenstringEncrypted tenant-specific auth token
statusEnum<'provisioning' | 'active' | 'suspended' | 'archived' | 'failed'>Database status
regionstringDeployment region
planEnum<'free' | 'starter' | 'pro' | 'enterprise' | 'custom'>Tenant plan tier
storageLimitMbintegerStorage limit in megabytes
createdAtstringDatabase creation timestamp
updatedAtstringLast update timestamp
lastAccessedAtstringoptionalLast accessed timestamp
metadataRecord<string, any>optionalCustom tenant configuration

TenantDatabaseStatus

Allowed Values

  • provisioning
  • active
  • suspended
  • archived
  • failed

TenantIdentificationSource

Allowed Values

  • subdomain
  • custom_domain
  • header
  • jwt_claim
  • session
  • default

TenantRoutingConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanEnable multi-tenant mode
identificationSourcesEnum<'subdomain' | 'custom_domain' | 'header' | 'jwt_claim' | 'session' | 'default'>[]Tenant identification strategy (in order of precedence)
defaultTenantIdstringoptionalDefault tenant ID
subdomainPatternstringoptionalSubdomain pattern for tenant extraction
customDomainMappingRecord<string, string>optionalCustom domain to tenant ID mapping
tenantHeaderNamestringHeader name for tenant ID
jwtOrganizationClaimstringJWT claim name for organization ID

On this page