Skip to content
  1. Extras
  2. mxHeadless
  3. Operations
  4. Troubleshooting

Troubleshooting ​

404 on /api/v1 ​

  • Friendly URLs and rewrite to index.php
  • Prefix mxheadless_api_prefix matches the URL
  • mxHeadless plugin is active
  • Fallback: api.php?route=/v1/health

503 service_disabled ​

mxheadless_enabled=false. Re-enable or keep only health for maintenance.

401 / 403 ​

  • Protected route needs credentials
  • Key scope does not cover the action → scope_denied
  • Invalid or revoked key → invalid_token

429 ​

Rate limit. Check X-RateLimit-*. Raise global or per-key limit. Verify trusted proxies (otherwise everyone behind LB shares one IP).

422 ​

Unknown field/filter/sort, bad JSON, page+offset together, max_fields exceeded.

CORS not working ​

  • mxheadless_cors_enabled=true and the SPA origin is in mxheadless_cors_allowed_origins
  • Do not combine * with mxheadless_cors_allow_credentials=true
  • Preflight OPTIONS reaches MODX (rewrite, not blocked by WAF)
  • Compare the origin with data.cors in discovery (GET /api/v1)
  • With CORS disabled, cross-origin fetch from the browser fails on the client: expected, not "open access"

Details: CORS.

Webhooks not firing ​

  • Worker in cron
  • URL passes SSRF check
  • Subscription is active
  • Check mxheadless_webhook_deliveries

CSRF on POST from mgr ​

Send X-CSRF-Token. Bearer API keys do not need CSRF.

Logs ​

Enable mxheadless_debug temporarily on staging only. For request history, see audit-log.