Skip to main content
In most integrations you don’t need to think about tenant explicitly. Authentication and routing already carry the tenant context, and the API filters data behind the scenes. This page explains the model, shows how the tenant is resolved on each request, and documents the few exceptions where Customer surfaces.

The concept: why multi-tenant

Cativa is a multi-tenant platform: a single API instance serves thousands of different communities, and each one has its data fully isolated from the rest. A call made in one tenant’s context never sees or touches another tenant’s data. Think of an apartment building. The structure (elevator, plumbing, facade) is shared, but each apartment has its own door and key. Nobody enters your apartment with the neighbor’s key. In Cativa, the “structure” is the API and infrastructure, the “apartment” is the tenant, and the “key” is the credential you use.

Customer and tenant are the same thing

In the product, Customer and tenant are the same concept seen from two angles:
  • Customer is the commercial/admin name. It shows up in billing, in the OIDC flow ({customerName}), and in the customer field of responses.
  • Tenant is the technical name. It is the unit of data isolation.
Treat the two as synonyms. Each Customer has a unique slug (for example, makersday), which is also the community’s public subdomain.

How the tenant is resolved on each request

You almost never pass the tenant by hand. The context is inferred from how the request arrives. Understanding this helps you debug empty responses or 403s.

The API Key embeds the tenant

The partner key follows this shape:
Because the middle segment identifies the Customer, a key only operates inside one tenant. You cannot (and don’t need to) point a key at another tenant. If you integrate several communities, store one key per tenant and pick the right one on each call.
The API Key is a secret. Store it in an environment variable or secret manager, never in source control or the front-end. Examples use cativa_live_... and YOUR_API_KEY as placeholders.

How to discover the current customer

If you need to know which customer your key belongs to (for logging, auditing, or an onboarding sanity check), call GET /auth/me. The customer field carries the tenant slug.
Illustrative response (fields abbreviated):
The sample JSON on this page is illustrative. The authoritative field-by-field schema lives in the API Reference tab (Auth tag).

When you handle Customer explicitly

In most integrations the tenant is invisible. These are the exceptions.
SSO endpoints carry the customer slug in the path:
The customerName is the community’s public subdomain. Align it with the tenant admin at onboarding. See Sign in with Cativa for the step-by-step.
If the same endpoint receives webhooks from more than one tenant (typical for apps serving multiple communities), the payload includes CustomerId at the top level so you can route.
Persist the mapping customerId -> external_account at customer onboarding. Don’t derive it on every event. Each event’s shape is documented on the webhook page (e.g. user_received_badge).
If you are building a Zapier-style app that connects Cativa to other tools and serves many different communities, the right flow is OAuth Marketplace:
1

Install

Each community (tenant) installs your app once.
2

Token per tenant

Cativa issues an OAuth token scoped to that tenant.
3

Use

You store one token per tenant and use the right token on each call.
If your use case is “one integration for one specific customer”, use an API Key: it’s simpler. OAuth Marketplace is for distributing the app to third parties.
Platform operator endpoints (/tenants/v1/admin/...) require operator credentials and a platform admin JWT. If you are an external API Key integrator, ignore this category: it isn’t publicly exposed to partners.

Common tenant-context errors

The credential is missing, malformed, or revoked. Check the Authorization: Bearer cativa_live_... header and that the key is for the right environment (live vs test).
The credential is valid but lacks permission for the resource, or you are trying to reach another tenant’s data. Remember: a key operates only inside its own tenant. Call GET /auth/me and check the customer field.
Almost always a wrong tenant resolution in production (bad domain or Cativa-Origin header), so the API filters and returns that tenant’s empty set. Confirm the request subdomain/origin.
See Errors and rate limits for the full error contract.

Next steps

Identity and Users

The User model and how to tie it to your external system.

Webhooks

How to receive events from Cativa, including the CustomerId field.