Benchmark report
Is the PyPI API slow?
Response times from 6 cities
Fast globally
PyPI responds quickly from all 6 test locations. Tokyo was fastest at 11 ms; San Francisco took 68 ms.
- Fastest
- 11 ms
- Tokyo
- Slowest
- 68 ms
- San Francisco
- Successful requests
- 100%
- 6 locations
Response time around the world
Tokyo
11 msMumbai
11 msAmsterdam
12 msMontreal
13 msSingapore
14 msSan Francisco
68 ms
Why is San Francisco slower?
In the controlled run of 4 October five cities finished in 12 to 17 ms with every phase in single digits: 2 ms to connect, 3 to 5 ms for the TLS handshake, 2 to 4 ms waiting for the first byte and 3 to 6 ms downloading the 230 KB. San Francisco took 60 ms and every phase grew with it: 12 ms to connect, 14 ms for TLS, 11 ms waiting and 23 ms downloading. When all four stages stretch together, the likely cause is a longer path to the cache that answered rather than a slower server. The Fastly homepage, served by the same CDN, shows the same San Francisco pattern.
Click the location to see each stage.
San Francisco60 ms
- Finding the server
- 13 ms
- Reaching the server
- 12 ms
- Setting up security
- 14 ms
- Waiting for the server
- 11 ms
- Receiving the response: most of the time
- 23 ms
- Total
- 60 ms
Finding the server is measured once per location, so it sits outside these bars. Open a city to see it.
Bars show the typical request, so the parts add up to its total. Why
Compare all locationsHide the comparison
Click a city to see its stage-by-stage breakdown.
Amsterdam14 ms
- Finding the server
- 1 ms
- Reaching the server
- 2 ms
- Setting up security
- 4 ms
- Waiting for the server
- 3 ms
- Receiving the response: most of the time
- 5 ms
- Total
- 14 ms
San Francisco60 ms
- Finding the server
- 13 ms
- Reaching the server
- 12 ms
- Setting up security
- 14 ms
- Waiting for the server
- 11 ms
- Receiving the response: most of the time
- 23 ms
- Total
- 60 ms
Montreal14 ms
- Finding the server
- 2 ms
- Reaching the server
- 2 ms
- Setting up security: most of the time
- 5 ms
- Waiting for the server
- 3 ms
- Receiving the response
- 4 ms
- Total
- 14 ms
Singapore17 ms
- Finding the server
- 2 ms
- Reaching the server
- 2 ms
- Setting up security
- 5 ms
- Waiting for the server
- 4 ms
- Receiving the response: most of the time
- 6 ms
- Total
- 17 ms
Tokyo12 ms
- Finding the server
- 1 ms
- Reaching the server
- 2 ms
- Setting up security
- 3 ms
- Waiting for the server
- 2 ms
- Receiving the response: most of the time
- 5 ms
- Total
- 12 ms
Mumbai13 ms
- Finding the server
- 9 ms
- Reaching the server
- 2 ms
- Setting up security: most of the time
- 5 ms
- Waiting for the server
- 3 ms
- Receiving the response
- 3 ms
- Total
- 13 ms
The phases come from the controlled run of 4 October 2026. Typical and slower times pool the daily requests. 6 of 6 test locations included: Amsterdam, San Francisco, Montreal, Singapore, Tokyo, Mumbai.
Finding the server is measured once per location, so it sits outside these bars. Open a city to see it.
Bars show the typical request, so the parts add up to its total. Why
PyPI still feels slow?
- Check PyPI’s status page
- Registry incidents are posted there. A slow install during one is not your network.
- This is not a pip install benchmark
- Wheel and source downloads come from files.pythonhosted.org, a separate host, and the simple index pip reads by default is a different document. Uploads and the website are not measured either.
- A shield cache in front of the edges
- Four Fastly addresses across our six cities, and the cache header named the same Washington-area cache everywhere, which suggests a shield cache in front of the edges. A slow result from the US West Coast matches what we see; elsewhere it would be unusual.
Response time over the last 29 days
A dot marks a day well above that location’s usual level.
Show the numbers
| Day | Amsterdam | San Francisco | Montreal | Singapore | Tokyo | Mumbai |
|---|---|---|---|---|---|---|
| 11 September 2026 | 11 ms | 67 ms | 116 ms ▲ | 13 ms | 13 ms | 11 ms |
| 12 September 2026 | 11 ms | 69 ms | 12 ms | 15 ms | 12 ms | 12 ms |
| 13 September 2026 | 12 ms | 59 ms | 12 ms | 13 ms | 13 ms | 12 ms |
| 14 September 2026 | 11 ms | 58 ms | 153 ms ▲ | 10 ms | 12 ms | 12 ms |
| 15 September 2026 | 11 ms | 59 ms | 189 ms ▲ | 16 ms | 11 ms | 11 ms |
| 16 September 2026 | 11 ms | 57 ms | 12 ms | 31 ms | 11 ms | 11 ms |
| 17 September 2026 | 11 ms | 61 ms | 12 ms | 17 ms | 10 ms | 12 ms |
| 18 September 2026 | 11 ms | 55 ms | 359 ms ▲ | 13 ms | 12 ms | 12 ms |
| 19 September 2026 | 11 ms | 57 ms | 81 ms ▲ | 12 ms | 10 ms | 12 ms |
| 20 September 2026 | 11 ms | 54 ms | 17 ms | 19 ms | 13 ms | 12 ms |
| 21 September 2026 | 10 ms | 58 ms | 82 ms ▲ | 13 ms | 13 ms | 11 ms |
| 22 September 2026 | 12 ms | 56 ms | 14 ms | 14 ms | 12 ms | 12 ms |
| 23 September 2026 | 11 ms | 60 ms | 11 ms | 19 ms | 12 ms | 11 ms |
| 24 September 2026 | 11 ms | 66 ms | 14 ms | 13 ms | 12 ms | 11 ms |
| 25 September 2026 | 10 ms | 54 ms | 13 ms | 14 ms | 11 ms | 10 ms |
| 26 September 2026 | 11 ms | 57 ms | 11 ms | 14 ms | 12 ms | 12 ms |
| 27 September 2026 | 11 ms | 56 ms | 11 ms | 14 ms | 11 ms | 11 ms |
| 28 September 2026 | 12 ms | 68 ms | 81 ms ▲ | 13 ms | 13 ms | 11 ms |
| 29 September 2026 | 13 ms | 59 ms | 13 ms | 14 ms | 12 ms | 11 ms |
| 30 September 2026 | 13 ms | 62 ms | 12 ms | 13 ms | 11 ms | 12 ms |
| 1 October 2026 | 12 ms | 63 ms | 10 ms | 13 ms | 10 ms | 11 ms |
| 2 October 2026 | 16 ms | 66 ms | 83 ms ▲ | 15 ms | 12 ms | 12 ms |
| 3 October 2026 | 12 ms | 81 ms | 57 ms ▲ | 15 ms | 11 ms | 12 ms |
| 4 October 2026 | 13 ms | 60 ms | 57 ms ▲ | 14 ms | 11 ms | 11 ms |
| 5 October 2026 | 10 ms | 67 ms | 68 ms ▲ | 12 ms | 10 ms | 11 ms |
| 6 October 2026 | 12 ms | 71 ms | 12 ms | 12 ms | 11 ms | 12 ms |
| 7 October 2026 | 12 ms | 73 ms | 12 ms | 13 ms | 10 ms | 12 ms |
| 9 October 2026 | 10 ms | 70 ms | 12 ms | 14 ms | 12 ms | 11 ms |
| 10 October 2026 | 11 ms | 65 ms | 122 ms ▲ | 15 ms | 12 ms | 11 ms |
About this measurement
GET pypi.org/pypi/pip/json · 64 to 65 requests per location over 13 daily runs · 27 September 2026 to 10 October 2026
What we tested · Package registry. GET pypi.org/pypi/pip/json: the pip project's metadata, about 230 KB of JSON, cached at Fastly's edge for 15 minutes.
How LatencyRadar measures response time →
Technical details
Doesn’t measure: pip install: the simple index and wheel downloads from files.pythonhosted.org, or the website.
One PyPI surface: the JSON metadata document for the pip project, about 230 KB that pypi.org serves through Fastly's cache with a 15-minute lifetime. Tools such as pip, Poetry and dependency scanners read this kind of document to learn which versions exist; it is the lookup step of a Python install. It does not stand for the download step: wheels and source archives come from files.pythonhosted.org, a separate host we measure as its own surface, and the simple index that pip reads by default is a different document again. From outside we cannot see whether the cache answered or the request went through to PyPI's origin; with a 15-minute cache lifetime, a slow request may simply be the first one after expiry.
Between 27 September and 10 October 2026 Tokyo, Mumbai, Amsterdam, Montreal and Singapore had a typical time of 11 to 14 ms, and San Francisco 68 ms. San Francisco's daily median stayed between 56 and 81 ms on all 13 runs, so the gap is steady rather than one bad day. Montreal's typical hides a split: 10 to 13 ms on seven days and 57 to 122 ms on the other six (28 September and 2, 3, 4, 5 and 10 October), which the pooled typical absorbs and the history chart shows. Those days give Montreal a slower time of 122 ms, against 13 to 20 ms in Amsterdam, Singapore, Tokyo and Mumbai and 94 ms in San Francisco. Mumbai was the steadiest city, at 11 or 12 ms on every run. Compare npm, whose registry root is a two-byte cached document, and crates.io, whose metadata is not cached at all.
| Test location | Typical response time | Slower response time | Requests |
|---|---|---|---|
| Amsterdam | 12 ms | 16 ms | 65 |
| San Francisco | 68 ms | 94 ms | 65 |
| Montreal | 13 ms | 122 ms | 65 |
| Singapore | 14 ms | 20 ms | 64 |
| Tokyo | 11 ms | 17 ms | 65 |
| Mumbai | 11 ms | 13 ms | 65 |
Typical: half of the requests finished within this time (technical: p50). Slower: 95% of requests finished within this time (technical: p95). Statistics
- Request
- GET pypi.org/pypi/pip/json
- Measured from
- Amsterdam · San Francisco · Montreal · Singapore · Tokyo · Mumbai
- Requests
- Daily measurements from 27 September 2026 to 10 October 2026. 6 of 6 test locations included: Amsterdam, San Francisco, Montreal, Singapore, Tokyo, Mumbai. · 27 September 2026 to 10 October 2026
- Timings taken
- DNS, connect, TLS, waiting for the server, download
- Report coverage
- 6 of 6 test locations included: Amsterdam, San Francisco, Montreal, Singapore, Tokyo, Mumbai.
- Coverage changes
- Mumbai (measured since 7 September 2026) joined this report on 21 September 2026. Earlier daily bands keep their previous location set.
- Daily requests in each location
- Amsterdam: 65 · San Francisco: 65 · Montreal: 65 · Singapore: 64 · Tokyo: 65 · Mumbai: 65
- Typical response time
- Median of the eligible daily requests in each included location.
- Slower response time
- The 95th percentile of the same eligible daily requests in each included location.
PyPI API
https://pypi.org/pypi/pip/json
Independent measurement by LatencyRadar. Not affiliated with PyPI. · How we measure (v1.3)
How fast is your API around the world?
Run a free speed test from multiple cities and find out where your users are waiting. No setup, no account required.
No account required · Takes about 30 seconds.