Core environment variables are centralized in api/constants.py. Variables marked Required in the description must be explicitly set — the application will either fail to boot or behave insecurely without them.

Application


Database


Authentication (Clerk)

User sign-in (Google + email) is handled by Clerk. The publishable key is public and is served to the browser at runtime via /v1/health; the secret key stays server-side. Until Clerk keys are set, browser sign-in returns 503, but API-key access still works. See Authentication for the full walkthrough.

URLs


Platform model providers

These OpenAI-compatible endpoints define what the EESI-managed model configuration (and empty configurations) resolve to. Defaults point at the self-hosted local stack — Ollama for the LLM, Speaches for STT/TTS; a hosted deployment repoints them at its own provider accounts. BYOK configurations never use these. The old MPS_LLM_BASE_URL-style MPS_* names are still accepted as deprecated fallbacks.

Billing (Polar)

EESI bills usage with prepaid credits (1 credit = 1 cent) purchased through Polar checkout and tracked on a local ledger. Billing is optional and turns on only when all three of POLAR_ACCESS_TOKEN, POLAR_WEBHOOK_SECRET, and POLAR_PRODUCT_IDS are set. Until then the billing UI is hidden, billing routes return 404, and no credit gating is applied (visible as billing_enabled: false in GET /v1/health).

Storage

EESI uses MinIO by default, which is bundled with the self-hosted deployment and requires no external setup. Set ENABLE_AWS_S3=true to switch to AWS S3 — typically used for cloud or managed deployments where S3 is already part of the infrastructure.

MinIO (OSS default)

AWS S3 (alternative)

Credentials come from the standard AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY environment variables.

S3-compatible servers (MinIO, rustfs, Ceph, …)

The S3 backend can target any S3-compatible server, not just AWS. Prefer it over the MinIO backend when you need presigned URLs against a private bucket: the MinIO backend returns plain unsigned object URLs and relies on the bucket being anonymously public-readable, whereas the S3 backend issues real presigned URLs so the bucket can stay private. To use it, set ENABLE_AWS_S3=true and point it at your server with the S3_* overrides above. For example, against rustfs:
Presigned URLs point at S3_ENDPOINT_URL, so that host must be reachable from the browser. Because browsers fetch transcripts cross-origin, the bucket also needs a CORS rule allowing your app’s origin for GET/HEAD — configure this on the storage server (e.g. via PutBucketCors), not in EESI.

WebRTC


Tracing (Langfuse)

Tracing activates automatically as soon as credentials are available — either via these environment variables (applied to all organizations) or per-organization in the UI under Platform Settings. If neither is set, spans are dropped silently. See the Tracing guide for setup instructions.

Monitoring


Logging


Campaigns

Controls concurrency for Campaigns, EESI’s bulk outbound calling feature.

Further Customisation

The variables documented here cover the standard configuration surface. For advanced customisation — such as integrating additional services or tuning internal behaviour — consult the relevant module alongside api/constants.py to understand how each variable is consumed.