Uau! Construiți-vă integrarea WhatsApp. Începeți gratuit. Înregistrați-vă acum
Sincronizare conținut canal · caz de utilizare WhatsApp API

Publicare în canal WhatsApp când conținutul devine live

Abonații văd aceeași lansare sau promo în canalul tău WhatsApp imediat ce site-ul sau magazinul publică, fără ca cineva să copieze manual textul în aplicație. Când backend-ul marchează conținutul ca live, worker-ul poate rezolva id-ul canalului și posta anunțul prin Whapi.Cloud. Acest caz de utilizare arată integratorilor cum să implementeze fluxul cu WhatsApp API.

Pornit când CMS-ul sau magazinul publică getNewsletters, apoi sendMessageText
Ecran de publicare CMS sau magazin lângă un telefon al cărui canal WhatsApp arată un anunț nou cu notificarea obișnuită pentru abonați.
Bulă decorativă
Caz de utilizare

Când să folosești acest flux

Declanșatorul este un eveniment de publicare în backend

Folosește acest flux când un articol, produs, promo sau go-live CMS în own_backend trebuie să actualizeze și un canal WhatsApp, nu când răspunzi doar la chat-uri primite.

Ținta difuzării este un canal WhatsApp

Folosește acest flux când postarea merge la un JID de canal, nu când ai nevoie ca toți membrii unei comunități să vadă un anunț de subgrup.

Ai nevoie de id-ul canalului înainte de trimitere

Folosește acest flux când worker-ul trebuie să citească lista de canale cu getNewsletters ca să aleagă JID-ul corect, nu când id-ul este deja salvat în config.

Canal WhatsApp pe un telefon cu un anunț nou și bannerul standard de notificare al canalului.
Experiența clientului

Abonații primesc actualizarea

Site-ul sau magazinul arată la timp articolul sau promoția, dar canalul WhatsApp încă așteaptă ca cineva să lipească manual același text.

După ce rulează fluxul, abonații canalului văd anunțul în canal și primesc notificarea obișnuită pe telefon. Integratorii construiesc acest rezultat cu WhatsApp API.

Flux

De la evenimentul de publicare la postarea în canal

1

Publicarea conținutului reușește în backend

CMS-ul, magazinul sau planificatorul semnalează că articolul, produsul sau promoția este live. Un worker compune textul anunțului și linkul opțional pentru corpul postării în canal.

2

Rezolvă JID-ul canalului țintă

GET /newsletters

getNewsletters returnează canalele tale cu metadate. Potrivește canalul pe care campania trebuie să-l actualizeze și ia id-ul lui pentru pasul de trimitere.

3

Publică anunțul în canal

POST /messages/text

sendMessageText postează textul pregătit în acel canal. Pune id-ul canalului în to și anunțul în body.

Ai nevoie de urmărirea livrării? Un răspuns API reușit nu înseamnă că fiecare abonat a primit deja postarea. Despre statusul livrării →

Cerințe preliminare

Înainte să rulezi fluxul

Conectează numărul WhatsApp care deține canalul și autentifică fiecare cerere cu tokenul API al acelui număr. Hook-urile de publicare, maparea CMS și canalul țintă rămân în backend-ul tău.

Opțional — aprofundează pentru acest flux

Implementare API

Listează canalul, apoi postează

Citește JID-ul canalului din lista de newsletters și publică corpul anunțului la acel id când se declanșează evenimentul de conținut.

Obține tokenul API gratuit după ce te înregistrezi pe whapi.cloud și folosește acel token în cod în loc de Your_Token din exemple.

Rezolvă JID-ul canalului țintă

Returnează metadatele canalului ca worker-ul să aleagă JID-ul corect când nu este deja salvat în config.

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

Publică anunțul în canal

Publică textul anunțului pregătit în acel canal ca abonații să vadă actualizarea cu notificarea canalului.

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

Știi când postarea a ajuns cu adevărat

Un răspuns de trimitere reușit nu înseamnă că fiecare abonat are deja postarea. Primul status vizibil înainte de webhook este pending. Schimbările ulterioare vin doar în statuses.post și statuses.put. Dacă statusul rămâne pending și nu trece la sent, delivered sau un ack ulterior, mesajul nu a fost livrat. Verifică payload-ul și permisiunea contului de a trimite la acel canal.

  • Un răspuns de la sendMessageText nu dovedește că fiecare abonat a primit anunțul.

  • Un pending care nu avansează înseamnă că postarea nu a fost livrată.

  • Urmărește statuses.post și statuses.put pentru ack-uri ulterioare la trimiteri în canal.

  • Activează webhook-urile dacă worker-ul trebuie să reîncerce când livrarea nu se finalizează.

Ce să citești despre livrare și webhook-uri

Contactează suportul dacă ceva a mers greșit
Când ceva se strică

Gestionează eșecurile la fiecare pas

Conținutul poate fi live pe site în timp ce sincronizarea canalului eșuează dacă lista de newsletters este goală, se alege un JID greșit sau sendMessageText este respins ori nelivrat.

Site-ul s-a publicat, dar canalul nu s-a actualizat?

Păstrează starea de publicare CMS separată de sincronizarea canalului. Dacă getNewsletters eșuează sau nu returnează un canal potrivit, sau sendMessageText eșuează, reîncearcă sau alertează operațiunile și nu marca conținutul ca sincronizat cu canalul. Dacă postarea în canal continuă să eșueze după reîncercare, contactează suportul Whapi cu id-ul canalului și răspunsul eșuat.

Contactează suportul dacă ceva a mers greșit

Depanează pe pas API

Stare Ce înseamnă Ce să faci
400 Wrong request parameters Parametri de cerere greșiți — verifică count și offset în cererea de listare.
500 Internal Error
Stare Ce înseamnă Ce să faci
400 Wrong request parameters Parametri de cerere greșiți — verifică to și body în payload-ul de trimitere.
401 Need channel authorization for send message Este necesară autorizarea canalului pentru trimitere mesaj — confirmă că numărul conectat poate posta în acel canal.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Este interzis să trimiți la acest grup sau destinatar — confirmă JID-ul canalului din pasul de listare.
413 Request body too large
429 Too many requests
500 Internal Error
Întrebări frecvente

Întrebări pe care le pun integratorii

Dacă JID-ul canalului este deja salvat în config, poți omite getNewsletters și apela sendMessageText cu acel id. Când id-ul este necunoscut sau canalele se schimbă, listează mai întâi.
Nu. Acest flux postează într-un singur canal WhatsApp. Anunțurile la nivel de comunitate prin grupuri legate sunt un scenariu separat.
Nu. Acest flux publică o dată la un JID de canal. DM-uri reci către numere individuale sunt o altă sarcină.
Da. Pune URL-ul în body împreună cu textul anunțului. Un link către chat personal este un CTA opțional când canalul nu are fir de răspuns în postare.
Nu. Compui anunțul în body și îl trimiți cu sendMessageText. Trimiterea nu așteaptă un șablon preaprobat pentru acel mesaj.
Dacă pasul de listare eșuează, nu există canal potrivit sau trimiterea eșuează, reîncearcă sau alertează operațiunile și nu marca conținutul ca sincronizat cu canalul până când publicarea reușește.
Funcționalități WhatsApp suportate

Tot ce ai nevoie pentru a construi automatizări pe WhatsApp

Whapi.Cloud îți oferă acces la un set complet de funcționalități WhatsApp — mesaje, media, grupuri, canale, webhook-uri și altele. Construiește boți, automatizări și integrări fără limitări de funcții.

Ales de dezvoltatori

De încredere pentru peste 3.300 de dezvoltatori și echipe SaaS

Dezvoltatori din întreaga lume se bazează pe Whapi.Cloud pentru a crea automatizări, boți, integrări CRM, instrumente de mesagerie în masă și fluxuri avansate WhatsApp. Infrastructura noastră procesează milioane de cereri API cu o stabilitate ridicată — iar numărul crește în fiecare lună.

Pictogramă funcționalitate

5,5K+

canale API active

Pictogramă funcționalitate

21M+

cereri API pe lună

„Totul este simplu, intuitiv și ușor de folosit. Documentația este clară, iar toate informațiile necesare sunt la îndemână. Foarte bine făcut.”

Roberto K. / Web Developer

„Am conectat WhatsApp la fluxurile noastre în n8n în doar câteva minute. Fără cod, fără complicații — totul a funcționat din prima.”

Martin P. / Developer

„Whapi.Cloud a devenit o parte esențială a comunicării cu clienții. Am automatizat actualizări de produse, notificări de comenzi și mesaje de suport — fără șabloane sau aprobări Meta.”

Oscar T. / CTO

Bulă decorativă