Guide

How to Read a HAR File Without Guessing

Learn how to read a HAR file with a four-request example: compare status and timing, separate unknowns from zero, and write a reviewed bug-report handoff.

Read requests, then explain the observed failure

To read a HAR file, compare each request’s method, path, HTTP status, and recorded total time with the action the tester took. Start with the first observed failed response, then inspect nearby requests and timing phases. A HAR records network evidence; it does not record the user’s intent or prove which component caused a bug.

This guide uses a four-request fictional checkout trace. Download the actual teaching file, then choose it in the HAR analyzer to see the same rows. It is synthetic data, not a customer session.

Find the fields behind a HAR row

Use the downloaded teaching file to connect the table to the raw record. In log.entries[2], request.method is POST, request.url identifies /api/orders, response.status is 500, and time is the recorded 1,400 ms total. timings.wait is one phase of that total; it is not a separate duration to add on top. Entry indexes start at zero, so this is table row three.

To inspect the file in Chrome itself, open DevTools Network and use Import HAR in the action bar, or drag the file into the request table. Chrome documents both import methods. Import displays saved requests for analysis; it does not replay the checkout action. Review private fields before importing a real customer file into any tool.

Work through four captured requests

The file contains these entries in capture order. The table uses the analyzer’s projected status and total time; “unknown” represents a negative or missing duration, not zero milliseconds.

Four fictional HAR requests and what each one shows
RequestStatusTotalWhat the row shows
#1 GET /checkout200120 msThe page received a successful HTTP response; checkout completion remains untested.
#2 GET /assets/checkout.js200300 msThe asset loaded. It is the longest successful request here, without a claim that 300 ms is universally slow.
#3 POST /api/orders5001,400 msThe first recorded HTTP error response and the longest known total in this trace.
#4 GET /api/order-status0unknownNo HTTP response was recorded. The file gives no valid total duration for this row.

The analyzer reports 4 requests, 2 failed or without an HTTP response, and 1 missing total timing. It counts status 500 and status 0 in its Failed filter. A status 0 is not an HTTP error code returned by a server; investigate why no response was recorded before assigning a reason. A 3xx redirect in another trace would not automatically be a failure: inspect its destination and the next request. See the HTTP status reference for the meaning of a returned code.

Read time without double-counting or guessing

The 1,400 ms order request

Its recorded wait phase is 1,365 ms. That points to where most recorded time sits, but Chrome’s Network timing reference says waiting for the first byte includes a network round trip and server preparation. It is not a pure backend execution measurement.

The first page request records connect at 20 ms and ssl at 15 ms. Chrome includes SSL negotiation within initial connection, so adding both would double-count part of the connection. The later rows use -1 for unavailable connection phases; the analyzer shows them as unknown. Keep the recorded total instead of recomputing it from every phase.

The fourth teaching row deliberately has unavailable required timing values; the analyzer accepts it as incomplete evidence. The sanitizer normalizes those values for HAR compatibility and derives a numeric total without adding SSL twice. ContextCapture reimports its own export using bounded timing markers, keeping this row’s total and required phases unknown. Other readers may ignore those markers and display the derived zero; it is not a measured instant response.

The fourth row starts after the order request starts, but the order request lasts 1.4 seconds and their intervals overlap. Capture order alone does not show that the order response caused the status request or the visible failure. Check the exact user action, initiators, application logs, and repeat attempts before describing a causal chain. Chrome’s Waterfall and initiator views can help inspect relationships in a real recording.

Decide what to investigate from this trace

For the teaching file, follow up on #3 POST /api/orders first because it has a recorded 500 response during the stated action. Keep #4 GET /api/order-status as a separate unanswered question: status 0 and unknown timing do not establish whether it reached a server. Compare the action time and any request identifier with application logs if your team has access; do not report a server failure for row four from the HAR alone.

If a real trace shows only 200 responses while the page still fails, report that mismatch and the visible result. HTTP success describes the response, not whether the user completed checkout; the HTTP status reference defines the code classes.

Turn the trace into a reviewed bug report

Pair the synthetic file with a separate fictional tester note: “On test checkout, pressed Place order once. Expected confirmation or a visible validation message; checkout stayed open. The trace shows #3 POST /api/orders returned 500 in 1,400 ms, while #4 GET /api/order-status has no recorded HTTP response or valid total. Browser version, repeat frequency, and root cause are unknown.” The action and visible result come from the tester note, not from the HAR.

For a real report, record the tested release and browser, starting state, exact action, expected and actual results, attempt count, and only the network observations you verified. Share the smallest useful summary. If the team needs the file, use the HAR sanitizer and review retained hosts, paths, timestamps, and any private content before sending it. Then add the findings to the bug-report generator or compare the handoff with the sample report.

Need to make your own trace? Follow the Chrome HAR capture guide. Need to make the observed action repeatable? Use the reproduction-steps guide.

Published October 9, 2026. Updated October 10, 2026. Method: the values above come from the downloadable fictional HAR and this site’s current analyzer projection; timing interpretation follows Chrome’s linked Network reference.

Examples for your team

Builder example

A builder reviews a synthetic checkout trace and records a 500 response without declaring its cause.

Start your 14-day free trial

Agency / QA example

A QA tester distinguishes a request with no recorded HTTP response from a slow request before sharing findings.

Start your 14-day free trial

Capture the next report with ContextCapture

Start a 14-day free trial. The beta plan is $7.99 per month for unlimited projects and reports, with up to five team members.