Overview
KaireonAI supports two authentication methods:- Google OAuth — one-click sign-in with your Google account
- Email & Password — register with email, verify, then sign in
Playground Registration
The hosted playground at playground.kaireonai.com offers self-service registration.Sign Up with Google
- Visit playground.kaireonai.com/register
- Click Sign up with Google
- Select your Google account
- You’re signed in — no email verification needed
Sign Up with Email
- Visit playground.kaireonai.com/register
- Fill in your name, email, and password
- Optionally provide a Tenant name — if set, the new tenant is created with this display name. Leave it blank to default to
"{Your Name}'s Workspace". - Click Create Account
- Check your inbox for a verification email from
support@kaireonai.com - Click the Verify Email link
- Sign in at playground.kaireonai.com/login
Password requirements: minimum 8 characters, at least 1 uppercase letter, at least 1 number.
After Registration
New users land on the platform as an admin of their personal workspace. An onboarding banner guides you to load sample data — go to Settings → Sample Data and load a dataset pack (e.g., Retail Rewards) to explore the full platform. You have full access to create Offers, schemas, Decision Flows, pipelines, and everything else.Playground Limits
Decision Quota
Each playground workspace has a 5,000 lifetime decision limit. Decisions are counted when:- The Recommend API generates impressions
- Batch pipeline runs produce decisions
- Journey triggers fire automated decisions
Workspace Reset
If you’ve used up your decisions or want to start fresh, go to Settings → Reset Workspace. This deletes all data in your workspace (offers, flows, schemas, interaction history, etc.) and resets your decision counter to 0. Your account and workspace remain intact.No Entity Limits
There are no limits on creating entities (Offers, schemas, Decision Flows, pipelines, etc.) in the playground. The only constraint is the 5,000 decision cap.Data Isolation
Every user’s data is completely isolated in their own tenant:- Separate data storage — offers, schemas, pipelines, interaction history, and all other data is scoped to your tenant
- No cross-tenant access — API routes enforce tenant boundaries on every request
- Independent models — scoring models and experiments are trained only on your tenant’s data
- Isolated Decision Flows — your flows, rules, and configurations are private to your workspace
Self-Hosted Authentication
When self-hosting KaireonAI, authentication is configured via environment variables:Self-hosted instances have no decision limits — the 5,000 cap only applies to the hosted playground.
Google OAuth Setup
To enable Google sign-in on your self-hosted instance:1
Create OAuth credentials
Go to Google Cloud Console, create an OAuth 2.0 Client ID for a Web application.
2
Configure redirect URIs
Add your deployment URL as an authorized redirect URI:For local development, also add:
3
Set environment variables
Email Verification Setup
Email verification requires an email sending service. The platform uses AWS SES by default:1
Verify your domain in SES
Add DKIM records and verify your sending domain in the AWS SES console.
2
Set environment variables
Seed Admin User
For self-hosted deployments, create the initial admin user with the seed script:admin@kaireonai.com / admin123). Change the password immediately after first login.
User Roles
New playground registrations receive the admin role on their personal workspace. Self-hosted admins can manage roles via the database.
Session Invalidation
KaireonAI sessions are stateless JWTs (~30-minute lifetime, auto-refreshed). Deleting a user, disabling a user, or changing a user’s role invalidates their live sessions within roughly 30 seconds — not the full JWT lifetime. Each user row carries atokenVersion (bumped on role change, account
disable/enable, or MFA enrollment) and a disabled flag. Every protected
API route re-validates these against the database at the authorization
choke points (requireTenant() and requireRole()), not just at sign-in —
a request carrying a JWT whose embedded tokenVersion no longer matches
the live row, or whose user is now disabled, is rejected even though the
JWT signature itself is still valid and unexpired:
API Key Management
API keys provide programmatic access to the KaireonAI REST API without user sessions. They are ideal for server-to-server integrations, CI/CD pipelines, and MCP connections.Key scopes: data plane vs control plane
The REST API is split into two planes, and a key’sscopes array (set at creation, immutable afterwards) determines which it can reach:
- Data plane — exactly
POST /api/v1/recommend,POST /api/v1/respond,POST /api/v1/respond/bulk, andPOST /api/v1/capture(a legacy alias of/respond). A key minted with no scopes ([], the default) is data-plane-only. - Control plane — everything else (all management CRUD: schemas, offers, categories, channels, creatives, decision flows, decisioning gates, connectors, pipelines, segments, models, reports, settings, API keys, …). Requires a first-party session, an MCP connection, or a key minted with
scopes: ["control-plane"](admin-only to mint). scopes: ["scim"]mints a SCIM provisioning key for/api/v1/scim/v2/*(used withAuthorization: Bearer <key>).
403 with { "title": "Forbidden", "detail": "This API key is scoped to the data plane (recommend / respond). Management endpoints require a first-party session, an MCP connection, or an API key minted with the \"control-plane\" scope." }.
The master/internal server key (API_KEY env var) and cron/webhook secrets are internal infrastructure, not customer keys, and are unaffected.
Creating an API Key
Endpoint:POST /api/v1/api-keys
Required role: Admin
Listing API Keys
Endpoint:GET /api/v1/api-keys
Required role: Admin
Returns all active (non-revoked) keys for the tenant, showing prefix, name, last used date, and expiration.
Revoking an API Key
Endpoint:DELETE /api/v1/api-keys?id=<key-id>
Required role: Admin
Soft-revokes the key immediately. Revoked keys cannot authenticate. Optionally include a reason in the request body.
Using an API Key
Include the key in theX-API-Key header (there is no Authorization: Bearer scheme for API keys — a Bearer token is rejected with 401; the only exception is SCIM keys on /scim/v2/*):
API keys are hashed with HMAC using the
API_KEY_PEPPER environment variable before storage. Set this variable in production for security.OAuth 2.0 Client Credentials
KaireonAI supports the OAuth 2.0 client credentials grant (RFC 6749 Section 4.4) for machine-to-machine authentication. This is the recommended approach for production integrations.Registering an OAuth Client
Endpoint:POST /api/v1/oauth/clients
Required role: Admin
read, write, admin
Obtaining an Access Token
Endpoint:POST /api/v1/oauth/token
Accepts form-encoded or JSON body:
Listing and Revoking Clients
- List:
GET /api/v1/oauth/clients(admin only) - Revoke:
DELETE /api/v1/oauth/clients?id=<client-id>(admin only)
Rate Limiting
The token endpoint is rate-limited to 20 requests per minute per client ID (or per IP when the client ID is absent). When Redis is unavailable, the rate limiter fails closed to prevent brute-force attacks.SCIM User Provisioning
KaireonAI implements SCIM 2.0 (System for Cross-domain Identity Management) for automated user provisioning from identity providers like Okta, Azure AD, and OneLogin.Base URL
Supported Operations
Authentication
SCIM endpoints require a bearer token validated byrequireSCIMAuth. Configure this in your identity provider with the SCIM bearer token from your KaireonAI tenant settings.
User Lifecycle
- Create (
POST /Users) — Creates a new user in the tenant withmemberrole. RequiresuserName(email). - Update (
PUT /Users/:id) — Updates name and email. Setactive: falseto deactivate. - Delete (
DELETE /Users/:id) — Soft-deactivates the user (setslockedUntilto a far-future date). Does not hard-delete.
Example: Create a User
All SCIM operations are audit-logged with
userId: "scim" for traceability. SCIM users are scoped to the authenticated tenant — no cross-tenant access is possible.Security
- JWT sessions — 30-minute expiry, auto-refreshed
- Account lockout — 5 failed login attempts locks the account for 15 minutes
- Email verification — required for email/password registration
- Rate limiting — registration endpoint: 5 attempts per IP per hour; OAuth token endpoint: 20 per minute per client
- CSRF protection — all state-changing API requests require
X-Requested-Withheader - Tenant isolation — all data access is scoped to the authenticated user’s tenant
- API key hashing — keys are HMAC-hashed with a pepper before storage
- OAuth secret hashing — client secrets are hashed before storage; timing-safe comparison prevents timing attacks
- Audit logging — all auth events (login, token grants, key creation/revocation, SCIM operations) are logged