Соглашения
Запросы принимают application/json или данные формы; ответы всегда возвращаются в JSON. Метки времени имеют формат ISO 8601 и часовой пояс UTC. Денежные суммы передаются строкой в USD с четырьмя знаками после точки. Номера телефонов имеют формат E.164 с начальным плюсом. Идентификаторы используют префиксы msg_, bat_, evt_, cmp_. Каждый ответ содержит X-Request-Id; укажите его при обращении в поддержку.
Аутентификация
Authorization: Bearer sk_live_9f2c...a71eОбласти доступа: send (создание сообщений), read (все запросы GET). Для ключа можно задать список разрешённых IP-адресов; запросы с других адресов получают 401 unauthorized. Тестовые ключи (sk_test_) работают так же, но не отправляют сообщения и не списывают средства.
Идемпотентность
Любой POST принимает Idempotency-Key — выбранную вами строку длиной до 128 символов. При одинаковом ключе и теле в течение 24 часов возвращается исходный ответ с заголовком Idempotent-Replayed: true. Тот же ключ с другим телом возвращает 409 idempotency_conflict.
Создать сообщение
POST/v1/messages
| Параметр | Тип | Описание |
|---|---|---|
| toобязательно | string | Направление в формате E.164, например +14155550142. Неподдерживаемые префиксы отклоняются до отправки. |
| textобязательно | string | Текст сообщения. Кодировка GSM-7 или Unicode определяется автоматически; не более 6 частей на сообщение. |
| from | string | Отправитель: буквенно-цифровое имя (от 3 до 11 символов, A–Z, 0–9, пробел) или арендованный номер. Не указывайте, чтобы платформа выбрала отправителя для каждого направления. Если маршрут требует замены, она выполняется автоматически. |
| send_at | datetime | Запланировать на определённый момент времени в UTC. Нельзя использовать вместе с window. |
| window | object | { local_start, local_end, quiet_hours }. Доставка выполняется в заданном местном интервале получателя; quiet_hours принимает значение default, off или bypass для транзакционного трафика. |
| validity | integer | Через сколько минут истекает срок доставки сообщения. По умолчанию 2880 (48 часов), не более 4320. |
| campaign | string | Произвольная метка длиной до 64 символов для группировки сообщений в отчётах и вебхуках. |
| reference | string | Ваш идентификатор длиной до 128 символов, который возвращается в ответах и вебхуках. |
| webhook_url | string | Переопределяет адреса вебхуков аккаунта только для этого сообщения. Требуется HTTPS. |
POST /v1/messages
Authorization: Bearer sk_live_...
Idempotency-Key: order-4821-ship
Content-Type: application/json
{
"to": "+14155550142",
"from": "METEOR",
"text": "Ваш заказ №4821 отправлен. Отслеживание: smsmtr.io/t/8fK2",
"campaign": "shipping",
"reference": "order-4821"
}{
"id": "msg_9Kd2fQ",
"status": "queued",
"to": "+14155550142",
"from": "METEOR",
"text": "Ваш заказ №4821 отправлен. Отслеживание: smsmtr.io/t/8fK2",
"segments": 1,
"encoding": "gsm7",
"price": "0.0084",
"currency": "USD",
"country": "us",
"campaign": "shipping",
"reference": "order-4821",
"created_at": "2026-09-21T11:42:07Z",
"sent_at": null,
"delivered_at": null,
"carrier_code": null
}Создать пакет
POST/v1/messages/batch
До 1000 сообщений в одном запросе API сообщений, у каждого свои to, text и необязательные from, reference. Значения верхнего уровня from, campaign, send_at, window и pace применяются ко всем сообщениям, где они не переопределены. По синтаксису пакет принимается или отклоняется целиком; отдельные сообщения всё равно могут быть отклонены из-за направления или содержимого и перечисляются с причиной.
| Параметр | Тип | Описание |
|---|---|---|
| messagesобязательно | array | Список объектов сообщений: от 1 до 1 000 элементов. |
| from, campaign, send_at, window | mixed | Значения по умолчанию для каждого сообщения; см. раздел «Создать сообщение». |
| pace | object | { per_minute } или { over_hours }: отправлять пакет с постоянной скоростью или равномерно распределить его на N часов. Можно использовать вместе с window. |
{
"batch_id": "bat_3Hq9Zr",
"accepted": 2, "rejected": 1,
"total_price": "0.0214", "currency": "USD",
"messages": [
{ "id": "msg_9Kd2fQ", "to": "+14155550142", "status": "queued", "price": "0.0084" },
{ "id": "msg_9Kd2fR", "to": "+447700900123", "status": "queued", "price": "0.0130" },
{ "to": "+99912345", "status": "rejected", "error": { "code": "unsupported_destination" } }
]
}Параметры планирования
Три способа задать время отправки для отдельных сообщений и пакетов. Их можно сочетать: для рекламных рассылок обычно используют window вместе с pace.
| Параметр | Тип | Описание |
|---|---|---|
| send_at | datetime | ISO 8601 в UTC. Все получатели получают сообщение в один момент независимо от местного времени. |
| window.local_start | time | HH:MM по местному времени получателя. Кампания открывается в каждом часовом поясе при наступлении этого времени. |
| window.local_end | time | HH:MM. Не отправленные к этому времени сообщения ждут окна следующего дня. |
| window.quiet_hours | string | default применяет ограничения по времени отправки для направления, off отключает их, а bypass помечает трафик как транзакционный. |
| pace.per_minute | integer | Максимальное число сообщений из пакета в минуту. |
| pace.over_hours | number | Вместо этого равномерно распределить пакет на указанное число часов. |
Получить сообщение
GET/v1/messages/{id}
Возвращает объект сообщения Message с текущим статусом, метками времени, ценой и кодом оператора связи при ошибке.
Список сообщений
GET/v1/messages
| Параметр | Тип | Описание |
|---|---|---|
| status | string | Один из шести статусов. |
| country | string | Двухбуквенный код ISO 3166-1 в нижнем регистре. |
| campaign | string | Метка кампании. |
| from_date, to_date | datetime | Границы времени создания включительно, UTC. |
| limit | integer | От 1 до 200, по умолчанию 50. |
| cursor | string | Непрозрачный курсор из поля next_cursor предыдущей страницы. |
{ "data": [ { "id": "msg_9Kd2fQ", "status": "delivered", "...": "..." } ],
"next_cursor": "eyJpZCI6Im1zZ185S2QyZlEifQ", "has_more": true }Тарифы
GET/v1/ratesиGET/v1/rates/{iso}
Публичная таблица тарифов, идентичная странице тарифов. Каждая запись содержит направление, телефонный код, цену за сегмент, правило имени отправителя и ограничения по времени отправки. Ответ можно кешировать на час; тарифы меняются не чаще раза в день. Ключ не требуется.
{ "country": "gb", "name": "United Kingdom", "dial": "44",
"price": "0.0130", "currency": "USD",
"sender": "alphanumeric", "quiet_hours": { "start": "08:00", "end": "21:00" },
"updated_at": "2026-09-21" }Баланс
GET/v1/balance
{ "balance": "1240.60", "currency": "USD", "pending": "0.00",
"low_threshold": "100.00", "updated_at": "2026-09-21T11:40:00Z" }Объект сообщения Message
| Параметр | Тип | Описание |
|---|---|---|
| id | string | Уникальный идентификатор с префиксом msg_. |
| status | string | queued, sent, delivered, failed, expired, rejected или test для тестовых ключей. |
| to, from, text | string | Переданные значения. from содержит фактически использованного отправителя с учётом возможной замены. |
| segments, encoding | integer, string | Число сегментов и кодировка gsm7 или ucs2. |
| price, currency | string | Общая цена всех сегментов в USD. |
| country | string | ISO-код направления, определённый по номеру. |
| campaign, reference | string | Ваши метки, возвращаемые без изменений. |
| created_at, sent_at, delivered_at | datetime | Метки времени жизненного цикла; до наступления события значение равно null. |
| carrier_code, failure_reason | string | Исходный код оператора связи и описание причины сбоя на английском языке. |
Статусы
- В очередиПринято и оценено, ожидает места в маршруте.
- ОтправленоПередано оператору связи. В этот момент списываются средства.
- ДоставленоУстройство подтвердило получение. Конечный статус.
- ОшибкаОператор связи не смог доставить; указано
carrier_code. Конечный статус. - Срок истёкСрок действия истёк без доставки. Конечный статус.
- ОтклоненоОтклонено до отправки. Средства не списываются. Конечный статус.
Ошибки
{ "error": { "code": "insufficient_balance", "message": "Balance 0.42 USD is below the message price 0.85 USD", "field": null } }| HTTP | Код | Значение |
|---|---|---|
| 400 | invalid_request | Некорректный JSON или отсутствует обязательное поле; его имя указано в field. |
| 400 | invalid_number | to не является допустимым номером в формате E.164. |
| 400 | invalid_sender | from не является допустимым буквенно-цифровым именем отправителя или арендованным вами номером. |
| 400 | text_too_long | Больше 6 частей на сообщение. |
| 401 | unauthorized | Ключ отсутствует, отозван, не имеет нужной области доступа или запрещён для этого IP-адреса. |
| 402 | insufficient_balance | После отправки баланс стал бы отрицательным. |
| 404 | not_found | Сообщение, пакет или страна не найдены. |
| 409 | idempotency_conflict | Ключ повторно использован с другим содержимым запроса. |
| 422 | unsupported_destination | Для этого префикса нет маршрута. |
| 422 | sender_not_allowed | Буквенно-цифровое имя отправителя запрещено, а замена отключена. |
| 422 | content_blocked | Текст совпадает с шаблоном в списке запрещённого содержимого, например фишингом или выдачей себя за другое лицо. |
| 429 | rate_limited | Превышено 50 запросов в секунду на ключ. Учитывайте Retry-After. |
| 5xx | internal | Ошибка на нашей стороне; сообщение не отправлено. Повторите запрос с тем же ключом идемпотентности. |
Ограничения частоты
50 запросов в секунду на ключ, измеряется в скользящем окне. Каждый пакетный запрос считается одним запросом. Ответы содержат X-RateLimit-Limit, X-RateLimit-Remaining, а при 429 — Retry-After в секундах.
Журнал изменений
- 2026-09 Поле
window.quiet_hoursпринимает значениеbypassдля транзакционного трафика. - 2026-07 В пакетных ответах отклонённые элементы перечисляются вместе с ошибками, а весь пакет не считается ошибочным.
- 2026-06 Поле
referenceдобавлено в вебхуки. - 2026-04 Добавлен
GET /v1/rates/{iso}.