Loading…

Email API

Документация (RU)

Два продукта под одним API: разовые активации (получение кода на временный email) и аренда почтового ящика (постоянный email на срок с доступом ко всем письмам). У них разные форматы ответа — это сделано намеренно, чтобы клиенты, уже интегрированные с апстримами, могли переключиться сменой хоста и ключа без переписывания парсеров:

  • Контракт 1 (активации) — конверт {data: ...}, формат, привычный по массовым сервисам email-активаций.
  • Контракт 2 (аренда) — конверт {success, result}, формат мультисайт-аренды почтового ящика.

Аутентификация

Основной способ — заголовок Authorization: ApiKey <ваш ключ>. Префикс ApiKey обязателен: без него запрос будет отклонён как неавторизованный.

Также поддерживаются (fallback, для совместимости с остальными нашими API):

  • X-Api-Key: <ключ>
  • Authorization: Bearer <ключ>
  • Ключ передаётся ТОЛЬКО заголовком. Параметр ?key= в этом API не принимается: денежные методы контракта аренды ходят по GET, и ключ из query-строки осел бы в access-логах сервера, ротациях и бэкапах.

Ключ никогда не передаётся в пути URL — ни один маршрут этого API его так не принимает.

Где взять ключ: тот же API‑ключ, что и для OTP/Numbers/Proxy API — раздел API в личном кабинете.

Лимиты: чтение — 60 запросов/мин на ключ; мутации (покупка/отмена/reorder/batch, а также заказ/продление аренды) — 20 запросов/мин на ключ. Счётчики раздельные для активаций и аренды.

Контракт 1 — Разовые активации

Базовый URL: https://sms-acktiwator.ru/api/v1/emails

Успех: {"data": Activation} или {"data": [Activation, ...], "meta": {...}}. Ошибка: {"error": "...", "code": "..."} с соответствующим HTTP‑статусом.

site — ЛЮБОЙ целевой сайт (свободная строка, например telegram.org или домен со ссылкой — нормализуется автоматически). domain — домен почтового ящика (например gmail.com), берётся из каталога GET .../domains.

Форма Activation:

ПолеТипОписание
idintID активации
sitestringЦелевой сайт (как передан при покупке, нормализован)
emailstring|nullАрендованный email‑адрес
statusstringWAIT / DONE / CANCEL / TIMEOUT
valuestring|nullКод/значение из письма; null, пока не пришло
coststringСписанная с вас цена
currencystringВсегда "USD"
datestringISO‑8601 UTC, дата создания активации
messagestring|nullЗарезервировано (сейчас всегда null)

Статусы: WAIT — ожидание кода; DONE — код получен; CANCEL — активация отменена (средства возвращены); TIMEOUT — истекло время ожидания.

1) GET /api/v1/emails — список активаций

ПараметрТипОбязателенОписание
searchstringнетПоиск по site/email/domain
sizeintнетРазмер страницы, ≤100 (по умолчанию 25)
pageintнетНомер страницы (по умолчанию 1)
statusstringнетWAIT/DONE/CANCEL/TIMEOUT
fromstringнетISO‑дата/время — нижняя граница date
tostringнетISO‑дата/время — верхняя граница date

Запрос:

GET https://sms-acktiwator.ru/api/v1/emails?status=WAIT&size=25&page=1
Authorization: ApiKey YOUR_API_KEY

Ответ (200):

{
  "data": [ { "id": 12345, "site": "telegram.org", "email": "z@gmail.com",
              "status": "WAIT", "value": null, "cost": "0.10",
              "currency": "USD", "date": "2026-07-31T10:00:00Z", "message": null } ],
  "meta": { "page": 1, "size": 25, "total": 1 }
}

2) POST /api/v1/emails — купить активацию

ПараметрТипОбязателенОписание
sitestringдаЦелевой сайт (любой)
domainstringдаДомен почтового ящика

Запрос:

POST https://sms-acktiwator.ru/api/v1/emails
Authorization: ApiKey YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded

site=telegram.org&domain=gmail.com

Ответ (201): {"data": Activation} с status="WAIT" и value=null.

Ошибки: 422 BAD_PARAMS — не заданы site/domain; 409 NO_OFFER — нет доступных ящиков по направлению (либо не хватает баланса).

3) GET /api/v1/emails/{id} — получить активацию (проверить код)

Запрос:

GET https://sms-acktiwator.ru/api/v1/emails/12345
Authorization: ApiKey YOUR_API_KEY

Ответ (200): {"data": Activation}. Поллите этот метод до терминального статуса (DONE/CANCEL/TIMEOUT).

Ошибки: 404 NOT_FOUND — активация не найдена или принадлежит другому пользователю.

4) DELETE /api/v1/emails/{id} — отменить активацию

Запрос:

DELETE https://sms-acktiwator.ru/api/v1/emails/12345
Authorization: ApiKey YOUR_API_KEY

Ответ: 204 без тела. Отменяет активацию и возвращает списанные средства на баланс.

Ошибки: 404 NOT_FOUND — чужая/не найдена; 409 CANNOT_CANCEL — активация уже закрыта (завершена/отменена/истекла).

5) POST /api/v1/emails/{id}/reorder — купить ещё раз (тот же site/domain)

Запрос:

POST https://sms-acktiwator.ru/api/v1/emails/12345/reorder
Authorization: ApiKey YOUR_API_KEY

Ответ (201): {"data": Activation} — новая активация с теми же site/domain, что у исходной (её собственный статус не важен и не меняется).

Ошибки: 404 NOT_FOUND — исходная активация чужая/не найдена; 409 NO_OFFER — нет доступных ящиков.

6) POST /api/v1/emails/batch — купить несколько активаций подряд

ПараметрТипОбязателенОписание
countintда1..10
sitestringдаЦелевой сайт (общий для всей пачки)
domainstringдаДомен (общий для всей пачки)

Ответ (201): {"data": [Activation, ...], "meta": {"info": string|null, "count": int}}. При частичном успехе (сток закончился на N‑й покупке) data содержит только купленные, meta.count — их число, meta.info поясняет причину остановки.

Ошибки: 422 BAD_PARAMScount вне 1..10 или не заданы site/domain.

7) GET /api/v1/emails/domains — каталог доменов и цен

Запрос:

GET https://sms-acktiwator.ru/api/v1/emails/domains
Authorization: ApiKey YOUR_API_KEY

Ответ (200):

{
  "data": [
    { "name": "gmail.com", "cost": "0.15", "count": 42 },
    { "name": "outlook.com", "cost": "0.20", "count": 7 }
  ]
}

Параметр ?site= принимается для совместимости, но на выдачу не влияет — каталог общий для всех сайтов.

Контракт 2 — Аренда почтового ящика (мультисайт)

Базовый URL: https://sms-acktiwator.ru/api/v1/ + название метода. Методы принимают и GET, и POST (GET — для совместимости с привычным форматом, POST — более корректный способ для операций, меняющих состояние).

Успех: {"success": true, "result": ...}. Ошибка: {"success": false, "error": "..."} с соответствующим HTTP‑статусом (без поля code).

Важно для интеграторов — особенности нашей реализации:

  • минимальный срок аренды — 12 часов (максимум — 1440 часов = 60 дней);
  • отмены аренды нет — аренда невозвратна;
  • письма отдаются из нашей базы (крон синкает их с провайдером примерно раз в 2 минуты), поэтому они доступны и после окончания срока аренды.

multisiteOrder — заказать аренду ящика

ПараметрТипОбязателенОписание
domainstringдаДомен ящика
sitesstringдаСписок целевых сайтов через запятую
periodintдаСрок в часах, 12..1440

Запрос:

POST https://sms-acktiwator.ru/api/v1/multisiteOrder
Authorization: ApiKey YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded

domain=zickmail.com&sites=instagram.com,discord.com&period=12

Ответ (201):

{ "success": true, "result": { "id": 1000042, "email": "abc123@zickmail.com", "expire": 43200 } }

expire — секунды до истечения аренды.

Ошибки: 422 — не заданы domain/sites, либо period вне 12..1440 ("Период аренды: 12..1440 часов"); 409 — бизнес‑отказ (нет доступных ящиков по домену, не хватает баланса).

multisiteInfo — статус аренды

Запрос: GET .../api/v1/multisiteInfo?id=1000042 (+ заголовок авторизации)

Ответ (200):

{ "success": true, "result": { "id": 1000042, "email": "abc123@zickmail.com", "expire": 43180, "expired": false } }

После истечения срока expire становится отрицательным, а expiredtrue (аренда при этом остаётся в системе, письма продолжают быть доступны).

Ошибки: 404 — аренда чужая или не найдена.

multisiteLetters — письма ящика

Запрос: GET .../api/v1/multisiteLetters?id=1000042

Ответ (200):

{ "success": true, "result": [
  { "from": "noreply@discord.com", "subject": "Verify your email",
    "data": "112233", "received_at": "2026-07-31T10:05:00Z" }
] }

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

Ошибки: 404 — аренда чужая или не найдена.

multisiteExtend — продлить аренду

ПараметрТипОбязателенОписание
idintдаID аренды
periodintдаДоп. срок в часах, 12..1440

Ответ (200): {"success": true, "result": true} — продлено, или {"success": true, "result": false} — бизнес‑отказ (например, не хватает баланса). HTTP при этом остаётся 200: сам вызов состоялся, отказ описан в result.

Ошибки: 422period вне 12..1440; 404 — аренда чужая/не найдена.

multisiteReorder — новая аренда на тех же domain/sites

Запрос: POST .../api/v1/multisiteReorder с id (исходной аренды) и period.

Ответ (201): {"success": true, "result": {"id": ..., "email": ..., "expire": ...}} — новая аренда на том же домене и с тем же списком сайтов, что у исходной.

Ошибки: 404 — исходная аренда чужая/не найдена; 409/422 — как у multisiteOrder.

Коды ошибок

Контракт 1 (активации), поле code:

HTTPcodeКогда
401BAD_KEYКлюч не передан, не найден или неактивен
403BANNEDАккаунт заблокирован
403FORBIDDENПродукт (Email‑активации) не подключён аккаунту
404NOT_FOUNDАктивация не найдена или принадлежит другому пользователю
409NO_OFFERНет доступных ящиков по site/domain (в т.ч. недостаточно средств)
409CANNOT_CANCELАктивация уже закрыта — отменить нельзя
422BAD_PARAMSНе заданы обязательные параметры или count вне 1..10
429CHANNEL_LIMITПревышен лимит запросов на ключ

Контракт 2 (аренда), поле error (без code):

HTTPerrorКогда
401«Bad API key»Ключ не передан, не найден или неактивен
403«Account is banned»Аккаунт заблокирован
403«Product disabled»Продукт (аренда ящиков) не подключён аккаунту
404«Rental not found»Аренда чужая или не найдена
409текст причиныБизнес‑отказ (нет ящиков по домену, не хватает баланса)
422«domain and sites required»Не заданы обязательные параметры
422«Период аренды: 12..1440 часов»period вне допустимого диапазона
429«Rate limit exceeded»Превышен лимит запросов на ключ

Примеры

Ключ во всех примерах — плейсхолдер YOUR_API_KEY, замените на свой.

Купить активацию и дождаться кода

curl:

curl -X POST "https://sms-acktiwator.ru/api/v1/emails" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -d "site=telegram.org" -d "domain=gmail.com"

# затем поллинг:
curl "https://sms-acktiwator.ru/api/v1/emails/12345" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Python (requests):

import time
import requests

BASE = "https://sms-acktiwator.ru/api/v1"
HEADERS = {"Authorization": "ApiKey YOUR_API_KEY"}

r = requests.post(f"{BASE}/emails", headers=HEADERS,
                   data={"site": "telegram.org", "domain": "gmail.com"})
r.raise_for_status()
activation = r.json()["data"]

while True:
    r = requests.get(f"{BASE}/emails/{activation['id']}", headers=HEADERS)
    data = r.json()["data"]
    if data["status"] == "DONE":
        print("code:", data["value"])
        break
    if data["status"] in ("CANCEL", "TIMEOUT"):
        raise RuntimeError(data["status"])
    time.sleep(3)

JavaScript (fetch):

const BASE = "https://sms-acktiwator.ru/api/v1";
const HEADERS = { "Authorization": "ApiKey YOUR_API_KEY" };

async function buyAndWaitCode(site, domain) {
  const created = await fetch(`${BASE}/emails`, {
    method: "POST",
    headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({ site, domain }),
  }).then(r => r.json());

  const id = created.data.id;
  while (true) {
    const { data } = await fetch(`${BASE}/emails/${id}`, { headers: HEADERS }).then(r => r.json());
    if (data.status === "DONE") return data.value;
    if (data.status === "CANCEL" || data.status === "TIMEOUT") throw new Error(data.status);
    await new Promise(res => setTimeout(res, 3000));
  }
}

Заказать аренду ящика и прочитать письма

curl:

curl -X POST "https://sms-acktiwator.ru/api/v1/multisiteOrder" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -d "domain=zickmail.com" -d "sites=instagram.com,discord.com" -d "period=12"

curl "https://sms-acktiwator.ru/api/v1/multisiteLetters?id=1000042" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Python (requests):

r = requests.post(f"{BASE}/multisiteOrder", headers=HEADERS,
                   data={"domain": "zickmail.com", "sites": "instagram.com,discord.com", "period": 12})
order = r.json()["result"]

r = requests.get(f"{BASE}/multisiteLetters", headers=HEADERS, params={"id": order["id"]})
letters = r.json()["result"]

JavaScript (fetch):

const order = await fetch(`${BASE}/multisiteOrder`, {
  method: "POST",
  headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({ domain: "zickmail.com", sites: "instagram.com,discord.com", period: 12 }),
}).then(r => r.json());

const letters = await fetch(`${BASE}/multisiteLetters?id=${order.result.id}`, { headers: HEADERS })
  .then(r => r.json());

Устаревшее API

⚠️ Эндпоинты /api/email-otp/get/, /api/email-otp/status/, /api/email-otp/cancel/ — устаревшие (deprecated), оставлены только ради уже работающих интеграций. Для новых интеграций используйте исключительно /api/v1/emails* (контракт 1 выше).

Documentation (EN)

Two products under one API: one‑off activations (receive a code on a temporary email) and mailbox rental (a persistent email for a period with access to all letters). They use different response envelopes on purpose — this lets clients already integrated with the upstream providers switch by changing the host and key only, with no parser rewrites:

  • Contract 1 (activations){data: ...} envelope, the format commonly used by email-activation services.
  • Contract 2 (rental){success, result} envelope, the multisite mailbox-rental format.

Authentication

Primary method — header Authorization: ApiKey <your key>. The literal ApiKey prefix is required; without it the request is rejected as unauthenticated.

Also supported (fallback, for compatibility with our other APIs):

  • X-Api-Key: <key>
  • Authorization: Bearer <key>
  • The key is accepted in headers only. The ?key= query parameter is not supported here: rental-contract money methods accept GET, so a key in the query string would end up in server access logs, rotations and backups.

The key is never accepted in the URL path — no route in this API reads it that way.

Where to get a key: the same API key used for OTP/Numbers/Proxy API — the API section of your account.

Limits: reads — 60 requests/min per key; mutations (buy/cancel/reorder/batch, and rental order/extend) — 20 requests/min per key. Counters are separate for activations and rentals.

Contract 1 — One-off activations

Base URL: https://sms-acktiwator.ru/api/v1/emails

Success: {"data": Activation} or {"data": [Activation, ...], "meta": {...}}. Error: {"error": "...", "code": "..."} with a matching HTTP status.

site — ANY target site (free-form string, e.g. telegram.org, or a full URL — normalized automatically). domain — the mailbox domain (e.g. gmail.com), taken from the GET .../domains catalog.

Activation shape:

FieldTypeDescription
idintActivation ID
sitestringTarget site (as submitted, normalized)
emailstring|nullRented email address
statusstringWAIT / DONE / CANCEL / TIMEOUT
valuestring|nullCode/value from the letter; null until received
coststringAmount charged
currencystringAlways "USD"
datestringISO-8601 UTC, creation date
messagestring|nullReserved (currently always null)

Statuses: WAIT — waiting for the code; DONE — code received; CANCEL — cancelled (funds refunded); TIMEOUT — waiting window expired.

1) GET /api/v1/emails — list activations

ParameterTypeRequiredDescription
searchstringnoSearch over site/email/domain
sizeintnoPage size, ≤100 (default 25)
pageintnoPage number (default 1)
statusstringnoWAIT/DONE/CANCEL/TIMEOUT
fromstringnoISO date/time — lower bound of date
tostringnoISO date/time — upper bound of date
GET https://sms-acktiwator.ru/api/v1/emails?status=WAIT&size=25&page=1
Authorization: ApiKey YOUR_API_KEY

Response (200):

{
  "data": [ { "id": 12345, "site": "telegram.org", "email": "z@gmail.com",
              "status": "WAIT", "value": null, "cost": "0.10",
              "currency": "USD", "date": "2026-07-31T10:00:00Z", "message": null } ],
  "meta": { "page": 1, "size": 25, "total": 1 }
}

2) POST /api/v1/emails — buy an activation

ParameterTypeRequiredDescription
sitestringyesTarget site (any)
domainstringyesMailbox domain
POST https://sms-acktiwator.ru/api/v1/emails
Authorization: ApiKey YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded

site=telegram.org&domain=gmail.com

Response (201): {"data": Activation} with status="WAIT" and value=null.

Errors: 422 BAD_PARAMSsite/domain missing; 409 NO_OFFER — no mailboxes available for this pair (or insufficient balance).

3) GET /api/v1/emails/{id} — get an activation (check the code)

GET https://sms-acktiwator.ru/api/v1/emails/12345
Authorization: ApiKey YOUR_API_KEY

Response (200): {"data": Activation}. Poll this until a terminal status (DONE/CANCEL/TIMEOUT).

Errors: 404 NOT_FOUND — not found or belongs to another user.

4) DELETE /api/v1/emails/{id} — cancel an activation

DELETE https://sms-acktiwator.ru/api/v1/emails/12345
Authorization: ApiKey YOUR_API_KEY

Response: 204, no body. Cancels the activation and refunds the charge to your balance.

Errors: 404 NOT_FOUND — not yours/not found; 409 CANNOT_CANCEL — activation already closed (completed/cancelled/expired).

5) POST /api/v1/emails/{id}/reorder — buy again (same site/domain)

POST https://sms-acktiwator.ru/api/v1/emails/12345/reorder
Authorization: ApiKey YOUR_API_KEY

Response (201): {"data": Activation} — a new activation with the same site/domain as the original (its own status is irrelevant and unchanged).

Errors: 404 NOT_FOUND — the original activation is not yours/not found; 409 NO_OFFER — no mailboxes available.

6) POST /api/v1/emails/batch — buy several activations at once

ParameterTypeRequiredDescription
countintyes1..10
sitestringyesTarget site (shared across the batch)
domainstringyesDomain (shared across the batch)

Response (201): {"data": [Activation, ...], "meta": {"info": string|null, "count": int}}. On partial success (stock ran out at item N) data contains only what was bought, meta.count is how many, and meta.info explains why it stopped.

Errors: 422 BAD_PARAMScount outside 1..10, or site/domain missing.

7) GET /api/v1/emails/domains — domain and price catalog

GET https://sms-acktiwator.ru/api/v1/emails/domains
Authorization: ApiKey YOUR_API_KEY

Response (200):

{
  "data": [
    { "name": "gmail.com", "cost": "0.15", "count": 42 },
    { "name": "outlook.com", "cost": "0.20", "count": 7 }
  ]
}

The ?site= parameter is accepted for compatibility but doesn't affect the result — the catalog is site-agnostic.

Contract 2 — Mailbox rental (multisite)

Base URL: https://sms-acktiwator.ru/api/v1/ + method name. Methods accept both GET and POST (GET for compatibility with the familiar format, POST as the more correct way for state-changing calls).

Success: {"success": true, "result": ...}. Error: {"success": false, "error": "..."} with a matching HTTP status (no code field).

Important for integrators — specifics of our implementation:

  • minimum rental period is 12 hours (maximum is 1440 hours = 60 days);
  • there is no rental cancellation — rentals are non-refundable;
  • letters are served from our own database (a cron job syncs them from the provider roughly every 2 minutes), so they remain available after the rental period ends.

multisiteOrder — order a mailbox rental

ParameterTypeRequiredDescription
domainstringyesMailbox domain
sitesstringyesComma-separated list of target sites
periodintyesHours, 12..1440
POST https://sms-acktiwator.ru/api/v1/multisiteOrder
Authorization: ApiKey YOUR_API_KEY
Content-Type: application/x-www-form-urlencoded

domain=zickmail.com&sites=instagram.com,discord.com&period=12

Response (201):

{ "success": true, "result": { "id": 1000042, "email": "abc123@zickmail.com", "expire": 43200 } }

expire — seconds until the rental expires.

Errors: 422domain/sites missing, or period outside 12..1440 ("Период аренды: 12..1440 часов"); 409 — business decline (no mailboxes for the domain, insufficient balance).

multisiteInfo — rental status

Request: GET .../api/v1/multisiteInfo?id=1000042 (+ auth header)

Response (200):

{ "success": true, "result": { "id": 1000042, "email": "abc123@zickmail.com", "expire": 43180, "expired": false } }

After the period ends, expire becomes negative and expired is true (the rental record stays and letters remain accessible).

Errors: 404 — not yours/not found.

multisiteLetters — mailbox letters

Request: GET .../api/v1/multisiteLetters?id=1000042

Response (200):

{ "success": true, "result": [
  { "from": "noreply@discord.com", "subject": "Verify your email",
    "data": "112233", "received_at": "2026-07-31T10:05:00Z" }
] }

Letters are served from our database, no provider call — available after the rental ends too.

Errors: 404 — not yours/not found.

multisiteExtend — extend a rental

ParameterTypeRequiredDescription
idintyesRental ID
periodintyesExtra hours, 12..1440

Response (200): {"success": true, "result": true} — extended, or {"success": true, "result": false} — business decline (e.g. insufficient balance). HTTP remains 200: the call itself succeeded, the decline is described in result.

Errors: 422period outside 12..1440; 404 — not yours/not found.

multisiteReorder — new rental with the same domain/sites

Request: POST .../api/v1/multisiteReorder with id (of the original rental) and period.

Response (201): {"success": true, "result": {"id": ..., "email": ..., "expire": ...}} — a new rental on the same domain and site list as the original.

Errors: 404 — the original rental is not yours/not found; 409/422 — same as multisiteOrder.

Error codes

Contract 1 (activations), code field:

HTTPcodeWhen
401BAD_KEYKey missing, not found, or inactive
403BANNEDAccount is banned
403FORBIDDENProduct (email activations) not enabled for the account
404NOT_FOUNDActivation not found or belongs to another user
409NO_OFFERNo mailboxes available for site/domain (incl. insufficient balance)
409CANNOT_CANCELActivation already closed — cannot cancel
422BAD_PARAMSRequired parameters missing, or count outside 1..10
429CHANNEL_LIMITPer-key rate limit exceeded

Contract 2 (rental), error field (no code):

HTTPerrorWhen
401"Bad API key"Key missing, not found, or inactive
403"Account is banned"Account is banned
403"Product disabled"Product (mailbox rental) not enabled for the account
404"Rental not found"Rental is not yours or doesn't exist
409reason textBusiness decline (no mailboxes for the domain, insufficient balance)
422"domain and sites required"Required parameters missing
422"Период аренды: 12..1440 часов"period outside the allowed range
429"Rate limit exceeded"Per-key rate limit exceeded

Examples

The key in every example is a placeholder, YOUR_API_KEY — replace it with your own.

Buy an activation and wait for the code

curl:

curl -X POST "https://sms-acktiwator.ru/api/v1/emails" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -d "site=telegram.org" -d "domain=gmail.com"

# then poll:
curl "https://sms-acktiwator.ru/api/v1/emails/12345" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Python (requests):

import time
import requests

BASE = "https://sms-acktiwator.ru/api/v1"
HEADERS = {"Authorization": "ApiKey YOUR_API_KEY"}

r = requests.post(f"{BASE}/emails", headers=HEADERS,
                   data={"site": "telegram.org", "domain": "gmail.com"})
r.raise_for_status()
activation = r.json()["data"]

while True:
    r = requests.get(f"{BASE}/emails/{activation['id']}", headers=HEADERS)
    data = r.json()["data"]
    if data["status"] == "DONE":
        print("code:", data["value"])
        break
    if data["status"] in ("CANCEL", "TIMEOUT"):
        raise RuntimeError(data["status"])
    time.sleep(3)

JavaScript (fetch):

const BASE = "https://sms-acktiwator.ru/api/v1";
const HEADERS = { "Authorization": "ApiKey YOUR_API_KEY" };

async function buyAndWaitCode(site, domain) {
  const created = await fetch(`${BASE}/emails`, {
    method: "POST",
    headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({ site, domain }),
  }).then(r => r.json());

  const id = created.data.id;
  while (true) {
    const { data } = await fetch(`${BASE}/emails/${id}`, { headers: HEADERS }).then(r => r.json());
    if (data.status === "DONE") return data.value;
    if (data.status === "CANCEL" || data.status === "TIMEOUT") throw new Error(data.status);
    await new Promise(res => setTimeout(res, 3000));
  }
}

Order a mailbox rental and read letters

curl:

curl -X POST "https://sms-acktiwator.ru/api/v1/multisiteOrder" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -d "domain=zickmail.com" -d "sites=instagram.com,discord.com" -d "period=12"

curl "https://sms-acktiwator.ru/api/v1/multisiteLetters?id=1000042" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Python (requests):

r = requests.post(f"{BASE}/multisiteOrder", headers=HEADERS,
                   data={"domain": "zickmail.com", "sites": "instagram.com,discord.com", "period": 12})
order = r.json()["result"]

r = requests.get(f"{BASE}/multisiteLetters", headers=HEADERS, params={"id": order["id"]})
letters = r.json()["result"]

JavaScript (fetch):

const order = await fetch(`${BASE}/multisiteOrder`, {
  method: "POST",
  headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({ domain: "zickmail.com", sites: "instagram.com,discord.com", period: 12 }),
}).then(r => r.json());

const letters = await fetch(`${BASE}/multisiteLetters?id=${order.result.id}`, { headers: HEADERS })
  .then(r => r.json());

Deprecated API

⚠️ /api/email-otp/get/, /api/email-otp/status/, /api/email-otp/cancel/ are deprecated — kept only for already-running integrations. For new integrations use only /api/v1/emails* (Contract 1 above).