Free API for speed test results and internet provider statistics. 1,000 requests a day per key; a link to SpeedMeter.dev is the only condition.
The key is issued instantly, without an account. We use your email only to contact you about the API.
Your key. Save it now: we show it only once.
By requesting a key you agree to the terms below. Privacy Policy
Pass the key in the Authorization header. All responses are JSON; speeds are in Mbps, ping and jitter in ms, packet loss in percent.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://speedmeter.dev/api/v1/providers?country=RU&limit=5"Call the API from your server. Do not put the key into page code: anyone could copy it and use up your limit.
| Request | Returns |
|---|---|
GET /api/v1/tests/{testId} | Result of one test: download, upload, ping, jitter, packet loss, provider and country. The testId comes from the widget when the test ends. |
GET /api/v1/providers | Median download, upload, ping, jitter and packet loss by provider network (ASN) over the last 30 days. Parameters: country (two letters, for example RU) and limit (1 to 500, default 50). |
GET /api/v1/providers/{asn} | The same for one network, for example /api/v1/providers/12389. |
POST /api/v1/proxy-check | No key needed. Checks the address the request came from: IP, network owner, network type (hosting, mobile or not determined) and location. The proxy checker page calls it. |
GET /api/v1/proxy-checks/{checkId} | Result of a proxy check by its number. Your customer sees the number on the proxy checker page. |
GET /api/v1/usage | How many requests your key has used today. |
POST /api/v1/keys | Issue a key. Body: email and, optionally, site. The form above does the same. |
Provider statistics include only networks with at least 30 tests from 10 different addresses in 30 days: with less data a median is noise. Statistics are recalculated every hour.
GET /api/v1/tests/5f0c2a1e-8d3b-4c6a-9e2f-1b7d4a9c3e10
{
"testId": "5f0c2a1e-8d3b-4c6a-9e2f-1b7d4a9c3e10",
"createdAt": "2026-09-29T11:06:05.000Z",
"download": 94.2,
"upload": 41.7,
"ping": 18.5,
"jitter": 2.1,
"packetLoss": 0,
"isp": { "name": "Example Telecom", "asn": 64500 },
"country": "RU",
"units": { "download": "Mbps", "upload": "Mbps", "ping": "ms", "jitter": "ms", "packetLoss": "%" },
"source": { "name": "SpeedMeter.dev", "url": "https://speedmeter.dev/" }
}Put the free widget on your page. When a test ends, the widget sends a message with the testId; pass it to your server and request the result with your key.
<iframe src="https://speedmeter.dev/widget.html" width="100%" height="320" frameborder="0"></iframe>
<script>
window.addEventListener('message', function (e) {
if (e.origin !== 'https://speedmeter.dev' || !e.data || e.data.type !== 'speedtest-complete') return;
// your server calls GET /api/v1/tests/{testId} with the key
fetch('/speedtest-result?testId=' + encodeURIComponent(e.data.testId));
});
</script>Themes, compact mode and the script version are described in the widget guide. Widget guide