API Enterno.io
Программный доступ ко всем инструментам enterno.io: HTTP-заголовки, DNS, SSL, пинг, IP-геолокация, оценка здоровья, мониторы и страницы статуса. REST API с ответами в формате JSON.
Аутентификация
Все запросы API v3 требуют ключ. Передайте его через заголовок X-API-Key (рекомендуется) или параметр api_key. Поддерживается также JSON body.
Получите API-ключ, зарегистрировав аккаунт или в личном кабинете.
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/check.php?url=example.com"
Каждый ответ содержит заголовок X-Request-Id для отслеживания.
Формат ответа
API v3 использует JSON:API-стиль с метаданными:
{
"data": { ... },
"meta": {
"request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
"duration_ms": 142,
"cached": false,
"api_version": "3.0"
}
}
При ошибке:
{
"error": {
"code": "invalid_url",
"message": "URL обязателен"
},
"meta": {
"request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
"duration_ms": 2
}
}
Для пагинированных эндпоинтов meta включает объект pagination:
"pagination": {
"total": 15,
"page": 1,
"per_page": 25,
"pages": 1
}
Лимиты запросов
Информация о лимитах включена в заголовки ответа:
| Заголовок | Описание |
|---|---|
X-RateLimit-Limit | Максимум запросов в минуту |
X-RateLimit-Remaining | Оставшиеся запросы в текущем окне |
X-RateLimit-Reset | Unix timestamp сброса лимита |
Retry-After | Секунды до повтора (только при 429) |
| Тариф | Запросов/мин | Дневной лимит | Области |
|---|---|---|---|
| Free | 10 | 100 | check, dns |
| Pro | 60 | 5 000 | check, dns, ssl, ip, ping, monitors |
| Business | 120 | 50 000 | check, dns, ssl, ip, ping, monitors |
Области
Каждый API-ключ имеет набор разрешённых областей. Запрос к недоступному эндпоинту вернёт ошибку 403.
| Область | Эндпоинт | Описание |
|---|---|---|
check | /api/v3/check.php | Проверка HTTP-заголовков + оценка здоровья |
dns | /api/v3/dns.php | DNS-запрос + DNSSEC |
ssl | /api/v3/ssl.php | Проверка SSL/TLS + детали цепочки |
ip | /api/v3/ip.php | Геолокация IP |
ping | /api/v3/ping.php | Пинг, проверка портов, трассировка |
monitors | /api/v3/monitors.php | CRUD мониторов + страницы статуса |
Check — Проверка HTTP-заголовков
Получение HTTP-заголовков ответа с детальной разбивкой времени (DNS, подключение, TLS, TTFB).
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | Да | URL для проверки |
method | string | Нет | GET, HEAD, POST (default: GET) |
follow | string | Нет | 0/1 (default: 1) |
timeout | integer | Нет | 1-30 (default: 15) |
ua | string | Нет | Пользовательский User-Agent |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/check.php?url=https://example.com"
Ответ
{
"data": {
"url": "https://example.com",
"final_url": "https://example.com/",
"method": "GET",
"code": 200,
"http_version": "HTTP/2",
"ip": "93.184.216.34",
"headers": [...],
"timing": {
"dns_ms": 12,
"connect_ms": 45,
"tls_ms": 78,
"ttfb_ms": 120,
"transfer_ms": 142,
"redirect_ms": 0,
"redirect_count": 0
},
"elapsed_ms": 142
},
"meta": {"request_id": "...", "duration_ms": 150, "cached": false, "api_version": "3.0"}
}
DNS — DNS-запрос
Получение DNS-записей с опциональной проверкой DNSSEC.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
domain | string | Да | Доменное имя |
types | string | Нет | Через запятую: A,AAAA,MX,NS,TXT,CNAME,SOA |
dnssec | string | Нет | 1 для проверки DNSSEC |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/dns.php?domain=example.com&dnssec=1"
SSL — Проверка SSL/TLS
Проверка SSL-сертификата с детальной информацией о цепочке.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
host | string | Да | Имя хоста |
port | integer | Нет | Порт (по умолчанию 443) |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/ssl.php?host=example.com"
IP — Геолокация
Определение местоположения, провайдера и организации по IP-адресу или домену.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
host | string | Да | IP-адрес или домен |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/ip.php?host=8.8.8.8"
Ping — Пинг, порты и трассировка
Пинг хоста, проверка портов или трассировка маршрута.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
host | string | Да | Хост или IP |
action | string | Нет | ping, ports, traceroute (default: ping) |
count | integer | Нет | Количество пингов 1-10 (по умолчанию 4) |
ports | string | Нет | Порты через запятую (для action=ports) |
max_hops | integer | Нет | Макс. хопов 1-30 (для action=traceroute) |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/ping.php?host=example.com&action=traceroute"
Health — Оценка здоровья сайта
Комплексный анализ здоровья сайта: заголовки безопасности (30 баллов), SSL/TLS (25 баллов), производительность (25 баллов), лучшие практики (20 баллов). Возвращает оценку 0-100 с грейдом от A+ до F.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | Да | URL для анализа |
Пример
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v3/health.php?url=example.com"
Ответ
{
"data": {
"url": "https://example.com",
"score": 82,
"grade": "A",
"categories": [
{"name": "Security Headers", "score": 22, "max": 30, "checks": [...]},
{"name": "SSL/TLS", "score": 25, "max": 25, "checks": [...]},
{"name": "Performance", "score": 20, "max": 25, "checks": [...]},
{"name": "Best Practices", "score": 15, "max": 20, "checks": [...]}
],
"recommendations": [
{"type": "critical", "check": "Permissions-Policy"},
{"type": "warning", "check": "Server info hidden"}
]
},
"meta": {"request_id": "...", "duration_ms": 2400, "cached": false, "api_version": "3.0"}
}
Monitors — CRUD
Создание, чтение, обновление и удаление мониторов аптайма через API.
Список мониторов
| Имя | Тип | Описание |
|---|---|---|
page | integer | Номер страницы (по умолчанию 1) |
per_page | integer | Элементов на странице, макс. 100 (по умолчанию 25) |
status | string | Фильтр: up, down, unknown |
Получить монитор
Возвращает детали монитора с 20 последними проверками.
Создать монитор
curl -X POST "https://enterno.io/api/v3/monitors.php" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"check_type": "http",
"interval_minutes": 5,
"expected_code": 200,
"notify_email": true
}'
Обновить монитор
curl -X PUT "https://enterno.io/api/v3/monitors.php?id=5" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"interval_minutes": 10, "is_active": false}'
Удалить монитор
curl -X DELETE "https://enterno.io/api/v3/monitors.php?id=5" \
-H "X-API-Key: YOUR_KEY"
Status — Публичная страница статуса
Получение данных страницы статуса в JSON. Аутентификация не требуется при указании slug.
Пример
curl "https://enterno.io/api/v3/status.php?slug=my-company"
Ответ
{
"data": {
"title": "My Company Status",
"slug": "my-company",
"overall_status": "operational",
"monitors_total": 5,
"monitors_down": 0,
"monitors": [
{"id": 1, "name": "example.com", "status": "up", "response_time_ms": 120}
],
"recent_incidents": []
},
"meta": {"request_id": "...", "duration_ms": 15, "cached": false, "api_version": "3.0"}
}
Коды ошибок
| HTTP код | Код ошибки | Описание |
|---|---|---|
400 | missing_parameter | Отсутствуют или некорректны параметры |
401 | auth_required | Отсутствует API-ключ |
401 | invalid_api_key | Неверный или неактивный API-ключ |
403 | insufficient_scope | Ключ не имеет нужной области доступа |
404 | not_found | Ресурс не найден |
405 | method_not_allowed | HTTP-метод не разрешён |
429 | rate_limit_exceeded | Превышен лимит |
429 | daily_limit_exceeded | Превышен дневной лимит запросов |
502 | request_failed | Ошибка целевого сервера |
Аутентификация
Все запросы к API v4 требуют ключ через заголовок X-API-Key. Используйте X-Idempotency-Key для безопасных повторных запросов.
Получите API-ключ, зарегистрировав аккаунт или в личном кабинете.
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v4/webhooks"
Каждый ответ содержит заголовок X-Request-Id для отслеживания.
Idempotency Key
Добавьте X-Idempotency-Key: unique-id к любому запросу на запись. Enterno.io вернёт кэшированный ответ при дублировании в течение 60 секунд.
curl -X POST "https://enterno.io/api/v4/webhooks" \
-H "X-API-Key: YOUR_KEY" \
-H "X-Idempotency-Key: create-wh-001" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-app.com/hook"}'
Формат ответа
API v4 использует тот же JSON-конверт, что v3, с "api_version": "4.0" в meta.
{
"data": { ... },
"meta": {
"request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
"duration_ms": 8,
"cached": false,
"api_version": "4.0"
}
}
При ошибке:
{
"error": {
"code": "not_found",
"message": "Ресурс не найден"
},
"meta": {
"request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
"duration_ms": 2,
"api_version": "4.0"
}
}
Лимиты запросов
Информация о лимитах включена в заголовки ответа:
| Заголовок | Описание |
|---|---|
X-RateLimit-Limit | Максимум запросов в минуту |
X-RateLimit-Remaining | Оставшиеся запросы в текущем окне |
X-RateLimit-Reset | Unix timestamp сброса лимита |
Retry-After | Секунды до повтора (только при 429) |
| Тариф | Запросов/мин | Дневной лимит | Области |
|---|---|---|---|
| Free | 10 | 100 | check, dns |
| Pro | 60 | 5 000 | check, dns, ssl, ip, ping, monitors, webhook |
| Business | 120 | 50 000 | check, dns, ssl, ip, ping, monitors, webhook |
Области
Каждый API-ключ имеет набор разрешённых областей. Запрос к недоступному эндпоинту вернёт ошибку 403.
| Область | Эндпоинт | Описание |
|---|---|---|
check | /api/v3/check.php | Проверка HTTP-заголовков + оценка здоровья |
dns | /api/v3/dns.php | DNS-запрос + DNSSEC |
ssl | /api/v3/ssl.php | Проверка SSL/TLS + детали цепочки |
ip | /api/v3/ip.php | Геолокация IP |
ping | /api/v3/ping.php | Пинг, проверка портов, трассировка |
monitors | /api/v3/monitors.php | CRUD мониторов + страницы статуса |
webhook | /api/v4/webhooks, /api/v4/events | CRUD вебхук-подписок и лога событий |
Webhooks — Управление подписками
Создавайте вебхук-подписки для получения HTTP POST уведомлений при изменении состояния мониторов, SSL-сертификатов или доменов.
Поддерживаемые типы событий
| Область | Описание |
|---|---|
monitor.down | Монитор упал |
monitor.up | Монитор восстановлен |
monitor.degraded | Снижение скорости монитора |
ssl.expiring | SSL-сертификат скоро истекает |
ssl.expired | SSL-сертификат истёк |
domain.expiring | Домен скоро истекает |
test | Тестовое событие |
Лимиты вебхуков по тарифам
| Тариф | Макс. вебхуков | Ограничения событий |
|---|---|---|
| Free | 1 | monitor.down, monitor.up, test |
| Starter | 5 | Все события |
| Pro | 20 | Все события |
| Business | 50 | Все события |
Список вебхуков
Возвращает все вебхук-подписки аутентифицированного пользователя.
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v4/webhooks"
Создать вебхук
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | Да | URL назначения (требуется HTTPS) |
name | string | Нет | Название подписки (опционально) |
secret | string | Нет | HMAC-SHA256 секрет для проверки подписи (опционально) |
events | array | Нет | Типы событий для подписки (по умолчанию: все) |
curl -X POST "https://enterno.io/api/v4/webhooks" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/hooks/enterno",
"name": "Production alerts",
"events": ["monitor.down", "monitor.up", "ssl.expiring"]
}'
Ответ
{
"data": {
"id": 12,
"name": "Production alerts",
"url": "https://your-app.com/hooks/enterno",
"secret": "ent_wh_sk_***",
"events": ["monitor.down", "monitor.up", "ssl.expiring"],
"is_active": true,
"created_at": "2026-03-28T06:00:00Z"
},
"meta": {"request_id": "...", "duration_ms": 18, "api_version": "4.0"}
}
Обновить вебхук
curl -X PUT "https://enterno.io/api/v4/webhooks?id=12" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"is_active": false}'
Удалить вебхук
curl -X DELETE "https://enterno.io/api/v4/webhooks?id=12" \
-H "X-API-Key: YOUR_KEY"
Проверка подписи webhook
Каждая доставка на ваш webhook-URL подписывается общим секретом secret. Два заголовка позволяют проверить целостность запроса и защититься от replay-атак:
| Заголовок | Значение | Назначение |
|---|---|---|
X-Enterno-Timestamp |
Unix-время (сек) в момент отправки | Отклонить если разница с локальным временем > 300 сек |
X-Enterno-Signature-V2 |
sha256=<hex> |
HMAC-SHA256(secret, timestamp + "." + body) |
X-Enterno-Signature |
sha256=<hex> |
Legacy — HMAC только по телу, без защиты от replay. Оставлен для существующих интеграций. Будет удалён 2026-07-01. |
Проверка на PHP (рекомендуется)
<?php
$secret = getenv('ENTERNO_WEBHOOK_SECRET'); // your shared secret
$ts = $_SERVER['HTTP_X_ENTERNO_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_ENTERNO_SIGNATURE_V2'] ?? '';
$body = file_get_contents('php://input');
// 1. Replay window — reject timestamps older than 5 minutes
if (abs(time() - (int)$ts) > 300) {
http_response_code(400);
exit('stale timestamp');
}
// 2. Compute expected signature
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
// 3. Timing-safe compare
if (!hash_equals($expected, $sig)) {
http_response_code(401);
exit('bad signature');
}
$payload = json_decode($body, true);
// …handle the event…
Проверка на Node.js
const crypto = require('crypto');
function verify(req, secret) {
const ts = req.headers['x-enterno-timestamp'];
const sig = req.headers['x-enterno-signature-v2'];
const body = req.rawBody; // use a raw-body parser
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300)
throw new Error('stale timestamp');
const expected =
'sha256=' + crypto.createHmac('sha256', secret)
.update(ts + '.' + body)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig)))
throw new Error('bad signature');
}
Окно миграции: старый X-Enterno-Signature (без timestamp) продолжает отправляться параллельно с V2 до 2026-07-01. Если используете старый формат — переключайтесь на V2 до этой даты.
Тест доставки
curl -X POST "https://enterno.io/api/v4/webhooks?action=test&id=12" \
-H "X-API-Key: YOUR_KEY"
Events — История доставки
Просматривайте историю доставки вебхуков с количеством попыток, HTTP-кодами ответов и причинами ошибок.
| Имя | Тип | Описание |
|---|---|---|
webhook_id | integer | Фильтр по ID вебхука (опционально) |
event_type | string | Фильтр по типу события |
status | string | Фильтр: delivered, retrying, failed, dead, pending |
page | integer | Номер страницы (по умолчанию 1) |
per_page | integer | Элементов на странице, макс. 100 (по умолчанию 25) |
curl -H "X-API-Key: YOUR_KEY" \
"https://enterno.io/api/v4/events?webhook_id=12&status=failed"
Ответ
{
"data": [
{
"id": 501,
"webhook_id": 12,
"event_type": "monitor.down",
"status": "delivered",
"http_status_code": 200,
"attempts": 1,
"created_at": "2026-03-28T06:05:00Z",
"delivered_at": "2026-03-28T06:05:01Z"
}
],
"meta": {
"request_id": "...",
"duration_ms": 12,
"api_version": "4.0",
"pagination": {"total": 1, "page": 1, "per_page": 25, "pages": 1}
}
}
Коды ошибок
| HTTP код | Код ошибки | Описание |
|---|---|---|
400 | missing_parameter | Отсутствуют или некорректны параметры |
401 | auth_required | Отсутствует API-ключ |
401 | invalid_api_key | Неверный или неактивный API-ключ |
403 | insufficient_scope | Ключ не имеет нужной области доступа |
404 | not_found | Ресурс не найден |
405 | method_not_allowed | HTTP-метод не разрешён |
409 | conflict | Идемпотентный запрос уже выполняется |
429 | rate_limit_exceeded | Превышен лимит |
429 | daily_limit_exceeded | Превышен дневной лимит запросов |
Миграция с v3
Аутентификация, лимиты и формат ответа идентичны v3. Переключитесь на пути /api/v4/ и добавьте scope webhook к вашему API-ключу.
| v3 | v4 |
|---|---|
/api/v3/check.php | Используйте v3 — в v4 не изменился |
/api/v3/monitors.php | Используйте v3 — в v4 не изменился |
| Вебхуки (только UI) | /api/v4/webhooks |
| Лог событий (только UI) | /api/v4/events |
Аутентификация
Все запросы к API требуют ключ. Передайте его через заголовок X-API-Key (рекомендуется) или параметр api_key.
Получите API-ключ, зарегистрировав аккаунт или в личном кабинете.
curl -H "X-API-Key: YOUR_KEY" \
https://enterno.io/api/check.php?url=example.com
Формат ответа
Все ответы имеют единый формат JSON:
{
"success": true,
"data": { ... }
}
При ошибке:
{
"success": false,
"error": "Описание ошибки"
}
Лимиты запросов
| Тариф | Запросов/мин | Дневной лимит | Области |
|---|---|---|---|
| Free | 10 | 100 | check, dns |
| Pro | 60 | 5 000 | check, dns, ssl, ip, ping |
| Business | 120 | 50 000 | check, dns, ssl, ip, ping |
Области
Каждый API-ключ имеет набор разрешённых областей. Запрос к недоступному эндпоинту вернёт ошибку 403.
| Область | Эндпоинт | Описание |
|---|---|---|
check | /api/check.php | Проверка HTTP-заголовков |
dns | /api/dns.php | DNS-запрос |
ssl | /api/ssl.php | Проверка SSL/TLS |
ip | /api/ip.php | Геолокация IP |
ping | /api/ping.php | Пинг и проверка портов |
Эндпоинты
Эндпоинты API v2 используют пути /api/v2/*.php. Все принимают GET и POST.
| Эндпоинт | Область | Описание |
|---|---|---|
/api/v2/check.php | check | Проверка HTTP-заголовков |
/api/v2/dns.php | dns | DNS-запрос |
/api/v2/ssl.php | ssl | Проверка SSL/TLS |
/api/v2/ip.php | ip | Геолокация IP |
/api/v2/ping.php | ping | Пинг и проверка портов |
Коды ошибок
| HTTP код | Описание |
|---|---|
400 | Неверный запрос |
401 | Не авторизован |
403 | Запрещено |
405 | Метод не разрешён |
429 | Превышен лимит |
502 | Ошибка целевого сервера |