Войти в ЛК
Разделы документации

Документация → SMS-рассылки

SMS-рассылки

Черновик по сегменту, отправка с защитой от повтора, статус и отмена.

SMS-рассылка по сегменту: черновик → отправка (с защитой от повтора) → статус и доставка.

Отписавшиеся, гости без телефона и попавшие под частотный лимит ресторана исключаются автоматически. Счётчики stats только растут; доставка досчитывается ещё сутки после sent.

Объект campaign

SMS-рассылка по сегменту, созданная через API

ПолеТипОписание
idstringНеизменный id
objectstringТип объекта
namestringНазвание; если не передано при создании — по сегменту
statusenumdraft → scheduled → sending → sent; failed — отправка не состоялась. Значения: draft, scheduled, sending, sent, failed
segment_idstringАудитория — id сегмента
textstringТекст SMS
scheduled_atdatetime | nullКогда отправить, UTC; null — сразу после send
audience_countintegerСколько получат. В draft — прогноз; после send — замороженный состав
sms_partsintegerЧастей SMS на одного получателя — зависит от длины и алфавита текста
costmoney | nullВ draft и scheduled — оценка, после sent — по факту шлюза
cost_finalbooleantrue — cost фактический и больше не изменится
statsCampaignStats | nullСчётчики получателей; null до начала отправки
failure_reasonenum | nullПочему отправка не состоялась; только при failed, иначе null. Значения: sending_disabled, empty_audience, gateway_rejected
created_atdatetimeКогда создана, UTC
sent_atdatetime | nullКогда отправка завершена, UTC; null — ещё не завершена
updated_atdatetimeПоследнее изменение, UTC
{
  "id": "cmp_Q4n8Rt2v",
  "object": "campaign",
  "name": "Вернуть уснувших",
  "status": "draft",
  "segment_id": "seg_at_risk",
  "text": "Анна, скучаем! −15% по коду BACK15",
  "scheduled_at": "2026-10-15T08:00:00Z",
  "audience_count": 1412,
  "sms_parts": 2,
  "cost": {
    "amount": "15400.00",
    "currency": "RUB"
  },
  "cost_final": false,
  "stats": {
    "sent": 1405,
    "delivered": 1371,
    "failed": 34
  },
  "failure_reason": null,
  "created_at": "2026-10-14T09:30:00Z",
  "sent_at": null,
  "updated_at": "2026-10-14T09:30:00Z"
}

Создать черновик SMS-рассылки

POST /v1/campaigns · право campaigns:write

Черновик по сегменту: в ответе прогноз аудитории и оценка стоимости. Ничего не отправляет — для отправки POST /v1/campaigns/{campaign_id}/send. Причины 422 в errors[]: unknown_segment, text_empty, text_too_long, scheduled_at_in_past, invalid_datetime.

ПараметрГдеОбязателенОписаниеПример
Idempotency-KeyзаголовокКлюч повтора, например UUID; повтор с тем же ключом вернёт сохранённый ответ6f1c2b8e-1d4a-4c55-9b0e-0f6d1a2c3b4d

Тело — объект CampaignCreate:

ПолеТипОбязательноОписание
segment_idstringдаАудитория — id сегмента из GET /v1/segments
textstringдаТекст SMS, от 1 до 1000 символов
namestring | nullНазвание рассылки; не передано — по сегменту
scheduled_atdatetime | nullКогда отправить, RFC 3339 с поясом; null — сразу после send
curl -X POST https://app.lazycrm.ru/v1/campaigns \
  -H "Authorization: Bearer lcrm_live_…" \
  -H "Idempotency-Key: 6f1c2b8e-1d4a-4c55-9b0e-0f6d1a2c3b4d" \
  -H "Content-Type: application/json" \
  -d '{"segment_id": "seg_at_risk", "text": "Анна, скучаем! −15% по коду BACK15", "name": "Вернуть уснувших", "scheduled_at": "2026-10-15T08:00:00Z"}'

Ошибки: 400 unknown_parameter, 401 missing_api_key, 401 invalid_api_key, 403 insufficient_scope, 409 idempotency_request_in_progress, 422 validation_error, 422 idempotency_key_reused, 429 rate_limited, 500 internal_error, 503 upstream_unavailable.

Получить рассылку

GET /v1/campaigns/{campaign_id} · право campaigns:read

Статус, счётчики доставки и стоимость рассылки, созданной через API.

ПараметрГдеОбязателенОписаниеПример
campaign_idпутьдаId рассылкиcmp_Q4n8Rt2v
curl https://app.lazycrm.ru/v1/campaigns/cmp_Q4n8Rt2v \
  -H "Authorization: Bearer lcrm_live_…"

Ошибки: 400 unknown_parameter, 401 missing_api_key, 401 invalid_api_key, 403 insufficient_scope, 404 not_found, 429 rate_limited, 500 internal_error, 503 upstream_unavailable.

Отправить рассылку

POST /v1/campaigns/{campaign_id}/send · право campaigns:write

Замораживает состав получателей на момент вызова и ставит рассылку в очередь: без scheduled_at SMS уходят в течение нескольких минут (status: sending), иначе status: scheduled. Подтверждения человеком нет. Тело пустое.

Заголовок Idempotency-Key обязателен: повтор с тем же ключом вернёт тот же ответ и вторую рассылку не создаст. После обрыва сети запрос можно смело повторить тем же ключом.

ПараметрГдеОбязателенОписаниеПример
campaign_idпутьдаId рассылкиcmp_Q4n8Rt2v
Idempotency-KeyзаголовокдаКлюч повтора, например UUID; без него — 400 idempotency_key_required0b7e3f52-8a61-4f2d-a3c9-5e8d7b6a1f20
curl -X POST https://app.lazycrm.ru/v1/campaigns/cmp_Q4n8Rt2v/send \
  -H "Authorization: Bearer lcrm_live_…" \
  -H "Idempotency-Key: 0b7e3f52-8a61-4f2d-a3c9-5e8d7b6a1f20"

Ошибки: 400 unknown_parameter, 400 idempotency_key_required, 401 missing_api_key, 401 invalid_api_key, 403 insufficient_scope, 404 not_found, 409 campaign_already_sent, 409 empty_audience, 409 idempotency_request_in_progress, 422 validation_error, 422 idempotency_key_reused, 429 rate_limited, 429 send_limit_reached, 500 internal_error, 503 sending_disabled, 503 upstream_unavailable.

Отменить отправку

POST /v1/campaigns/{campaign_id}/cancel · право campaigns:write

Снимает запланированную рассылку до начала отправки и возвращает её в draft. Если SMS уже уходят или рассылка не запланирована — 409 campaign_not_cancelable.

ПараметрГдеОбязателенОписаниеПример
campaign_idпутьдаId рассылкиcmp_Q4n8Rt2v
Idempotency-KeyзаголовокКлюч повтора, например UUID; повтор с тем же ключом вернёт сохранённый ответ6f1c2b8e-1d4a-4c55-9b0e-0f6d1a2c3b4d
curl -X POST https://app.lazycrm.ru/v1/campaigns/cmp_Q4n8Rt2v/cancel \
  -H "Authorization: Bearer lcrm_live_…" \
  -H "Idempotency-Key: 6f1c2b8e-1d4a-4c55-9b0e-0f6d1a2c3b4d"

Ошибки: 400 unknown_parameter, 401 missing_api_key, 401 invalid_api_key, 403 insufficient_scope, 404 not_found, 409 campaign_not_cancelable, 409 idempotency_request_in_progress, 422 validation_error, 422 idempotency_key_reused, 429 rate_limited, 500 internal_error, 503 upstream_unavailable.