System Config Keys Reference
The Platform exposes 71 runtime configuration keys through the admin API. These keys control gateway behavior — DLP thresholds, rate limits, audit settings, agent execution, quality scoring, and more — without requiring a service restart or redeployment.
Resolution order
Section titled “Resolution order”Every configuration key resolves through a three-tier priority chain:
- Database override — value set via the admin API (
PUT /api/v1/admin/config/{key}) - Environment variable — value from the process environment
- Compiled default — hardcoded default in the application
Database overrides take highest precedence. When an admin updates a key via the API, the new value is persisted in the system_configs table and takes effect immediately for subsequent requests.
Admin API endpoints
Section titled “Admin API endpoints”All system config endpoints require admin-role JWT authentication.
GET /api/v1/admin/config
Section titled “GET /api/v1/admin/config”List all configuration entries grouped by category.
Response 200 OK
[ { "key": "rate_limit_requests_per_minute", "value": 60, "source": "default", "editable": true, "category": "Rate Limiting", "description": "Maximum requests per user per minute.", "value_type": "int", "enum_options": null, "min_value": 1, "max_value": 10000 }]| Field | Type | Description |
|---|---|---|
key |
string | Configuration key name |
value |
string | int | bool | Current resolved value |
source |
string | Resolution source: db, env, or default |
editable |
bool | Whether the key accepts API updates |
category |
string | UI grouping category |
description |
string | Human-readable description |
value_type |
string | Expected type: string, int, bool, or enum |
enum_options |
string[] | null | Allowed values for enum-type keys |
min_value |
int | null | Minimum allowed value (int keys only) |
max_value |
int | null | Maximum allowed value (int keys only) |
Sensitive values (database URLs, passwords) are masked as ***.
PUT /api/v1/admin/config/{key}
Section titled “PUT /api/v1/admin/config/{key}”Update a single configuration value. Only editable: true keys accept updates.
Path parameters
| Parameter | Type | Description |
|---|---|---|
key |
string | Configuration key to update (lowercase, e.g. rate_limit_requests_per_minute) |
Request body
{ "value": 120 }| Field | Type | Required | Description |
|---|---|---|---|
value |
string | int | bool | yes | New value — must match the key’s value_type and pass constraint validation |
Response 200 OK — the updated ConfigEntry object.
Error codes
| Status | Condition |
|---|---|
400 Bad Request |
Key is read-only, value fails type validation, or value is outside min/max bounds |
404 Not Found |
Unknown configuration key |
Every config update emits an audit log entry recording the old value, new value, and the acting admin’s identity.
Never-exposed keys
Section titled “Never-exposed keys”The following keys exist in the settings but are never returned by the config API. They are set exclusively through environment variables or secrets backends:
jwt_secret_key, database_url_sync, audit_webhook_url, audit_webhook_token, cors_origins, security_csp_policy
Configuration keys by category
Section titled “Configuration keys by category”Application
Section titled “Application”Read-only keys reflecting the deployment identity.
| Key | Env Var | Type | Default | Editable | Description |
|---|---|---|---|---|---|
app_name |
APP_NAME |
string | Arbitex |
no | Application display name |
app_version |
APP_VERSION |
string | 0.1.0 |
no | Application semantic version |
debug |
DEBUG |
bool | false |
no | Whether debug mode is enabled |
database_url |
DATABASE_URL |
string | (masked) | no | Database connection URL (masked for security) |
jwt_algorithm |
JWT_ALGORITHM |
string | HS256 |
no | JWT signing algorithm |
Security
Section titled “Security”Authentication and access control settings.
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
jwt_access_token_expire_minutes |
JWT_ACCESS_TOKEN_EXPIRE_MINUTES |
int | 60 |
yes | 5–1440 | JWT access token expiration in minutes |
security_hsts_enabled |
SECURITY_HSTS_ENABLED |
bool | true |
yes | — | Send Strict-Transport-Security header |
prompt_guard_enabled |
PROMPT_GUARD_ENABLED |
bool | true |
yes | — | Toggle prompt injection defenses |
prompt_guard_log_level |
PROMPT_GUARD_LOG_LEVEL |
enum | warning |
yes | debug, info, warning, error |
Log level for prompt guard warnings |
admin_recovery_enabled |
ADMIN_RECOVERY_ENABLED |
bool | true |
yes | — | Allow admins to trigger account recovery for users |
self_service_recovery_enabled |
SELF_SERVICE_RECOVERY_ENABLED |
bool | false |
yes | — | Allow users to request self-service account recovery via email |
allow_open_registration |
ALLOW_OPEN_REGISTRATION |
bool | false |
yes | — | Allow open user registration without an invite token |
max_concurrent_sessions |
MAX_CONCURRENT_SESSIONS |
int | 5 |
yes | 1–100 | Maximum concurrent sessions per user |
Rate Limiting
Section titled “Rate Limiting”| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
rate_limit_requests_per_minute |
RATE_LIMIT_REQUESTS_PER_MINUTE |
int | 60 |
yes | 1–10000 | Maximum requests per user per minute |
rate_limit_admin_exempt |
RATE_LIMIT_ADMIN_EXEMPT |
bool | false |
yes | — | Whether admin users bypass rate limits |
usage_throttle_rpm_factor |
USAGE_THROTTLE_RPM_FACTOR |
string | 0.5 |
yes | — | RPM reduction factor when org is in 95–100% usage band (0.0–1.0) |
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
default_summarizer_model |
DEFAULT_SUMMARIZER_MODEL |
string | claude-sonnet-4-20250514 |
yes | — | Default model ID used for summarize mode |
audit_sinks |
AUDIT_SINKS |
string | db |
yes | Allowed: db, jsonl, webhook |
Active audit sinks (comma-separated) |
audit_compression_level |
AUDIT_COMPRESSION_LEVEL |
int | 1 |
yes | 1–19 | Zstd compression level for audit prompt/response text (1=fastest, 19=max ratio) |
audit_shard_threshold |
AUDIT_SHARD_THRESHOLD |
int | 10000000 |
yes | 100000–100000000 | Row count threshold per audit shard before creating the next shard |
audit_retention_days |
AUDIT_RETENTION_DAYS |
int | 90 |
yes | 7–3650 | Days to retain audit shards before dropping |
Conversation
Section titled “Conversation”| Key | Env Var | Type | Default | Editable | Description |
|---|---|---|---|---|---|
auto_title_enabled |
AUTO_TITLE_ENABLED |
bool | true |
yes | Enable automatic title generation for new conversations |
auto_title_model |
AUTO_TITLE_MODEL |
string | claude-haiku-3-20240307 |
yes | Model for auto-title generation (format: provider/model_id or model_id) |
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
dlp_entity_thresholds |
DLP_ENTITY_THRESHOLDS |
string | {} |
yes | Valid JSON | Per-entity-type confidence thresholds (JSON). Overrides defaults in the DLP pipeline |
dlp_ner_force |
DLP_NER_FORCE |
enum | auto |
yes | auto, always, never |
NER detection override: auto (pack-based gating), always (force NER on), never (force NER off). Per-org override via dlp_ner_force:{org_id} |
dlp_context_window_chars |
DLP_CONTEXT_WINDOW_CHARS |
int | 50 |
yes | 10–200 | Character window (±N) around regex matches for context keyword scanning |
image_ocr_enabled |
IMAGE_OCR_ENABLED |
bool | false |
yes | — | Enable image text extraction via OCR for DLP scanning. Per-org override via org.<org_id>.image_ocr_enabled |
image_ocr_provider |
IMAGE_OCR_PROVIDER |
enum | tesseract |
yes | tesseract, azure, disabled |
OCR provider. Per-org override via org.<org_id>.image_ocr_provider |
image_ocr_max_file_size_mb |
IMAGE_OCR_MAX_FILE_SIZE_MB |
int | 20 |
yes | 1–100 | Maximum file size in MB for OCR processing |
image_ocr_timeout_seconds |
IMAGE_OCR_TIMEOUT_SECONDS |
int | 30 |
yes | 5–120 | Per-file OCR timeout in seconds |
image_visual_detection_enabled |
IMAGE_VISUAL_DETECTION_ENABLED |
bool | false |
yes | — | Enable visual pattern detection (credit cards, ID cards, QR codes). Per-org override via org.<org_id>.image_visual_detection_enabled |
image_visual_sensitivity |
IMAGE_VISUAL_SENSITIVITY |
enum | medium |
yes | low, medium, high |
Sensitivity for visual pattern detection. Per-org override via org.<org_id>.image_visual_sensitivity |
tier0_prompt_injection_enabled |
TIER0_PROMPT_INJECTION_ENABLED |
bool | true |
yes | — | Enable Tier 0 TF-IDF prompt injection pre-filter |
tier0_confidence_threshold |
TIER0_CONFIDENCE_THRESHOLD |
string | 0.95 |
yes | — | Confidence threshold for Tier 0 pre-filter. Above this threshold, text is blocked without running the full DLP pipeline |
Drift Detection
Section titled “Drift Detection”| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
drift_baseline_window_days |
DRIFT_BASELINE_WINDOW_DAYS |
int | 7 |
yes | 1–90 | Rolling baseline window in days for drift detection |
drift_comparison_window_minutes |
DRIFT_COMPARISON_WINDOW_MINUTES |
int | 60 |
yes | 1–1440 | Comparison window in minutes for drift detection |
drift_latency_threshold |
DRIFT_LATENCY_THRESHOLD |
string | 2.0 |
yes | — | Z-score threshold for latency drift anomaly flagging |
drift_topic_threshold |
DRIFT_TOPIC_THRESHOLD |
string | 0.3 |
yes | — | Jensen-Shannon divergence threshold for topic drift anomaly flagging |
drift_behavior_sensitivity |
DRIFT_BEHAVIOR_SENSITIVITY |
enum | medium |
yes | low, medium, high |
Behavior anomaly detection sensitivity (low=3σ, medium=2σ, high=1.5σ) |
Bias & Fairness
Section titled “Bias & Fairness”| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
fairness_audit_enabled |
FAIRNESS_AUDIT_ENABLED |
bool | true |
yes | — | Enable fairness violation audit event emission |
fairness_baseline_days |
FAIRNESS_BASELINE_DAYS |
int | 7 |
yes | 1–90 | Rolling baseline window in days for fairness analysis |
fairness_group_attributes |
FAIRNESS_GROUP_ATTRIBUTES |
string | department,role |
yes | — | Comma-separated user metadata attributes to compare for bias detection |
fairness_sentiment_threshold |
FAIRNESS_SENTIMENT_THRESHOLD |
string | 0.15 |
yes | — | Sentiment deviation threshold for flagging bias (0.01–1.0) |
Evaluation
Section titled “Evaluation”Model intelligence and evaluation settings.
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
eval_comparison_enabled |
EVAL_COMPARISON_ENABLED |
bool | true |
yes | — | Enable model comparison evaluation feature |
eval_max_prompts_per_comparison |
EVAL_MAX_PROMPTS_PER_COMPARISON |
int | 50 |
yes | 1–200 | Maximum prompts per model comparison run |
eval_analytics_trend_days |
EVAL_ANALYTICS_TREND_DAYS |
int | 30 |
yes | 1–365 | Default number of days for analytics trend data |
eval_health_weights |
EVAL_HEALTH_WEIGHTS |
string | {"latency":0.2,"quality":0.2,"safety":0.2,"fairness":0.2,"evaluation":0.2} |
yes | Valid JSON, must sum to 1.0 | Weights for health score computation per signal |
Agent Execution
Section titled “Agent Execution”| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
agent_enabled |
AGENT_ENABLED |
bool | false |
yes | — | Enable the autonomous agent execution framework |
agent_max_concurrent_sessions |
AGENT_MAX_CONCURRENT_SESSIONS |
int | 3 |
yes | 1–20 | Maximum concurrent agent sessions per tenant |
agent_max_steps |
AGENT_MAX_STEPS |
int | 20 |
yes | 1–100 | Maximum steps per agent session |
agent_step_timeout_seconds |
AGENT_STEP_TIMEOUT_SECONDS |
int | 30 |
yes | 5–300 | Timeout in seconds for each agent step |
Quotas
Section titled “Quotas”Default per-user quota limits applied when no explicit user or group quota is configured.
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
default_daily_token_limit |
DEFAULT_DAILY_TOKEN_LIMIT |
int | 1000000 |
yes | 0–100000000 | Default daily token limit per user (0 = unlimited) |
default_monthly_token_limit |
DEFAULT_MONTHLY_TOKEN_LIMIT |
int | 30000000 |
yes | 0–1000000000 | Default monthly token limit per user (0 = unlimited) |
default_daily_request_limit |
DEFAULT_DAILY_REQUEST_LIMIT |
int | 1000 |
yes | 0–1000000 | Default daily request limit per user (0 = unlimited) |
default_monthly_request_limit |
DEFAULT_MONTHLY_REQUEST_LIMIT |
int | 30000 |
yes | 0–10000000 | Default monthly request limit per user (0 = unlimited) |
default_daily_cost_limit_usd |
DEFAULT_DAILY_COST_LIMIT_USD |
int | 50 |
yes | 0–100000 | Default daily cost limit per user in USD (0 = unlimited) |
default_monthly_cost_limit_usd |
DEFAULT_MONTHLY_COST_LIMIT_USD |
int | 1500 |
yes | 0–1000000 | Default monthly cost limit per user in USD (0 = unlimited) |
Output Quality
Section titled “Output Quality”| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
output_scoring_enabled |
OUTPUT_SCORING_ENABLED |
bool | false |
yes | — | Enable output quality scoring (hallucination, relevance, toxicity, groundedness) |
output_scoring_timeout_ms |
OUTPUT_SCORING_TIMEOUT_MS |
int | 5000 |
yes | 1000–30000 | Skip output scoring if provider response latency exceeds this threshold (ms) |
quality_alert_threshold_hallucination |
QUALITY_ALERT_THRESHOLD_HALLUCINATION |
string | 0.3 |
yes | — | Alert when avg hallucination score drops below this (0.0–1.0) |
quality_alert_threshold_relevance |
QUALITY_ALERT_THRESHOLD_RELEVANCE |
string | 0.3 |
yes | — | Alert when avg relevance score drops below this (0.0–1.0) |
quality_alert_threshold_toxicity |
QUALITY_ALERT_THRESHOLD_TOXICITY |
string | 0.3 |
yes | — | Alert when avg toxicity score drops below this (0.0–1.0) |
quality_alert_threshold_groundedness |
QUALITY_ALERT_THRESHOLD_GROUNDEDNESS |
string | 0.3 |
yes | — | Alert when avg groundedness score drops below this (0.0–1.0) |
AppGuard
Section titled “AppGuard”| Key | Env Var | Type | Default | Editable | Description |
|---|---|---|---|---|---|
appguard_ml_enabled |
APPGUARD_ML_ENABLED |
bool | false |
yes | Enable ML classifier as primary threat scorer (falls back to heuristic if unavailable) |
appguard_ensemble_mode |
APPGUARD_ENSEMBLE_MODE |
bool | false |
yes | Run both heuristic and ML classifier, log A/B comparison in response |
SMTP delivery settings for transactional emails (account recovery, security notifications, invitations).
| Key | Env Var | Type | Default | Editable | Constraints | Description |
|---|---|---|---|---|---|---|
smtp_host |
SMTP_HOST |
string | "" |
yes | — | SMTP server hostname. Empty = dev mode (emails logged, not sent) |
smtp_port |
SMTP_PORT |
int | 587 |
yes | 1–65535 | SMTP server port (587 for STARTTLS, 465 for SSL) |
smtp_username |
SMTP_USERNAME |
string | "" |
yes | — | SMTP authentication username |
smtp_password |
SMTP_PASSWORD |
string | (masked) | yes | — | SMTP authentication password |
smtp_from_address |
SMTP_FROM_ADDRESS |
string | [email protected] |
yes | — | Sender address for transactional emails |
smtp_use_tls |
SMTP_USE_TLS |
bool | true |
yes | — | Use TLS/STARTTLS for SMTP connection |
Per-org overrides
Section titled “Per-org overrides”Several DLP and image scanning keys support per-org overrides using the naming convention org.<org_id>.<key_name>. These are stored as additional entries in the system_configs table and take precedence over the global key for the specified org.
Supported per-org keys:
org.<org_id>.image_ocr_enabledorg.<org_id>.image_ocr_providerorg.<org_id>.image_visual_detection_enabledorg.<org_id>.image_visual_sensitivitydlp_ner_force:<org_id>
Example — enable OCR for a specific org:
curl -X PUT https://gateway.arbitex.ai/api/v1/admin/config/org.550e8400-e29b-41d4-a716-446655440000.image_ocr_enabled \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"value": true}'See also
Section titled “See also”- Configuration Reference — environment variables across Platform, Cloud, and Outpost
- Platform Admin API — full admin endpoint surface including config management
- Deployment Guide — production configuration setup