500 Internal Server Error
Something went wrong on the server — an unhandled exception, a bug in the application code, a misconfiguration, or a runtime error. It's a catch-all when the server doesn't know what else to say. Unlike 4xx errors, this is the server's fault, not the client's.
What can I do?
- This is not your fault. The website's server has an error. Try again in a few minutes. If it persists, contact the site administrator.
How to debug & fix
- Check your server error logs immediately — the actual exception will be there
- Set up proper error monitoring (Sentry, Datadog) to catch 500s before users report them
- Never expose stack traces to end users in production
- Implement global error handlers that log the error and return a clean 500 response
- Set up error monitoring (Sentry, Datadog) to receive alerts before users file reports.
- Never expose stack traces or internal paths in 500 responses sent to clients.
Code Example
// Global error handler — must be last middleware
app.use((err, req, res, next) => {
console.error(err); // log stack trace
// optionally send to Sentry
res.status(500).json({
error: 'Internal Server Error',
// never expose err.message in production
});
});
Related Status Codes
How HTTP Status Codes Work
Every HTTP response carries a three-digit status code that tells the client — browser, API consumer, or search-engine crawler — exactly what happened. The first digit defines the class: 1xx informational (request in progress), 2xx success, 3xx redirection, 4xx client error (bad request, missing auth, not found), and 5xx server failure.
Status codes are standardised in RFC 9110 (HTTP Semantics, 2022). Extensions like WebDAV (RFC 4918) and rate-limit headers (RFC 6585) added codes beyond the core set. When a client receives an unrecognised code, the rule is to treat it as the generic x00 of its class.
Why the Right Code Matters
Semantically correct codes help search engines index accurately (301 passes link equity; 410 removes pages faster than 404), allow API clients to implement correct retry logic (429 + Retry-After, 503 + Retry-After), and let monitoring systems distinguish bugs (500) from load issues (503) from auth failures (401/403).
Looking up a different status code? The full reference covers all HTTP codes with causes, fix guides, and copyable code examples for Node.js and Python.
Browse the full HTTP Status Code reference →