x-api-key: <YOUR_API_KEY>Content-Type: application/jsonhttps://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...).components в запросе должна точно соответствовать структуре шаблона.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": "text_static",
"templateLanguage": "ru"
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"text_static\",\"templateLanguage\":\"ru\"}" Порядок параметров должен соответствовать порядку плейсхолдеров {{1}}, {{2}} и т.д.
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": "order_update",
"templateLanguage": "ru",
"components": [
{
"type": "body",
"parameters": [
{"type":"text","text":"Алексей"},
{"type":"text","text":"№1452"}
]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"order_update\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"body\",\"parameters\":[{\"type\":\"text\",\"text\":\"Алексей\"},{\"type\":\"text\",\"text\":\"№1452\"}]}]}" 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": "feedback_request",
"templateLanguage": "ru",
"components": [
{
"type": "body",
"parameters": [
{"type":"text","text":"Алексей"},
{"type":"text","text":"оформление заказа"}
]
},
{
"type": "button",
"sub_type": "quick_reply",
"index": "0",
"parameters": [{"type":"payload","payload":"FEEDBACK_GOOD"}]
},
{
"type": "button",
"sub_type": "quick_reply",
"index": "1",
"parameters": [{"type":"payload","payload":"FEEDBACK_BAD"}]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"feedback_request\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"body\",\"parameters\":[{\"type\":\"text\",\"text\":\"Алексей\"},{\"type\":\"text\",\"text\":\"оформление заказа\"}]},{\"type\":\"button\",\"sub_type\":\"quick_reply\",\"index\":\"0\",\"parameters\":[{\"type\":\"payload\",\"payload\":\"FEEDBACK_GOOD\"}]},{\"type\":\"button\",\"sub_type\":\"quick_reply\",\"index\":\"1\",\"parameters\":[{\"type\":\"payload\",\"payload\":\"FEEDBACK_BAD\"}]}]}" 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": "promo_with_image",
"templateLanguage": "ru",
"components": [
{
"type": "header",
"parameters": [
{"type":"image","image":{"link":"https://example.com/promo.jpg"}}
]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"promo_with_image\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"header\",\"parameters\":[{\"type\":\"image\",\"image\":{\"link\":\"https://example.com/promo.jpg\"}}]}]}" 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": "marketing_carousel",
"templateLanguage": "ru",
"components": [
{
"type": "carousel",
"cards": [
{
"card_index": 0,
"components": [
{
"type": "header",
"parameters": [
{"type":"image","image":{"link":"https://example.com/img1.jpg"}}
]
}
]
},
{
"card_index": 1,
"components": [
{
"type": "header",
"parameters": [
{"type":"image","image":{"link":"https://example.com/img2.jpg"}}
]
}
]
}
]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"marketing_carousel\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"carousel\",\"cards\":[{\"card_index\":0,\"components\":[{\"type\":\"header\",\"parameters\":[{\"type\":\"image\",\"image\":{\"link\":\"https://example.com/img1.jpg\"}}]}]},{\"card_index\":1,\"components\":[{\"type\":\"header\",\"parameters\":[{\"type\":\"image\",\"image\":{\"link\":\"https://example.com/img2.jpg\"}}]}]}]}]}" Если шаблон одобрен с заголовком «document», укажите ссылку на файл (PDF/DOC и т.п.).
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": "invoice_doc_header",
"templateLanguage": "ru",
"components": [
{
"type": "header",
"parameters": [
{"type":"document","document":{"link":"https://example.com/invoice-1452.pdf","filename":"invoice-1452.pdf"}}
]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"invoice_doc_header\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"header\",\"parameters\":[{\"type\":\"document\",\"document\":{\"link\":\"https://example.com/invoice-1452.pdf\",\"filename\":\"invoice-1452.pdf\"}}]}]}" Если шаблон одобрен с кнопками «Visit website»/«Call», параметры задаются провайдером; обычно components не требуются. Ниже пример с параметризованным URL (если шаблон это поддерживает).
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": "promo_with_cta",
"templateLanguage": "ru",
"components": [
{
"type": "button",
"sub_type": "url",
"index": "0",
"parameters": [{"type":"text","text":"1452"}] // подставится в URL-шаблон
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"promo_with_cta\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"button\",\"sub_type\":\"url\",\"index\":\"0\",\"parameters\":[{\"type\":\"text\",\"text\":\"1452\"}]}]}" Если шаблон подразумевает передачу геоданных в тексте, передайте их как текстовые параметры body.
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": "pickup_point_info",
"templateLanguage": "ru",
"components": [
{
"type": "body",
"parameters": [
{"type":"text","text":"55.7522, 37.6156"}, // координаты
{"type":"text","text":"ул. Примерная, 1"}
]
}
]
}' curl.exe -X POST "https://api.pushon365.ru/api/v1/send-template-message" -H "x-api-key: {{YOUR_API_KEY}}" -H "Content-Type: application/json" --data-raw "{\"toPhone\":\"+79991234567\",\"channelId\":\"aaaaaaaaaa\",\"templateName\":\"pickup_point_info\",\"templateLanguage\":\"ru\",\"components\":[{\"type\":\"body\",\"parameters\":[{\"type\":\"text\",\"text\":\"55.7522, 37.6156\"},{\"type\":\"text\",\"text\":\"ул. Примерная, 1\"}]}]}" curl.exe и экранирование \" в JSON.
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).