x-api-key: <YOUR_API_KEY>
Content-Type: application/json
https://api.pushon365.ru/api/v1/
Сессионные сообщения — обычные текстовые сообщения WhatsApp, разрешённые только в пределах 24-часового окна после последнего входящего сообщения пользователя (customer care window). Не требуют шаблонов и обычно не тарифицируются как шаблонные.
{
"toPhone": "+79991234567",
"text": "this is a test message",
"channelId": "aaaaaaaaaa"
}
+
.⚠ Отправка возможна только внутри 24 часов с момента последнего входящего сообщения от клиента.
curl -X POST "https://api.pushon365.ru/api/v1/send-session-message" \
-H "x-api-key: {{YOUR_API_KEY}}" \
-H "Content-Type: application/json" \
-d '{
"toPhone": "+79991234567",
"text": "this is a test message",
"channelId": "aaaaaaaaaa"
}'
{
"status": "ok",
"messageId": "wamid.HBgLMj...EQA",
"toPhone": "+79991234567",
"channelId": "aaaaaaaaaa",
"text": "this is a test message",
"queuedAt": "2025-09-11T11:52:10.987Z"
}
{
"status": "error",
"code": "SESSION_WINDOW_CLOSED",
"message": "Cannot send session message outside 24-hour customer care window."
}
Шаблонные сообщения (HSM) — заранее утверждённые WhatsApp Business шаблоны для рассылок и инициирования диалога вне 24-часового окна. Имя и язык шаблона должны совпадать с одобренной версией.
{
"toPhone": "+79991234567",
"channelId": "aaaaaaaaaa",
"templateName": "your_template_name",
"templateLanguage": "ru"
}
ru
, en
, es
, de
...).curl -X POST "https://api.pushon365.ru/api/v1/send-template-message" \
-H "x-api-key: {{YOUR_API_KEY}}" \
-H "Content-Type: application/json" \
-d '{
"toPhone": "+79991234567",
"channelId": "aaaaaaaaaa",
"templateName": "your_template_name",
"templateLanguage": "ru"
}'
{
"status": "ok",
"messageId": "wamid.HBgLMj...EQA",
"toPhone": "+79991234567",
"channelId": "aaaaaaaaaa",
"templateName": "your_template_name",
"templateLanguage": "ru",
"queuedAt": "2025-09-11T11:45:32.123Z"
}
{
"status": "error",
"code": "BAD_REQUEST",
"message": "Invalid templateLanguage, expected two-letter lowercase code."
}
PushOn отправляет HTTP POST
на ваш Webhook URL при входящих сообщениях от пользователей,
а также при изменении статусов исходящих сообщений (queued
, sent
, delivered
, read
, failed
).
POST
, заголовок: Content-Type: application/json
.HTTP 200 OK
и пустое тело как можно быстрее.
При отсутствии 200
PushOn может выполнить повторные попытки доставки с нарастающей задержкой.
Для устойчивости сразу отвечайте 200 с пустым телом, а бизнес-логику выполняйте асинхронно.
{
"type": "message",
"direction": "inbound",
"timestamp": "2025-09-11T11:58:12.345Z",
"message": {
"id": "wamid.HBgLMj...",
"from": "+79991234567",
"channelId": "aaaaaaaaaa",
"payload_type": "text",
"text": "Здравствуйте!"
}
}
Поле payload_type
может быть text
, image
, document
и т.д.
{
"type": "status",
"timestamp": "2025-09-11T11:59:03.001Z",
"messageId": "wamid.HBgLMj...",
"to": "+79991234567",
"channelId": "aaaaaaaaaa",
"status": "delivered",
"error": null
}
Возможные status
: queued
, sent
, delivered
, read
, failed
. При ошибке заполняется error
.
curl -X POST "https://your-server.example.com/webhook" \
-H "Content-Type: application/json" \
-d '{
"type": "status",
"timestamp": "2025-09-11T11:59:03.001Z",
"messageId": "wamid.test",
"to": "+79991234567",
"channelId": "aaaaaaaaaa",
"status": "delivered"
}'
Обработчик должен вернуть 200 OK
и пустое тело (\n
допустим). Любой другой ответ считается неуспешным и может привести к повтору.
import express from "express";
const app = express();
app.use(express.json());
app.post("/webhook", (req, res) => {
// 1) Быстро логируем/кладём в очередь
// console.log(req.body);
// queue.push(req.body);
// 2) Немедленно возвращаем 200 с ПУСТЫМ телом
return res.status(200).end();
});
app.listen(3000, () => console.log("Webhook on :3000"));
messageId
, защита от повторов).SESSION_WINDOW_CLOSED
— попытка отправки сессионного сообщения вне 24 часов.BAD_REQUEST
— неверные параметры (формат телефона, язык, имя шаблона).UNAUTHORIZED
— недействительный x-api-key
.FORBIDDEN
— ключ не привязан к каналу или канал отключён.NOT_FOUND
— шаблон/канал не найдены.RATE_LIMITED
— превышены лимиты частоты запросов.На Windows не используйте -k/--insecure
для обхода SSL — обновите корневые сертификаты и проверьте цепочку.
messageId
для трекинга статусов.429
, 5xx
).