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:
| Поле | Тип | Описание |
|---|---|---|
id | int | ID активации |
site | string | Целевой сайт (как передан при покупке, нормализован) |
email | string|null | Арендованный email‑адрес |
status | string | WAIT / DONE / CANCEL / TIMEOUT |
value | string|null | Код/значение из письма; null, пока не пришло |
cost | string | Списанная с вас цена |
currency | string | Всегда "USD" |
date | string | ISO‑8601 UTC, дата создания активации |
message | string|null | Зарезервировано (сейчас всегда null) |
Статусы: WAIT — ожидание кода; DONE — код получен; CANCEL — активация отменена (средства возвращены); TIMEOUT — истекло время ожидания.
1) GET /api/v1/emails — список активаций
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
search | string | нет | Поиск по site/email/domain |
size | int | нет | Размер страницы, ≤100 (по умолчанию 25) |
page | int | нет | Номер страницы (по умолчанию 1) |
status | string | нет | WAIT/DONE/CANCEL/TIMEOUT |
from | string | нет | ISO‑дата/время — нижняя граница date |
to | string | нет | 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 — купить активацию
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
site | string | да | Целевой сайт (любой) |
domain | string | да | Домен почтового ящика |
Запрос:
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 — купить несколько активаций подряд
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
count | int | да | 1..10 |
site | string | да | Целевой сайт (общий для всей пачки) |
domain | string | да | Домен (общий для всей пачки) |
Ответ (201): {"data": [Activation, ...], "meta": {"info": string|null, "count": int}}. При частичном успехе (сток закончился на N‑й покупке) data содержит только купленные, meta.count — их число, meta.info поясняет причину остановки.
Ошибки: 422 BAD_PARAMS — count вне 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 — заказать аренду ящика
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
domain | string | да | Домен ящика |
sites | string | да | Список целевых сайтов через запятую |
period | int | да | Срок в часах, 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 становится отрицательным, а expired — true (аренда при этом остаётся в системе, письма продолжают быть доступны).
Ошибки: 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 — продлить аренду
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
id | int | да | ID аренды |
period | int | да | Доп. срок в часах, 12..1440 |
Ответ (200): {"success": true, "result": true} — продлено, или {"success": true, "result": false} — бизнес‑отказ (например, не хватает баланса). HTTP при этом остаётся 200: сам вызов состоялся, отказ описан в result.
Ошибки: 422 — period вне 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:
| HTTP | code | Когда |
|---|---|---|
| 401 | BAD_KEY | Ключ не передан, не найден или неактивен |
| 403 | BANNED | Аккаунт заблокирован |
| 403 | FORBIDDEN | Продукт (Email‑активации) не подключён аккаунту |
| 404 | NOT_FOUND | Активация не найдена или принадлежит другому пользователю |
| 409 | NO_OFFER | Нет доступных ящиков по site/domain (в т.ч. недостаточно средств) |
| 409 | CANNOT_CANCEL | Активация уже закрыта — отменить нельзя |
| 422 | BAD_PARAMS | Не заданы обязательные параметры или count вне 1..10 |
| 429 | CHANNEL_LIMIT | Превышен лимит запросов на ключ |
Контракт 2 (аренда), поле error (без code):
| HTTP | error | Когда |
|---|---|---|
| 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:
| Field | Type | Description |
|---|---|---|
id | int | Activation ID |
site | string | Target site (as submitted, normalized) |
email | string|null | Rented email address |
status | string | WAIT / DONE / CANCEL / TIMEOUT |
value | string|null | Code/value from the letter; null until received |
cost | string | Amount charged |
currency | string | Always "USD" |
date | string | ISO-8601 UTC, creation date |
message | string|null | Reserved (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
| Parameter | Type | Required | Description |
|---|---|---|---|
search | string | no | Search over site/email/domain |
size | int | no | Page size, ≤100 (default 25) |
page | int | no | Page number (default 1) |
status | string | no | WAIT/DONE/CANCEL/TIMEOUT |
from | string | no | ISO date/time — lower bound of date |
to | string | no | ISO 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
| Parameter | Type | Required | Description |
|---|---|---|---|
site | string | yes | Target site (any) |
domain | string | yes | Mailbox 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_PARAMS — site/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
| Parameter | Type | Required | Description |
|---|---|---|---|
count | int | yes | 1..10 |
site | string | yes | Target site (shared across the batch) |
domain | string | yes | Domain (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_PARAMS — count 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
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | yes | Mailbox domain |
sites | string | yes | Comma-separated list of target sites |
period | int | yes | Hours, 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: 422 — domain/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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | int | yes | Rental ID |
period | int | yes | Extra 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: 422 — period 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:
| HTTP | code | When |
|---|---|---|
| 401 | BAD_KEY | Key missing, not found, or inactive |
| 403 | BANNED | Account is banned |
| 403 | FORBIDDEN | Product (email activations) not enabled for the account |
| 404 | NOT_FOUND | Activation not found or belongs to another user |
| 409 | NO_OFFER | No mailboxes available for site/domain (incl. insufficient balance) |
| 409 | CANNOT_CANCEL | Activation already closed — cannot cancel |
| 422 | BAD_PARAMS | Required parameters missing, or count outside 1..10 |
| 429 | CHANNEL_LIMIT | Per-key rate limit exceeded |
Contract 2 (rental), error field (no code):
| HTTP | error | When |
|---|---|---|
| 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 |
| 409 | reason text | Business 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).