HTTP status codes / 200
200 OK — HTTP Status Code
200 OK means the request succeeded. For a GET, the body is the page, file or data you asked for; for a POST, it describes the result of the action. A 200 only says the server thinks it succeeded, so an error message rendered with status 200 still looks healthy to anything that reads just the code.
200 OK is the standard success code: the server received the request, understood it and handled it, and the body contains the answer. Most of the responses a browser receives on a normal page load, the HTML, images, stylesheets and API calls, come back as 200.
What 200 means
RFC 9110 (Section 15.3.1) says 200 means the request has succeeded, and that what the body contains depends on the method:
| Method | What a 200 body holds |
|---|---|
| GET | The requested resource, such as a page or a JSON document |
| HEAD | The same headers as GET, with no body |
| POST | The status or result of the action |
| PUT, DELETE | The status of the action |
| OPTIONS | Communication options for the resource |
Outside of CONNECT, a 200 is expected to carry content unless its framing says the length is zero. If a client signals that it wants no content back, the RFC suggests 204 No Content instead.
Two more details from the RFC matter in practice:
- Caching. 200 responses are heuristically cacheable. A cache may store them even without
Cache-ControlorExpires, using its own rules to estimate freshness. - Validators. For GET and HEAD, the server should send validators such as
ETagandLast-Modified. Those let a browser later ask "has this changed?" and receive a cheap 304 Not Modified instead of the whole file again.
When you see it
Everywhere. Web servers return 200 for files that exist, application frameworks return it by default when a handler finishes without error, and APIs return it for successful reads and many writes.
Because 200 is the default, it is also what you get when software forgets to set a better code. That is the source of the most common 200-related problems.
When 200 is misleading
A 200 reports what the server believes, not what the user sees. Watch for these:
- Error pages with a success code. A framework catches an exception and renders a friendly "Something went wrong" template, but never changes the status from 200.
- Soft 404s. A missing product or article renders an empty template or a "not found" message with status 200. Search engines may treat these as missing pages anyway, and analytics count them as successful views.
- Maintenance pages. A maintenance mode that serves a holding page with 200 hides the outage from anything that reads only status codes. A 503 with
Retry-Afteris the honest answer. - Placeholder content. An expired hosting plan or a domain that stopped resolving to your server may produce a registrar or host placeholder page, often with 200.
- Partial renders. The HTML shell loads with 200, but a critical API call inside it fails, so users see a spinner forever.
The fix in each case is the same: return the code that matches reality, and verify content, not just status.
How to check it
Fetch only the headers:
curl -I https://www.example.com/
HTTP/2 200
content-type: text/html; charset=utf-8
cache-control: max-age=300
etag: "a1b2c3"
curl -I sends a HEAD request. Some applications treat HEAD differently from GET, so confirm with a real GET that prints the status and the start of the body:
curl -s -o page.html -w "%{http_code}\n" https://www.example.com/ && head -c 300 page.html
If the status is 200 but the saved HTML contains an error message, you have found a misleading 200.
What it means for uptime monitoring
A 200 is the clearest "up" signal. PingRobot's checker sends a GET, follows any redirects, and counts the final response as up when its status is between 200 and 399.
Because of the problems listed above, a status check alone cannot tell a real page from an error page served with 200. A keyword monitor goes one step further: after a successful status, it reads the first 512 KB of the body and checks that a word you choose is present (or, if you prefer, absent). Pick text that only appears on a healthy page, such as a product name in the footer or a heading from your home page, rather than something a template or error page would also contain. Keep the word within the first 512 KB of the HTML; on most pages that covers the whole document.
Related codes
- 201 Created — success that also created something
- 204 No Content — success with nothing to return
- 206 Partial Content — success for part of a file
- 304 Not Modified — the cache-validation counterpart of 200
- 404 Not Found — what a missing page should return instead of a soft 404
Start monitoring free — 10 monitors, no credit card.
Frequently asked questions
Does 200 OK mean my website is working?
It means the server answered and reported success. The page can still be blank, show a database error, or be a parked-domain placeholder. Checking for a word that only appears on a healthy page closes that gap.
What is a soft 404?
A page that says "not found" or is effectively empty but is served with status 200. Search engines may treat it as a missing page, and status-only monitors will report it as up. Return a real 404 instead.
Should an API return 200 or 204 when there is nothing to send back?
RFC 9110 suggests 204 No Content when the request indicates no content is wanted on success. Many APIs still return 200 with a small JSON body such as an id or status, which is also fine.
Can a 200 response be cached?
Yes. RFC 9110 marks 200 as heuristically cacheable, so caches may store it even without explicit headers. Use Cache-Control to say exactly how long, or no-store for personal data.