HTTP Error Analyzer
Check what a URL is actually returning right now, or look up any status code 400–504 for common causes and the diagnostic steps that actually narrow it down.
400 — Bad Request
Likely causes:
- Malformed request syntax (bad JSON, invalid headers)
- Request body too large for a proxy/server limit
- A client-side bug sending an invalid parameter
What to check:
- Inspect the actual request body/headers in browser DevTools → Network tab
- Check the app or API server's error log for the specific validation failure
401 — Unauthorized
Likely causes:
- Missing or expired auth token/session
- Wrong credentials sent
- Clock skew breaking time-based tokens (JWT, HMAC signatures)
What to check:
- Confirm the Authorization header is actually being sent
- Check server time is correct — `timedatectl status`
403 — Forbidden
Likely causes:
- Valid auth, but insufficient permissions for this resource
- IP allowlist/firewall blocking the request
- File permissions denying the web server read access
What to check:
- Check web server error log for the specific denial reason
- Verify file/directory permissions with the chmod calculator if it's a static file
404 — Not Found
Likely causes:
- URL typo or the resource genuinely doesn't exist
- Missing rewrite/routing rule for a single-page app
- DNS pointing to the wrong server entirely
What to check:
- Confirm DNS resolves where you expect it to
- Check Nginx/Apache rewrite rules for SPA fallback routing
405 — Method Not Allowed
Likely causes:
- Client sent POST to a GET-only endpoint (or vice versa)
- A reverse proxy stripping or rewriting the HTTP method
- CORS preflight (OPTIONS) not handled by the server
What to check:
- Confirm which methods the endpoint actually accepts
- Check for an OPTIONS handler if this is a cross-origin API call
408 — Request Timeout
Likely causes:
- Client connection too slow to finish sending the request
- Server-side timeout set too aggressively for large uploads
- Network issue between client and server
What to check:
- Check client_body_timeout (Nginx) or similar directive
- Test from a different network to rule out client-side connectivity
409 — Conflict
Likely causes:
- Concurrent edits to the same resource (optimistic locking failure)
- Trying to create a resource that already exists (duplicate key)
- State machine violation (e.g., cancelling an already-completed order)
What to check:
- Check application logs for the specific constraint that failed
- Look for a version/ETag mismatch in the request
429 — Too Many Requests
Likely causes:
- Rate limit genuinely exceeded
- A retry loop in client code hammering the endpoint
- Rate limit configured too strictly for legitimate traffic
What to check:
- Check the Retry-After response header for the cooldown period
- Review rate-limit config — Nginx limit_req zone, API gateway settings
500 — Internal Server Error
Likely causes:
- Unhandled exception in application code
- Database connection failure
- Misconfiguration (missing environment variable, bad config file)
What to check:
- Check application error logs — this is almost always logged server-side
- Check PHP-FPM error log if running PHP: /var/log/php-fpm/www-error.log
501 — Not Implemented
Likely causes:
- Server doesn't support the requested HTTP method at all
- A proxy forwarding an unsupported method to the backend
What to check:
- Confirm the web server/framework actually implements this method
502 — Bad Gateway
Likely causes:
- Upstream application server (PHP-FPM, Node, Gunicorn) crashed or isn't running
- Reverse proxy pointing to the wrong upstream address/port
- Upstream returned a malformed response
What to check:
- Check if PHP-FPM/your app process is actually running: `systemctl status php-fpm`
- Check the Nginx error log for the specific "connect() failed" message
- Verify the upstream host:port in your Nginx config matches where the app is actually listening
503 — Service Unavailable
Likely causes:
- Server overloaded — all worker processes busy
- App deliberately in maintenance mode
- Upstream health check failing in a load balancer
What to check:
- Check worker/connection limits with the PHP-FPM or Nginx worker calculator
- Check if a maintenance-mode flag or file is set
504 — Gateway Timeout
Likely causes:
- Upstream application taking longer than the proxy's timeout to respond
- A slow database query blocking the response
- Network issue between the proxy and the upstream server
What to check:
- Check proxy_read_timeout (Nginx) against how long the backend actually takes
- Profile the slow endpoint — is it a specific slow query?