Перейти к основному содержимому

Справочник API

Полный список эндпоинтов Public API — того, что доступно по API-ключу проекта. Страница собрана из OpenAPI-спеки, из которой генерятся и официальные SDK, поэтому разойтись с реальным поведением API она не может.

Машиночитаемая спека: mailinfra-public.json.

Основы​

  • База API — https://app.mailinfra.ru/v1.
  • Аутентификация — Authorization: Bearer mi_live_… (рабочие отправки) или Bearer mi_test_… (sandbox: письмо сохраняется со статусом SIMULATED, не доставляется и не расходует месячный объём).
  • Успешный ответ всегда приходит конвертом {"data": …}.
  • Ошибка — конвертом {"error": {"code", "message", "details"}, "request_id"}. Ветвитесь по error.code, а не по тексту сообщения: коды и лимиты.
  • X-Request-ID есть в каждом ответе — именно его называйте в обращении в поддержку.
Не собирайте запросы руками

Идемпотентность, повторы с backoff и разбор ошибок уже сделаны в официальных SDK: Python, Node.js, PHP, Go.

Эндпоинты​

GET /emails​

Параметры​

ПараметрГдеТипОбязательноОписание
statusqueryEmailStatus | nullнет
from_emailquerystring | nullнет
to_emailquerystring | nullнет
tagquerystring | nullнет
fromquerystring (ISO-8601) | nullнет
toquerystring (ISO-8601) | nullнет
limitqueryintegerнетот 1, до 100, по умолчанию 25

Ответ​

Поле data — список EmailListItem.

Коды ответа​

КодКогдаЗаголовки
200Успешный ответX-Request-ID
429Превышен лимит: RPS ключа (error.code = rps_exceeded), месячный объём плана или дневной потолок организации. Заголовок Retry-After содержит задержку до повтора.Retry-After, X-Request-ID
прочиеОшибка. Единый конверт: error.code, error.message, error.details, request_idX-Request-ID

POST /emails​

Параметры​

ПараметрГдеТипОбязательноОписание
Idempotency-Keyзаголовокstring | nullнетдо 255 символов

Тело запроса​

Схема: EmailSendRequest.

ПолеТипОбязательноОписание
attachmentsarray<EmailAttachmentInput>нетдо 10 элементов
bccarray<string (email)>нетдо 50 элементов
ccarray<string (email)>нетдо 50 элементов
fromstring (email)да
from_namestring | nullнетдо 200 символов
headersobject<string, string>нет
htmlstring | nullнет
reply_toarray<string (email)>нетдо 10 элементов
subjectstring | nullнетдо 998 символов
tagsarray<string>нетдо 10 элементов
templatestring | nullнетдо 100 символов
textstring | nullнет
toarray<string (email)>дане пустой список, до 50 элементов
variablesobject<string, any>нет

Ответ​

Поле data — EmailSendResponseData.

Коды ответа​

КодКогдаЗаголовки
200Идемпотентный повтор: запрос с таким Idempotency-Key уже был принят, письмо повторно не отправлено.Idempotent-Replayed, X-Request-ID
202Успешный ответX-Request-ID
429Превышен лимит: RPS ключа (error.code = rps_exceeded), месячный объём плана или дневной потолок организации. Заголовок Retry-After содержит задержку до повтора.Retry-After, X-Request-ID
прочиеОшибка. Единый конверт: error.code, error.message, error.details, request_idX-Request-ID

POST /emails/batch​

Тело запроса​

Схема: BatchSendRequest.

ПолеТипОбязательноОписание
emailsarray<EmailSendRequest>дане пустой список, до 100 элементов

Ответ​

Поле data — BatchSendResponseData.

Коды ответа​

КодКогдаЗаголовки
202Успешный ответX-Request-ID
429Превышен лимит: RPS ключа (error.code = rps_exceeded), месячный объём плана или дневной потолок организации. Заголовок Retry-After содержит задержку до повтора.Retry-After, X-Request-ID
прочиеОшибка. Единый конверт: error.code, error.message, error.details, request_idX-Request-ID

GET /emails/{email_id}​

Параметры​

ПараметрГдеТипОбязательноОписание
email_idпутьstring (uuid)да

Ответ​

Поле data — EmailDetail.

Коды ответа​

КодКогдаЗаголовки
200Успешный ответX-Request-ID
429Превышен лимит: RPS ключа (error.code = rps_exceeded), месячный объём плана или дневной потолок организации. Заголовок Retry-After содержит задержку до повтора.Retry-After, X-Request-ID
прочиеОшибка. Единый конверт: error.code, error.message, error.details, request_idX-Request-ID

GET /emails/{email_id}/events​

Параметры​

ПараметрГдеТипОбязательноОписание
email_idпутьstring (uuid)да

Ответ​

Поле data — список EmailEventPublic.

Коды ответа​

КодКогдаЗаголовки
200Успешный ответX-Request-ID
429Превышен лимит: RPS ключа (error.code = rps_exceeded), месячный объём плана или дневной потолок организации. Заголовок Retry-After содержит задержку до повтора.Retry-After, X-Request-ID
прочиеОшибка. Единый конверт: error.code, error.message, error.details, request_idX-Request-ID

Схемы​

BatchSendError​

ПолеТипОбязательноОписание
codestringда
detailsobject<string, any>нет
messagestringда
status_codeintegerда

BatchSendRequest​

ПолеТипОбязательноОписание
emailsarray<EmailSendRequest>дане пустой список, до 100 элементов

BatchSendResponseData​

ПолеТипОбязательноОписание
accepted_countintegerда
failed_countintegerда
resultsarray<BatchSendResult>да

BatchSendResult​

ПолеТипОбязательноОписание
errorBatchSendError | nullнет
idstring (uuid) | nullнет
indexintegerда
skipped_recipientsarray<object<string, string>>нет
statusEmailStatus | nullнет

BounceCategory​

Нормализованная причина bounce — для UI/Debug Explorer.

Отдельно от BounceType (hard/soft): категория даёт человекочитаемую причину, вычисляется классификатором по enhanced-коду/тексту диагностики. См.

Допустимые значения:

  • invalid-recipient
  • mailbox-full
  • message-too-large
  • content-spam-block
  • policy-rejection
  • reputation-blocklist
  • greylisting
  • dns-mx-failure
  • connection-error
  • rate-limited
  • auth-failure
  • unknown

BounceType​

Допустимые значения:

  • hard
  • soft

DkimSigningStatus​

Достоверность DKIM-подписи письма.

EXPECTED — на нашей стороне известно, что домен верифицирован и ключ для него существует, поэтому Haraka должна была подписать письмо. Это не подтверждение факта подписи — Haraka сегодня не сообщает результат подписания обратно. CONFIRMED/FAILED зарезервированы под будущий callback от Haraka (fast-follow), значения уже есть, миграция не нужна.

Допустимые значения:

  • expected
  • confirmed
  • failed
  • not_signed

EmailAttachmentInput​

Вложение в исходящем письме.

content_base64 — содержимое файла в base64.

ПолеТипОбязательноОписание
content_base64stringдадо 14 348 938 символов
content_typestringнетдо 255 символов, по умолчанию "application/octet-stream"
filenamestringдане пустая строка, до 255 символов

EmailDetail​

ПолеТипОбязательноОписание
bcc_emailsarray<string> | nullда
bounce_categoryBounceCategory | nullнет
bounce_typeBounceType | nullнет
cc_emailsarray<string> | nullда
created_atstring (ISO-8601)да
delivered_atstring (ISO-8601) | nullда
dkim_alignedboolean | nullнет
dkim_dstring | nullнет
dkim_selectorstring | nullнет
dkim_signing_statusDkimSigningStatus | nullнет
dmarc_alignedboolean | nullнет
failed_atstring (ISO-8601) | nullда
final_smtp_codeinteger | nullнет
final_smtp_enhancedstring | nullнет
final_smtp_textstring | nullнет
from_emailstringда
from_namestring | nullда
headersobject<string, string>да
html_bodystring | nullда
idstring (uuid)да
message_idstring | nullнет
project_idstring (uuid)да
reply_toarray<string> | nullда
sent_atstring (ISO-8601) | nullда
sourceEmailSourceнетпо умолчанию "API"
spf_alignedboolean | nullнет
spf_authorized_ipboolean | nullнет
spf_domainstring | nullнет
statusEmailStatusда
subjectstringда
suppression_reasonSuppressionReason | nullнет
tagsarray<string>да
text_bodystring | nullда
to_emailsarray<string>да

EmailEventPublic​

ПолеТипОбязательноОписание
dataobject<string, any>да
idstring (uuid)да
ip_addressstring | nullнет
timestampstring (ISO-8601)да
typeEmailEventTypeда
user_agentstring | nullнет

EmailEventType​

Допустимые значения:

  • queued
  • sending
  • sent
  • delivered
  • smtp_connected
  • opened
  • clicked
  • bounced
  • complained
  • failed
  • simulated

EmailListItem​

Сокращённая репрезентация для списка.

ПолеТипОбязательноОписание
bounce_categoryBounceCategory | nullнет
bounce_typeBounceType | nullнет
created_atstring (ISO-8601)да
delivered_atstring (ISO-8601) | nullда
dkim_alignedboolean | nullнет
dkim_dstring | nullнет
dkim_selectorstring | nullнет
dkim_signing_statusDkimSigningStatus | nullнет
dmarc_alignedboolean | nullнет
final_smtp_codeinteger | nullнет
final_smtp_enhancedstring | nullнет
final_smtp_textstring | nullнет
from_emailstringда
idstring (uuid)да
message_idstring | nullнет
project_idstring (uuid)да
sent_atstring (ISO-8601) | nullда
sourceEmailSourceнетпо умолчанию "API"
spf_alignedboolean | nullнет
spf_authorized_ipboolean | nullнет
spf_domainstring | nullнет
statusEmailStatusда
subjectstringда
suppression_reasonSuppressionReason | nullнет
tagsarray<string>да
to_emailsarray<string>да

EmailSendRequest​

POST /v1/emails.

ПолеТипОбязательноОписание
attachmentsarray<EmailAttachmentInput>нетдо 10 элементов
bccarray<string (email)>нетдо 50 элементов
ccarray<string (email)>нетдо 50 элементов
fromstring (email)да
from_namestring | nullнетдо 200 символов
headersobject<string, string>нет
htmlstring | nullнет
reply_toarray<string (email)>нетдо 10 элементов
subjectstring | nullнетдо 998 символов
tagsarray<string>нетдо 10 элементов
templatestring | nullнетдо 100 символов
textstring | nullнет
toarray<string (email)>дане пустой список, до 50 элементов
variablesobject<string, any>нет

EmailSendResponseData​

ПолеТипОбязательноОписание
idstring (uuid)да
skipped_recipientsarray<object<string, string>>нет
statusEmailStatusда

EmailSource​

Транспорт, через который письмо попало в пайплайн отправки.

Допустимые значения:

  • API
  • SMTP
  • CAMPAIGN

EmailStatus​

Допустимые значения:

  • QUEUED
  • SENDING
  • SENT
  • DELIVERED
  • BOUNCED
  • COMPLAINED
  • FAILED
  • SIMULATED

ErrorDetails​

ПолеТипОбязательноОписание
codestringда
detailsobject<string, any> | nullнет
messagestringда

ErrorResponse​

Единый конверт ошибки.

Ровно эта форма отдаётся всеми обработчиками исключений — доменными (MailInfraError), валидационными и fallback'ом на непойманное исключение. Схема подключена к OpenAPI через ERROR_RESPONSES, чтобы сгенерированные клиенты знали структуру ошибки, а не только её код.

ПолеТипОбязательноОписание
errorErrorDetailsда
request_idstring | nullнет

SuppressionReason​

Допустимые значения:

  • HARD_BOUNCE
  • COMPLAINT
  • UNSUBSCRIBE
  • MANUAL