Нет подходящих разделов.

Host-Tracker REST API v1

Стабильный HTTP API с токен-аутентификацией для управления задачами мониторинга сайтов, контактами, подписками на оповещения/отчёты, а также для чтения статистики, простоев и инцидентов.

Это API v1. Он не выполняет мгновенные проверки и использует другую схему аутентификации, чем API v2 — эти два API не взаимозаменяемы. Для автоматизированных мгновенных проверок используйте вместо этого API v2.

Базовый URL

Каждый путь в этом документе указан относительно базового URL. Один и тот же API обслуживают две точки входа:

Точка входаБазовый URL (BASE_URL)Примечания
Напрямую https://api1.host-tracker.com/ Рекомендуется для интеграций сервер–сервер.
Через основной сайт https://www.host-tracker.com/api/web/v1/ Проксируется на ту же службу. Удобно, если вы уже обращаетесь к www.host-tracker.com.

Далее в этом справочнике запись вида GET tasks означает GET BASE_URL/tasks — например, https://api1.host-tracker.com/tasks или https://www.host-tracker.com/api/web/v1/tasks.

Тип содержимого и методы HTTP

По умолчанию запросы и ответы имеют тип application/json (см. Соглашения про XML). API использует стандартные методы HTTP:

  • GET — чтение сущностей (задачи, контакты, подписки, статистика, простои, инциденты, агенты).
  • POST — создание сущности или запуск действия.
  • PUT — обновление существующих сущностей.
  • DELETE — удаление сущностей.
  • PATCH — частичные обновления (используется для повторной отправки кода подтверждения контакта).

Переопределение метода HTTP

Если ваш клиент не может отправлять PUT, DELETE или PATCH, отправьте POST и добавьте заголовок X-HTTP-Method-Override с именем нужного метода. Например, чтобы обновить задачи, отправьте POST на tasks с заголовком X-HTTP-Method-Override: PUT.

Соглашения

Сериализация JSON

В JSON используются имена свойств в стиле camelCase. Пустые (null) поля не включаются в ответ (пустые массивы по-прежнему передаются как []). Порядок свойств стабилен: сначала идентификатор и адрес/url, затем унаследованные поля, затем поля, специфичные для типа.

Дата и время

В ответах на создание/чтение задач метки времени передаются в виде строк ISO-8601 UTC (например, 2024-06-21T22:26:23Z). Точки входа для статистики, простоев, инцидентов и результатов дополнительно используют двойное представление: каждое время присутствует и как поле целого числа в секундах Unix (с суффиксом Unix), и как удобочитаемая строка, отформатированная согласно формату даты и часовому поясу профиля аккаунта. Фильтры запроса принимают секунды Unix и/или отформатированные строки в зависимости от точки входа (описано ниже для каждой точки входа). Все метки времени Unix — это количество секунд с 1970-01-01T00:00:00Z.

Согласование содержимого XML

Все точки входа также могут возвращать XML. Отправьте заголовок Accept: application/xml, чтобы получить тело ответа в формате XML вместо JSON; в ответе используется классическое представление объектного графа через .NET XmlSerializer. JSON — формат по умолчанию и рекомендуемый.

CORS

Межсайтовые запросы разрешены. Обычные (без передачи учётных данных) запросы принимаются с любого источника (Access-Control-Allow-Origin: *). Запросы, передающие cookie/учётные данные, принимаются только с источников *.host-tracker.com. На вызовы по токену (с использованием заголовка Authorization, как описано здесь) ограничение по источникам с учётными данными не распространяется.

Аутентификация

Аутентификация требуется для каждой точки входа, кроме POST users/token и анонимных точек входа со списком агентов. Поддерживаются две схемы:

  • Bearer-токен — получается через POST users/token, передаётся как Authorization: bearer <token>. Это основная схема.
  • HTTP BasicAuthorization: Basic <base64(login:password)>. Учётные данные декодируются как ISO-8859-1. Удобно для быстрых тестов; для автоматизации предпочтителен bearer-токен.

POST users/token анонимно

Обменивает логин и пароль на bearer-токен. Токен действителен в течение 48 часов.

Тело запроса

application/json
{
  "login": "your-login",
  "password": "your-password"
}
ПолеТипОписание
loginstringЛогин аккаунта. Обязательно. Также принимается email аккаунта.
passwordstringПароль аккаунта. Обязательно.
forLoginstringНеобязательно. Логин супераккаунта, от имени которого нужно действовать (олицетворение субаккаунта — см. ниже).

Ответ — 200 OK

application/json
{
  "ticket": "<bearer token>",
  "expirationTime": "2024-06-23T22:26:23Z",
  "expirationUnixTime": 1719181583
}

При ошибке возвращается ответ 401 с машинным кодом IncorrectLoginOrPassword (или AccessDenied, если для аккаунта отключён доступ к API) и заголовком WWW-Authenticate: Bearer.

Использование токена

HTTP
GET BASE_URL/tasks HTTP/1.1
Host: api1.host-tracker.com
Accept: application/json
Authorization: bearer 3DD135...5EE510417

Олицетворение субаккаунта (forLogin)

Если супераккаунт предоставил вашему субаккаунту доступ к своим данным, войдите как субаккаунт, но передайте логин супераккаунта в forLogin. Возвращённый токен позволит управлять супераккаунтом так, как если бы точки входа вызывались для вашего собственного аккаунта, в рамках прав, предоставленных супераккаунтом. Например, если он предоставил доступ только на чтение задач мониторинга, вызовы GET будут успешны, а POST/PUT/PATCH/DELETE для задач будут отклонены.

сквозной пример
# 1. Получаем токен олицетворения
POST BASE_URL/users/token HTTP/1.1
Content-Type: application/json

{
  "login": "subaccount-login",
  "password": "subaccount-password",
  "forLogin": "superaccount-login"
}

# 2. Используем полученный ticket для чтения задач СУПЕРАККАУНТА
GET BASE_URL/tasks HTTP/1.1
Authorization: bearer <ticket from step 1>

curl

bash
# получаем токен и сохраняем его
TOKEN=$(curl -s -X POST https://api1.host-tracker.com/users/token \
  -H "Content-Type: application/json" \
  -d '{"login":"your-login","password":"your-password"}' \
  | grep -o '"ticket":"[^"]*"' | cut -d'"' -f4)

# вызываем защищённую точку входа
curl -s https://api1.host-tracker.com/tasks \
  -H "Authorization: bearer $TOKEN"

Ошибки и машинные коды

Ошибки возвращаются со стандартным HTTP-кодом статуса и коротким машиночитаемым кодом, по которому ваша интеграция может ветвить логику. Тело ответа — обычный текст на английском языке (не JSON), предназначенный для людей/логов.

Машинный код передаётся двумя способами:

  • заголовок ответа X-HT-Reason — содержит код в каждом ответе и при любой версии HTTP. Это рекомендуемый способ определения типа ошибки.
  • фраза причины HTTP/1.1 — строка статуса выглядит, например, так: HTTP/1.1 400 SimilarExists. Сохранена для обратной совместимости, однако учтите, что в HTTP/2 и HTTP/3 фразы причины были удалены из протокола, поэтому это поле может быть пустым, если соединение согласовало HTTP/2+. Предпочитайте X-HT-Reason.
пример ответа с ошибкой
HTTP/1.1 400 SimilarExists
X-HT-Reason: SimilarExists
Content-Type: text/plain; charset=utf-8

Same task allready exists
Проверки аутентификации. При отсутствующем или недействительном токене возвращается 401 с заголовком WWW-Authenticate: Bearer и одним из кодов AccessDenied, WrongTicket, TicketExpired или IncorrectLoginOrPassword.

Справочник кодов ошибок

Все машинные коды, которые может вернуть API, сгруппированные по областям, с типичным HTTP-статусом. Если не указано иное, ошибки возвращаются как 400 Bad Request.

Аутентификация

КодСтатусЗначение
AccessDenied401Доступ к API отключён для этого аккаунта, либо у вызывающего недостаточно прав.
IncorrectLoginOrPassword401Логин/пароль отклонены на users/token.
WrongTicket401Bearer-токен некорректен / не читается.
TicketExpired401Срок действия bearer-токена истёк — получите новый.
RequestThrottled429Превышен лимит частоты запросов (см. Ограничения частоты запросов). Включает заголовок Retry-After.

Задачи

КодСтатусЗначение
NotFound404Запрошенная задача не существует.
SimilarExists400Задача с таким же типом и ключом уже существует (если только аккаунту не разрешены похожие задачи).
EmptyTaskData400Не переданы данные задачи.
UncomplitedData400Данные задачи неполны.
NoIdInTaskData400Запрошено обновление, но отсутствует id задачи.
WrongEditableTaskDataType400Тип тела правки не совпадает с типом целевой задачи.
WrongTaskType400Неизвестный тип задачи.
WrongTaskStatus400Недопустимое значение status (ожидается Enabled/Disabled).
WrongInterval400Интервал мониторинга не входит в число допустимых значений (см. tasks/intervals).
EmptyUrl400Не передан URL/хост для задачи, для которой он обязателен.
WrongUrl400URL некорректен.
WrongSchema400Неподдерживаемая схема URL.
BadIP400URL разрешается в запрещённый или некорректный IP-адрес.
UrlInBlackList400URL находится во внутреннем чёрном списке.
WrongHttpMethod400Неподдерживаемый HTTP-метод для HTTP-задачи (разрешены: Get, Post, Head).
WrongKeywordMode400Неподдерживаемый режим ключевых слов.
WrongPort400Некорректный порт для задачи типа порт.
WrongAgentPool400Один или несколько запрошенных пулов агентов не существуют. Сообщение перечисляет некорректные и доступные пулы.
SelectMoreAgents400В выбранных пулах агентов недостаточно агентов (требуется 7). Сообщение содержит количество по каждому пулу.
ApiFullLogNotAllowed400fullLog доступен только на расширенных тарифах.
WrongExpectedSLA400expectedSLA должен быть в диапазоне от 0 до 100.
WrongDate400Некорректная начальная/конечная дата в фильтре.
WrongDateFormat400Строка даты не соответствует требуемому формату (указан в сообщении).
EndDateIsGreaterThanStartDate400Начальная дата должна быть ≤ конечной.
StartEndIntervalIsTooBig400Запрос результатов вернул бы более 10 000 строк. Сообщение содержит допустимый интервал (см. GET tasks).
WrongSubscription400Встроенная подписка в теле задачи некорректна (внутренний код/сообщение подписки передаётся как есть).
EmptyFilter400Массовый запрос DELETE tasks отправлен с пустым фильтром (отклонён, чтобы не удалить весь аккаунт).

Контакты

КодСтатусЗначение
NotFound404Запрошенный контакт не существует.
SimilarExists400Контакт с таким же типом, шлюзом, адресом и задержкой оповещения уже существует.
EmptyContactData400Не переданы данные контакта.
UncomplitedData400Данные контакта неполны.
NoIdInContactData400Запрошено обновление, но отсутствует id контакта.
EmptyAddress400Не передан адрес при создании контакта.
WrongContactType400Неизвестный тип контакта (также возвращается для устаревшего пути создания/обновления IM).
WrongEditableContactDataType400Тип тела правки не совпадает с типом целевого контакта.
WrongEmailFormat400Некорректный email-адрес либо неподдерживаемый формат email-отчёта.
WrongPhoneFormat400Номер телефона должен содержать только цифры (ведущий + допустим).
WrongSmsGateway400Неизвестный SMS-шлюз.
WrongIMGateway400Неизвестный IM-шлюз.
WrongAlertDelay400alertDelay не входит в число допустимых значений (см. contacts/delays).
WrongActivePeriodInterval400Некорректное начало/конец активного периода.
WrongActiveDay400Неподдерживаемое название активного дня.
EmptyFilter400Массовый запрос DELETE contacts отправлен с пустым фильтром (отклонён).

Подписки

КодСтатусЗначение
AlertsAndReportsAreEmpty400В записи подписки не указаны ни типы оповещений, ни типы отчётов.
UnknownAlertType400Тип оповещения не является одним из Up, Down, RepeatedlyDown.
UnknownReportType400Тип отчёта не является одним из Day, Week, Month, Quarter, Year.

Ограничения частоты запросов

Запросы ограничиваются по частоте для каждого клиента и каждой точки входа отдельно. При превышении лимита возвращается 429 с машинным кодом RequestThrottled и заголовком Retry-After (в секундах).

Область действияЛимит
Обычные точки входа, на аккаунт + точку входа6 запросов/секунду и 120 запросов/минуту
Точки входа кодов подтверждения (contacts/{id}/code), на аккаунт + точку входа1 запрос/секунду и 2 запроса/минуту
Анонимные точки входаТе же 6/с + 120/мин, ключом служит IP-адрес клиента
ответ 429
HTTP/1.1 429 RequestThrottled
X-HT-Reason: RequestThrottled
Retry-After: 1
Content-Type: application/json; charset=utf-8

"API calls quota exceeded! maximum admitted 6 per s."

Задачи мониторинга

GET tasks/types

Возвращает массив известных системе имён типов задач:

200 OK
["API","CntCheck","Counter","DNSBL","Database","DomainExp","Http",
 "Ping","Port","RusRegBL","SSLExp","Snmp","Tran","Waterfall","WebRisk"]
Существующие задачи любого из этих типов можно прочитать через этот API. Создавать/обновлять задачи можно только через типизированные точки входа для четырёх типов: Http Ping Port RusRegBL (создаются на tasks/http, tasks/ping, tasks/port, tasks/rusbl соответственно).

GET tasks/intervals

Возвращает массив интервалов мониторинга (в минутах), допустимых для вашего аккаунта, например [1,5,15,30,60]. Используйте одно из этих значений для поля interval при создании задачи; любое другое значение приведёт к WrongInterval.

GET tasks

Список задач мониторинга. Все параметры запроса необязательны; без параметров возвращаются все задачи аккаунта. Чтобы передать массив, повторите параметр, например ?ids=guid1&ids=guid2.

Параметр info

Запрашивает дополнительные данные, встраиваемые в каждую задачу. Значения можно объединять через запятую (?info=stats,subscriptions) либо передать эквивалентное целое число-битовую маску:

ЗначениеБитЭффект
subscriptions1Включить подписки задачи на оповещения/отчёты в поле subscriptions.
stats2Включить дневной/месячный/годовой/суммарный аптайм в поле stats.
results4Включить результаты проверок за окно sdtuedtu в поле results (последний результат, если окно не задано).
attachedResultsВключить последние результаты присоединённых проверок (сертификат, истечение домена, DNSBL) в поле attached. Требует соответствующих флагов check… у задачи.

?info=stats,subscriptions,results эквивалентно ?info=7.

Параметры фильтра

ПараметрТипОписание
idsguid[]Вернуть только эти id задач. Для одного id предпочтительнее использовать GET tasks/{id}.
excludeIdsboolВместе с ids: вернуть всё, кроме этих id.
taskType / taskTypesstring / string[]Фильтр по типу задачи (с учётом регистра), например Http.
excludeTaskTypesboolИнвертировать фильтр по типу.
statusstringEnabled или Disabled (отключение пользователем). Например ?status=Disabled.
url / urlsstring / string[]Фильтр по URL. Значения в urls должны быть URL-кодированы.
urlSearchLikeboolВместе с url (не urls): поиск по подстроке вместо точного совпадения.
excludeUrlsboolИнвертировать фильтр по URL.
name / namesstring / string[]Фильтр по имени задачи. Сочетание name/names с id/ids работает как ИЛИ; сочетание с другими фильтрами — как И.
nameSearchLikeboolВместе с name: поиск по подстроке.
excludeNamesboolИнвертировать фильтр по имени.
interval / intervalsint / int[]Фильтр по интервалу мониторинга (в минутах).
excludeIntervalsboolИнвертировать фильтр по интервалу.
openStatboolПубличные задачи (публичная статистика/журнал событий).
lastStatebooltrue — сейчас доступна, false — сейчас недоступна.
tagsstring[]Фильтр по тегу.
overlimitedboolЗадачи с (true) или без (false) превышения биллингового лимита.
activebooltrue — активна, false — отключена системой (превышение лимита, низкий баланс, …). Для отключения пользователем используйте status.
sdtu / edtuint64Секунды Unix (UTC), начало/конец окна. Используется только когда задан info=results; указывайте оба значения. edtu должен быть > sdtu.
Лимит строк результатов. При запросе результатов оценочное количество строк (edtu − sdtu) × (число задач) / (средний интервал) не должно превышать 10 000. Иначе ответ будет 400 StartEndIntervalIsTooBig, а его сообщение будет содержать максимальный подходящий интервал. Это ограничение применяется только к чтению результатов задач.

Ответ — 200 OK

Массив объектов задач. Точный набор полей зависит от типа задачи; общая база включает id, name, taskType, enabled, interval, lastState, creationTime, tags, agentPools, а также (если запрошено через info) subscriptions, stats, results и attached. Если включены результаты, каждый результат содержит как минимум timestamp (секунды Unix, UTC) и eventNumber; остальные поля зависят от типа задачи (см. ниже пример ответа на создание HTTP-задачи).

пример запроса
GET BASE_URL/tasks?info=stats,subscriptions&taskType=Http HTTP/1.1
Accept: application/json
Authorization: bearer <token>

GET tasks/{id:guid}

Получить одну задачу по id. Принимает тот же параметр info (а также sdtu/edtu при info=results). Возвращает объект задачи либо 404 NotFound, если задача не существует.

POST tasks/http · tasks/ping · tasks/port · tasks/rusbl

Создаёт задачу мониторинга указанного типа. При успехе возвращается 201 Created, относительный заголовок Location: /tasks/{id} и полный объект созданной задачи.

Тело запроса — HTTP-задача

POST tasks/http · application/json
{
  // поля, специфичные для HTTP
  "url": "https://www.example.com",        // ОБЯЗАТЕЛЬНО
  "httpMethod": "Get",                       // Get | Post | Head (по умолчанию Get)
  "userAgent": "MyMonitor",
  "referer": "https://www.google.com",
  "acceptHeader": "application/json",
  "followRedirect": false,
  "treat300AsError": false,                // если задано, followRedirect игнорируется
  "checkDnsbl": false,                       // проверять домен по DNS-чёрным спискам
  "checkDomainExpiration": false,            // отслеживать истечение домена (только для валидных доменов)
  "checkCertificateExpiration": false,       // отслеживать истечение TLS-сертификата (только для https)
  "checkRussianBlackLists": false,
  "checkWebRisk": false,
  "timeout": 40000,                          // мс до фиксации ошибки проверки
  "keywords": ["error", "maintenance"],
  "keywordMode": "ReverseAny",             // см. режимы ключевых слов ниже
  "userName": "basic-auth-user",          // учётные данные для проверяемого ресурса
  "password": "basic-auth-pass",
  "postParameters": "a=1\r\nb=2",          // только с httpMethod=Post
  "ignoredStatuses": [404, 500],

  // поля, общие для всех типов задач
  "interval": 5,                             // минуты; должен быть допустимым интервалом
  "enabled": true,
  "fullLog": false,                          // только на расширенных тарифах
  "openStat": true,
  "name": "My website",
  "tags": ["production", "web"],
  "agentPools": ["westeurope", "asia"],  // см. примечания ниже
  "subscriptions": [ /* встроенные подписки, см. ниже */ ]
}
Режим ключевых словЗадача считается исправной, когда…
PresentAnyлюбое ключевое слово присутствует в ответе.
PresentAllприсутствуют все ключевые слова.
ReverseAnyотсутствуют все ключевые слова.
ReverseAllотсутствует любое ключевое слово.
ReverseWithResultотсутствуют все ключевые слова; сообщение об ошибке включает остаток строки ответа, в которой встретилось первое ключевое слово (анализируются первые 100 символов каждой строки).
agentPools задаёт точки мониторинга. Параметр необязателен (иначе используется значение по умолчанию из профиля). Если указан, пулы вместе должны содержать не менее 7 агентов, иначе запрос завершится с SelectMoreAgents. Неизвестные id пулов приводят к WrongAgentPool. Id пулов берутся из GET agents/pools.

Встроенные подписки

Массив subscriptions подписывает контакты на оповещения/отчёты этой задачи в момент создания. Каждая запись использует форму подписки; не задавайте taskIds (он фиксирован на новую задачу). Если contactIds не указан, подписываются все ваши подтверждённые контакты. Подписки на отчёты применяются только к контактам типа Email.

Другие типы задач

  • tasks/ping — в теле передаётся host плюс общие поля.
  • tasks/port — в теле передаются host и port плюс общие поля.
  • tasks/rusbl — проверка по чёрным спискам российского реестра; в теле передаётся url, а также ignoreWarnings, doNotSendMsgOnWarnings, prefixMatch и общие поля.

Ответ — 201 Created (HTTP-задача)

application/json
{
  "id": "ef10cd12-93f9-e311-bec5-dc85de1f0bc2",
  "url": "https://www.example.com",
  "rawUrl": "https://www.example.com",
  "name": "My website",
  "creationTime": "2024-06-21T22:26:23Z",
  "taskType": "Http",
  "enabled": true,
  "interval": 5,
  "lastState": true,
  "openStatEnabled": true,
  "fullLogEnabled": false,
  "tags": ["production", "web"],
  "agentPools": ["westeurope", "asia"],
  "subscriptions": [
    { "alertTypes": ["Up"],   "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] },
    { "alertTypes": ["Down"], "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] },
    { "reportTypes": ["Month"], "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] }
  ],
  "httpMethod": "Get",
  "keywords": ["error"],
  "keywordMode": "ReverseAny",
  "timeout": 40000
}

curl

bash
curl -s -X POST https://api1.host-tracker.com/tasks/http \
  -H "Authorization: bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.example.com","interval":5,"name":"My website"}'

PUT tasks & типизированные варианты

Обновление задач. Две формы:

  • По idPUT tasks/{id} (только общие поля), либо типизированные PUT tasks/http/{id}, tasks/ping/{id}, tasks/port/{id}, tasks/rusbl/{id} (также поля, специфичные для типа). Тело имеет ту же редактируемую форму, что и при создании; изменяются только присланные поля.
  • По фильтруPUT tasks?<filter> (только общие поля) либо типизированный PUT tasks/{type}?<filter> (закрепляет фильтр за этим типом). Используются те же параметры фильтра, что и у GET tasks. Возвращает обновлённые задачи.

Нетипизированный PUT tasks / PUT tasks/{id} может менять только поля, общие для всех типов задач — чтобы изменить настройки, специфичные для типа, используйте типизированную точку входа.

DELETE tasks/{id:guid} & tasks

  • DELETE tasks/{id} — удаляет одну задачу; возвращает удалённую задачу.
  • DELETE tasks?<filter> — массовое удаление по фильтру задач (фильтр также может быть передан в теле запроса). Возвращает удалённые задачи.
Пустой фильтр отклоняется. Массовый запрос DELETE tasks без выборочного фильтра возвращает 400 EmptyFilter вместо удаления всего вашего аккаунта. Чтобы намеренно удалить всё, выполняйте удаление явно по элементам.

POST tasks/$batch · task/$batch

Выполняет несколько операций над задачами в одном запросе. Тело — JSON-массив вложенных запросов; ответ — JSON-массив вложенных ответов в том же порядке. Подоперация выбирается по последнему сегменту relativeUrl (например, httpPOST tasks/http). Тело запроса должно быть в формате JSON (Content-Type: application/json). Тот же механизм существует для контактов на contacts/$batch / contact/$batch.

Поле запросаТипОписание
methodstringHTTP-метод вложенного запроса (POST, PUT, DELETE…).
relativeUrlstringПодресурс; последний сегмент выбирает операцию (http, ping, port, rusbl…).
contentTypestringТип содержимого content, обычно application/json.
contentstringТело вложенного запроса в виде JSON-строки.
Поле ответаТипОписание
codeintHTTP-код статуса вложенного ответа (например, 201, 400).
statusstringТекст причины/статуса (при ошибках содержит машинный код).
headersobjectЗаголовки ответа подоперации (например, Location).
bodystringТело вложенного ответа.
запрос · POST tasks/$batch
POST BASE_URL/tasks/$batch HTTP/1.1
Authorization: bearer <token>
Content-Type: application/json

[
  {
    "method": "POST",
    "relativeUrl": "http",
    "contentType": "application/json",
    "content": "{\"url\":\"https://a.example.com\",\"interval\":5}"
  },
  {
    "method": "POST",
    "relativeUrl": "ping",
    "contentType": "application/json",
    "content": "{\"host\":\"b.example.com\"}"
  }
]
ответ · 200 OK
[
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/ef10cd12-...-0bc2" },
    "body": "{ ...created http task... }" },
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/7a20de34-...-1cd3" },
    "body": "{ ...created ping task... }" }
]

Контакты

Контакты — это адресаты, которые получают оповещения и отчёты (email-адреса, номера телефонов для SMS/голосовых звонков). Id контактов используются при создании подписок.

GET contacts/types · contacts/delays · contacts/sms/gateways · contacts/im/gateways

Статические перечисления, используемые точками входа для контактов:

ЭндпоинтВозвращает
contacts/types["Email","IM","SMS","VoiceCall"] — типы контактов, перечисляемые этим API. Создаваемые типы — Email, SMS и VoiceCall (IM устарел — см. ниже).
contacts/delaysДопустимые значения alertDelay (в минутах): [0,5,15,30,60,180,720,360,1440,3].
contacts/sms/gatewaysId SMS-шлюзов: ["clickatell","clickatella","infobip","skype","twiliosms"]. По умолчанию используется twiliosms; остальные записи устарели и могут быть неактивны.
contacts/im/gatewaysId IM-шлюзов: ["GTalk","SkypeChat"]. Перечислены только для совместимости — создавать IM-контакты больше нельзя (см. ниже).
IM-контакты устарели. GET contacts/im/gateways по-прежнему возвращает список шлюзов, но POST contacts/im и PUT contacts/im теперь возвращают 400 WrongContactType. Существующие IM-контакты нельзя создать через этот API.

GET contacts & contacts/{id:guid}

Список контактов (опционально с фильтром) или получение одного по id. Добавьте ?info=subscriptions, чтобы включить подписки каждого контакта. Без фильтра возвращаются все контакты аккаунта.

Параметр фильтраТипОписание
ids / excludeIdsguid[] / boolВыбрать или исключить по id.
contactType / contactTypesstring / string[]Фильтр по типу (Email, SMS, VoiceCall…).
excludeContactTypesboolИнвертировать фильтр по типу.
confirmedboolПодтверждённые либо неподтверждённые контакты.
overlimitedboolКонтакты, помеченные как превышающие лимит тарифа.
acceptBillingNotificationsboolКонтакты, используемые для биллинговых уведомлений.
name / names / nameSearchLike / excludeNamesstring(s) / boolФильтр по имени (точное совпадение, список, подстрока или исключение).
address / addresses / addressSearchLike / excludeAddressesstring(s) / boolФильтр по адресу.

Объект контакта

Общие поля: id, confirmed, contactType, name, address, alertDelay, activePeriodStart/activePeriodEnd (HH:mm), activeDays, sendCost. Email-контакты дополнительно содержат reportFormat (Text/ShortText), sendNews, sendBillingNotifications; SMS/IM-контакты дополнительно содержат gateway.

POST contacts/email · contacts/sms · contacts/voice

Создаёт контакт. Возвращает 201 Created, относительный заголовок Location: /contacts/{id} и ContactOperationResult ({ contact, status }), чьё поле status сообщает об исходе подтверждения.

POST contacts/email · application/json
{
  "address": "ops@@example.com",          // ОБЯЗАТЕЛЬНО
  "name": "Ops mailbox",
  "alertDelay": 0,                        // минуты; одно из contacts/delays
  "reportFormat": "Text",               // Text | ShortText (только email)
  "activePeriodStart": "00:00",        // необязательное окно "тихих часов" (HH:mm)
  "activePeriodEnd": "23:59",
  "activeDays": ["Monday", "Tuesday"],   // необязательно; по умолчанию все дни
  "subscriptions": [ /* необязательные встроенные подписки */ ]
}
ПолеПрименяется кПримечания
addressвсеEmail-адрес либо номер телефона (цифры, опционально с ведущим +) для SMS/голосовых звонков. Обязательно при создании.
alertDelayвсеМинуты ожидания перед оповещением. Должно быть одним из contacts/delays.
activePeriodStart / activePeriodEndвсеHH:mm; окно, в течение которого доставляются оповещения.
activeDaysвсеЛюбые из SundaySaturday; по умолчанию каждый день.
reportFormat, sendNews, sendBillingNotificationsemailНастройки email.
gatewaysmsОдно из contacts/sms/gateways; по умолчанию twiliosms.

SMS- и голосовые контакты по умолчанию используют шлюзы twiliosms / twiliovoice, получают стандартную цену за сообщение и сохраняют номер с ведущим +. Изменение адреса или шлюза контакта сбрасывает его подтверждённое состояние.

Значения статуса подтверждения

Поле status результата сообщает об исходе отправки кода подтверждения:

СтатусЗначение
ConfirmedКонтакт создан уже подтверждённым (код не требуется).
CodeSentКод подтверждения отправлен; контакт станет активным после подтверждения.
CodeSentEarlierКод уже был недавно отправлен и всё ещё действителен.
CodeFailКонтакт создан, но отправка кода не удалась; повторите попытку позже.
LowSmsBalanceНе удалось отправить код, так как баланс аккаунта слишком низок.
OverlimitedКонтакт превышает лимит тарифа.

PUT contacts & типизированные варианты

  • По idPUT contacts/{id} (общие поля), либо типизированные PUT contacts/email/{id}, contacts/sms/{id}, contacts/voice/{id}. Изменяются только присланные поля.
  • По фильтруPUT contacts?<filter> либо типизированный PUT contacts/{type}?<filter> (закрепляет фильтр за этим типом), с использованием фильтра контактов.

PUT contacts/im (в обеих формах) возвращает 400 WrongContactType.

DELETE contacts/{id:guid} & contacts

Удаляет один контакт по id либо выполняет массовое удаление по фильтру контактов. Как и для задач, массовое удаление с пустым фильтром отклоняется с кодом 400 EmptyFilter.

Коды подтверждения

Неподтверждённые контакты должны подтвердить владение коротким кодом, доставляемым на адрес контакта.

  • PATCH contacts/{id}/code — (повторно) выпускает и отправляет код подтверждения. Возвращает ContactOperationResult со статусом, например CodeSent.
  • POST contacts/{id}/code — подтверждает контакт, передавая код. Тело: { "code": "12345" }. При успехе контакт становится подтверждённым.
Для этих точек входа действует более строгий лимит частоты: 1 запрос/секунду и 2 запроса/минуту.

Оповещения и подписки

Подписка связывает одну или несколько задач и контактов с набором типов оповещений и/или отчётов. Одна запись подписки декартово перемножает свои задачи и контакты, порождая одно оповещение/отчёт на каждую пару (задача, контакт, тип).

Форма подписки

запись подписки
{
  "alertTypes": ["Up", "Down"],       // любые из Up, Down, RepeatedlyDown
  "reportTypes": ["Day", "Month"],     // любые из Day, Week, Month, Quarter, Year
  "taskIds": ["<task guid>"],
  "contactIds": ["<contact guid>"]
}
  • Требуется хотя бы одно из alertTypes / reportTypes, иначе возникает AlertsAndReportsAreEmpty.
  • Если taskIds не указан, по умолчанию берутся все ваши задачи; если contactIds не указан, по умолчанию берутся все ваши контакты. Явно заданный пустой массив означает "ни одного".
  • Подписки на отчёты применяются только к Email-контактам — типы отчётов для не-Email контактов тихо игнорируются (их подписки на оповещения всё равно создаются).
  • Id, которыми вы не владеете, игнорируются.

GET subscriptions/alertTypes · subscriptions/reportTypes

ЭндпоинтВозвращает
subscriptions/alertTypes["Up","Down","RepeatedlyDown"]
subscriptions/reportTypes["Day","Week","Month","Quarter","Year"]

GET subscriptions

Список подписок. Возвращает по одной записи на каждую совпавшую подписку на оповещение или отчёт (никогда не объединяет их). Необязательные фильтры:

ПараметрТипОписание
taskIdguidТолько подписки для этой задачи.
contactIdguidТолько подписки для этого контакта.
typesstring[]Только эти типы оповещений/отчётов. Здесь нераспознанные названия игнорируются (в отличие от POST/DELETE, которые их отклоняют).

POST subscriptions · DELETE subscriptions

Оба метода принимают в теле JSON-массив записей подписки. POST добавляет описанные подписки (вставляются только новые строки); DELETE удаляет существующие. Оба метода возвращают 200 OK с пустым телом. Неизвестные типы оповещений/отчётов отклоняются с UnknownAlertType / UnknownReportType.

POST subscriptions · тело запроса
[
  { "alertTypes": ["Up", "Down"],
    "taskIds": ["7ee87894-b8a9-e311-beb2-dc85de1f0bc2"],
    "contactIds": ["4cedf037-d1d9-e311-bebc-dc85de1f0bc2"] },
  { "reportTypes": ["Month"],
    "taskIds": ["7ee87894-b8a9-e311-beb2-dc85de1f0bc2"],
    "contactIds": ["4cedf037-d1d9-e311-bebc-dc85de1f0bc2"] }
]
curl
curl -s -X POST https://api1.host-tracker.com/subscriptions \
  -H "Authorization: bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{"alertTypes":["Up","Down"],"taskIds":["<task>"],"contactIds":["<contact>"]}]'

Статистика и результаты

GET stats

Агрегаты аптайма/даунтайма по задачам за временное окно. Принимает фильтр задач для выбора задач, а также:

ПараметрТипОписание
statsStartUnix / statsEndUnixint64Начало/конец окна в секундах Unix (UTC).
statsStart / statsEndstringНачало/конец окна в виде строки, отформатированной согласно профилю (альтернатива полям Unix).
expectedSLAdouble0–100. Если задано, каждый результат сообщает slaExpectationSucceeded.
fullTaskboolВключить полный объект задачи вместо только ссылки на неё.

Ответ

Объект Stats с рассчитанным окном (поля даты в двойном представлении) и массивом stats. Каждая запись содержит ссылку на задачу и: uptimeInMinutes/uptimeSpan, downtimeInMinutes/downtimeSpan, время технического обслуживания (up/down), totalTimeInMinutes, количество проверок по интервалам и uptimePercent/downtimePercent.

Процент аптайма: uptime% = (uptime + maintenanceUptime) / (totalTime − maintenanceDowntime). Когда общее время равно времени технического обслуживания в состоянии простоя, процент равен null (не определён). slaExpectationSucceeded — это uptime% ≥ expectedSLA.

GET outages

Периоды простоя по задачам. Принимает фильтр задач плюс:

ПараметрТипОписание
startTimeUnix / endTimeUnixint64Окно в секундах Unix (UTC).
startTime / endTimestringОкно в виде строк, отформатированных согласно профилю.
getInUtcTimeZoneintЕсли задано, отформатированное время указывается в UTC, а не в часовом поясе профиля.
fullTaskboolВключить полный объект задачи.

Ответ: объект Outages с рассчитанным окном и массивом taskOutages; каждый элемент связывает задачу с её периодами outages (startTime/endTime + варианты в Unix, номера событий, необязательный комментарий).

GET incident

Список инцидентов (событий сбоя) по задачам. Принимает фильтр задач плюс те же параметры окна/часового пояса, что и outages, а также:

ПараметрТипОписание
startTimeUnix / endTimeUnix / startTime / endTimeint64 / stringОкно (в Unix и/или отформатированное).
getInUtcTimeZoneintФорматировать время в UTC.
fullTaskboolВключить полный объект задачи.
fullLogboolВключить подробный журнал повторных проверок по агентам. Требует расширенный тариф, иначе ApiFullLogNotAllowed.

Ответ: объект Incidents с массивом taskIncidents. Каждый инцидент содержит taskId, checkId, время начала/окончания в Unix, location сбойной точки, error, hasSnapshot и (с fullLog) блок recheck со списком успешных локаций и локаций, упавших по каждому виду ошибки.

GET incident/snapshot

Получить сохранённый снимок ответа, зафиксированный для инцидента. Параметры:

ПараметрТипОписание
taskIdguidЗадача. Обязательно.
checkIdint64Id проверки/события.
timestampUnixUtcint64Время инцидента (секунды Unix, UTC).

Возвращает снимок (метку времени плюс захваченные байты), если он существует, либо null, если снимка для указанного инцидента нет.

GET results/http

Агрегированные метрики времени отклика HTTP по задачам. Принудительно фильтрует по типу задачи Http. Принимает фильтр задач плюс:

ПараметрТипОписание
resultStartUnix / resultEndUnixint64Окно в секундах Unix (UTC).
resultStart / resultEndstringОкно в виде строк, отформатированных согласно профилю.
fullTaskboolВключить полный объект задачи.

Ответ: объект AggregatedHttpResults; каждая запись taskResults содержит ссылку на задачу и усреднённые responseTime, dnsTime, headTime, dataTime (в миллисекундах).

GET cr/httpResponseTime

Ряды времени отклика HTTP по задачам. Принимает фильтр задач плюс startDate, endDate и groupBy. Возвращает простой массив объектов рядов:

200 OK
[
  {
    "id": "ef10cd12-93f9-e311-bec5-dc85de1f0bc2",
    "rawUrl": "https://www.example.com",
    "name": "My website",
    "results": [ [1719181583, 142], [1719177983, 138] ]   // [секунды Unix, время отклика в мс], сначала новые
  }
]

Агенты

Агенты — это географически распределённые точки мониторинга. Id пулов, возвращаемые здесь, — это значения, которые вы передаёте в поле agentPools задачи.

GET agents

Список агентов мониторинга. Необязательный параметр запроса:

ПараметрТипОписание
touchedintТолько агенты, которые отчитались за последние N минут. Значения ≤ 0 (или отсутствие параметра) означают отсутствие фильтра; иначе значение ограничивается диапазоном 1–10.

Каждый агент содержит id, upFrom, datacenter (название/город/страна/регион), company (название/url), ip, version, lon/lat и pools.

200 OK
[
  {
    "id": "a1b2c3d4-...-0001",
    "upFrom": "2024-06-20T08:00:00Z",
    "datacenter": { "name": "Example Hosting", "city": "Frankfurt", "country": "DE", "state": "" },
    "company": { "name": "Example Hosting", "url": "https://example-hosting.com" },
    "ip": "203.0.113.10",
    "version": "1.4.2",
    "lon": 8.68, "lat": 50.11,
    "pools": []
  }
]

GET agents/pools

Список публичных пулов агентов (гео-регионов). Каждый пул содержит id, desc, свои agents, childPools и hidden. Используйте значения id пула в поле agentPools задачи.

GET agents/ips анонимно

Возвращает текущие IP-адреса агентов мониторинга — полезно для добавления Host-Tracker в белый список файрвола. Эта точка входа не требует аутентификации. По умолчанию она возвращает text/plain, по одному IP на строку; отправьте заголовок Accept: application/json, чтобы получить JSON-массив вместо этого.

text/plain (по умолчанию)
203.0.113.10
203.0.113.11
198.51.100.7
с заголовком Accept: application/json
["203.0.113.10", "203.0.113.11", "198.51.100.7"]
Host-Tracker REST API v1 — host-tracker.com. Машиночитаемая документация Swagger/OpenAPI доступна по адресу BASE_URL/docs/v1, а интерактивная песочница — по адресу BASE_URL/sandbox.