Переезжай на Whapi · от 500 ₽/мес Наш WhatsApp API работает штатно Регистрация
Синхронизация контента канала · сценарий WhatsApp API

Публикация в канале WhatsApp, когда контент выходит в эфир

Подписчики видят тот же запуск или акцию в вашем канале WhatsApp, как только сайт или магазин публикует материал — без ручного копирования текста в приложение. Когда backend отмечает контент как live, worker может определить id канала и разместить анонс через Whapi.Cloud. Этот сценарий показывает интеграторам, как реализовать такой поток через WhatsApp API.

Запускается при публикации в CMS или магазине getNewsletters, затем sendMessageText
Экран публикации CMS или магазина рядом с телефоном, на канале WhatsApp которого виден новый анонс с уведомлением для подписчиков.
Декоративный пузырь
Сценарий

Когда использовать этот поток

Триггер — событие публикации в backend

Используйте этот поток, когда статья, товар, акция или go-live в CMS в own_backend должны обновить и канал WhatsApp, а не когда вы только отвечаете на входящие чаты.

Цель рассылки — канал WhatsApp

Используйте этот поток, когда пост уходит на JID канала, а не когда нужно, чтобы все участники сообщества увидели анонс в подгруппе.

Перед отправкой нужен id канала

Используйте этот поток, когда worker должен прочитать список каналов через getNewsletters и выбрать правильный JID, а не когда id уже лежит в конфиге.

Канал WhatsApp на телефоне с новым анонсом и стандартным баннером уведомления канала.
Опыт клиента

Подписчики получают обновление

Сайт или магазин вовремя показывает новую статью или акцию, но канал WhatsApp всё ещё ждёт, пока кто-то вручную вставит тот же текст.

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

Поток

От события публикации к посту в канале

1

Контент успешно опубликован в backend

CMS, магазин или планировщик сигнализирует, что статья, товар или акция live. Worker собирает текст анонса и опциональную ссылку для тела поста в канале.

2

Определите целевой JID канала

GET /newsletters

getNewsletters возвращает ваши каналы с метаданными. Сопоставьте канал, который должна обновить кампания, и возьмите его id для шага отправки.

3

Опубликуйте анонс в канале

POST /messages/text

sendMessageText публикует подготовленный текст в этот канал. Укажите id канала в to, а анонс — в body.

Нужно отслеживать доставку? Успешный ответ API не значит, что каждый подписчик уже получил пост. Про статус доставки →

Что нужно заранее

Перед запуском потока

Подключите номер WhatsApp, которому принадлежит канал, и подписывайте каждый запрос API-токеном этого номера. Хуки публикации, маппинг CMS и выбор канала остаются на вашем backend.

Дополнительно — подробнее об этом потоке

Реализация API

Сначала канал в списке, затем пост

Прочитайте JID канала из списка newsletters и опубликуйте тело анонса на этот id, когда срабатывает событие контента.

Получите API-токен бесплатно после регистрации на whapi.cloud и подставьте его в код вместо Your_Token из примеров.

Определите целевой JID канала

Верните метаданные канала, чтобы worker выбрал правильный JID, если он ещё не сохранён в конфиге.

curl --request GET \
     --url https://gate.whapi.cloud/newsletters \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/newsletters",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/newsletters"

headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
}

response = requests.get(url, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/newsletters';

const response = await fetch(url, {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/newsletters")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/newsletters");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/newsletters", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}

Опубликуйте анонс в канале

Опубликуйте подготовленный текст анонса в этот канал, чтобы подписчики увидели обновление с уведомлением канала.

curl --request POST \
     --url https://gate.whapi.cloud/newsletters/link/{InviteCode} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/newsletters/link/{InviteCode}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/newsletters/link/{InviteCode}"

payload = {
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/newsletters/link/{InviteCode}';

const response = await fetch(url, {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/newsletters/link/{InviteCode}")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/newsletters/link/{InviteCode}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789" });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"1203632001928471@newsletter","body":"New on the site: Summer promo is live. Read more: https://example.com/promo"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/newsletters/link/{InviteCode}", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Доставка

Когда пост действительно дошёл

Успешный ответ отправки не значит, что каждый подписчик уже видит пост. Первый статус до вебхука — pending. Дальнейшие изменения приходят только в statuses.post и statuses.put. Если статус остаётся pending и не переходит в sent, delivered или более поздний ack, сообщение не доставлено. Проверьте тело запроса и право аккаунта отправлять в этот канал.

  • Ответ sendMessageText не доказывает, что каждый подписчик получил анонс.

  • pending, который не двигается дальше, значит, что пост не доставлен.

  • Смотрите statuses.post и statuses.put, чтобы увидеть следующие ack для отправок в канал.

  • Включите вебхуки, если worker должен повторять попытку, когда доставка так и не завершилась.

Что читать про доставку и вебхуки

Напишите в поддержку, если что-то пошло не так
Если что-то ломается

Обрабатывайте сбои на каждом шаге

Контент может выйти на сайте, а синхронизация с каналом всё равно сломаться: список newsletters пуст, выбран неверный JID канала или sendMessageText отклонён либо не доставлен.

Сайт опубликован, а канал не обновился?

Держите состояние публикации CMS отдельно от синхронизации канала. Если getNewsletters падает или не возвращает подходящий канал, либо sendMessageText падает, повторите попытку или предупредите ops и не помечайте контент как синхронизированный с каналом. Если пост в канал после повтора всё равно не уходит, обратитесь в поддержку Whapi с id канала и телом ошибки.

Напишите в поддержку, если что-то пошло не так

Разбор по шагу API

Статус Что значит Что делать
400 Wrong request parameters Неверные параметры запроса — проверьте count и offset в запросе списка.
500 Internal Error
Статус Что значит Что делать
400 Wrong request parameters Неверные параметры запроса — проверьте to и body в теле отправки.
401 Need channel authorization for send message Нужна авторизация канала для отправки сообщения — убедитесь, что подключённый номер может публиковать в этот канал.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Отправка этому групповому получателю запрещена — проверьте JID канала с шага списка.
413 Request body too large
429 Too many requests
500 Internal Error
Частые вопросы

Вопросы, которые задают интеграторы

Если JID канала уже сохранён в конфиге, можно пропустить getNewsletters и вызвать sendMessageText с этим id. Когда id неизвестен или каналы меняются, сначала получите список.
Нет. Этот поток публикует в один канал WhatsApp. Объявления на всё сообщество через связанные группы — отдельный сценарий.
Нет. Этот поток публикует один раз на JID канала. Холодные личные сообщения на отдельные номера — другая задача.
Да. Укажите URL в body вместе с текстом анонса. Ссылка на личный чат — опциональный CTA, когда в посте канала нет треда ответов.
Нет. Вы составляете анонс в body и отправляете через sendMessageText. Отправка не ждёт предодобренный шаблон для этого сообщения.
Если падает шаг списка, нет подходящего канала или падает отправка, повторите попытку или предупредите ops и не помечайте контент синхронизированным с каналом, пока публикация не пройдёт успешно.
Поддерживаемые функции WhatsApp

Всё, что нужно для создания автоматизации WhatsApp

Whapi.Cloud предоставляет доступ к полному набору функций WhatsApp — сообщениям, медиа, группам, каналам, вебхукам и не только. Создавайте ботов, автоматизации и интеграции без функциональных ограничений.

Выбор разработчиков

Нам доверяют 3 300+ разработчиков и SaaS-команд

Разработчики по всему миру используют Whapi.Cloud для создания автоматизаций, ботов, CRM-интеграций, массовых рассылок и продвинутых WhatsApp-воркфлоу. Наша инфраструктура обрабатывает миллионы API-запросов с высокой стабильностью — и этот показатель растёт каждый месяц.

Иконка функции

5,5K+

активных API-каналов

Иконка функции

21M+

API-запросов в месяц

«Всё просто, интуитивно и легко. Документация понятная, и вся нужная информация всегда под рукой. Отличная работа.»

Roberto K. / Web-разработчик

«Мы подключили WhatsApp к нашим процессам через n8n всего за несколько минут. Без кода, без сложностей — всё заработало с первого раза.»

Martin P. / Разработчик

«Whapi.Cloud стал важной частью нашей коммуникации с клиентами. Мы автоматизировали обновления по продуктам, уведомления о заказах и поддержку — без шаблонов и модерации.»

Oscar T. / CTO

Декоративный пузырь