Guide
HTTP Status Codes for Bug Reports
Use HTTP status codes as bug-report evidence: understand 2xx to 5xx, compare 401 and 409 examples, and record observations without guessing the cause.
Use the code as evidence, not a diagnosis
An HTTP status code describes a response to one request. In a bug report, record the action, request method and safe path, code, time, and what the person saw on the page. Then compare that response with the expected outcome. A 200 response can accompany a failed business outcome, and a 500 response does not identify the failing component by itself.
The classes are a quick first pass: 1xx is informational, 2xx indicates HTTP success, 3xx is redirection, 4xx is a client-error response, and 5xx is a server-error response. “Client error” describes the request/response class, not who is at fault. A redirect is not automatically a bug; 304, for example, supports cache reuse. These meanings follow MDN’s status reference and the HTTP Semantics specification.
Codes worth recording in a browser bug report
These are short meanings, not a diagnosis. The right column tells a reviewer what else to collect for the affected action.
| Code | Response meaning | Record with the code |
|---|---|---|
| 400 | Request could not be processed as sent | Method, safe input shape, and response message. |
| 401 | Authentication is required | Signed-in state, action, and whether a fresh sign-in changes the result. |
| 403 | Access is refused | Test account role and the resource requested. |
| 404 | Resource is not available here; existence may be concealed | Expected route or item, tested permissions, and exact response. |
| 409 | Request conflicts with current state | Starting version, edit order, and any conflict message. |
| 422 | Content is understood but cannot be processed semantically | Field or response detail, with private values removed. |
| 429 | Too many requests in a time window | Attempt count and Retry-After if the response includes it. |
| 500 | Generic server error response | Action, method, path, time, and visible result. |
| 502 | Gateway received an invalid response | Which request and gateway response were visible. |
| 503 | Service is unavailable | Time, retry behavior, and Retry-After if present. |
| 504 | Gateway did not receive a response in time | Request timing and what the page displayed. |
A status 0 shown by some network recordings means no HTTP response code was recorded; it is not a code sent by an HTTP server. Check the request’s surrounding evidence before deciding whether it was cancelled, blocked, or interrupted. The HAR reading guide works through a synthetic status-0 row.
Two fictional outcomes that need different follow-up
401 after an idle save attempt
A test editor leaves a draft open, changes its title, and presses Save. The request returns 401; the page shows a sign-in prompt and the draft stays unchanged. After signing in again, a later save succeeds.
Report both attempts, the tested role, and the visible prompt. The sequence makes a session-related hypothesis reasonable to investigate, but the status alone does not prove exactly why authentication failed.
409 after two editors change one draft
Two fictional test editors open the same draft. Editor B saves first; Editor A then submits an older version. The request returns 409, and the page says only “Save failed.”
Record the edit order, response, and lack of recovery guidance. A conflict response may be expected protection against overwriting work; the review question is whether the user can understand and resolve it.
Contrast both with a fictional checkout POST /api/orders returning 500 while the button remains loading. That is a generic error response plus a visible failure. Record the attempt and inspect logs before naming a root cause.
When a retry changes the evidence
Suppose a fictional form submission returns 429 and includes Retry-After. Record that header, the attempt count, and whether the page told the tester when to try again; MDN’s 429 reference describes the optional header. Do not repeatedly submit just to measure a limit. If the later attempt returns 200 but the form still appears unsent, report both responses and the visible state as separate observations.
For a 401 after a fresh sign-in, keep the role, request path, and new attempt time. The code identifies an authentication response, while the before-and-after comparison helps the team investigate what changed.
Copy a report structure, then replace the example facts
This static snippet uses the fictional 401 case. Select and copy it into your own notes, then replace each value with observations from the actual attempt. Keep private URLs, tokens, and personal data out of shared evidence.
Title: Save asks me to sign in after an idle test session
Starting state: Signed in as a test editor, draft open, then idle before saving.
Action: Change the draft title and press Save once.
Expected: The change saves or the page clearly asks me to sign in again.
Actual: A sign-in prompt appears; the draft remains unchanged.
Network observation: POST /api/drafts/42 returned HTTP 401 at 14:32 in this fictional attempt.
Follow-up: A fresh sign-in allowed a later save. Exact session expiry cause is unconfirmed.To collect network evidence, follow the HAR capture guide and inspect the file with the HAR analyzer. A console excerpt may add context, but it does not replace a response code. Pair the reviewed result with repeatable steps in the bug-report generator; the sample report shows a fuller handoff.
Published October 9, 2026. Updated October 10, 2026. Method: status meanings are condensed from the linked MDN and HTTP Semantics references; the scenarios and snippet are invented teaching examples.
Examples for your team
Builder example
A builder records a 401 response during a fictional save attempt alongside the visible sign-in prompt and tested session state.
Start your 14-day free trialAgency / QA example
A QA tester compares a fictional 409 edit conflict with a 500 checkout response, keeping observed codes separate from suspected causes.
Start your 14-day free trial