Skip to content
  1. Extras
  2. mxHeadless
  3. Getting started
  4. System settings

System settings

Namespace: mxheadless. Keys use underscores (mxheadless_cors_enabled), not dots.

From 1.0.42, upgrade migrates values from old dotted keys (mxheadless.cors.enabled) to the new names.

API

KeyTypeDefaultDescription
mxheadless_api_prefixtextfield/apiPublic prefix before /v1
mxheadless_contexttextfieldwebMODX context key for API bootstrap (api.php, gateway). Value mgr is ignored and falls back to web

Core

KeyTypeDefaultDescription
mxheadless_enabledcombo-booleantrueKill switch. When false, only GET / and GET /health work. Everything else → 503 (service_disabled)
mxheadless_debugcombo-booleanfalseException details in problem+json (dev only)
mxheadless_swagger_enabledcombo-booleantrueSwagger UI on GET /docs. OpenAPI JSON stays available when false

Cache

KeyTypeDefaultDescription
mxheadless_cache_enabledcombo-booleantrueHTTP cache for anonymous GET/HEAD with ETag
mxheadless_cache_ttlnumberfield300max-age for public responses (seconds)

Rate limit

KeyTypeDefaultDescription
mxheadless_rate_limit_enabledcombo-booleantrueLimit by identity/IP
mxheadless_rate_limit_max_requestsnumberfield120Requests per window
mxheadless_rate_limit_window_secondsnumberfield60Window length (seconds)

Per-key overrides: columns rate_limit_max, rate_limit_window on mxheadless_api_keys and mxheadless_oauth_clients.

CORS

KeyTypeDefaultDescription
mxheadless_cors_enabledcombo-booleanfalseCORS for cross-origin SPAs
mxheadless_cors_allowed_originstextareaemptyComma-separated origins or *
mxheadless_cors_allowed_methodstextfieldGET,POST,PUT,PATCH,DELETE,OPTIONSPreflight methods
mxheadless_cors_allowed_headerstextfieldAuthorization,Content-Type,X-Request-ID,X-CSRF-Token,X-Context,X-API-Key,Idempotency-KeyAllowed headers
mxheadless_cors_expose_headerstextfieldETag,X-Request-ID,X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset,Idempotency-ReplayedExpose-Headers for JS
mxheadless_cors_allow_credentialscombo-booleanfalseDo not combine with origins=*

Details: CORS.

Security and idempotency

KeyTypeDefaultDescription
mxheadless_max_body_bytesnumberfield1048576Max body size (1 MB)
mxheadless_max_uri_bytesnumberfield2048Max URI length
mxheadless_trusted_proxiestextareaemptyProxy IPs for X-Forwarded-For
mxheadless_csrf_enabledcombo-booleantrueCSRF for session mutations
mxheadless_idempotency_enabledcombo-booleantrueIdempotency-Key on POST
mxheadless_idempotency_ttlnumberfield86400Idempotency cache TTL (seconds)

OAuth

KeyTypeDefaultDescription
mxheadless_oauth_enabledcombo-booleanfalsePOST /auth/token
mxheadless_oauth_token_ttlnumberfield3600mxt_* TTL (seconds)
mxheadless_oauth_password_grant_enabledcombo-booleanfalsepassword grant

Webhooks

KeyTypeDefaultDescription
mxheadless_webhook_max_attemptsnumberfield5Delivery attempts before failed
mxheadless_webhook_worker_limitnumberfield50Default --limit for worker
mxheadless_webhook_allow_private_urlscombo-booleanfalseDev: localhost/private IP (also relaxes TLS verify)

Audit

KeyTypeDefaultDescription
mxheadless_audit_enabledcombo-booleanfalseLog to mxheadless_api_log
mxheadless_audit_retention_daysnumberfield90Retention for audit-prune.php
mxheadless_audit_log_getcombo-booleanfalseLog GET requests

Query limits (code defaults)

QueryParser reads these via getOption. You can add them as system settings:

KeyDefault
mxheadless_max_limit100
mxheadless_max_offset100000
mxheadless_max_fields50
mxheadless_max_include_relations10
mxheadless_max_include_depth2
mxheadless_allowed_contextsweb,mgr

See Limits.