408 Request Timeout
The server timed out waiting for the client to send a complete request within the time it was willing to wait.
Defined in RFC 9110 §15.5.9
What 408 means
408 Request Timeout means the server was willing to wait for the client to finish sending a complete request but gave up before that happened, and it may close the connection without waiting for the client's next attempt. It differs from 504 Gateway Timeout, which describes a downstream server taking too long to respond after the request was fully received; 408 is specifically about the request never fully arriving.
Slow or unstable client networks, mobile connections with high latency, and large file uploads sent over a single non-resumable request are the usual causes. It also appears when a client opens a connection early, to reduce perceived latency, but delays sending the body, exceeding the server's read timeout. Load balancers and reverse proxies like nginx and AWS ALB generate their own synthetic 408s independently of the application when an idle connection exceeds their configured timeout.
A subtle variant involves keep-alive connection reuse: if a client reuses a persistent connection to send a second request just as the server's idle-keep-alive timeout is about to close it, the two can race, and the client sees a 408 or a reset connection instead of a normal response, which is why keep-alive timeout values are usually tuned to be longer at the edge, the load balancer, than at the origin server itself.
Common causes
- The client's network is slow or unstable, so the request body arrives too slowly.
- The client opened the connection well before it started sending the request body.
- A large file upload takes longer than the server's configured read timeout.
- The load balancer's or reverse proxy's idle-connection timeout is shorter than the client needs.
- A keep-alive connection is reused right as the server is about to close it for inactivity.
How to fix a 408
If you are the client (browser user or API caller)
- Retry the request, since 408 is often a transient network issue.
- Use chunked or resumable upload APIs for large payloads instead of one long-running request.
- Send the request body promptly after opening the connection rather than delaying.
If you run the server
- Increase the request or read timeout to match realistic upload sizes and client network conditions.
- Align keep-alive timeout values between the origin server and any load balancer or CDN in front of it.
- Offer resumable or chunked upload endpoints for large file transfers.
Example
POST /upload HTTP/1.1
Host: files.example.com
Content-Length: 52428800
[connection idles mid-upload]
HTTP/1.1 408 Request Timeout
Connection: closeTry it live
Our free status responder returns a real HTTP 408 you can point tests, monitors or a browser at.
GET https://mcp.httpstatus.com/status/408