HTTP 503 Service Unavailable indicates the server is temporarily unable to handle the request due to overload or maintenance. Unlike 500 (unexpected error) or 502 (bad upstream), 503 explicitly means 'come back later.' The server SHOULD include a Retry-After header indicating when the service is expected to be available. This is the correct status for planned maintenance windows, deployment rollouts, and circuit breaker activations.
Response includes the status code, standard headers (including Content-Type), and a small diagnostic JSON body describing the request and returned status.
Simulator URL (copy in the app after load — not a normal link):
https://httpstatus.com/api/status/503
Example request:
curl -i "https://httpstatus.com/api/status/503"The server is currently unavailable (overloaded, down for maintenance, or rate limiting). Should include Retry-After header when possible.
On this code, Inspector focuses on semantics, headers, and correctness warnings that commonly affect clients and caches.
HTTP 503 Service Unavailable represents a specific server-side condition that requires different handling than other 5xx errors. Understanding the precise cause helps operations teams diagnose and resolve issues faster. Monitoring systems should distinguish 503 from other 5xx codes for accurate alerting and diagnosis.
// Handle 503 Service Unavailable
process.on('unhandledRejection', (reason) => {
console.error('Unhandled rejection:', reason);
});
app.use((err, req, res, next) => {
console.error(`${req.method} ${req.url}:`, err.stack);
res.status(err.status || 500).json({
error: process.env.NODE_ENV === 'production'
? 'Internal Server Error'
: err.message,
requestId: req.id
});
});from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging
logger = logging.getLogger(__name__)
@app.exception_handler(Exception)
async def server_error_handler(request: Request, exc: Exception):
logger.error(f'{request.method} {request.url}: {exc}',
exc_info=True)
return JSONResponse(
status_code=503,
content={'error': 'Service Unavailable', 'request_id': request.state.id}
)@ControllerAdvice
public class GlobalErrorHandler {
private static final Logger log = LoggerFactory.getLogger(
GlobalErrorHandler.class);
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(
Exception ex, HttpServletRequest req) {
log.error("{} {}: {}", req.getMethod(),
req.getRequestURI(), ex.getMessage(), ex);
return ResponseEntity.status(503)
.body(new ErrorResponse("Service Unavailable",
"An unexpected error occurred"));
}
}func errorMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("%s %s: %v\n%s",
r.Method, r.URL, err, debug.Stack())
w.WriteHeader(503)
json.NewEncoder(w).Encode(map[string]string{
"error": "Service Unavailable",
})
}
}()
next.ServeHTTP(w, r)
})
}