You're about to send a massive file over the internet: a high-resolution video, a database backup, a huge dataset. You click "upload," and for a moment, nothing seems to happen. Is it stuck? Did the connection fail? Is the server even awake over there?
Behind the scenes, a quiet but crucial conversation is happening between your computer and the server. It's a quick check, a preliminary handshake to avoid a catastrophic waste of bandwidth and time. And the key message in that handshake is a simple, almost invisible status code: 100 Continue.
Unlike its famous cousins like 200 OK
or 404 Not Found
, the 100 Continue status code operates in the shadows. It's part of the 1xx class informational responses, used not for the final answer, but for coordinating the conversation itself.
If you've never heard of it, you're not alone. But if you work with large file uploads, APIs that handle big payloads, or just want to understand the nuances of HTTP, this little code is a fascinating piece of the puzzle.
In this detailed blog post, we will explain everything you need to know about HTTP status code 100 Continue, what it means, why it exists, how it works behind the scenes, and some best practices when dealing with it. Plus, you'll discover how using tools like Apidog, a free and powerful API testing platform, can help you experiment with and debug requests involving this status code. The best part? You can download Apidog for free today and start testing HTTP responses like a pro.
Now, let's break down everything you need to know about the HTTP status code 100 Continue.
Setting the Stage: The 1xx Informational Class
To understand 100 Continue
, we first need to understand its family. The HTTP status code classes are:
- 1xx (Informational): "I got your request, and I'm working on it. Hold on." These are provisional responses.
- 2xx (Success): "I got your request, understood it, and successfully handled it."
- 3xx (Redirection): "You need to go somewhere else to finish this."
- 4xx (Client Error): "You messed up the request."
- 5xx (Server Error): "I messed up handling your request."
The 1xx codes are unique because they are headers-only responses. The server sends the status line and headers, but has no body to send yet. They are simply an update on the status of the connection.
The Problem: Avoiding the "Wasteful Upload"
Imagine you're mailing a giant, heavy package to a company. You spend $50 on shipping, carefully package it, and send it off. A week later, the package arrives back on your doorstep with a note: "We're closed for vacation."
You've wasted time, effort, and money because the recipient wasn't ready to accept it.
This is the problem the 100 Continue
status code is designed to prevent in the digital world. In the early days of the web, a client might try to send a large POST request (like a file upload) to a server. The client would spend time and bandwidth sending the entire, multi-megabyte body of the request, only to have the server immediately reject it with a 401 Unauthorized
or 404 Not Found
error because it didn't have the right permissions or the URL was wrong.
The entire payload was transmitted for nothing. The 100 Continue
mechanism was introduced to add a simple "Are you ready for this?" check before the big data transfer begins.
This is especially useful when a client is sending a large payload (like a file upload or form data). Instead of sending the entire body right away, the client first sends just the headers. The server can then respond with 100 Continue, essentially saying, "All good continue sending the rest."
In other words, when the server sends back this 100 Continue response, it's giving the client a green light to send the rest of the request data, usually the message body, like a file upload or form data.
Why Was the 100 Continue Status Code Introduced?
Before 100 Continue existed, clients like web browsers or API clients would blindly send the entire request, including large bodies, without knowing if the server would accept the request headers.
Imagine you're trying to upload a 1GB file to a server. Without 100 Continue
, your client would just start sending the entire file immediately. But what if the server rejects the request due to authentication, content type, or rate limits? You just wasted bandwidth sending a huge payload.
With 100 Continue
:
- The client sends headers with an
Expect: 100-continue
request. - The server evaluates those headers.
- If everything looks good, the server replies with 100 Continue.
- Only then does the client send the body.
The 100 Continue mechanism acts as a checkpoint, preventing clients from sending potentially large or unnecessary payloads before server approval. This handshake avoids wasted effort.
How Does the 100 Continue Mechanism Work?
Here's a simple step-by-step example of the 100 Continue process:
- Client sends only headers initially: The client begins by sending request headers including an
Expect: 100-continue
header, indicating it wants to wait for server approval before sending the body. - Server evaluates headers: The server reviews the headers to decide if it’s ready to process the full request.
- Server responds with 100 Continue: If the server is okay, it sends back the HTTP 100 Continue informational response.
- Client sends the request body: Upon receiving 100 Continue, the client proceeds to send the message body.
- Final server response: After processing the full request, the server sends the final status like 200 OK, 401 Unauthorized, etc.
If the server decides early that the request will fail (for example, invalid authentication), it can respond immediately with a final error status instead of 100 Continue, saving the client from sending the data.
What Does "100 Continue" Actually Mean?
The 100 Continue
status is part of a two-step process:
1. The Client's "Ask": The client sends the request headers, but it intentionally holds back the request body. It includes a special header: Expect: 100-continue
. This is the client saying, "Hey server, I have a body to send you. Are you ready to receive it? Here are the headers so you can decide."
2. The Server's "Answer": The server looks at the headers the HTTP method, the URL, the Content-Length
, the Authorization
header and makes a quick decision.
- If the server is happy (the URL is valid, the user is authorized, it's willing to accept the data), it responds with
HTTP/1.1 100 Continue
. This is the server saying, "Everything looks good so far! Green light! Send the body." - If the server is not happy (e.g., the user is not authorized, the URL is invalid, the file is too big), it can immediately respond with a final error code like
401 Unauthorized
or413 Content Too Large
. This is the server saying, "Red light! Stop! Don't waste your time sending the body because I will just reject it."
3. The Client's Next Move:
- If it gets the
100 Continue
, it proceeds to send the entire request body. - If it gets an error, it stops the transfer, saves a ton of bandwidth, and handles the error.
- If it doesn't get any response after a while (a timeout), it may decide to send the body anyway, as not all servers support the
Expect
handshake.
When Is 100 Continue Typically Used?
This mechanism isn't used for every request. It's specifically beneficial in these scenarios:
- Large Request Bodies: The primary use case is for requests with large payloads (e.g., file uploads, big JSON or XML documents). The overhead of the extra round trip is worth it to avoid the massive cost of sending unwanted data.
- Requests with Sensitive Headers: When a request requires authentication (
Authorization
header), it's wise to check if the authentication is valid before sending the potentially sensitive data in the body. - Uncertain Server State: If the client isn't sure the server can handle the request (e.g., it might be overloaded), the
Expect
handshake acts as a preliminary check.
What Does the ‘Expect: 100-continue’ Header Do?
Clients send this header to ask the server to confirm before sending the body basically saying:
"Let me send you the request headers first, and if you say 100 Continue, I’ll send the body next."
If this header is missing, the client usually sends the whole request at once without waiting for permission.
Example of 100 Continue in Action
Let's look at an example request with curl:
curl -v -H "Expect: 100-continue" -d @largefile.zip <http://example.com/upload>
In the verbose output, you might see something like:
> Expect: 100-continue
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
This means:
- The server first acknowledged the headers with
100 Continue
. - Then, after receiving the body, it responded with
200 OK
.
Advantages of Using 100 Continue
Why should you care about 100 Continue
? Here are some advantages:
- Bandwidth savings: Don't send large payloads unless the server is ready.
- Faster error detection: Server can reject bad requests early.
- Improved efficiency: Especially useful for APIs handling large uploads.
- Scalability: Helps servers manage load by validating headers first.
How Should Clients Behave When Receiving 100 Continue?
- On receiving 100 Continue, the client must send the request body immediately.
- If the client times out waiting for 100 Continue, it may send the body anyway.
- If the server responds with an error status instead of 100 Continue, the client should not send the body.
- Once the body is sent, clients should correctly handle the final status response.
What Should Servers Do Regarding 100 Continue?
- When receiving a request with
Expect: 100-continue
, a server should promptly reply with 100 Continue if it accepts the headers. - If the headers are invalid or authentication fails, it should send an appropriate error status (like 417 Expectation Failed or 401 Unauthorized).
- If the client sends the entire body before the server responds, the server may skip sending 100 Continue and just send the final status.
- Servers should support persistent connections, allowing multiple requests to reduce connection overhead.
Common Challenges With 100 Continue Handling
While useful, 100 Continue
can sometimes cause problems:
- Incorrect server implementations: Some servers don’t handle 100 Continue correctly, causing delays or errors.
- Client compatibility issues: Older clients or proxies might not understand
Expect: 100-continue
. - Increased latency: The additional round-trip for 100 Continue may add slight delay.
- Proxy interference: Intermediate proxies may mishandle headers or responses, disrupting expectation flow.
- Added complexity: Adds an extra step in the request cycle.
- Configuration quirks: Some HTTP clients disable
Expect: 100-continue
by default.
Troubleshooting 100 Continue Issues
- Check if clients send
Expect: 100-continue
only when needed. - Monitor server responses and ensure timely 100 Continue messages.
- Use debugging tools like Apidog to simulate requests with and without
Expect
headers. - Analyze proxy and firewall behavior if requests stall or fail.
- Update server and client libraries for proper HTTP/1.1 compliance.
How Apidog Helps You with 100 Continue and API Testing

Testing protocols involving 100 Continue can get complex because they're part of a multi-step handshake. This is where Apidog becomes incredibly useful:
- Allowing you to simulate HTTP requests with the
Expect: 100-continue
header. - Automating testing workflows that involve large payloads or multi-step requests.
- Capturing complete request-response cycles, including interim 100 Continue responses.
- Helping developers debug and ensure their clients and servers handle 100 Continue properly.
- Share test cases with your team to ensure consistent handling.
By using Apidog, you can validate that your client and server handle the 100 Continue
flow correctly without wasting time or bandwidth. Download Apidog for free today to power up your API testing and development!
Important Considerations and Best Practices
- It's Optional: Clients cannot rely on always receiving a
100 Continue
response. Some servers ignore theExpect
header and just wait for the full request. Well-behaved clients should have a timeout after which they just send the body anyway. - Server Support: Not all web servers or application frameworks handle the
Expect
header by default. You might need to configure them to properly support it and send the100 Continue
response when appropriate. - The Final Response is What Matters: Remember,
100 Continue
is not a success message. The final response like200 OK
or201 Created
is still what determines the ultimate outcome of the operation. The100
is just a provisional "all clear" for the body transmission. - HTTP/2 and Beyond: The
Expect: 100-continue
mechanism is a feature of HTTP/1.1. HTTP/2 has different, more efficient ways of managing flow control and headers, but the semantic meaning can still be applied.
Alternatives and Related Status Codes
While 100 Continue
is the most common 1xx informational code, there are others worth knowing:
- 101 Switching Protocols: Used for WebSocket handshakes.
- 102 Processing (WebDAV): Indicates the server is working on it.
- 103 Early Hints: Allows servers to preload resources before final response.
Each serves a similar purpose: improving efficiency and communication between client and server.
Why Most People Don't See It
If you're a web developer, you might have gone your entire career without explicitly handling this code. Why?
- Abstraction: Modern high-level programming frameworks and HTTP client libraries handle the entire
Expect
handshake automatically. - Different Solutions: For large file uploads, many modern applications use techniques like chunked uploads (breaking the file into pieces) or dedicated services (like AWS S3 presigned URLs), which have their own flow.
- Perception: The process is so seamless that it happens without the application developer needing to intervene.
Conclusion: The Unsung Hero of Efficiency
The HTTP 100 Continue
status code is a testament to the clever, efficiency-minded design that underpins the web. It's a small protocol feature that prevents a potentially large waste of resources. It represents a cooperative handshake between client and server, ensuring they're both in agreement before committing to a significant data transfer.
So, what is status code 100 Continue? In short: it's an interim response that tells the client, "I’ve checked your headers, go ahead and send the body."
It's all about efficiency, saving bandwidth, reducing wasted effort, and making APIs more responsive. While not every system needs it, 100 Continue
is especially valuable for large uploads and data-heavy APIs.
While you may not code against it every day, understanding its purpose gives you a deeper appreciation for the complexities of network communication and the importance of building robust, efficient applications. And when you need to dive deep into that communication, having a powerful tool like Apidog in your arsenal ensures you can see, understand, and optimize every single part of the conversation, from the first Expect
header to the final 200 OK
.
So don't guess. Download Apidog for free today and test smarter.