Wow! Redução de 65% no preço para clientes brasileiros! Registre-se agora
Sincronização de conteúdo do canal · caso de uso WhatsApp API

Publicação no canal WhatsApp quando o conteúdo vai ao ar

Os inscritos veem o mesmo lançamento ou promo no seu canal WhatsApp assim que o site ou a loja publica, sem alguém copiar o texto manualmente no app. Quando seu backend marca o conteúdo como ativo, seu worker pode resolver o id do canal e publicar o anúncio via Whapi.Cloud. Este caso de uso mostra aos integradores como implementar esse fluxo com a WhatsApp API.

Disparado quando o CMS ou a loja publica getNewsletters e depois sendMessageText
Tela de publicação do CMS ou da loja ao lado de um celular cujo canal WhatsApp mostra um anúncio novo com a notificação habitual do canal.
Balão decorativo
Cenário de uso

Quando usar este fluxo

O gatilho é um evento de publicação no backend

Use este fluxo quando um artigo, produto, promo ou go-live do CMS em own_backend também deve atualizar um canal WhatsApp, não quando você só responde chats de entrada.

O destino da divulgação é um canal WhatsApp

Use este fluxo quando a publicação vai para um JID de canal, não quando você precisa que todos os membros de uma comunidade vejam um anúncio de subgrupo.

Você precisa do id do canal antes de enviar

Use este fluxo quando o worker deve ler a lista de canais com getNewsletters para escolher o JID certo, não quando você já guarda esse id na configuração.

Canal WhatsApp em um celular com um anúncio novo e o banner padrão de notificação do canal.
Experiência do cliente

Inscritos recebem a atualização

O site ou a loja mostra o artigo ou a promo no prazo, mas o canal WhatsApp ainda espera alguém colar o mesmo texto manualmente.

Depois que o fluxo roda, os inscritos do canal veem o anúncio no canal e recebem a notificação habitual no celular. Integradores constroem esse resultado com a WhatsApp API.

Fluxo

Do evento de publicação ao post do canal

1

A publicação de conteúdo tem sucesso no backend

Seu CMS, loja ou agendador indica que o artigo, produto ou promo está ativo. Um worker monta o texto do anúncio e o link opcional para o corpo do canal.

2

Resolva o JID do canal de destino

GET /newsletters

getNewsletters devolve seus canais com metadados. Associe o canal que a campanha deve atualizar e pegue o id dele para o passo de envio.

3

Publique o anúncio no canal

POST /messages/text

sendMessageText publica o texto preparado nesse canal. Coloque o id do canal em to e o anúncio em body.

Precisa acompanhar a entrega? Uma resposta de API bem-sucedida não significa que todos os inscritos já receberam o post. Saiba mais sobre o status de entrega →

Pré-requisitos

Antes de executar o fluxo

Conecte o número de WhatsApp que possui o canal e autentique cada requisição com o token de API desse número. Hooks de publicação, mapeamento do CMS e qual canal mirar ficam no seu backend.

Opcional — aprofunde neste fluxo

Implementação da API

Liste o canal, depois publique

Leia o JID do canal na lista de newsletters e publique o corpo do anúncio nesse id quando seu evento de conteúdo disparar.

Obtenha seu token de API grátis depois de se registrar no whapi.cloud e use esse token no código no lugar de Your_Token dos exemplos.

Resolva o JID do canal de destino

Devolva metadados do canal para o worker escolher o JID certo quando ele ainda não está salvo na configuração.

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))
}

Publique o anúncio no canal

Publique o texto do anúncio preparado nesse canal para os inscritos verem a atualização com a notificação do canal.

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))
}
Envio

Saiba quando o post chegou de fato

Uma resposta de envio bem-sucedida não significa que todos os inscritos já têm o post. O primeiro status visível antes de um webhook é pending. Mudanças posteriores chegam só em statuses.post e statuses.put. Se o status ficar em pending e não passar para sent, delivered ou um ack posterior, a mensagem não foi entregue. Confira o payload e a permissão da conta para enviar a esse canal.

  • Uma resposta de sendMessageText não prova que todos os inscritos receberam o anúncio.

  • Um pending que não avança significa que o post não foi entregue.

  • Acompanhe statuses.post e statuses.put para acks posteriores em envios ao canal.

  • Ative webhooks se seu worker deve tentar de novo quando a entrega nunca se completa.

O que ler sobre entrega e webhooks

Fale com o suporte se algo deu errado
Quando algo falha

Trate falhas em cada passo

O conteúdo pode ir ao ar no site enquanto a sincronização do canal falha se a lista de newsletters estiver vazia, o JID do canal errado for escolhido ou sendMessageText for rejeitado ou não entregue.

O site publicou, mas o canal não atualizou?

Mantenha o estado de publicação do CMS separado da sincronização do canal. Se getNewsletters falhar ou não devolver um canal correspondente, ou sendMessageText falhar, tente de novo ou avise a operação e não marque o conteúdo como sincronizado com o canal. Se a publicação no canal continuar falhando após uma nova tentativa, fale com o suporte Whapi com o id do canal e a resposta de erro.

Fale com o suporte se algo deu errado

Diagnostique por passo da API

Situação O que significa O que fazer
400 Wrong request parameters Parâmetros de requisição incorretos — confira count e offset na requisição de listagem.
500 Internal Error
Situação O que significa O que fazer
400 Wrong request parameters Parâmetros de requisição incorretos — confira to e body no payload de envio.
401 Need channel authorization for send message É necessária autorização do canal para enviar mensagem — confirme que o número conectado pode publicar nesse canal.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient É proibido enviar a este grupo ou destinatário — confirme o JID do canal do passo de listagem.
413 Request body too large
429 Too many requests
500 Internal Error
Perguntas frequentes

Perguntas que integradores fazem

Se o JID do canal já está na sua configuração, você pode pular getNewsletters e chamar sendMessageText com esse id. Quando o id é desconhecido ou os canais mudam, liste primeiro.
Não. Este fluxo publica em um canal WhatsApp. Anúncios para toda a comunidade via grupos vinculados são outro cenário.
Não. Este fluxo publica uma vez em um JID de canal. DMs frios para números individuais são outro trabalho.
Sim. Coloque a URL em body com o texto do anúncio. Um link para chat pessoal é um CTA opcional quando o canal não tem thread de resposta no post.
Não. Você compõe o anúncio em body e envia com sendMessageText. O envio não espera um template pré-aprovado para essa mensagem.
Se o passo de listagem falhar, nenhum canal corresponder ou o envio falhar, tente de novo ou avise a operação e não marque o conteúdo como sincronizado com o canal até a publicação ter sucesso.
Recursos compatíveis do WhatsApp

Tudo o que você precisa para criar automações no WhatsApp

O Whapi.Cloud oferece acesso a um conjunto completo de recursos do WhatsApp — mensagens, mídia, grupos, canais, webhooks e muito mais. Crie bots, automações e integrações sem limitações de funcionalidades.

Escolhido por desenvolvedores

Confiado por mais de 3.300 desenvolvedores e equipes SaaS

Desenvolvedores no mundo inteiro utilizam o Whapi.Cloud para criar automações, bots, integrações com CRM, ferramentas de envio em massa e fluxos avançados de WhatsApp. Nossa infraestrutura processa milhões de requisições API com alta estabilidade — e esse número cresce a cada mês.

Ícone de recurso

5,5K+

canais de API ativos

Ícone de recurso

21M+

requisições API por mês

“Tudo é simples, intuitivo e fácil de navegar. A documentação é clara e todas as informações estão bem à mão. Trabalho excelente.”

Roberto K. / Desenvolvedor Web

“Conectamos o WhatsApp aos nossos fluxos usando o n8n em apenas alguns minutos. Sem código, sem complicações — funcionou de primeira.”

Martin P. / Desenvolvedor

“O Whapi.Cloud se tornou uma parte essencial da nossa comunicação com clientes. Automatizamos atualizações de produtos, notificações de pedidos e mensagens de suporte — tudo sem templates nem aprovações da Meta.”

Oscar T. / CTO

Balão decorativo