Нет подходящих разделов.
Host-Tracker REST API v1
Стабильный HTTP API с токен-аутентификацией для управления задачами мониторинга сайтов, контактами, подписками на оповещения/отчёты, а также для чтения статистики, простоев и инцидентов.
Базовый 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 Basic —
Authorization: Basic <base64(login:password)>. Учётные данные декодируются как ISO-8859-1. Удобно для быстрых тестов; для автоматизации предпочтителен bearer-токен.
POST users/token анонимно
Обменивает логин и пароль на bearer-токен. Токен действителен в течение 48 часов.
Тело запроса
{
"login": "your-login",
"password": "your-password"
}
| Поле | Тип | Описание |
|---|---|---|
login | string | Логин аккаунта. Обязательно. Также принимается email аккаунта. |
password | string | Пароль аккаунта. Обязательно. |
forLogin | string | Необязательно. Логин супераккаунта, от имени которого нужно действовать (олицетворение субаккаунта — см. ниже). |
Ответ — 200 OK
{
"ticket": "<bearer token>",
"expirationTime": "2024-06-23T22:26:23Z",
"expirationUnixTime": 1719181583
}
При ошибке возвращается ответ 401 с машинным кодом
IncorrectLoginOrPassword (или AccessDenied, если для
аккаунта отключён доступ к API) и заголовком WWW-Authenticate: Bearer.
Использование токена
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
# получаем токен и сохраняем его
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.
Аутентификация
| Код | Статус | Значение |
|---|---|---|
AccessDenied | 401 | Доступ к API отключён для этого аккаунта, либо у вызывающего недостаточно прав. |
IncorrectLoginOrPassword | 401 | Логин/пароль отклонены на users/token. |
WrongTicket | 401 | Bearer-токен некорректен / не читается. |
TicketExpired | 401 | Срок действия bearer-токена истёк — получите новый. |
RequestThrottled | 429 | Превышен лимит частоты запросов (см. Ограничения частоты запросов). Включает заголовок Retry-After. |
Задачи
| Код | Статус | Значение |
|---|---|---|
NotFound | 404 | Запрошенная задача не существует. |
SimilarExists | 400 | Задача с таким же типом и ключом уже существует (если только аккаунту не разрешены похожие задачи). |
EmptyTaskData | 400 | Не переданы данные задачи. |
UncomplitedData | 400 | Данные задачи неполны. |
NoIdInTaskData | 400 | Запрошено обновление, но отсутствует id задачи. |
WrongEditableTaskDataType | 400 | Тип тела правки не совпадает с типом целевой задачи. |
WrongTaskType | 400 | Неизвестный тип задачи. |
WrongTaskStatus | 400 | Недопустимое значение status (ожидается Enabled/Disabled). |
WrongInterval | 400 | Интервал мониторинга не входит в число допустимых значений (см. tasks/intervals). |
EmptyUrl | 400 | Не передан URL/хост для задачи, для которой он обязателен. |
WrongUrl | 400 | URL некорректен. |
WrongSchema | 400 | Неподдерживаемая схема URL. |
BadIP | 400 | URL разрешается в запрещённый или некорректный IP-адрес. |
UrlInBlackList | 400 | URL находится во внутреннем чёрном списке. |
WrongHttpMethod | 400 | Неподдерживаемый HTTP-метод для HTTP-задачи (разрешены: Get, Post, Head). |
WrongKeywordMode | 400 | Неподдерживаемый режим ключевых слов. |
WrongPort | 400 | Некорректный порт для задачи типа порт. |
WrongAgentPool | 400 | Один или несколько запрошенных пулов агентов не существуют. Сообщение перечисляет некорректные и доступные пулы. |
SelectMoreAgents | 400 | В выбранных пулах агентов недостаточно агентов (требуется 7). Сообщение содержит количество по каждому пулу. |
ApiFullLogNotAllowed | 400 | fullLog доступен только на расширенных тарифах. |
WrongExpectedSLA | 400 | expectedSLA должен быть в диапазоне от 0 до 100. |
WrongDate | 400 | Некорректная начальная/конечная дата в фильтре. |
WrongDateFormat | 400 | Строка даты не соответствует требуемому формату (указан в сообщении). |
EndDateIsGreaterThanStartDate | 400 | Начальная дата должна быть ≤ конечной. |
StartEndIntervalIsTooBig | 400 | Запрос результатов вернул бы более 10 000 строк. Сообщение содержит допустимый интервал (см. GET tasks). |
WrongSubscription | 400 | Встроенная подписка в теле задачи некорректна (внутренний код/сообщение подписки передаётся как есть). |
EmptyFilter | 400 | Массовый запрос DELETE tasks отправлен с пустым фильтром (отклонён, чтобы не удалить весь аккаунт). |
Контакты
| Код | Статус | Значение |
|---|---|---|
NotFound | 404 | Запрошенный контакт не существует. |
SimilarExists | 400 | Контакт с таким же типом, шлюзом, адресом и задержкой оповещения уже существует. |
EmptyContactData | 400 | Не переданы данные контакта. |
UncomplitedData | 400 | Данные контакта неполны. |
NoIdInContactData | 400 | Запрошено обновление, но отсутствует id контакта. |
EmptyAddress | 400 | Не передан адрес при создании контакта. |
WrongContactType | 400 | Неизвестный тип контакта (также возвращается для устаревшего пути создания/обновления IM). |
WrongEditableContactDataType | 400 | Тип тела правки не совпадает с типом целевого контакта. |
WrongEmailFormat | 400 | Некорректный email-адрес либо неподдерживаемый формат email-отчёта. |
WrongPhoneFormat | 400 | Номер телефона должен содержать только цифры (ведущий + допустим). |
WrongSmsGateway | 400 | Неизвестный SMS-шлюз. |
WrongIMGateway | 400 | Неизвестный IM-шлюз. |
WrongAlertDelay | 400 | alertDelay не входит в число допустимых значений (см. contacts/delays). |
WrongActivePeriodInterval | 400 | Некорректное начало/конец активного периода. |
WrongActiveDay | 400 | Неподдерживаемое название активного дня. |
EmptyFilter | 400 | Массовый запрос DELETE contacts отправлен с пустым фильтром (отклонён). |
Подписки
| Код | Статус | Значение |
|---|---|---|
AlertsAndReportsAreEmpty | 400 | В записи подписки не указаны ни типы оповещений, ни типы отчётов. |
UnknownAlertType | 400 | Тип оповещения не является одним из Up, Down, RepeatedlyDown. |
UnknownReportType | 400 | Тип отчёта не является одним из Day, Week, Month, Quarter, Year. |
Ограничения частоты запросов
Запросы ограничиваются по частоте для каждого клиента и каждой точки входа отдельно. При превышении лимита
возвращается 429 с машинным кодом RequestThrottled и
заголовком Retry-After (в секундах).
| Область действия | Лимит |
|---|---|
| Обычные точки входа, на аккаунт + точку входа | 6 запросов/секунду и 120 запросов/минуту |
Точки входа кодов подтверждения (contacts/{id}/code), на аккаунт + точку входа | 1 запрос/секунду и 2 запроса/минуту |
| Анонимные точки входа | Те же 6/с + 120/мин, ключом служит IP-адрес клиента |
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
Возвращает массив известных системе имён типов задач:
["API","CntCheck","Counter","DNSBL","Database","DomainExp","Http",
"Ping","Port","RusRegBL","SSLExp","Snmp","Tran","Waterfall","WebRisk"]
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) либо передать эквивалентное целое число-битовую маску:
| Значение | Бит | Эффект |
|---|---|---|
subscriptions | 1 | Включить подписки задачи на оповещения/отчёты в поле subscriptions. |
stats | 2 | Включить дневной/месячный/годовой/суммарный аптайм в поле stats. |
results | 4 | Включить результаты проверок за окно sdtu…edtu в поле results (последний результат, если окно не задано). |
attachedResults | — | Включить последние результаты присоединённых проверок (сертификат, истечение домена, DNSBL) в поле attached. Требует соответствующих флагов check… у задачи. |
?info=stats,subscriptions,results эквивалентно ?info=7.
Параметры фильтра
| Параметр | Тип | Описание |
|---|---|---|
ids | guid[] | Вернуть только эти id задач. Для одного id предпочтительнее использовать GET tasks/{id}. |
excludeIds | bool | Вместе с ids: вернуть всё, кроме этих id. |
taskType / taskTypes | string / string[] | Фильтр по типу задачи (с учётом регистра), например Http. |
excludeTaskTypes | bool | Инвертировать фильтр по типу. |
status | string | Enabled или Disabled (отключение пользователем). Например ?status=Disabled. |
url / urls | string / string[] | Фильтр по URL. Значения в urls должны быть URL-кодированы. |
urlSearchLike | bool | Вместе с url (не urls): поиск по подстроке вместо точного совпадения. |
excludeUrls | bool | Инвертировать фильтр по URL. |
name / names | string / string[] | Фильтр по имени задачи. Сочетание name/names с id/ids работает как ИЛИ; сочетание с другими фильтрами — как И. |
nameSearchLike | bool | Вместе с name: поиск по подстроке. |
excludeNames | bool | Инвертировать фильтр по имени. |
interval / intervals | int / int[] | Фильтр по интервалу мониторинга (в минутах). |
excludeIntervals | bool | Инвертировать фильтр по интервалу. |
openStat | bool | Публичные задачи (публичная статистика/журнал событий). |
lastState | bool | true — сейчас доступна, false — сейчас недоступна. |
tags | string[] | Фильтр по тегу. |
overlimited | bool | Задачи с (true) или без (false) превышения биллингового лимита. |
active | bool | true — активна, false — отключена системой (превышение лимита, низкий баланс, …). Для отключения пользователем используйте status. |
sdtu / edtu | int64 | Секунды 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-задача
{
// поля, специфичные для 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-задача)
{
"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
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 & типизированные варианты
Обновление задач. Две формы:
- По id —
PUT 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 (например, http →
POST tasks/http). Тело запроса должно быть в формате JSON
(Content-Type: application/json). Тот же механизм существует для контактов на
contacts/$batch / contact/$batch.
| Поле запроса | Тип | Описание |
|---|---|---|
method | string | HTTP-метод вложенного запроса (POST, PUT, DELETE…). |
relativeUrl | string | Подресурс; последний сегмент выбирает операцию (http, ping, port, rusbl…). |
contentType | string | Тип содержимого content, обычно application/json. |
content | string | Тело вложенного запроса в виде JSON-строки. |
| Поле ответа | Тип | Описание |
|---|---|---|
code | int | HTTP-код статуса вложенного ответа (например, 201, 400). |
status | string | Текст причины/статуса (при ошибках содержит машинный код). |
headers | object | Заголовки ответа подоперации (например, Location). |
body | string | Тело вложенного ответа. |
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\"}"
}
]
[
{ "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/gateways | Id SMS-шлюзов: ["clickatell","clickatella","infobip","skype","twiliosms"]. По умолчанию используется twiliosms; остальные записи устарели и могут быть неактивны. |
contacts/im/gateways | Id IM-шлюзов: ["GTalk","SkypeChat"]. Перечислены только для совместимости — создавать IM-контакты больше нельзя (см. ниже). |
GET contacts/im/gateways по-прежнему возвращает
список шлюзов, но POST contacts/im и PUT contacts/im
теперь возвращают 400 WrongContactType. Существующие IM-контакты нельзя создать
через этот API.
GET contacts & contacts/{id:guid}
Список контактов (опционально с фильтром) или получение одного по id. Добавьте
?info=subscriptions, чтобы включить подписки каждого контакта. Без фильтра
возвращаются все контакты аккаунта.
| Параметр фильтра | Тип | Описание |
|---|---|---|
ids / excludeIds | guid[] / bool | Выбрать или исключить по id. |
contactType / contactTypes | string / string[] | Фильтр по типу (Email, SMS, VoiceCall…). |
excludeContactTypes | bool | Инвертировать фильтр по типу. |
confirmed | bool | Подтверждённые либо неподтверждённые контакты. |
overlimited | bool | Контакты, помеченные как превышающие лимит тарифа. |
acceptBillingNotifications | bool | Контакты, используемые для биллинговых уведомлений. |
name / names / nameSearchLike / excludeNames | string(s) / bool | Фильтр по имени (точное совпадение, список, подстрока или исключение). |
address / addresses / addressSearchLike / excludeAddresses | string(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 сообщает об
исходе подтверждения.
{
"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 | все | Любые из Sunday…Saturday; по умолчанию каждый день. |
reportFormat, sendNews, sendBillingNotifications | Настройки email. | |
gateway | sms | Одно из contacts/sms/gateways; по умолчанию twiliosms. |
SMS- и голосовые контакты по умолчанию используют шлюзы twiliosms /
twiliovoice, получают стандартную цену за сообщение и сохраняют номер с
ведущим +. Изменение адреса или шлюза контакта сбрасывает его подтверждённое
состояние.
Значения статуса подтверждения
Поле status результата сообщает об исходе отправки кода подтверждения:
| Статус | Значение |
|---|---|
Confirmed | Контакт создан уже подтверждённым (код не требуется). |
CodeSent | Код подтверждения отправлен; контакт станет активным после подтверждения. |
CodeSentEarlier | Код уже был недавно отправлен и всё ещё действителен. |
CodeFail | Контакт создан, но отправка кода не удалась; повторите попытку позже. |
LowSmsBalance | Не удалось отправить код, так как баланс аккаунта слишком низок. |
Overlimited | Контакт превышает лимит тарифа. |
PUT contacts & типизированные варианты
- По id —
PUT 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" }. При успехе контакт становится подтверждённым.
Оповещения и подписки
Подписка связывает одну или несколько задач и контактов с набором типов оповещений и/или отчётов. Одна запись подписки декартово перемножает свои задачи и контакты, порождая одно оповещение/отчёт на каждую пару (задача, контакт, тип).
Форма подписки
{
"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
Список подписок. Возвращает по одной записи на каждую совпавшую подписку на оповещение или отчёт (никогда не объединяет их). Необязательные фильтры:
| Параметр | Тип | Описание |
|---|---|---|
taskId | guid | Только подписки для этой задачи. |
contactId | guid | Только подписки для этого контакта. |
types | string[] | Только эти типы оповещений/отчётов. Здесь нераспознанные названия игнорируются (в отличие от POST/DELETE, которые их отклоняют). |
POST subscriptions · DELETE subscriptions
Оба метода принимают в теле JSON-массив записей подписки. POST добавляет описанные подписки (вставляются
только новые строки); DELETE удаляет существующие. Оба метода возвращают
200 OK с пустым телом. Неизвестные типы оповещений/отчётов отклоняются с
UnknownAlertType / UnknownReportType.
[
{ "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 -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 / statsEndUnix | int64 | Начало/конец окна в секундах Unix (UTC). |
statsStart / statsEnd | string | Начало/конец окна в виде строки, отформатированной согласно профилю (альтернатива полям Unix). |
expectedSLA | double | 0–100. Если задано, каждый результат сообщает slaExpectationSucceeded. |
fullTask | bool | Включить полный объект задачи вместо только ссылки на неё. |
Ответ
Объект Stats с рассчитанным окном (поля даты в двойном представлении) и массивом
stats. Каждая запись содержит ссылку на задачу и:
uptimeInMinutes/uptimeSpan,
downtimeInMinutes/downtimeSpan, время
технического обслуживания (up/down), totalTimeInMinutes, количество проверок
по интервалам и uptimePercent/downtimePercent.
uptime% = (uptime + maintenanceUptime) / (totalTime − maintenanceDowntime).
Когда общее время равно времени технического обслуживания в состоянии простоя, процент равен
null (не определён). slaExpectationSucceeded —
это uptime% ≥ expectedSLA.
GET outages
Периоды простоя по задачам. Принимает фильтр задач плюс:
| Параметр | Тип | Описание |
|---|---|---|
startTimeUnix / endTimeUnix | int64 | Окно в секундах Unix (UTC). |
startTime / endTime | string | Окно в виде строк, отформатированных согласно профилю. |
getInUtcTimeZone | int | Если задано, отформатированное время указывается в UTC, а не в часовом поясе профиля. |
fullTask | bool | Включить полный объект задачи. |
Ответ: объект Outages с рассчитанным окном и массивом
taskOutages; каждый элемент связывает задачу с её периодами
outages (startTime/endTime
+ варианты в Unix, номера событий, необязательный комментарий).
GET incident
Список инцидентов (событий сбоя) по задачам. Принимает фильтр задач плюс те же параметры окна/часового пояса, что и outages, а также:
| Параметр | Тип | Описание |
|---|---|---|
startTimeUnix / endTimeUnix / startTime / endTime | int64 / string | Окно (в Unix и/или отформатированное). |
getInUtcTimeZone | int | Форматировать время в UTC. |
fullTask | bool | Включить полный объект задачи. |
fullLog | bool | Включить подробный журнал повторных проверок по агентам. Требует расширенный тариф, иначе ApiFullLogNotAllowed. |
Ответ: объект Incidents с массивом taskIncidents.
Каждый инцидент содержит taskId, checkId, время
начала/окончания в Unix, location сбойной точки,
error, hasSnapshot и (с
fullLog) блок recheck со списком успешных
локаций и локаций, упавших по каждому виду ошибки.
GET incident/snapshot
Получить сохранённый снимок ответа, зафиксированный для инцидента. Параметры:
| Параметр | Тип | Описание |
|---|---|---|
taskId | guid | Задача. Обязательно. |
checkId | int64 | Id проверки/события. |
timestampUnixUtc | int64 | Время инцидента (секунды Unix, UTC). |
Возвращает снимок (метку времени плюс захваченные байты), если он существует, либо
null, если снимка для указанного инцидента нет.
GET results/http
Агрегированные метрики времени отклика HTTP по задачам. Принудительно фильтрует по типу задачи
Http. Принимает фильтр задач плюс:
| Параметр | Тип | Описание |
|---|---|---|
resultStartUnix / resultEndUnix | int64 | Окно в секундах Unix (UTC). |
resultStart / resultEnd | string | Окно в виде строк, отформатированных согласно профилю. |
fullTask | bool | Включить полный объект задачи. |
Ответ: объект AggregatedHttpResults; каждая запись
taskResults содержит ссылку на задачу и усреднённые
responseTime, dnsTime,
headTime, dataTime (в миллисекундах).
GET cr/httpResponseTime
Ряды времени отклика HTTP по задачам. Принимает фильтр задач плюс
startDate, endDate и
groupBy. Возвращает простой массив объектов рядов:
[
{
"id": "ef10cd12-93f9-e311-bec5-dc85de1f0bc2",
"rawUrl": "https://www.example.com",
"name": "My website",
"results": [ [1719181583, 142], [1719177983, 138] ] // [секунды Unix, время отклика в мс], сначала новые
}
]
Агенты
Агенты — это географически распределённые точки мониторинга. Id пулов, возвращаемые здесь, — это
значения, которые вы передаёте в поле agentPools задачи.
GET agents
Список агентов мониторинга. Необязательный параметр запроса:
| Параметр | Тип | Описание |
|---|---|---|
touched | int | Только агенты, которые отчитались за последние N минут. Значения ≤ 0 (или отсутствие параметра) означают отсутствие фильтра; иначе значение ограничивается диапазоном 1–10. |
Каждый агент содержит id, upFrom,
datacenter (название/город/страна/регион),
company (название/url), ip,
version, lon/lat и
pools.
[
{
"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-массив вместо этого.
203.0.113.10
203.0.113.11
198.51.100.7
["203.0.113.10", "203.0.113.11", "198.51.100.7"]