Обзор

Интеграции

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

Справочник API

Вебхуки

Шаблоны

Шаблоны писем хранятся на сервере: их можно создавать, править, переносить между серверами и использовать при отправке. Серверный ключ работает только с шаблонами своего сервера — чужой шаблон для него не найден (код 1101); перенос между серверами доступен только ключу аккаунта.

Отправка письма с шаблоном #

post

/email/withTemplate

Отправляет одно письмо по сохраненному шаблону: тема, HTML и текстовая версия берутся из шаблона. Шаблон должен принадлежать серверу ключа, иначе вернется ошибка 1101. Остальное — как у отправки одного письма.

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

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

application/json

Content-Type обязательный

application/json

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

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

Параметры тела запроса

TemplateId integer

ID шаблона. Нужен TemplateId или TemplateAlias.

TemplateAlias string

Название шаблона — вместо TemplateId.

TemplateModel object

Подстановки: ключ — фрагмент текста шаблона, значение — на что его заменить. Замена буквальная, поэтому разделители входят в ключ: {"{{name}}": "Иван"} заменит {{name}}. Применяется к теме, HTML и текстовой версии.

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

Адрес отправителя. Он должен быть на подтвержденном домене аккаунта. Имя отправителя указывается так: Магазин <shop@example.com>.

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

Адреса получателей через запятую. Каждый получатель получает отдельное письмо со своим MessageID.

Cc string

Получатели копии через запятую.

Bcc string

Получатели скрытой копии через запятую.

Subject string

Тема письма. Если не указана, берется тема шаблона.

Tag string

Тег письма. По нему фильтруют письма, открытия, клики и возвраты в API.

ReplyTo string

Адрес для ответа (заголовок Reply-To).

Headers array

Дополнительные заголовки письма: список объектов {"Name": "…", "Value": "…"}.

TrackOpens boolean

Включить или выключить отслеживание открытий для этого письма. Без параметра действует настройка сервера.

TrackLinks boolean | string

Включить или выключить отслеживание кликов для этого письма. Без параметра действует настройка сервера. Строкой — как в Postmark: None (без учета регистра) выключает, любое другое значение включает. Режим письма (только HTML или только текст) строкой не задается — это настройка сервера.

Metadata object

Произвольные данные «ключ — значение», привязанные к письму.

Attachments array

Вложения: список объектов с полями Name (имя файла), Content (содержимое в Base64) и ContentType. Чтобы встроить картинку в HTML, добавьте поле ContentID и сошлитесь на нее как cid:….

MessageStream string

ID канала, через который отправляется письмо, — из списка каналов. Канал должен принадлежать серверу ключа, не быть входящим и не находиться в архиве (иначе ошибка 1226). Если не указан, письмо уходит через транзакционный канал сервера по умолчанию; если исходящих каналов у сервера еще нет, такой канал создается. Если активные исходящие каналы у сервера только массовые, вернется ошибка 1226 — укажите канал явно.

Ответ

To string

Получатели из запроса.

SubmittedAt string

Время приема письма, YYYY-MM-DD HH:MM:SS, МСК.

MessageID string

ID письма. Если получателей несколько, ID перечислены через запятую в том же порядке. По ID ищут письмо в API сообщений.

ErrorCode integer

0 — письмо принято в отправку. Иначе — код ошибки, HTTP-статус ответа при этом 422.

Message string

Описание результата.

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

curl "https://api.haskimail.ru/email/withTemplate" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Server-Token: server token" \
  -d '{
  "TemplateId": 4521,
  "TemplateModel": {
    "{{name}}": "Иван",
    "{{order}}": "1042"
  },
  "From": "Магазин <shop@example.com>",
  "To": "ivan@example.com",
  "Tag": "orders",
  "MessageStream": "2081"
}'

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

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

{
  "To": "ivan@example.com",
  "SubmittedAt": "2026-10-07 14:30:12",
  "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
  "ErrorCode": 0,
  "Message": "OK"
}

Пакетная отправка с шаблонами #

post

/email/batchWithTemplates

Отправляет до 500 писем по сохраненным шаблонам одним запросом — у каждого письма свой получатель и свои подстановки. Размер запроса — до 50 МБ. Шаблон каждого письма должен принадлежать серверу ключа, иначе это письмо получит ошибку 1101.

Письма проверяются и ставятся в очередь независимо друг от друга: отказ одного письма не останавливает остальные. HTTP-статус ответа — 200, даже если часть писем отклонена, поэтому проверяйте ErrorCode каждого элемента ответа.

Если не разобран сам пакет — тело не в том формате, писем нет или их больше 500, — вернется HTTP 422 с кодом 300, а для запроса больше 50 МБ — HTTP 413. Ни одно письмо при этом не отправляется. Если в настройках аккаунта задан список разрешенных IP-адресов, пакет с другого адреса получит HTTP 403.

С тестовым ключом HASKIMAIL_API_TEST письма пакета только проверяются и никуда не уходят.

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

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

application/json

Content-Type обязательный

application/json

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

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

Параметры тела запроса

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

Письма: от 1 до 500 объектов. Поля письма — те же, что у отправки письма с шаблоном.

Ответ

Массив объектов — по одному на письмо, в порядке писем запроса.

To string

Получатели письма из запроса.

SubmittedAt string

Время приема письма, YYYY-MM-DD HH:MM:SS, МСК.

MessageID string

ID письма; если получателей несколько — через запятую в том же порядке. У отклоненного письма — null.

ErrorCode integer

0 — письмо принято в отправку. Иначе — код ошибки этого письма; на остальные письма пакета он не влияет.

Message string

Описание результата.

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

curl "https://api.haskimail.ru/email/batchWithTemplates" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Server-Token: server token" \
  -d '{
  "Messages": [
    {
      "TemplateId": 4521,
      "TemplateModel": {
        "{{name}}": "Иван",
        "{{order}}": "1042"
      },
      "From": "Магазин <shop@example.com>",
      "To": "ivan@example.com",
      "Tag": "orders",
      "MessageStream": "2081"
    },
    {
      "TemplateId": 4521,
      "TemplateModel": {
        "{{name}}": "Анна",
        "{{order}}": "1043"
      },
      "From": "Магазин <shop@example.com>",
      "To": "anna.example.com",
      "Tag": "orders",
      "MessageStream": "2081"
    }
  ]
}'

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

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

[
  {
    "To": "ivan@example.com",
    "SubmittedAt": "2026-10-13 14:30:12",
    "MessageID": "6f1c0b2d9e8a4f7b3c5d2e1a0b9c8d7e",
    "ErrorCode": 0,
    "Message": "OK"
  },
  {
    "To": "anna.example.com",
    "SubmittedAt": "2026-10-13 14:30:12",
    "MessageID": null,
    "ErrorCode": 6,
    "Message": "Некорректный email-адрес получателя"
  }
]

Перенос шаблонов на другой сервер #

put

/templates/push

Переносит все шаблоны одного сервера на другой. Шаблоны именно переезжают, а не копируются: на исходном сервере их не останется. С PerformChanges: false метод только показывает, какие шаблоны будут перенесены.

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

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

application/json

Content-Type обязательный

application/json

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

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

Параметры тела запроса

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

ID сервера, с которого переносятся шаблоны.

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

ID сервера, на который переносятся шаблоны.

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

true — перенести, false — только показать список.

Ответ

TotalCount integer

Количество шаблонов исходного сервера.

Templates array

Шаблоны исходного сервера.

Templates[].TemplateId integer

ID шаблона.

Templates[].Name string

Название шаблона.

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

curl "https://api.haskimail.ru/templates/push" \
  -X PUT \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Account-Token: account token" \
  -d '{
  "SourceServerID": 11834,
  "DestinationServerID": 11835,
  "PerformChanges": true
}'

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

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

{
  "TotalCount": 2,
  "Templates": [
    {
      "TemplateId": 4521,
      "Name": "Заказ оформлен"
    },
    {
      "TemplateId": 4522,
      "Name": "Восстановление пароля"
    }
  ]
}

Получение шаблона #

get

/templates/{templateIdOrAlias}

Возвращает шаблон по ID или по названию.

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

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

application/json

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

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

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

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

ID шаблона или его название.

Ответ

TemplateId integer

ID шаблона.

Name string

Название шаблона.

Subject string

Тема письма.

HtmlBody string

HTML-версия.

TextBody string

Текстовая версия.

AssociatedServerId integer

ID сервера, к которому относится шаблон.

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

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

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

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

{
  "TemplateId": 4521,
  "Name": "Заказ оформлен",
  "Subject": "Заказ №{{order}} оформлен",
  "HtmlBody": "<html><body><p>Здравствуйте, {{name}}! Заказ №{{order}} оформлен.</p></body></html>",
  "TextBody": "Здравствуйте, {{name}}! Заказ №{{order}} оформлен.",
  "AssociatedServerId": 11834
}

Создание шаблона #

post

/templates

Создает шаблон на указанном сервере.

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

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

application/json

Content-Type обязательный

application/json

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

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

Параметры тела запроса

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

Название шаблона. По нему шаблон можно выбрать вместо ID (TemplateAlias), поэтому лучше делать названия уникальными.

AssociatedServerId integer

ID сервера, на котором создается шаблон. С серверным ключом можно не указывать — шаблон создается на сервере ключа; другой сервер указать нельзя (код 510). С ключом аккаунта обязателен.

Subject string

Тема письма.

HtmlBody string

HTML-версия.

TextBody string

Текстовая версия.

Ответ

TemplateId integer

ID нового шаблона.

Name string

Название шаблона.

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

curl "https://api.haskimail.ru/templates" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Server-Token: server token" \
  -d '{
  "Name": "Заказ оформлен",
  "AssociatedServerId": 11834,
  "Subject": "Заказ №{{order}} оформлен",
  "HtmlBody": "<html><body><p>Здравствуйте, {{name}}! Заказ №{{order}} оформлен.</p></body></html>",
  "TextBody": "Здравствуйте, {{name}}! Заказ №{{order}} оформлен."
}'

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

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

{
  "TemplateId": 4521,
  "Name": "Заказ оформлен"
}

Редактирование шаблона #

put

/templates/{templateIdOrAlias}

Заменяет содержимое шаблона. Поля перезаписываются целиком: поле, которого нет в запросе, станет пустым, поэтому передавайте все четыре.

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

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

application/json

Content-Type обязательный

application/json

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

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

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

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

ID шаблона или его название.

Параметры тела запроса

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

Название шаблона.

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

Тема письма.

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

HTML-версия.

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

Текстовая версия.

Ответ

TemplateId integer

ID шаблона.

Name string

Название шаблона.

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

curl "https://api.haskimail.ru/templates/{templateIdOrAlias}" \
  -X PUT \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Server-Token: server token" \
  -d '{
  "Name": "Заказ оформлен",
  "Subject": "Заказ №{{order}} принят",
  "HtmlBody": "<html><body><p>Здравствуйте, {{name}}! Заказ №{{order}} принят.</p></body></html>",
  "TextBody": "Здравствуйте, {{name}}! Заказ №{{order}} принят."
}'

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

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

{
  "TemplateId": 4521,
  "Name": "Заказ оформлен"
}

Список шаблонов #

get

/templates

Возвращает шаблоны сервера ключа; с ключом аккаунта — всех серверов.

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

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

application/json

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

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

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

count

Количество шаблонов в ответе. По умолчанию 500.

offset

Сколько шаблонов пропустить. По умолчанию 0.

Ответ

TotalCount integer

Общее количество шаблонов.

Templates array

Шаблоны.

Templates[].TemplateId integer

ID шаблона.

Templates[].Name string

Название шаблона.

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

curl "https://api.haskimail.ru/templates?count=100&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": 2,
  "Templates": [
    {
      "TemplateId": 4521,
      "Name": "Заказ оформлен"
    },
    {
      "TemplateId": 4522,
      "Name": "Восстановление пароля"
    }
  ]
}

Удаление шаблона #

delete

/templates/{templateIdOrAlias}

Удаляет шаблон.

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

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

application/json

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

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

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

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

ID шаблона или его название.

Ответ

ErrorCode integer

0 — шаблон удален.

Message string

Описание результата.

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

curl "https://api.haskimail.ru/templates/{templateIdOrAlias}" \
  -X DELETE \
  -H "Accept: application/json" \
  -H "X-Haskimail-Server-Token: server token"

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

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

{
  "ErrorCode": 0,
  "Message": "Template 4521 removed."
}

Проверка шаблона #

post

/templates/validate

Показывает, что получит получатель письма по шаблону, — ничего не сохраняет и не отправляет. TestRenderModel подставляется так же, как TemplateModel при отправке: буквальная замена фрагментов в теме, HTML и тексте. {{SENDDATE}} и %SENDDATE% заменяются сегодняшней датой.

Ошибка — фрагмент {{…}}, оставшийся после подстановки: в модели нет такого ключа или он записан иначе, например с пробелами внутри скобок. Еще одна ошибка — {{ без закрывающих }}. Больше ничего не проверяется: подстановка не меняет разметку, а ссылки и открытия при проверке не отслеживаются.

Ответ — HTTP 200, даже если в шаблоне есть ошибки: смотрите AllContentIsValid. HTTP 422 с кодом 1120 — если проверять нечего или TestRenderModel не объект «фрагмент → строка». Макетов в Haskimail нет: TemplateType может быть только Standard, LayoutTemplate — только пустым. InlineCssForHtmlTestRender не учитывается: CSS не встраивается и при отправке.

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

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

application/json

Content-Type обязательный

application/json

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

Серверный API-ключ. Он есть в настройках сервера на вкладке «API-ключи». Подходит и ключ аккаунта в заголовке X-Haskimail-Account-Token.

Параметры тела запроса

Subject string

Тема шаблона. Нужен хотя бы один из Subject, HtmlBody, TextBody.

HtmlBody string

HTML-версия шаблона.

TextBody string

Текстовая версия шаблона.

TestRenderModel object

Подстановки, как TemplateModel при отправке: ключ — фрагмент текста шаблона вместе с разделителями, значение — строка или число, на которое его заменить: {"{{name}}": "Иван"}.

Ответ

AllContentIsValid boolean

true, если ошибок нет ни в одной из переданных частей.

Subject, HtmlBody, TextBody object

Результат по каждой переданной части; не переданной части в ответе нет. Поля: ContentIsValid (boolean) — ошибок нет; RenderedContent (string) — часть после подстановки, как ее получит получатель; ValidationErrors (array) — ошибки, у каждой Message, Line и CharacterPosition: строка и позиция в ней в исходном тексте, с 1. Ноль — фрагмент появился из значения модели, в исходном тексте его нет.

SuggestedTemplateModel object

Модель для этого шаблона: все фрагменты {{…}} из него, кроме даты отправки. Значение — из TestRenderModel, если ключ там есть, иначе заглушка имя_Value.

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

curl "https://api.haskimail.ru/templates/validate" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Haskimail-Server-Token: server token" \
  -d '{
  "Subject": "Заказ {{order}} оформлен",
  "HtmlBody": "<p>Здравствуйте, {{name}}!</p>\n<p>Трек-номер: {{track}}</p>",
  "TextBody": "Здравствуйте, {{name}}! Заказ {{order}} оформлен.",
  "TestRenderModel": {
    "{{name}}": "Иван",
    "{{order}}": "1042"
  }
}'

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

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

{
  "AllContentIsValid": false,
  "Subject": {
    "ContentIsValid": true,
    "ValidationErrors": [],
    "RenderedContent": "Заказ 1042 оформлен"
  },
  "HtmlBody": {
    "ContentIsValid": false,
    "ValidationErrors": [
      {
        "Message": "Нет значения для {{track}}: в TestRenderModel нет такого ключа",
        "Line": 2,
        "CharacterPosition": 16
      }
    ],
    "RenderedContent": "<p>Здравствуйте, Иван!</p>\n<p>Трек-номер: {{track}}</p>"
  },
  "TextBody": {
    "ContentIsValid": true,
    "ValidationErrors": [],
    "RenderedContent": "Здравствуйте, Иван! Заказ 1042 оформлен."
  },
  "SuggestedTemplateModel": {
    "{{order}}": "1042",
    "{{name}}": "Иван",
    "{{track}}": "track_Value"
  }
}