408 Request Timeout
What HTTP 408 means, how it differs from 504 and client-side timeouts, and what slow-request timeouts reveal about your infrastructure.
408 Request Timeout means the server was waiting for the client to finish sending its request — and gave up. The connection was open, but the request didn't arrive completely within the server's timeout window.
408 vs the other timeouts
| Symptom | What timed out |
|---|---|
| 408 | The client was too slow sending the request |
| 504 | An upstream server was too slow answering a proxy |
| Client-side timeout (no status at all) | The response didn't arrive before the client gave up |
A 408 is the rarest of the three in practice — many servers just close the connection silently instead of sending it.
Common causes
- Slow or flaky client networks — mobile clients uploading large bodies over poor connections
- Stalled uploads — the client advertised a
Content-Lengthand then stopped sending mid-body - Keep-alive housekeeping — some servers send 408 when closing an idle persistent connection; browsers retry transparently, but you'll see them in logs
- Aggressive server timeouts —
client_body_timeout(nginx) orRequestReadTimeout(Apache) set lower than real clients need - Slowloris-style attacks — deliberately slow request trickles designed to exhaust connections; timeouts sending 408 are the defense working
Debugging
Sporadic 408s from real users usually track client network quality — check whether they cluster by geography or mobile carrier. A spike in 408s can also be the early signature of a slow-request attack; look at how many connections are open in a "reading request" state.
If your own API calls time out, distinguish where: a 408 status means the server judged you slow; an exception with no response means your client timeout fired first. The free ping test and traceroute show whether latency and loss on the path explain slow request delivery, and a multi-region HTTP monitor tells you whether slowness is global or one network's problem.