Перейти к содержимому
HEXSMSDEVELOPERS
HEXSMS API · v1

Подключите отправку SMS
к своему сервису.

Начните с одного API KEY. Выберите страну и отправляйте сообщения на 1000 номеров за раз. Результат виден по каждому номеру.

REST APIJSONДо 1000 номеров / запрос

Быстрый старт

  1. Создайте API KEY

    После регистрации, одобрения и входа с OTP откройте раздел Управление API-ключами, чтобы выпустить ключ.

  2. Подготовьте кредиты

    Используются кредиты и тариф вашего аккаунта. Сумма списывается при приёме отправки.

  3. Отправьте сообщения и проверьте результат

    Сохраните ID отправки и проверяйте результат через API статуса.

Base URL https://hexsms.com

Для реальной интеграции вызывайте API с сервера по HTTPS. В режиме предпросмотра выпуск настоящих ключей и отправка через API недоступны.

Покрытие

190+Глобальное покрытие сети

Основные страны покрытия

  • Соединенные Штаты
  • Канада
  • Великобритания
  • Германия
  • Франция
  • Испания
  • Италия
  • Нидерланды
  • Швеция
  • Норвегия
  • Дания
  • Польша
  • Румыния
  • Чехия
  • Австрия
  • Швейцария
  • Ирландия
  • Португалия
  • Финляндия
  • Япония
  • Республика Корея
  • Китай
  • Тайвань
  • Гонконг (САР)
  • Сингапур
  • Малайзия
  • Индонезия
  • Филиппины
  • Таиланд
  • Вьетнам
  • Индия
  • Бангладеш
  • Пакистан
  • Австралия
  • Новая Зеландия
  • Бразилия
  • Мексика
  • Южно-Африканская Республика
  • Нигерия
  • ОАЭ
  • Саудовская Аравия

Возможность отправки, тарифы и требования к регистрации отправителя зависят от аккаунта и местных сетей. Проверьте тариф страны перед отправкой.

GET/api/v1/messages/countries

Проверяйте активные страны и применяемые тарифы через API. В запросе на отправку укажите страну в country и передавайте в одном запросе номера только этой страны. Для стран без заданного тарифа отправки не принимаются.

200 OK
{ "currency": "USDT", "countries": [{ "country": "US", "unitPrice": 0.02 }] }

Аутентификация по API KEY

Добавляйте этот заголовок во все запросы к внешнему API. Cookie входа и коды OTP не нужны.

HTTP
Authorization: Bearer hex_live_ВАШ_КЛЮЧ

Полный ключ показывается только один раз при выпуске. Храните его в переменной окружения на сервере и не добавляйте во фронтенд-код. Отозванный ключ или ключ заблокированного аккаунта использовать нельзя. Можно создать до 5 ключей.

POST/api/v1/messages

Отправляйте на 1000 номеров за раз

Отправьте один текст на множество номеров. Запрос проверяется, ставится в очередь отправки, и ответ приходит сразу. Чтобы отправить разным номерам разный текст, используйте отдельные запросы с новым Idempotency-Key.

ПолеФорматОписание
country *stringКод страны ISO 3166-1 alpha-2, например US, GB, JP, KR. Страны по умолчанию нет.
text *string1–1600 символов после удаления пробелов по краям. Все номера в запросе получают одинаковый текст.
recipients *string[]1–1000 мобильных номеров. Рекомендуется формат с +кодом страны; все номера должны относиться к стране из country.
Idempotency-Key *header8–100 латинских букв, цифр, дефисов и подчёркиваний. Задавайте уникальное значение для каждого запроса.

Если хотя бы один номер неверен или повторяется, отклоняется весь запрос — без отправки и списания. Дубликаты проверяются после приведения номеров к международному формату.

cURL · массовая отправка
curl -X POST 'https://hexsms.com/api/v1/messages' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: notice-20261024-001' \
  -d '{
    "country": "US",
    "text": "Your verification code is 482913.",
    "recipients": ["+12025550123", "+12025550124"]
  }'
202 Accepted · поставлено в очередь
{
  "id": "35bed356-b84a-452a-8e94-98b538972ecd",
  "country": "US",
  "state": "RUNNING",
  "total": 2,
  "segments": 1,
  "unitPrice": 0.025,
  "cost": 0.05,
  "createdAt": 1792800000000,
  "note": null,
  "replayed": false
}
Если ответ не пришёл, повторите запрос с тем же ключом запроса.

Повтор с тем же аккаунтом, тем же Idempotency-Key, тем же текстом и порядком номеров вернёт исходный результат без повторной отправки и списания (200, replayed: true). Если тело отличается — 409. Защита от дублей сохраняется и после смены API-ключа. Ключи запросов хранятся бессрочно.

Как рассчитывается стоимость

Число номеров × число сегментов (segments) × тариф аккаунта — так рассчитывается стоимость. Для символов UCS-2 один сегмент вмещает 70 символов, далее — по 67. Для базовых символов GSM-7 — 160, далее — по 153. Расширенные символы считаются за 2, эмодзи — по длине в UTF-16. unitPrice и cost указаны в USDT. Фактический тариф — тот, что в ответе; 0.025 выше — лишь пример.

GET/api/v1/messages/{id}

Проверяйте результат по каждому номеру

Используйте id, полученный от API отправки. Доступны только отправки через API с того же аккаунта. Запрос возвращает сохранённые результаты. Если нужны свежие данные оператора, сначала вызовите API обновления статуса.

cURL · запрос статуса
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK · результаты по номерам
{
  "id": "35bed356-b84a-452a-8e94-98b538972ecd",
  "country": "US",
  "state": "DONE",
  "total": 2, "segments": 1,
  "unitPrice": 0.025, "cost": 0.05,
  "createdAt": 1792800000000, "note": null,
  "summary": { "DELIVERED": 1, "PENDING": 1 },
  "messages": [
    {
      "id": "d2787184-d8b8-49c6-9c15-1db90a6d5516",
      "to": "12025550123",
      "status": "DELIVERED",
      "statusName": "DELIVERED_TO_HANDSET",
      "description": "Message delivered to handset",
      "error": null,
      "updatedAt": 1792800005000
    }
  ],
  "pagination": { "limit": 1, "offset": 0, "nextOffset": 1 }
}

limit — 1–1000 (по умолчанию 100), offset — 0–1000 (по умолчанию 0). Если nextOffset равен null, это последняя страница. summary — количество номеров по статусам. to возвращается в международном формате без +, время — в миллисекундах Unix. Порядок номеров может отличаться от исходного — различайте сообщения по id.

DONE не означает, что сообщение получено.

Это значит, что обработка очереди завершена. Фактическую доставку подтверждает status DELIVERED в messages.

POST/api/v1/messages/{id}/refresh

Получите актуальный статус доставки

Обновляет сохранённые результаты по логам оператора. Тело запроса не нужно. После обновления снова запросите результаты через GET. Одну отправку можно обновлять раз в 30 секунд. Логи оператора доступны в течение 48 часов после отправки. Если настроены вебхуки, результаты могут обновляться автоматически.

cURL · обновление статуса
curl -X POST 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd/refresh' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK
{ "id": "35bed356-b84a-452a-8e94-98b538972ecd", "updated": 2 }

updated — число обновлённых строк. Оно может быть равно 0, если сообщения ещё в очереди или новых результатов нет. Рекомендуем вызывать GET не чаще чем раз в 10 секунд, а refresh — только при необходимости.

Коды статусов

state запроса на отправку

PREPARING — подготовка · RUNNING — обработка · PAUSED — пауза · DONE — очередь обработана · CANCELED — отменено

status по номерамЗначение
QUEUEDОжидает отправки.
SENDINGЗапрос передаётся оператору.
PENDINGПринято оператором, ожидается итоговый результат.
DELIVEREDДоставлено на устройство получателя.
UNDELIVERABLEДоставить не удалось.
EXPIREDИстёк срок доставки.
REJECTEDЗапрос отклонён или произошла ошибка обработки.
CANCELEDОтправка из очереди отменена.
UNKNOWNРезультат пока неизвестен.

Операторы могут добавлять новые коды статусов, поэтому обрабатывайте и неизвестные значения status. Причину ошибки смотрите в statusName, description и error.

Что делать при ошибке

Формат ответа с ошибкой
{ "error": "Недостаточно кредитов. Пополните баланс и повторите запрос.", "code": "INSUFFICIENT_CREDITS" }
HTTPcodeЧто проверить
403COUNTRY_NOT_ENABLEDПроверьте тарифы стран и их активность.
400INVALID_COUNTRYУкажите в country код страны ISO.
400INVALID_BODY / INVALID_JSON / INVALID_TEXTПроверьте JSON-объект и текст сообщения.
400INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONEПроверьте количество, формат и дубликаты номеров.
400INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATIONПроверьте ключ запроса или параметры страницы.
401UNAUTHORIZEDBearer API KEY отсутствует или недействителен.
402INSUFFICIENT_CREDITSПополните кредиты.
403ACCOUNT_INACTIVEУбедитесь, что аккаунт одобрен и активен.
404NOT_FOUNDПроверьте ID отправки и владельца аккаунта.
409IDEMPOTENCY_CONFLICTТот же ключ запроса использован с другим телом.
413 / 415BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPEОтправьте тело JSON размером не более 128 КиБ.
429RATE_LIMITED / REFRESH_TOO_SOONПодождите указанное в Retry-After число секунд и повторите запрос.
500 / 502INTERNAL_ERROR / PROVIDER_UNAVAILABLEПовторите попытку позже. Для повторной отправки используйте тот же ключ запроса.
503PREVIEW_ONLYВ режиме предпросмотра настоящий API вызвать нельзя.

Для каждого API KEY допускается до 120 запросов в минуту в сумме по отправке, запросу и обновлению статуса. При превышении лимита смотрите заголовок Retry-After. API предназначен для межсерверной интеграции; вызовы из браузера через CORS не поддерживаются.

Подключение на Node.js

Node.js · запуск на сервере
const response = await fetch('https://hexsms.com/api/v1/messages', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer ' + process.env.HEXSMS_API_KEY,
    'Content-Type': 'application/json',
    'Idempotency-Key': 'notice-20261024-001'
  },
  body: JSON.stringify({
    country: 'US',
    text: 'Your order is on its way.',
    recipients: ['+12025550123', '+12025550124']
  })
});
const result = await response.json();
if (!response.ok) throw new Error(result.code + ': ' + result.error);
console.log(result.id); // Use this ID to check delivery status.

Создавайте ключ запроса один раз на операцию и используйте то же значение при повторах, если ответ не пришёл. Если повторно отправить успешную операцию с новым ключом, она будет обработана как отдельная отправка.