Supresje
Supresja to adres, do którego Twój obszar roboczy nie będzie wysyłać wiadomości, zapisany z określonym zakresem. Bird blokuje wysyłkę na zablokowany adres, zanim dotrze ona do WhatsApp.
Otwórz stronę Suppressions, aby zarządzać listą, lub użyj API poniżej. Wpisy zgłoszone przez odbiorców znajdują się na karcie Preferences tej samej strony i podlegają innym zasadom.

Blokowanie konta biznesowego
Na karcie Suppressions utwórz supresję dla numeru telefonu i wybierz konto biznesowe, którego dotyczy. Bird blokuje wiadomości z tego konta, a Twoje pozostałe konta nadal mogą wysyłać wiadomości na ten numer. Kolumna Business account na liście wskazuje konto, do którego supresja jest przypisana, lub wyświetla All accounts, jeśli obejmuje cały obszar roboczy.
POST /v1/whatsapp/suppressions zapisuje to samo z poziomu kodu. waba to konto, do którego chcesz przypisać zakres; pomiń je, aby zablokować adres w całym obszarze roboczym, w tym na kontach, które podłączysz później:
// Omit waba to block the address for the whole workspace, whichever account
// sends. With it, your other accounts keep reaching them, and the same
// address for two accounts is two records.
const suppression = await bird.whatsapp.suppressions.add({
address: "+15550001234",
waba: "102290129340398",
});
console.log(suppression.id, suppression.applies_to);# Omit waba to block the address for the whole workspace, whichever account
# sends. With it, your other accounts keep reaching them, and the same
# address for two accounts is two records.
suppression = client.whatsapp.suppressions.add(
address="+15550001234",
waba="102290129340398",
)
print(suppression.id, suppression.applies_to)suppression, err := client.Whatsapp.Suppressions.Add(context.Background(), bird.WhatsappSuppressionsAddParams{
Address: "+15550001234",
// Omit Waba to block the address for the whole workspace, whichever account
// sends. With it, your other accounts keep reaching them, and the same
// address for two accounts is two records.
Waba: &waba,
})
if err != nil {
log.Fatal(err)
}
fmt.Println(suppression.Id, suppression.AppliesTo)// Omit setWaba to block the address for the whole workspace, whichever account
// sends. With it, your other accounts keep reaching them, and the same address
// for two accounts is two records.
$suppression = $bird->whatsapp->suppressions->add(
(new WhatsAppSuppressionCreate())
->setAddress('+15550001234')
->setWaba('102290129340398'),
);
echo $suppression->getId(), ' ', $suppression->getAppliesTo();bird whatsapp suppressions add --address +5511977670804curl -X POST https://us1.platform.bird.com/v1/whatsapp/suppressions \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address":"+15550001234","waba":"102290129340398"}'
Jeden zakres, jeden wpis
Supresja ma jeden zakres, więc ten sam adres zablokowany dla dwóch kont to dwa wpisy, nie jeden. Aby objąć cały obszar roboczy, wykonaj jedno wywołanie bez waba.
Dodanie adresu, który jest już zablokowany w danym zakresie, zwraca 200 z istniejącym wpisem zamiast tworzyć drugi. Nowy wpis zwraca 201.
Supresja jest identyfikowana po zapisanym adresie. Odbiorca wskazany numerem telefonu i ten sam odbiorca wskazany identyfikatorem użytkownika w zakresie konta biznesowego to dwa różne klucze, więc zablokowanie jednego nie blokuje drugiego. Zapisz oba, jeśli kontaktujesz się z tą samą osobą na oba sposoby.
Odczytywanie listy supresji
GET /v1/whatsapp/suppressions zwraca obowiązujące supresje, od najnowszych, jako stronę kursorową. address filtruje po prefiksie bez rozróżniania wielkości liter: częściowa wartość dopasowuje każdy adres pod nią, a pełna wartość dopasowuje dokładnie ten adres. reason zawęża do kategorii, na przykład manual dla tych dodanych przez Ciebie:
// address is a prefix, so a partial value matches every address under it.
const suppressions = await bird.whatsapp.suppressions.list({ address: "+1555" });
for (const suppression of suppressions.data ?? []) {
console.log(suppression.address, suppression.waba ?? "every account");
}# address is a prefix, so a partial value matches every address under it.
suppressions = client.whatsapp.suppressions.list(address="+1555")
for suppression in suppressions.data or []:
print(suppression.address, suppression.waba or "every account")for suppression, err := range client.Whatsapp.Suppressions.List(context.Background(), bird.WhatsappSuppressionsListParams{
Address: "+1555", // a prefix, so a partial value matches every address under it
}) {
if err != nil {
log.Fatal(err)
}
fmt.Println(suppression.Address, suppression.Reason)
}// address is a prefix, so a partial value matches every address under it.
foreach ($bird->whatsapp->suppressions->list(['address' => '+1555']) as $suppression) {
echo $suppression->getAddress(), ' ', $suppression->getWaba() ?? 'every account', PHP_EOL;
}bird whatsapp suppressions listcurl "https://us1.platform.bird.com/v1/whatsapp/suppressions?address=%2B1555" \
-H "Authorization: Bearer $BIRD_API_KEY"Lista zawiera wpisy obowiązujące; zakończone wpisy są pomijane. Brak adresu nie dowodzi, że obszar roboczy nigdy go nie blokował; wpis mógł zostać zakończony. Odczytaj go po ID, aby to potwierdzić.
Odczytywanie pojedynczego wpisu
GET /v1/whatsapp/suppressions/{suppression_id} zwraca zarówno wpis zakończony, jak i obowiązujący, podając kiedy został zakończony i co go zakończyło:
// Resolves a record that has already ended, which the list leaves out.
const suppression = await bird.whatsapp.suppressions.get("was_01krdgeqcxet5s7t44vh8rt9mg");
console.log(suppression.reason, suppression.ended_at ?? "still in force");# Resolves a record that has already ended, which the list leaves out.
suppression = client.whatsapp.suppressions.get("was_01krdgeqcxet5s7t44vh8rt9mg")
print(suppression.reason, suppression.ended_at or "still in force")suppression, err := client.Whatsapp.Suppressions.Get(context.Background(), "was_01krdgeqcxet5s7t44vh8rt9mg")
if err != nil {
log.Fatal(err)
}
fmt.Println(suppression.Reason, suppression.EndedAt)// Resolves a record that has already ended, which the list leaves out.
$suppression = $bird->whatsapp->suppressions->get('was_01krdgeqcxet5s7t44vh8rt9mg');
echo $suppression->getReason(), ' ', $suppression->getEndedAt()?->format(DATE_ATOM) ?? 'still in force';bird whatsapp suppressions get <suppression-id>curl https://us1.platform.bird.com/v1/whatsapp/suppressions/was_01krdgeqcxet5s7t44vh8rt9mg \
-H "Authorization: Bearer $BIRD_API_KEY"Kończenie supresji
Akcja Delete w wierszu supresji kończy supresję, a nie usuwa ją. Blokada przestaje obowiązywać. Wpis pozostaje czytelny i pokazuje, kiedy został zakończony i kto go zakończył. DELETE /v1/whatsapp/suppressions/{suppression_id} robi to samo i zwraca 204:
// Only a manual suppression can be ended; a recipient's own opt-out is
// theirs to reverse. The record is kept and still reads back by id.
await bird.whatsapp.suppressions.remove("was_01krdgeqcxet5s7t44vh8rt9mg");# Only a manual suppression can be ended; a recipient's own opt-out is
# theirs to reverse. The record is kept and still reads back by id.
client.whatsapp.suppressions.remove("was_01krdgeqcxet5s7t44vh8rt9mg")if err := client.Whatsapp.Suppressions.Remove(context.Background(), "was_01krdgeqcxet5s7t44vh8rt9mg"); err != nil {
log.Fatal(err)
}// Only a manual suppression can be ended; a recipient's own opt-out is theirs
// to reverse. The record is kept and still reads back by id.
$bird->whatsapp->suppressions->remove('was_01krdgeqcxet5s7t44vh8rt9mg');bird whatsapp suppressions remove <suppression-id> --yescurl -X DELETE https://us1.platform.bird.com/v1/whatsapp/suppressions/was_01krdgeqcxet5s7t44vh8rt9mg \
-H "Authorization: Bearer $BIRD_API_KEY"Supresja dodana przez Ciebie ma powód manual i można ją zakończyć. Rezygnacja zgłoszona przez odbiorcę może być cofnięta tylko przez niego, a próba zwraca 422. Ponowne wywołanie na supresji, która już się zakończyła, kończy się sukcesem bez żadnych zmian, a ID nieistniejące w obszarze roboczym zwraca 404.
Zakończenie supresji wymaga jej ID, więc najpierw wyszukaj je na liście.
Obserwowanie nowych supresji
whatsapp_suppression.created jest wywoływane, gdy supresja zostanie zapisana, dzięki czemu Twój system widzi nowe blokady bez odpytywania. Jego payload zawiera:
- suppression_id, identyfikator wpisu.
- address, zablokowany numer w formacie E.164.
- waba, konto, do którego blokada jest ograniczona, lub null, gdy obejmuje cały obszar roboczy.
- reason i workspace_id.
Żadne zdarzenie nie jest wywoływane, gdy supresja się kończy, więc przed użyciem posiadanej kopii ponownie odczytaj listę. Pełny payload znajdziesz w zdarzeniach WhatsApp.
Następne kroki
- Preferencje: wpisy zgłoszone przez odbiorców i informacja, które z nich możesz cofnąć.
- Zdarzenia WhatsApp: payload whatsapp.rejected generowany przez zablokowaną wysyłkę.
- Wysyłanie wiadomości WhatsApp: API wysyłki i jej asynchroniczny model dostarczania.
Powiązane zasoby
Kontynuuj z dokumentacją, przewodnikami i przykładami dotyczącymi tego tematu. Zasoby są w języku angielskim.
Obejrzyj przewodnikConnecting WhatsApp to Bird: from buying a number to a live channelZrozum koncepcjęWhat is the 24-hour customer service window on WhatsApp?Użyj narzędziaWhatsApp message builderPoznaj możliwościWhatsApp
Wypróbuj ćwiczenie i uzyskaj brief wdrożeniowy