• 228 направлений
  • Без KYC — всегда
  • Bitcoin, Monero, USDT и ещё 4 валюты

Справочник API

Шесть конечных точек.
Документировано каждое поле.

Версия 1 REST API. Запросы и ответы в JSON, Bearer-ключи и идемпотентные операции записи. Описание этой страницы в формате OpenAPI можно скачать на странице SDK.

  • Базовый URL https://api.smsmeteor.com/v1
  • 50 запросов в секунду на ключ
  • Доступна спецификация OpenAPI 3.1

Соглашения

Запросы принимают 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 частей на сообщение.
fromstringОтправитель: буквенно-цифровое имя (от 3 до 11 символов, A–Z, 0–9, пробел) или арендованный номер. Не указывайте, чтобы платформа выбрала отправителя для каждого направления. Если маршрут требует замены, она выполняется автоматически.
send_atdatetimeЗапланировать на определённый момент времени в UTC. Нельзя использовать вместе с window.
windowobject{ local_start, local_end, quiet_hours }. Доставка выполняется в заданном местном интервале получателя; quiet_hours принимает значение default, off или bypass для транзакционного трафика.
validityintegerЧерез сколько минут истекает срок доставки сообщения. По умолчанию 2880 (48 часов), не более 4320.
campaignstringПроизвольная метка длиной до 64 символов для группировки сообщений в отчётах и вебхуках.
referencestringВаш идентификатор длиной до 128 символов, который возвращается в ответах и вебхуках.
webhook_urlstringПереопределяет адреса вебхуков аккаунта только для этого сообщения. Требуется 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, windowmixedЗначения по умолчанию для каждого сообщения; см. раздел «Создать сообщение».
paceobject{ per_minute } или { over_hours }: отправлять пакет с постоянной скоростью или равномерно распределить его на N часов. Можно использовать вместе с window.
Ответ 201
{
  "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_atdatetimeISO 8601 в UTC. Все получатели получают сообщение в один момент независимо от местного времени.
window.local_starttimeHH:MM по местному времени получателя. Кампания открывается в каждом часовом поясе при наступлении этого времени.
window.local_endtimeHH:MM. Не отправленные к этому времени сообщения ждут окна следующего дня.
window.quiet_hoursstringdefault применяет ограничения по времени отправки для направления, off отключает их, а bypass помечает трафик как транзакционный.
pace.per_minuteintegerМаксимальное число сообщений из пакета в минуту.
pace.over_hoursnumberВместо этого равномерно распределить пакет на указанное число часов.

Получить сообщение

GET/v1/messages/{id}

Возвращает объект сообщения Message с текущим статусом, метками времени, ценой и кодом оператора связи при ошибке.

Список сообщений

GET/v1/messages

ПараметрТипОписание
statusstringОдин из шести статусов.
countrystringДвухбуквенный код ISO 3166-1 в нижнем регистре.
campaignstringМетка кампании.
from_date, to_datedatetimeГраницы времени создания включительно, UTC.
limitintegerОт 1 до 200, по умолчанию 50.
cursorstringНепрозрачный курсор из поля next_cursor предыдущей страницы.
Ответ 200
{ "data": [ { "id": "msg_9Kd2fQ", "status": "delivered", "...": "..." } ],
  "next_cursor": "eyJpZCI6Im1zZ185S2QyZlEifQ", "has_more": true }

Тарифы

GET/v1/ratesиGET/v1/rates/{iso}

Публичная таблица тарифов, идентичная странице тарифов. Каждая запись содержит направление, телефонный код, цену за сегмент, правило имени отправителя и ограничения по времени отправки. Ответ можно кешировать на час; тарифы меняются не чаще раза в день. Ключ не требуется.

Ответ 200GET /v1/rates/gb
{ "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

Ответ 200
{ "balance": "1240.60", "currency": "USD", "pending": "0.00",
  "low_threshold": "100.00", "updated_at": "2026-09-21T11:40:00Z" }

Объект сообщения Message

ПараметрТипОписание
idstringУникальный идентификатор с префиксом msg_.
statusstringqueued, sent, delivered, failed, expired, rejected или test для тестовых ключей.
to, from, textstringПереданные значения. from содержит фактически использованного отправителя с учётом возможной замены.
segments, encodinginteger, stringЧисло сегментов и кодировка gsm7 или ucs2.
price, currencystringОбщая цена всех сегментов в USD.
countrystringISO-код направления, определённый по номеру.
campaign, referencestringВаши метки, возвращаемые без изменений.
created_at, sent_at, delivered_atdatetimeМетки времени жизненного цикла; до наступления события значение равно null.
carrier_code, failure_reasonstringИсходный код оператора связи и описание причины сбоя на английском языке.

Статусы

  1. В очередиПринято и оценено, ожидает места в маршруте.
  2. ОтправленоПередано оператору связи. В этот момент списываются средства.
  3. ДоставленоУстройство подтвердило получение. Конечный статус.
  4. ОшибкаОператор связи не смог доставить; указано carrier_code. Конечный статус.
  5. Срок истёкСрок действия истёк без доставки. Конечный статус.
  6. ОтклоненоОтклонено до отправки. Средства не списываются. Конечный статус.

Ошибки

402 Payment Required
{ "error": { "code": "insufficient_balance", "message": "Balance 0.42 USD is below the message price 0.85 USD", "field": null } }
HTTPКодЗначение
400invalid_requestНекорректный JSON или отсутствует обязательное поле; его имя указано в field.
400invalid_numberto не является допустимым номером в формате E.164.
400invalid_senderfrom не является допустимым буквенно-цифровым именем отправителя или арендованным вами номером.
400text_too_longБольше 6 частей на сообщение.
401unauthorizedКлюч отсутствует, отозван, не имеет нужной области доступа или запрещён для этого IP-адреса.
402insufficient_balanceПосле отправки баланс стал бы отрицательным.
404not_foundСообщение, пакет или страна не найдены.
409idempotency_conflictКлюч повторно использован с другим содержимым запроса.
422unsupported_destinationДля этого префикса нет маршрута.
422sender_not_allowedБуквенно-цифровое имя отправителя запрещено, а замена отключена.
422content_blockedТекст совпадает с шаблоном в списке запрещённого содержимого, например фишингом или выдачей себя за другое лицо.
429rate_limitedПревышено 50 запросов в секунду на ключ. Учитывайте Retry-After.
5xxinternalОшибка на нашей стороне; сообщение не отправлено. Повторите запрос с тем же ключом идемпотентности.

Ограничения частоты

50 запросов в секунду на ключ, измеряется в скользящем окне. Каждый пакетный запрос считается одним запросом. Ответы содержат X-RateLimit-Limit, X-RateLimit-Remaining, а при 429 — Retry-After в секундах.

Журнал изменений