| 9 min read

p50 vs p95 vs p99: Understanding API Latency Percentiles

Your average response time is lying to you. This guide explains what latency percentiles actually measure, why the slowest 1% of requests hurts your busiest users the most, and which percentile you should set your alerts on.

p50 vs p95 vs p99: Understanding API Latency Percentiles

Why Averages Lie About Latency

Imagine an API that answers 99 requests in 100 ms and one request in 10 seconds. Its average response time is about 199 ms — a number that describes precisely none of the hundred requests. The 99 fast ones were twice as fast as the average suggests; the slow one was fifty times worse. This is not a contrived example: real-world latency distributions are heavily skewed, with a long tail of slow requests caused by garbage collection pauses, cold caches, lock contention, and overloaded dependencies.

Averages hide that tail by design — they smear the outliers across all the fast requests until everything looks fine. A latency chart built on averages can stay perfectly flat while a growing fraction of your users stares at timeouts. That is why every serious monitoring practice replaces (or at least supplements) the average with percentiles, which answer a much more honest question: "how slow is it for the unluckiest X% of my requests?"

What p50, p95, and p99 Actually Mean

A percentile is a simple idea: sort all response times from fastest to slowest, then read the value at a given position. p50 (the median) is the middle value — half your requests were faster, half were slower. It describes the typical experience and is far more robust than the average, because a handful of extreme outliers cannot drag it around.

p95 is the value below which 95% of requests fall — put differently, 1 in 20 requests is slower than this. It captures the experience of your unlucky-but-not-rare users. p99 marks the slowest 1% — 1 in 100 requests. It sounds negligible until you do the arithmetic: at one million requests per day, p99 describes 10,000 requests, every single day.

A healthy way to read the trio: p50 tells you what your API feels like, p95 tells you what your users complain about, and p99 tells you what your systems are hiding from you. The gap between them matters as much as the values: a p50 of 100 ms with a p99 of 150 ms is a tight, predictable service; a p50 of 100 ms with a p99 of 4 seconds is a time bomb.

Why Tail Latency Hits Your Best Customers Hardest

The counterintuitive property of tail latency is that it does not distribute evenly — it concentrates on your most active users. A user who makes one request has a 1% chance of hitting your p99. A user whose page load fans out into 40 API calls has a 33% chance that at least one of them lands in the slowest 1%. And because the page is only as fast as its slowest call, your heaviest users — the dashboards, the integrations, the power customers — experience your p99 latency routinely, not exceptionally.

This fan-out effect is why large engineering organizations obsess over the tail. In microservice architectures the problem compounds: if service A calls B, which calls C, one slow hop stalls the whole chain, holds a worker thread hostage, and under load can ripple into a cascading slowdown of services that were themselves perfectly healthy. Tail latency is not a cosmetic metric — it is the leading indicator of the saturation problems that later become outages.

Which Percentile Should You Alert On?

Alerting on the average is worse than useless — it creates false confidence. But alerting on the wrong percentile creates noise instead. A practical scheme:

Alert on p95 or p99 for user-facing endpoints. Set the threshold from your own baseline, not from folklore: measure a normal week, then alert when the percentile sustainably exceeds, say, 2–3× its baseline. A brief p99 spike during a deploy is normal; a p99 that stays elevated for ten minutes is a real degradation. Watch p50 for drift, not for alerts. A slowly rising median is the signature of growing datasets, missing indexes, or creeping payload sizes — review it weekly rather than paging on it. Track the p50/p99 gap. A widening gap with a stable median means the tail is degrading first — the classic early warning of an overloaded dependency or connection pool.

And measure where it matters: percentiles computed from your server logs miss DNS, TLS, and network time entirely. External synthetic checks from multiple regions measure the latency your clients actually experience, which is the number your users judge you by.

Common Percentile Pitfalls

Three mistakes show up in almost every latency dashboard. Averaging percentiles: the average of five per-minute p99 values is not the p99 of the five-minute window — percentiles do not compose. When aggregating across time windows or across regions, compute the percentile over the merged data (or use a mergeable sketch), never an average of percentiles. Ignoring sample size: a p99 computed from 50 requests is essentially one unlucky request masquerading as a trend; give low-traffic endpoints wider windows before trusting their tail. Comparing percentiles across different mixes: a p95 that "improved" after a traffic drop may simply reflect that the heavy queries left — segment by endpoint and request type before celebrating.

None of this requires sophisticated tooling to get right — it requires measuring continuously, from outside, with thresholds per monitor. A latency threshold on a synthetic check is the simplest honest implementation: every check either met your latency budget or it did not, and a run of failures is a degradation you hear about while it is still a performance problem rather than an outage.

Frequently Asked Questions

What does p99 latency mean?
p99 is the response time below which 99% of requests complete — equivalently, 1 in 100 requests is slower than this value. At one million requests per day, your p99 describes the experience of 10,000 real requests daily, which is why it matters far more than its "1%" label suggests.
Why is p99 more important than average response time?
Latency distributions are skewed: a few very slow requests barely move the average but dominate real user experience, especially when a single page load triggers dozens of API calls and is only as fast as the slowest one. The average hides the tail; p99 measures it directly.
Should I alert on p50, p95, or p99?
Alert on p95 or p99 for user-facing endpoints, with thresholds derived from your measured baseline and a sustained-duration condition to filter deploy blips. Use p50 for weekly drift review rather than paging, and watch the gap between p50 and p99 — a widening gap is the earliest sign of a degrading dependency.
Can I average p99 values from different time windows?
No — percentiles do not compose. The average of several per-minute p99 values is not the p99 of the combined period and usually understates it significantly. Aggregate the underlying response times (or use mergeable percentile sketches) and compute the percentile over the merged data instead.

Ready to monitor your APIs with confidence?

Start monitoring your APIs in minutes. Free Hobby plan, no card required.