SmakMail
Документация SmakMail API v1
Документ перенесён на страницу SmakMail. Текст взят из прежней версии документа.
Обновлено: 13 августа 2026
1. Назначение API
SmakMail API v1 это product API для работы с почтами, письмами, кодами, ссылками, заказами и PJ.
API предназначен для:
- получения информации о токене и текущем пользователе
- получения текущего баланса
- получения каталога товаров
- создания заказа на почты
- получения статуса заказа
- получения результата завершённого заказа
- получения информации о конкретной почте по email
- получения списка писем конкретной почты
- получения карточки письма
- получения HTML письма
- получения извлечённых кодов и ссылок из письма
- получения последнего кода по конкретной почте
- смены PJ конкретной почты
API v1 не является panel API.
API v1 не даёт административные функции.
API v1 не даёт отправку писем от пользовательских почт.
API v1 не раскрывает внутренние filesystem paths и внутренние служебные идентификаторы доменов.
2. Базовая информация
Версия API:
v1
Базовый URL:
https://api.smakmail.com/api/v1
Локальный базовый путь сервиса:
/api/v1
Служебные endpoints:
GET /api/v1/openapi.json GET /api/v1/docs GET /api/v1/healthz
3. Доступ к API
Доступ к API осуществляется через Bearer token.
Токен:
- создаётся через Telegram-бота
- перевыпускается через Telegram-бота
- отзывается через Telegram-бота
- активен в одном экземпляре на пользователя
Через HTTP API не поддерживаются:
- регистрация
- логин по паролю
- создание токена по логину и паролю
- OAuth
- multi-token management
4. Авторизация
Во все защищённые запросы передаётся заголовок:
Authorization: Bearer <API_TOKEN>
Пример:
Authorization: Bearer smakmail_api_v1_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Не передавайте API token в URL.
Не публикуйте API token в чатах, логах и скриншотах.
5. Доступ к почтам и письмам
Для чтения конкретной почты, писем, HTML, extract и latest-code теперь требуется два фактора доступа:
1. API token пользователя 2. текущий PJ конкретной почты
PJ передаётся только через HTTP header:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Не передавайте PJ в query string.
Плохо:
GET /api/v1/mailbox/latest-code?email=mailbox@example.com&password=123
Правильно:
Authorization: Bearer <API_TOKEN> X-Mailbox-Password: <MAILBOX_PASSWORD>
Эти endpoints требуют X-Mailbox-Password:
GET /api/v1/mailbox
GET /api/v1/mailbox/messages
GET /api/v1/mailbox/latest-code
GET /api/v1/messages/{msg_id}
GET /api/v1/messages/{msg_id}/extract
GET /api/v1/messages/{msg_id}/html
Эти endpoints не требуют X-Mailbox-Password:
GET /api/v1/me
GET /api/v1/balance
GET /api/v1/products
GET /api/v1/shop/domain-options
POST /api/v1/orders
GET /api/v1/orders/{order_id}
GET /api/v1/orders/{order_id}/result
POST /api/v1/mailbox/password/change
POST /api/v1/mailbox/password/change принимает текущий PJ в JSON-поле old_password.
Если X-Mailbox-Password не передан, API возвращает:
{
"ok": false,
"error": {
"code": "mailbox_password_required",
"message": "Mailbox password is required"
},
"request_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
Если PJ неверный, API возвращает:
{
"ok": false,
"error": {
"code": "invalid_mailbox_password",
"message": "Mailbox password is invalid"
},
"request_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
6. Лимиты и безопасность
Лимит запросов
Для API действует лимит:
Стандартный API: 10 запросов/с, burst 20. Developer: 50 запросов/с, burst 250, 5 000 000 запросов/сутки, 100 000 000 запросов за 30 дней.
При превышении лимита сервис возвращает:
429 rate_limited
Модель доступа
API работает в owner-only режиме.
Это означает:
- пользователь видит только свои заказы
- пользователь видит только свои почты
- пользователь видит только свои письма
- пользователь может менять PJ только у своей почты
- пользователь может получать коды только из своих писем
- для чтения почты нужен текущий PJ этой почты
Чужой email, msg_id или order_id возвращает ошибку forbidden.
Защита после передачи почты другому владельцу
Если пользователь купил почту, передал её другому человеку, а новый владелец сменил PJ, старый владелец не сможет читать письма и коды через API без нового PJ.
API token сам по себе больше не даёт доступ к письмам и кодам.
Внутренние данные не раскрываются
API не возвращает:
- filesystem paths
- внутренние пути к HTML-файлам
- внутренние пути к result-файлам заказа
- user_domain_id
- mailauth_domain_id
- внутренние id доменов
7. Формат ответа
Успешный ответ
{
"ok": true
}
Ответ с ошибкой
{
"ok": false,
"error": {
"code": "forbidden",
"message": "message is not available for current user"
},
"request_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
Основные коды ошибок
bad_request invalid_token forbidden not_found conflict validation_error rate_limited quota_exceeded mailbox_password_required invalid_mailbox_password internal_error
8. Методы API
8.1 Проверка токена
GET /api/v1/me
Возвращает информацию о текущем токене и пользователе.
X-Mailbox-Password не требуется.
Пример ответа:
{
"ok": true,
"user_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
"scope": "mail.read order.create pj.change",
"token_created_at": "2026-05-02T19:44:04.381444+03:00",
"token_last_used_at": "2026-05-02T19:44:05.719220+03:00"
}
8.2 Баланс
GET /api/v1/balance
Возвращает текущий баланс пользователя.
X-Mailbox-Password не требуется.
Пример ответа:
{
"ok": true,
"balance_kopeks": 7975,
"balance_rub": "79.75"
}
8.3 Каталог товаров
GET /api/v1/products
Возвращает текущий каталог доступных товаров.
X-Mailbox-Password не требуется.
Актуальные цены, остатки и минимальные количества нужно получать из ответа API.
Пример ответа:
{
"ok": true,
"items": [
{
"product": "Eternal",
"title": "Eternal",
"available": true
},
{
"product": "Limited_ru",
"title": "Limited .ru",
"available": true
},
{
"product": "Limited_com",
"title": "Limited .com",
"available": true
},
{
"product": "Privileged",
"title": "Privileged",
"available": true
},
{
"product": "Ultimate",
"title": "Ultimate",
"available": true
},
{
"product": "Personal",
"title": "Personal",
"available": true,
"requires_personal_domain": true
}
]
}
Поддерживаемые товары:
Eternal Limited_ru Limited_com Privileged Ultimate Personal
8.4 Создание заказа
POST /api/v1/orders
Создаёт заказ на выдачу почт.
X-Mailbox-Password не требуется.
Обязательные заголовки:
Authorization: Bearer <API_TOKEN> Content-Type: application/json Idempotency-Key: <UNIQUE_KEY>
Idempotency-Key обязателен.
Заказ обычного товара
{
"product": "Eternal",
"qty": 100
}
Заказ Personal
Для Personal нужно передать полный домен пользователя.
{
"product": "Personal",
"qty": 100,
"domain": "example.com"
}
Правила:
productобязателенqtyобязателен- для
Personalполеdomainобязательно - для остальных товаров поле
domainзапрещено - пользователь не передаёт
user_domain_id - пользователь не передаёт
mailauth_domain_id - сервер сам резолвит домен пользователя внутри owner-safe контура
Пример успешного ответа:
{
"ok": true,
"order_id": "e43e7413-ba40-4934-ae8d-a4e0aec15144",
"status": "awaiting_backend",
"issuance_request_id": 689
}
8.5 Заказы: выбор доменов и статус
Выбор и исключение доменов при покупке
Для заказов через публичный API можно заранее посмотреть доступные домены продукта, а затем указать, какие домены использовать или исключить при покупке. Это нужно, если внешний сервис заблокировал конкретный почтовый домен.
GET /api/v1/shop/domain-options?product=Eternal&quantity=100 Authorization: Bearer <API_TOKEN>
{
"ok": true,
"product": "Eternal",
"quantity": 100,
"service": null,
"service_filter_applied": false,
"domains": [
{
"domain_id": 685,
"domain": "ochkomail.com",
"fqdn": "ochkomail.com",
"available": 9998843
}
],
"total_available": 59861181
}
Параметр service можно передавать для будущей совместимости, но сейчас сервисная фильтрация не применяется. В ответе это явно указано как service_filter_applied=false.
Режим only
mode=only означает: создать почты только на указанных доменах. Если ёмкости выбранных доменов не хватает, заказ не создаётся и деньги не списываются.
curl -sS \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: api-domain-only-1" \
-d '{"product":"Eternal","qty":100,"domain_selection":{"mode":"only","domains":["ochkomail.com"]}}' \
https://api.smakmail.com/api/v1/orders
Режим exclude
mode=exclude означает: не использовать указанные домены. Это основной режим для случая, когда сервис заблокировал один из доменов.
curl -sS \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: api-domain-exclude-1" \
-d '{"product":"Eternal","qty":100,"domain_selection":{"mode":"exclude","domains":["ochkomail.com"]}}' \
https://api.smakmail.com/api/v1/orders
Ошибки domain_selection
invalid_domain_selection domain_not_found domain_not_available domain_product_mismatch insufficient_capacity_selected_domains
Для Personal по-прежнему используется поле domain. Поле domain_selection предназначено для продуктов из общего пула доменов: Eternal, Limited_ru, Limited_com, Ultimate и других публично доступных пулов.
GET /api/v1/orders/{order_id}
Возвращает статус конкретного заказа пользователя.
X-Mailbox-Password не требуется.
order_id это UUID.
Пример ответа:
{
"ok": true,
"order": {
"order_id": "e43e7413-ba40-4934-ae8d-a4e0aec15144",
"product": "Eternal",
"qty": 100,
"unit_price_kopeks": 20,
"total_kopeks": 2000,
"status": "done",
"created_at": "2026-03-26T06:55:58.366986+00:00",
"updated_at": "2026-03-26T07:34:59.484063+00:00",
"issuance_request_id": 689,
"last_error": null,
"status_obj": {
"status": "done",
"progress_done": 100,
"progress_total": 100,
"progress_phase": "done",
"created_count": 100,
"total_boxes": 100
}
}
}
8.6 Результат заказа
GET /api/v1/orders/{order_id}/result
Возвращает результат завершённого заказа.
X-Mailbox-Password не требуется.
API возвращает JSON со списком email и password.
Внутренние filesystem paths наружу не раскрываются.
Пример ответа:
{
"ok": true,
"order_id": "e43e7413-ba40-4934-ae8d-a4e0aec15144",
"items": [
{
"email": "mailbox1@example.com",
"password": "ExamplePass123!"
},
{
"email": "mailbox2@example.com",
"password": "ExamplePass456!"
}
]
}
Важно: если почта передаётся другому владельцу, новому владельцу нужно сменить PJ. После смены PJ старый владелец не сможет читать письма и коды без нового PJ.
8.7 Карточка почты по email
GET /api/v1/mailbox?email=<EMAIL>
Возвращает информацию о конкретной почте текущего пользователя.
Требует текущий PJ почты через header:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Параметры:
ПараметрГдеОбязателенОписаниеemailqueryдаПолный email почтыX-Mailbox-PasswordheaderдаТекущий PJ этой почтыПример ответа:
{
"ok": true,
"mailbox": {
"email": "mailbox@example.com",
"notify_enabled": true,
"updated_at": "2026-03-26T07:18:59.420928+00:00"
}
}
8.8 Список писем конкретной почты
GET /api/v1/mailbox/messages?email=<EMAIL>&limit=<N>&cursor=<CURSOR>
Возвращает список писем конкретной почты.
Требует текущий PJ почты через header:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Параметры:
ПараметрГдеОбязателенОписаниеemailqueryдаПолный email почтыlimitqueryнетКоличество писем. По умолчанию 50, максимум 100cursorqueryнетКурсор следующей страницыX-Mailbox-PasswordheaderдаТекущий PJ этой почтыПример ответа:
{
"ok": true,
"items": [
{
"msg_id": "m63264u1",
"from_addr": "noreply@example.com",
"subject": "Example subject",
"snippet_600": "Example text",
"preview_text": "Example text",
"flags": [
"\\Seen"
],
"date": "2026-03-26T07:58:00+00:00",
"arrived_at": "2026-03-26T07:58:02+00:00",
"has_html": true
}
],
"next_cursor": null
}
msg_id из этого ответа нужно использовать для получения карточки письма, HTML, кодов и ссылок.
8.9 Карточка письма
GET /api/v1/messages/{msg_id}
Возвращает карточку одного письма.
Требует текущий PJ той почты, которой принадлежит письмо:
X-Mailbox-Password: <MAILBOX_PASSWORD>
msg_id это строковый идентификатор письма, полученный из GET /api/v1/mailbox/messages.
Ответ включает объект extract.
API гарантирует extract-on-read:
- если коды и ссылки уже извлечены, API отдаёт готовый результат
- если extract ещё не готов, API синхронно запускает извлечение при чтении письма
- результат сохраняется в
msg_extract - клиент получает готовый объект
extract
Параметры:
ПараметрГдеОбязателенОписаниеmsg_idpathдаID письмаX-Mailbox-PasswordheaderдаТекущий PJ почты, которой принадлежит письмоПример ответа:
{
"ok": true,
"message": {
"msg_id": "m63264u1",
"email": "mailbox@example.com",
"from_addr": "noreply@example.com",
"subject": "Your verification code",
"snippet_600": "Your verification code is 142008",
"preview_text": "Your verification code is 142008",
"flags": [
"\\Recent",
"\\Seen"
],
"date": "2026-05-02T13:23:26+03:00",
"arrived_at": "2026-05-02T16:23:29+03:00",
"has_html": true,
"extract": {
"status": "ready",
"db_status": "ok",
"service": "genshinimpact",
"kind": "code",
"summary": "",
"preview_text": "Код: 142008",
"codes": [
{
"value": "142008",
"label": "Код",
"score": 1.2
}
],
"links": [],
"confidence": 1.2,
"model_name": null,
"model_version": null,
"extracted_at": "2026-05-02T13:25:06.835495+03:00",
"updated_at": "2026-05-02T18:33:23.507370+03:00"
}
}
}
8.10 Extract письма
GET /api/v1/messages/{msg_id}/extract
Возвращает только извлечённые коды и ссылки из письма.
Требует текущий PJ той почты, которой принадлежит письмо:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Этот endpoint удобен, когда клиенту не нужна карточка письма целиком.
API также гарантирует extract-on-read.
Параметры:
ПараметрГдеОбязателенОписаниеmsg_idpathдаID письмаX-Mailbox-PasswordheaderдаТекущий PJ почты, которой принадлежит письмоПример ответа с кодом:
{
"ok": true,
"extract": {
"status": "ready",
"db_status": "ok",
"service": "genshinimpact",
"kind": "code",
"summary": "",
"preview_text": "Код: 142008",
"codes": [
{
"value": "142008",
"label": "Код",
"score": 1.2
}
],
"links": [],
"confidence": 1.2,
"model_name": null,
"model_version": null,
"extracted_at": "2026-05-02T13:25:06.835495+03:00",
"updated_at": "2026-05-02T18:33:23.507370+03:00"
}
}
Пример ответа без найденного кода:
{
"ok": true,
"extract": {
"status": "no_code_found",
"db_status": "ok",
"service": null,
"kind": "other",
"summary": "",
"preview_text": "Example message",
"codes": [],
"links": [],
"confidence": null,
"model_name": null,
"model_version": null,
"extracted_at": "2026-05-02T13:25:06.835495+03:00",
"updated_at": "2026-05-02T13:25:06.835495+03:00"
}
}
Поля extract
ПолеТипОписаниеstatusstringПубличный статус extract. Обычно ready или no_code_founddb_statusstringВнутренний статус строки extract. Обычно okservicestring или nullОпределённый сервис, если распознанkindstringТип результата. Например code, link, code_link, othersummarystring или nullКраткое описаниеpreview_textstringКраткий текст результатаcodesarrayНайденные кодыlinksarrayНайденные ссылкиconfidencenumber или nullОценка уверенностиmodel_namestring или nullИмя модели, если применимоmodel_versionstring или nullВерсия модели, если применимоextracted_atstring или nullВремя извлеченияupdated_atstring или nullВремя обновления extractПоля codes
ПолеТипОписаниеvaluestringЗначение кодаlabelstringЧеловекочитаемая меткаscorenumberОценка релевантности, если естьkindstringТип кода, если естьconfidencenumberУверенность, если естьПоля links
ПолеТипОписаниеurlstringURLlabelstringТекст ссылкиkindstringТип ссылки, если распознанscorenumberОценка релевантности, если естьconfidencenumberУверенность, если есть8.11 Последний код по почте
GET /api/v1/mailbox/latest-code?email=<EMAIL>
Возвращает последний найденный код по конкретной почте.
Это самый удобный endpoint для автоматизаций, которым нужен только код.
Требует текущий PJ почты через header:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Параметры:
ПараметрГдеОбязателенОписаниеemailqueryдаПолный email почтыservicequeryнетФильтр по сервисуlimitqueryнетСколько последних писем проверить. По умолчанию 20, максимум 50X-Mailbox-PasswordheaderдаТекущий PJ этой почтыПример запроса:
GET /api/v1/mailbox/latest-code?email=mailbox@example.com
Пример ответа:
{
"ok": true,
"status": "ready",
"email": "mailbox@example.com",
"message_id": "m111208u8",
"service": "genshinimpact",
"kind": "code",
"code": "142008",
"codes": [
"142008"
],
"links": [],
"arrived_at": "2026-05-02T16:23:29+03:00",
"extracted_at": "2026-05-02T13:25:06.835495+03:00",
"extract": {
"status": "ready",
"db_status": "ok",
"service": "genshinimpact",
"kind": "code",
"summary": "",
"preview_text": "Код: 142008",
"codes": [
{
"value": "142008",
"label": "Код",
"score": 1.2
}
],
"links": [],
"confidence": 1.2,
"model_name": null,
"model_version": null,
"extracted_at": "2026-05-02T13:25:06.835495+03:00",
"updated_at": "2026-05-02T18:33:23.507370+03:00"
}
}
Пример с фильтром service:
GET /api/v1/mailbox/latest-code?email=mailbox@example.com&service=genshinimpact
Ответ, если писем нет:
{
"ok": true,
"status": "not_found",
"email": "mailbox@example.com",
"message_id": null,
"code": null,
"codes": [],
"links": []
}
Ответ, если письма есть, но код не найден:
{
"ok": true,
"status": "no_code_found",
"email": "mailbox@example.com",
"message_id": null,
"service": null,
"code": null,
"codes": [],
"links": []
}
8.12 HTML письма
GET /api/v1/messages/{msg_id}/html
Возвращает HTML письма.
Требует текущий PJ той почты, которой принадлежит письмо:
X-Mailbox-Password: <MAILBOX_PASSWORD>
Если для письма есть HTML-версия, endpoint возвращает:
HTTP 200 Content-Type: text/html; charset=utf-8
Тело ответа содержит HTML документа письма.
Параметры:
ПараметрГдеОбязателенОписаниеmsg_idpathдаID письмаX-Mailbox-PasswordheaderдаТекущий PJ почты, которой принадлежит письмоПример запроса:
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ https://api.smakmail.com/api/v1/messages/m63264u1/html
8.13 Смена PJ
POST /api/v1/mailbox/password/change
Меняет PJ конкретной почты текущего пользователя.
Для этого endpoint X-Mailbox-Password не нужен. Текущий PJ передаётся в JSON-поле old_password.
Пример запроса:
{
"email": "mailbox@example.com",
"old_password": "OldPass123!",
"new_password": "NewPass123!"
}
Пример успешного ответа:
{
"ok": true,
"status": "ok",
"closed_sessions": 1
}
Что происходит при успешной смене PJ:
- проверяется принадлежность почты текущему пользователю
- проверяется старый пароль
- новый пароль валидируется по текущей политике PJ
- обновляется hash пароля
- закрываются старые сессии этой почты
- выполняется IMAP session kick
- в аудит пишется событие смены пароля
9. Owner-only модель доступа
Все mail-операции и order-операции работают только в owner-only режиме.
Это означает:
- чужой email недоступен
- чужой msg_id недоступен
- чужой order_id недоступен
- сменить PJ чужой почты нельзя
- получить результат чужого заказа нельзя
- получить код из чужого письма нельзя
При нарушении прав доступа возвращается ошибка:
forbidden
Для mail-read endpoints дополнительно требуется текущий PJ почты.
Если PJ отсутствует:
mailbox_password_required
Если PJ неверный:
invalid_mailbox_password
10. Идемпотентность заказов
Для POST /api/v1/orders обязателен заголовок:
Idempotency-Key: <UNIQUE_KEY>
Рекомендуется передавать уникальную строку для каждого нового заказа.
Повторный запрос с тем же Idempotency-Key должен рассматриваться как повтор того же действия, а не как создание нового заказа.
11. Extract-on-read
SmakMail API v1 гарантирует извлечение кодов и ссылок при чтении.
Это значит:
фоновый extractor = ускоритель API extract-on-read = гарантия
Рабочая схема:
- Письмо приходит на почту.
- Письмо становится доступно через API.
- Клиент запрашивает письмо, extract или latest-code.
- API проверяет наличие готового extract.
- Если extract уже есть, API отдаёт его сразу.
- Если extract ещё нет, API синхронно извлекает код и ссылки.
- API сохраняет результат.
- Клиент получает готовый ответ.
Это убирает ситуацию, когда письмо уже доступно, но код ещё не извлечён.
12. Что не входит в API v1
В API v1 не входят:
- регистрация
- логин по паролю
- создание токена по логину и паролю
- multi-token management
- пополнение баланса
- refund
- cancel order
- admin endpoints
- общий
GET /mailboxes - webhook subscriptions
- signed links на HTML
- отправка писем от пользовательских почт
- раскрытие внутренних filesystem paths
- раскрытие внутренних идентификаторов доменов
13. Рекомендованный порядок работы клиента
Получение и использование API
- Открыть в боте раздел
IMAP | API. - Создать или перевыпустить токен.
- Сохранить токен.
- Проверить токен через
GET /api/v1/me.
Работа с заказами
- Получить баланс через
GET /api/v1/balance. - Получить каталог через
GET /api/v1/products. - Создать заказ через
POST /api/v1/orders. - Проверять статус через
GET /api/v1/orders/{order_id}. - После завершения получить результат через
GET /api/v1/orders/{order_id}/result.
Работа с письмами
- Иметь API token.
- Иметь текущий PJ конкретной почты.
- Получить карточку почты через
GET /api/v1/mailbox. - Получить список писем через
GET /api/v1/mailbox/messages. - Взять
msg_idиз списка писем. - Получить карточку письма через
GET /api/v1/messages/{msg_id}. - Получить extract через
GET /api/v1/messages/{msg_id}/extract. - При необходимости получить HTML через
GET /api/v1/messages/{msg_id}/html.
Быстрое получение кода
Для большинства автоматизаций достаточно одного запроса:
GET /api/v1/mailbox/latest-code?email=<EMAIL>
Нужны заголовки:
Authorization: Bearer <API_TOKEN> X-Mailbox-Password: <MAILBOX_PASSWORD>
Endpoint сразу возвращает последний найденный код по почте.
Смена PJ
- Вызвать
POST /api/v1/mailbox/password/change. - Передать текущий PJ в
old_password. - Передать новый PJ в
new_password.
14. Примечания по текущей версии
- API v1 работает с UUID-идентификаторами заказов.
msg_idписьма нужно брать из ответаGET /api/v1/mailbox/messages.GET /api/v1/messages/{msg_id}возвращает объектextract.GET /api/v1/messages/{msg_id}/extractвозвращает только extract письма.GET /api/v1/mailbox/latest-codeвозвращает последний код по почте.- Для чтения почты, писем, HTML, extract и latest-code нужен
X-Mailbox-Password. - Для
Personalвсегда передаётся полный домен строкой в полеdomain. /api/v1/docsи/api/v1/openapi.jsonсуществуют как web-представление документации и OpenAPI-схемы.
15. Примеры curl
Проверка токена
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ https://api.smakmail.com/api/v1/me
Баланс
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ https://api.smakmail.com/api/v1/balance
Каталог
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ https://api.smakmail.com/api/v1/products
Заказ обычного товара
curl -sS \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: test-order-1" \
-d '{"product":"Eternal","qty":100}' \
https://api.smakmail.com/api/v1/orders
Заказ Personal
curl -sS \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: test-personal-order-1" \
-d '{"product":"Personal","qty":100,"domain":"example.com"}' \
https://api.smakmail.com/api/v1/orders
Статус заказа
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ https://api.smakmail.com/api/v1/orders/e43e7413-ba40-4934-ae8d-a4e0aec15144
Результат заказа
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ https://api.smakmail.com/api/v1/orders/e43e7413-ba40-4934-ae8d-a4e0aec15144/result
Карточка почты
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ --get \ --data-urlencode "email=mailbox@example.com" \ https://api.smakmail.com/api/v1/mailbox
Список писем почты
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ --get \ --data-urlencode "email=mailbox@example.com" \ --data-urlencode "limit=5" \ https://api.smakmail.com/api/v1/mailbox/messages
Карточка письма с extract
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ https://api.smakmail.com/api/v1/messages/m63264u1
Extract письма
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ https://api.smakmail.com/api/v1/messages/m63264u1/extract
Последний код по почте
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ --get \ --data-urlencode "email=mailbox@example.com" \ https://api.smakmail.com/api/v1/mailbox/latest-code
Последний код по почте с фильтром service
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ --get \ --data-urlencode "email=mailbox@example.com" \ --data-urlencode "service=genshinimpact" \ https://api.smakmail.com/api/v1/mailbox/latest-code
HTML письма
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ https://api.smakmail.com/api/v1/messages/m63264u1/html
Смена PJ
curl -sS \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"email":"mailbox@example.com","old_password":"OldPass123!","new_password":"NewPass123!"}' \
https://api.smakmail.com/api/v1/mailbox/password/change
16. Минимальный сценарий для получения кода
Запрос:
curl -sS \ -H "Authorization: Bearer <TOKEN>" \ -H "X-Mailbox-Password: <MAILBOX_PASSWORD>" \ --get \ --data-urlencode "email=mailbox@example.com" \ https://api.smakmail.com/api/v1/mailbox/latest-code
Ожидаемый успешный ответ:
{
"ok": true,
"status": "ready",
"email": "mailbox@example.com",
"message_id": "m111208u8",
"service": "genshinimpact",
"kind": "code",
"code": "142008",
"codes": [
"142008"
],
"links": [],
"arrived_at": "2026-05-02T16:23:29+03:00",
"extracted_at": "2026-05-02T13:25:06.835495+03:00"
}
Актуальный эксплуатационный контракт
Лимиты API
- Стандартный API: 10 запросов/с, burst 20.
- Developer: 50 запросов/с, burst 250.
- Developer: 5 000 000 запросов в сутки.
- Developer: 100 000 000 запросов за 30 дней.
При превышении скоростного лимита возвращается HTTP 429 rate_limited. При исчерпании Developer quota возвращается HTTP 429 quota_exceeded.
Developer endpoints
GET /api/v1/developer POST /api/v1/developer/trial POST /api/v1/developer/subscribe
Связанные документы
Changelog
- 13 августа 2026: актуализированы API-лимиты, опубликована POP3-документация, исправлена публичная обнаруживаемость docs.
- 24 июня 2026: опубликованы публичные API и IMAP docs.