API для агентов и LLM

Это не отдельный API: это именно та поверхность, которую вызывает браузер, когда вы запускаете тест скорости на этом сайте, задокументированная так, чтобы скрипт, агент или инструмент LLM тоже мог её вызвать. Без ключа, без регистрации, без CORS.

Отдельного «публичного API» здесь нет: это те же четыре эндпоинта, которые вызывает браузер этого сайта при запуске теста скорости, без API-ключа, без аккаунта и — см. ниже — без заголовка CORS.

Эндпоинты

GET/api/speed/pingБез лимита

Минимальный зонд «туда-обратно».

Поле t в ответе носит только диагностический характер. Workers замораживают Date.now() между операциями ввода-вывода, поэтому это ненадёжные часы для измерения задержки — измеряйте запрос самостоятельно.

GET/api/speed/metaБез лимита

Показывает, что Cloudflare знает о вызывающей стороне: IP, провайдера, ASN, город, страну и edge-узел (colo), который ответил.

Ничего из этого не сохраняется. Данные возвращаются только вызывающей стороне и больше никому.

GET/api/speed/down120 запросов / 60 с / IP

Передаёт bytes (параметр запроса, по умолчанию 1 МБ, максимум 100 МБ) случайных данных для измерения скорости скачивания.

Ответ помечен no-store, no-transform — ничто его не сжимает и не кэширует, а любое из этого завысило бы измеренную скорость.

POST/api/speed/up120 запросов / 60 с / IP

Принимает тело запроса до 100 МБ и сообщает, сколько байт пришло и сколько это заняло времени, для измерения скорости загрузки.

Заявленный Content-Length больше 100 МБ отклоняется с кодом 413 ещё до чтения тела.

Лимит использования — в цифрах

/api/speed/down и /api/speed/up делят один лимит: 120 запросов с одного IP за каждое окно в 60 секунд, после чего окно сбрасывается само. На гигабитной линии стандартный тест скорости делает около 40 таких запросов (четыре потока загрузки и четыре потока отдачи, каждый повторяет запросы до конца своей фазы; на более медленных линиях их меньше), то есть число полных тестов за окно — примерно 3. При превышении лимита возвращается 429 с заголовком Retry-After. Подсчёт ведётся отдельно в каждой точке присутствия Cloudflare, поэтому считайте его приблизительным. /api/speed/ping и /api/speed/meta без лимита: их нагрузка тривиальна, а лимитирование добавило бы лишнюю проверку именно на том пути, который они и призваны измерять.

Самый большой запрос, который отдаёт или принимает любой из этих эндпоинтов — 100 МБ.

Без CORS — намеренно

Эти эндпоинты не отправляют заголовок Access-Control-Allow-Origin, и ни один из них не проходит проверку того же источника, которую этот сайт использует на маршрутах аккаунта и оплаты. Это сочетание намеренное: серверный вызывающий — curl, агент, инструмент LLM — уже работает сегодня, а браузер, выполняющий кросс-доменный JavaScript против этих эндпоинтов, уже блокируется самим браузером. Добавление CORS с * позволило бы любому сайту расходовать пропускную способность этого сайта через браузеры своих же посетителей; документировать текущее положение дел ничего не стоит и ничего не меняет.

Разобранный пример — curl

Скачайте 5 МБ и засеките время — стандартная форма ручной проверки пропускной способности.

curl -o /dev/null -w "%{time_total}s for %{size_download} bytes\n" \
  "https://mysygnal.net/api/speed/down?bytes=5000000"

Разобранный пример — агент или инструмент LLM

То же измерение, засечённое самим вызывающим, а не взятое на веру из ответа — см. примечание про /api/speed/ping выше.

const t0 = performance.now();
const res = await fetch("https://mysygnal.net/api/speed/down?bytes=5000000");
await res.arrayBuffer();
const seconds = (performance.now() - t0) / 1000;
const mbps = (5_000_000 * 8) / seconds / 1_000_000;

Всё остальное, что этот сайт предлагает вызывающей стороне

llms.txt индексирует инструменты, руководства и каждую страницу роутера на этом сайте в одном текстовом файле, предназначенном для чтения моделью, а не браузером.

Эта страница переведена автоматически и может содержать ошибки. Читать оригинал на английском