Обзор

Интеграции

Руководство пользователя

Справочник API

Вебхуки

Сообщения

Поиск отправленных писем, их открытий и кликов, а также работа со входящими письмами сервера. Серверный ключ видит письма только своего сервера, ключ аккаунта — всех серверов; сузить выборку до канала можно фильтром messagestream. Старые письма, отправленные без канала, относятся к серверу аккаунта по умолчанию. Пути вида /messages/outbound/… тоже принимаются.

Детали письма #

get

/messages/{messageid}/details

Возвращает одно отправленное письмо. Если письмо не найдено — ответ 422 с кодом 701.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID письма — MessageID из ответа на отправку.

Ответ

Recipient string

Email получателя.

ReceivedAt string

Время отправки, YYYY-MM-DD HH:MM:SS, МСК.

Tag string

Тег письма.

From string

Email отправителя.

MessageID string

ID письма.

Subject string

Тема письма.

MessageStream string

ID канала. У писем, отправленных до появления канала по умолчанию, бывает "" или "0".

Status string

Всегда Sent.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/{messageid}/details" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Recipient": "ivan@example.com",
  "ReceivedAt": "2026-10-07 14:30:13",
  "Tag": "orders",
  "From": "shop@example.com",
  "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
  "Subject": "Ваш заказ №1042 оформлен",
  "MessageStream": "2081",
  "Status": "Sent"
}

Открытия писем #

get

/messages/opens

Возвращает открытия писем сервера ключа, новые первыми. Каждое открытие — отдельная запись.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи».

Параметры строки запроса

count

Количество открытий в ответе, от 1 до 500. По умолчанию 100.

offset

Сколько записей пропустить. По умолчанию 0. Сумма count и offset — не больше 10000.

recipient

Email получателя, точное совпадение.

tag

Тег письма.

messagestream

ID канала.

fromdate

Начало периода: дата 2026-10-01 или дата и время 2026-10-01 12:00:00, МСК. По умолчанию — месяц назад.

todate

Конец периода включительно. Дата без времени — до конца дня. По умолчанию — сейчас.

Ответ

TotalCount integer

Сколько открытий подходит под фильтры.

Opens array

Открытия.

Opens[].Recipient string

Email получателя.

Opens[].ReceivedAt string

Время открытия, YYYY-MM-DD HH:MM:SS, МСК.

Opens[].Tag string

Тег письма.

Opens[].From string

Email отправителя.

Opens[].MessageID string

ID письма.

Opens[].Subject string

Тема письма.

Opens[].MessageStream string

ID канала. У писем, отправленных до появления канала по умолчанию, бывает "" или "0".

Opens[].RecordType string

Всегда Open.

Opens[].Os string

Операционная система.

Opens[].Browser string

Браузер или почтовая программа.

Opens[].Webservice string

Почтовый веб-сервис, если письмо открыто в веб-интерфейсе.

Opens[].UserAgent string

Строка User-Agent.

Opens[].Language string

Язык браузера.

Opens[].Region string

Регион.

Opens[].Country string

Код страны.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/opens?count=50&offset=0" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "TotalCount": 1,
  "Opens": [
    {
      "Recipient": "ivan@example.com",
      "ReceivedAt": "2026-10-07 14:52:40",
      "Tag": "orders",
      "From": "shop@example.com",
      "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
      "Subject": "Ваш заказ №1042 оформлен",
      "MessageStream": "2081",
      "RecordType": "Open",
      "Os": "Windows",
      "Browser": "Chrome",
      "Webservice": "",
      "Language": "ru-RU",
      "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0 Safari/537.36",
      "Region": "Москва",
      "Country": "RU"
    }
  ]
}

Открытия одного письма #

get

/messages/opens/{messageid}

Период не ограничен: возвращаются все записи по письму. Фильтры recipient, tag и messagestream работают так же, как в общем списке.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID письма — MessageID из ответа на отправку.

Параметры строки запроса

count

Количество открытий в ответе, от 1 до 500. По умолчанию 100.

offset

Сколько записей пропустить. По умолчанию 0. Сумма count и offset — не больше 10000.

recipient

Email получателя, точное совпадение.

tag

Тег письма.

messagestream

ID канала.

Ответ

TotalCount integer

Сколько открытий у письма.

Opens array

Открытия — поля как в «Открытиях писем».

Пример запроса с curl

curl "https://api.haskimail.ru/messages/opens/{messageid}?count=10&offset=0" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "TotalCount": 1,
  "Opens": [
    {
      "Recipient": "ivan@example.com",
      "ReceivedAt": "2026-10-07 14:52:40",
      "Tag": "orders",
      "From": "shop@example.com",
      "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
      "Subject": "Ваш заказ №1042 оформлен",
      "MessageStream": "2081",
      "RecordType": "Open",
      "Os": "Windows",
      "Browser": "Chrome",
      "Webservice": "",
      "Language": "ru-RU",
      "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0 Safari/537.36",
      "Region": "Москва",
      "Country": "RU"
    }
  ]
}

Клики по ссылкам #

get

/messages/clicks

Возвращает клики по ссылкам в письмах сервера ключа, новые первыми. Каждый клик — отдельная запись.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи».

Параметры строки запроса

count

Количество кликов в ответе, от 1 до 500. По умолчанию 100.

offset

Сколько записей пропустить. По умолчанию 0. Сумма count и offset — не больше 10000.

recipient

Email получателя, точное совпадение.

tag

Тег письма.

messagestream

ID канала.

fromdate

Начало периода: дата 2026-10-01 или дата и время 2026-10-01 12:00:00, МСК. По умолчанию — месяц назад.

todate

Конец периода включительно. Дата без времени — до конца дня. По умолчанию — сейчас.

Ответ

TotalCount integer

Сколько кликов подходит под фильтры.

Clicks array

Клики.

Clicks[].Recipient string

Email получателя.

Clicks[].ReceivedAt string

Время клика, YYYY-MM-DD HH:MM:SS, МСК.

Clicks[].Tag string

Тег письма.

Clicks[].From string

Email отправителя.

Clicks[].MessageID string

ID письма.

Clicks[].Subject string

Тема письма.

Clicks[].MessageStream string

ID канала. У писем, отправленных до появления канала по умолчанию, бывает "" или "0".

Clicks[].RecordType string

Всегда Click.

Clicks[].Os string

Операционная система.

Clicks[].Browser string

Браузер или почтовая программа.

Clicks[].Webservice string

Почтовый веб-сервис, если письмо открыто в веб-интерфейсе.

Clicks[].UserAgent string

Строка User-Agent.

Clicks[].Language string

Язык браузера.

Clicks[].Region string

Регион.

Clicks[].Country string

Код страны.

Clicks[].OriginalLink string

Ссылка, по которой перешел получатель.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/clicks?count=50&offset=0" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "TotalCount": 1,
  "Clicks": [
    {
      "Recipient": "ivan@example.com",
      "ReceivedAt": "2026-10-07 14:53:02",
      "Tag": "orders",
      "From": "shop@example.com",
      "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
      "Subject": "Ваш заказ №1042 оформлен",
      "MessageStream": "2081",
      "RecordType": "Click",
      "OriginalLink": "https://example.com/orders/1042",
      "Os": "Windows",
      "Browser": "Chrome",
      "Webservice": "",
      "Language": "ru-RU",
      "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0 Safari/537.36",
      "Region": "Москва",
      "Country": "RU"
    }
  ]
}

Клики в одном письме #

get

/messages/clicks/{messageid}

Период не ограничен: возвращаются все записи по письму. Фильтры recipient, tag и messagestream работают так же, как в общем списке.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID письма — MessageID из ответа на отправку.

Параметры строки запроса

count

Количество кликов в ответе, от 1 до 500. По умолчанию 100.

offset

Сколько записей пропустить. По умолчанию 0. Сумма count и offset — не больше 10000.

recipient

Email получателя, точное совпадение.

tag

Тег письма.

messagestream

ID канала.

Ответ

TotalCount integer

Сколько кликов у письма.

Clicks array

Клики — поля как в «Кликах по ссылкам».

Пример запроса с curl

curl "https://api.haskimail.ru/messages/clicks/{messageid}?count=10&offset=0" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "TotalCount": 1,
  "Clicks": [
    {
      "Recipient": "ivan@example.com",
      "ReceivedAt": "2026-10-07 14:53:02",
      "Tag": "orders",
      "From": "shop@example.com",
      "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
      "Subject": "Ваш заказ №1042 оформлен",
      "MessageStream": "2081",
      "RecordType": "Click",
      "OriginalLink": "https://example.com/orders/1042",
      "Os": "Windows",
      "Browser": "Chrome",
      "Webservice": "",
      "Language": "ru-RU",
      "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0 Safari/537.36",
      "Region": "Москва",
      "Country": "RU"
    }
  ]
}

Детали входящего сообщения #

get

/messages/inbound/{messageid}/details

Возвращает письмо целиком — те же поля, что приходят на вебхук, но без содержимого вложений, а также статус и его причину: BlockedReason для заблокированных, FailureReason для писем с ошибкой или запланированным повтором.

Если письмо пропускали мимо правил (кнопкой в интерфейсе или методом bypass), это видно по полям BypassedAt — когда, BypassedBy — кто (email пользователя или API) и BypassedBlockReason — какую блокировку обошли. У писем, которые не пропускали, BypassedAt равен null, остальные два поля — пустые строки.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ: входящие письма принадлежат серверу. Ключ есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID входящего письма — MessageID из поиска входящих писем или из вебхука входящих.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/inbound/{messageid}/details" \
  -X GET \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "FromName": "Иван Петров",
  "MessageStream": "2081",
  "From": "ivan@example.com",
  "OriginalRecipient": "451d9b70cf9364d23ff6f9d51d870251+ticket-42@inbound.haskimail.ru",
  "Subject": "Re: Заказ №42",
  "MessageID": "22c74902-a0c1-4511-804f-341342852c90",
  "MailboxHash": "ticket-42",
  "TextBody": "Спасибо, все получил!",
  "StrippedTextReply": "Спасибо, все получил!",
  "Attachments": [
    { "Name": "check.pdf", "ContentType": "application/pdf", "ContentLength": 48213, "ContentID": "" }
  ],
  "Status": "Failed",
  "BlockedReason": "",
  "FailureReason": "Вебхук ответил HTTP 500",
  "ReceivedAt": "2026-09-29T14:05:14+03:00",
  "ProcessedAt": null,
  "BypassedAt": null,
  "BypassedBy": "",
  "BypassedBlockReason": ""
}

Обход правил для заблокированного входящего #

put

/messages/inbound/{messageid}/bypass

Отправляет письмо в статусе Blocked на вебхук, не применяя правила блокировки и спам-фильтр. Письмо уходит в течение минуты. Если письмо заблокировано из-за исчерпанного лимита, сначала пополните его.

Haskimail запоминает, когда и кем письмо пропущено и какая блокировка была обойдена, — это видно в деталях письма (поля BypassedAt, BypassedBy со значением API, BypassedBlockReason) и в карточке письма в интерфейсе.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ: входящие письма принадлежат серверу. Ключ есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID входящего письма — MessageID из поиска входящих писем или из вебхука входящих.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/inbound/{messageid}/bypass" \
  -X PUT \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "ErrorCode": 0,
  "Message": "Successfully bypassed message: 22c74902-a0c1-4511-804f-341342852c90"
}

Повторная обработка входящего с ошибкой #

put

/messages/inbound/{messageid}/retry

Заново отправляет на вебхук письмо в статусе Failed: счетчик попыток сбрасывается, при неудаче снова действует расписание повторов.

Заголовки запроса

Accept обязательный

application/json

X-Haskimail-Server-Token обязательный

Серверный API-ключ: входящие письма принадлежат серверу. Ключ есть в настройках сервера на вкладке «API-ключи».

Параметры пути

messageid обязательный

ID входящего письма — MessageID из поиска входящих писем или из вебхука входящих.

Пример запроса с curl

curl "https://api.haskimail.ru/messages/inbound/{messageid}/retry" \
  -X PUT \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

Пример ответа

HTTP/1.1 200 OK
Content-Type: application/json

{
  "ErrorCode": 0,
  "Message": "Successfully rescheduled failed message: 22c74902-a0c1-4511-804f-341342852c90"
}