Skip to main content
Back to Blog

Read a HAR p95 Without Blaming the Wrong API

A browser HAR mixes request types. Learn what the analyzer counts, why ten samples put p95 at the maximum, and what to save before making a performance claim.

Shashank Rawlani

Engineering Leader | Builder | Problem Solver | AI Engineer

Published Oct 4, 2026Updated Oct 14, 20263 min read
View AI-ready Markdown
Ten request-duration bars rise across a dark chart. Nine green bars cluster near a horizontal marker; the final orange bar rises far above the group and reaches a separate high-tail marker.
Export a sanitized HAR from the browser, then upload it to the HAR Response Time Analyzer. It reports the average, p50, p90, p95, p99, and the five slowest requests in that file. Check which requests the HAR contains before treating its p95 as an API target.

A page feels slow and someone asks for “the API p95.” A browser network export includes more than one API call. It may include images, fonts, and a request that waited behind another operation. One number across all of those requests can send the investigation to the wrong service.

Start with the capture

In Chrome DevTools, open Network, reproduce the journey, and export HAR (sanitized). Chrome says that option omits sensitive Cookie, Set-Cookie, and Authorization headers. The analyzer reads the file in the browser. You can also select “Try a sample” first to see the report layout without preparing a capture.

Upload the file. The top row shows request count, average time, p95, and p99. The next panels show all four percentiles, method and status counts, and the slowest URLs. Use the slowest list to find a request worth inspecting in DevTools; the report itself does not explain whether the delay was server work, transfer, or browser scheduling.

Ten requests, one slow tail

To test the calculation, the same parser was run with ten GET /orders HAR entries whose time values, in milliseconds, were:

90  100  110  120  130  140  150  160  170  1800

The analyzer reported an average of 297 ms, p50 of 130 ms, p90 of 170 ms, and both p95 and p99 of 1800 ms. It uses a nearest-rank percentile: p95 selects rank ceil(0.95 × 10) = 10, the slowest observation. That result is correct for this sample. It does not establish that 5% of future requests take 1.8 seconds. Collect more representative traffic before making a performance promise.

What the report includes

The analyzer counts every HAR entry with a request and a time value. It does not filter to API URLs or a particular status code. A static asset can therefore become the “slowest endpoint.” Export a focused capture or separate requests by endpoint before comparing this result with an API service objective. For a controlled load test and repeatable thresholds, use the k6 Script Generator as a starting point and verify the script against the actual service.

Does p95 tell me which request was slow? The percentile is a value, not an identity. The slowest list provides URLs to investigate, but a HAR can contain several requests with the same duration.

Can I use a HAR from any browser session? Check its contents first. Chrome offers a separate export with sensitive data; use the sanitized option for this workflow and inspect the file before sharing it elsewhere.

Capture a sample you can compare

Capture one reproducible journey. Record the URL set, sample count, p95, and the slowest request. Then repeat the same journey under comparable conditions. If the sample mixes unrelated requests, narrow the capture before drawing a conclusion.

HAR and percentile references