Skip to content
On this page

HTTP 200 OK is the standard "success" status code: the server got your request, handled it, and sent back the response you expected. For a GET request (asking for a page), 200 means the page content is in the reply. For a POST request (sending data), it means the action completed. 200 is the default "everything worked" signal. But for web scrapers there's a catch: a 200 does not always mean the page actually contains the data you wanted.

Quick facts

Status code200
Category2xx Success
Default success responseBody contains the requested resource
Common gotcha (scraping)200 + bot-detection HTML body ("soft block")

What a 200 OK means

The HTTP spec (the rulebook for how browsers and servers talk) says a 200 means the request was understood, accepted, and the response body holds the result. For a GET, that body is the content at the URL you asked for. For a POST, it's usually a summary of what the action did. In theory, servers should never send 200 when something went wrong — that's the job of the 4xx codes (your mistake) and 5xx codes (the server's mistake). In practice, many servers return 200 anyway and just put an error message inside the body, because that's easier than setting the correct code. Because servers follow the rules loosely, a scraper can't trust a 200 as proof of success without also checking what's actually in the body.

Why 200 isn't always success for scrapers

Bot-detection systems often answer with a 200 even when they're blocking you — serving a challenge page, a "please enable JavaScript" notice, or an empty layout instead of the real content. Your HTTP client sees status 200 and calls it a win. Your parser then runs over the wrong HTML and either crashes or quietly pulls out nothing. This is called a soft block, and it's the sneakiest failure in scraping: if you only watch status codes, you never notice it happened. Solid production scrapers check two things after every fetch: the status code AND a structural signal that the expected content is really there (a known CSS selector, a specific JSON field, or a minimum response size).

How to validate a 200 response correctly

Use three layered checks. First, confirm the status code is 200 — if it's anything else, stop here and treat it as a failure. Second, confirm the response body is at least a reasonable size — a real product page is rarely under 5KB, so a 1KB "200 OK" is almost certainly a block page. Third, confirm at least one expected element exists — for example, `soup.select_one('.product-title')` should return an element, not None. If any of the three checks fail, treat the request as failed, queue a retry with a different proxy or fingerprint, and bump a separate "soft block" counter. That separate counter lets you tell "the site is broken" apart from "we're being detected."

Next in HTTP status codes explained · 2 of 8

The most common failure, and the least specific.

What Is a 404 Error?

Related terms

Concept map

Concept map

How 200 Status Code connects

The terms most directly tied to this one. Hover a node to see its neighbours, click to preview, drag to rearrange.

0 terms · 0 connections
You are here · HTTP Errors
Building map…

Frequently asked questions

Does 200 mean my scraper worked?

Only if the body also contains what you asked for. A 200 that returns a "please verify you're human" page in the body is a failed scrape — it just looks successful at the HTTP layer.

What's the difference between 200 and 204?

200 OK means success with content in the body. 204 No Content means success with an empty body — common for a DELETE, or for a PUT request that has nothing to send back.

Can I get a 200 from a CAPTCHA page?

Yes — most CAPTCHA challenge pages return 200, with the challenge HTML sitting in the body. To catch this you have to check the content itself, not just the status code.

Should my scraper retry on 200?

Only if your after-fetch validation fails. If the status is 200 and the body looks correct, you're done. If the status is 200 but the body looks like a block page, retry with a different identity (a new proxy or fingerprint).

Last updated: 2026-05-31