Skip to main content
Vexa’s settings are per API-key owner — there is one settings blob per account, and the server derives whose it is from your key. There is no organization or workspace settings tier. All requests use the same API-key authentication as the rest of Vexa:
Every route on this page accepts a key holding either the bot or the tx scope. See Authentication for minting and scoping keys.

Where each setting lives

Settings written here are account-level overrides of the deployment’s defaults, resolved field by field: a field you set wins; a field you leave unset falls through to the deployment configuration. Clearing a field returns it to the deployment default.

Identity

GET /auth/me
Response — 200
This is the cheapest way to check that a key is live and which scopes it holds. A key with only the browser scope can call this route and nothing else.

Model configuration

The account’s LLM settings, used by the agent control plane and meeting-time summarization.
GET /user/models
Response — 200
The stored credential never leaves in the clear: api_key is masked to its last four characters, enough to recognize which credential is set, and api_key_set states whether one exists at all. An unset field reads as null.
PUT /user/models
Returns the same masked shape as the read, with 200 OK.
string
subscription or custom — which credential terms this account operates under. Any other value returns 422. See Model credentials & licensing.
string
Model name for general agent work.
string
Model name for meeting-time work, when it should differ from model.
string
OpenAI-compatible endpoint. Must be an http or https URL with a hostname, or the request returns 422.
string
Credential for that endpoint. Stored, never echoed in the clear.
The update is partial: only the fields present in the body change. Sending a field as an empty string clears it, and a cleared field falls back to the deployment default. Clearing every field removes the account override entirely. String fields longer than 2,048 characters return 422.

Transcription backend

The account’s override of the deployment’s speech-to-text endpoint. Leave it unset to use whatever the deployment configures — see Bring your own STT.
GET /user/transcription
Response — 200
PUT /user/transcription
string
Transcription endpoint. Must be an http or https URL with a hostname.
string
Credential for that endpoint. Masked on every read-back, exactly like the model credential.
Same partial-update and clearing rules as model configuration.

Webhook configuration

Webhook delivery has never been proven against a real external receiver — see Webhooks for what is and is not established. The configuration endpoints below are the settings surface for it; they store what you send.
GET /user/webhook
Response — 200
PUT /user/webhook
string
required
Where Vexa POSTs events. Required on every write — this endpoint replaces the URL, it does not patch it.
string
HMAC signing secret. Written only when non-empty: sending "" leaves the stored secret in place rather than clearing it.
object
A {event_type: boolean} filter. When you have never set one, only meeting.completed fires. An explicit false suppresses an event; an event you do not mention falls back to that default.
The write returns the account record with 200 OK; the stored secret is omitted from it. Read it back with GET /user/webhook, where it appears masked.

Delivery history

GET /user/webhook/deliveries
Response — 200
Newest first. limit accepts 1–500 and defaults to 100; a value outside that range returns 422. Vexa retains the most recent 100 attempts per account — this is a recent-history window, not an audit log. A row carries the target host only, never the configured URL or the secret: a webhook URL can carry a token in its path or query. An empty deliveries array means no attempt has been recorded for this account — including when the feature has never fired at all.

Account limits (admin tier)

Concurrency is an account limit, not a self-serve setting: it is changed with the admin key on the admin API, not with your X-API-Key.
PATCH /admin/users/{user_id}
Returns the updated account with 200 OK; an unknown id returns 404. A body that changes nothing returns 422 — the patch requires at least one field. Unrecognized fields are refused rather than dropped. The same patch also accepts a data object of platform-billing fields, which the hosted deployment’s billing integration writes. A self-hosted deployment does not need it. Creating accounts and minting keys are covered in Authentication.

What is not configurable through the API

These have no settings endpoint today. They are listed so you can stop looking for one.

Error summary

See the full error reference.