Обзор публичного API
OpenSpeedTest предоставляет REST API для программного доступа к списку тестовых серверов, отправки результатов измерений и получения агрегированной статистики. API работает по HTTPS и возвращает JSON в кодировке UTF-8.
Базовый URL
https://openspeedtest.ru
Версии и эндпоинты
| Метод | Путь | Назначение | Авторизация |
|---|---|---|---|
| GET | /api.php?action=get-servers | Список тестовых серверов | X-API-KEY (обязательно) |
| POST | /api.php?action=submit-result | Отправка результата теста | X-API-KEY + X-SIGNATURE |
| GET | /api/v2/servers | Персональный список серверов + лимиты | X-API-KEY |
| GET | /api/v1/network-quality | Агрегированная статистика по регионам (карта) | нет |
| GET | /api/v1/network-quality/geometry | Геометрия карты (TopoJSON) | нет |
Документация охватывает публичный серверный API. API мобильного приложения и встраиваемого виджета в этот раздел не входит.
Формат данных
- Все ответы — JSON (
Content-Type: application/json; charset=utf-8). - Тела
POST-запросов передаются как JSON. - Успешные ответы обычно содержат поле
success: true; ошибки —success: falseиerrorс описанием. - Публичные эндпоинты статистики (
network-quality) возвращают объект данных без поляsuccess.
Аутентификация
Основной способ — заголовок:
X-API-KEY: <64 hex-символа>
Ключ создаётся только в личном кабинете после регистрации. У ключа могут быть ограничения:
allowed_ip— список IP, с которых разрешена отправка результатов из CLI;allowed_domains— список доменов, с которых разрешена работа виджета.
Отправка результата дополнительно подписывается HMAC-SHA256 (заголовок X-SIGNATURE) — см. статью «Отправка результата теста».
Защита каталога серверов
Список тестовых серверов является ресурсом сервиса и не отдаётся анонимно: запрос get-servers без действующего X-API-KEY получает 401. Такой подход позволяет:
- выдавать каталог только идентифицированным клиентам;
- привязывать ключ к домену (виджет) или IP (CLI), учитывать и ограничивать запросы;
- отзывать доступ, удаляя ключ в личном кабинете;
- не публиковать статические выгрузки каталога (они закрыты на уровне веб-сервера).
Ключ оформляется в личном кабинете после регистрации — см. статью «API-ключи».
Квоты
Ключи, привязанные к аккаунту, делят единую квоту аккаунта (окна «час» и «сутки»). Превышение лимита возвращает 429 с заголовком Retry-After. Отдельно действует защитный лимит для submit-result. Подробности — в статье «Квоты и лимиты».
Коды ошибок (общие)
| Код | Значение |
|---|---|
| 400 | Некорректный запрос: параметр, тело или action |
| 401 | Не передан X-API-KEY |
| 403 | Ключ недействителен/неактивен, домен или IP не разрешены, неверная подпись |
| 404 | Ресурс/эндпоинт недоступен |
| 405 | Недопустимый HTTP-метод |
| 429 | Превышение квоты или защитного лимита |
| 500 | Внутренняя ошибка сервера |
| 503 | Функция временно недоступна |
CORS
Эндпоинт api.php добавляет CORS-заголовки: при наличии Origin он возвращается в Access-Control-Allow-Origin вместе с Access-Control-Allow-Credentials: true, без Origin — Access-Control-Allow-Origin: *. Preflight OPTIONS разрешает методы GET, POST, OPTIONS и заголовки Content-Type, X-API-KEY, X-SIGNATURE, Origin, Referer. Эндпоинты api/v2 и network-quality рассчитаны на запросы с того же источника и CORS-заголовков не добавляют.
Ограничения
- Свежесть запроса: при отправке результата
timestampне должен отличаться от серверного времени более чем на 300 секунд. - Определение IP: сервис учитывает заголовки
X-Forwarded-ForиX-Real-IP(за обратным прокси), иначе —REMOTE_ADDR. - Версии: контракт
api.phpстабилен; новые возможности добавляются вapi/v2и публичные эндпоинты статистики. Требование API-ключа дляget-servers— часть политики защиты каталога серверов.