Back to SpeedMeter.dev

SpeedMeter.dev API

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.

Get a free API key

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

Quick start

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.

Endpoints

RequestReturns
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/providersMedian 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-checkNo 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/usageHow many requests your key has used today.
POST /api/v1/keysIssue 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.

Example response

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/" } }

Widget results on your server

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

Limits

Terms

For internet providers and hosting companies

Questions?

Write to us about integration, limits or data.

support@speedmeter.dev