Skip to content
mxHeadless
REST API gateway for headless frontends on MODX 3. Resources, objects, OpenAPI, API keys, and OAuth
  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.