Supressões
Uma supressão é um endereço para o qual seu espaço de trabalho não enviará mensagens, registrado com um escopo. Bird bloqueia um envio para um endereço suprimido antes que ele chegue a WhatsApp.
Abra a página Suppressions para trabalhar com a lista, ou use a API abaixo. Registros declarados pelo destinatário ficam na aba Preferences da mesma página e seguem regras diferentes.

Suprimindo uma conta de negócio
Na aba Suppressions, crie uma supressão para um número de telefone e escolha a conta de negócio à qual ela se aplica. Bird bloqueia mensagens dessa conta, e suas outras contas ainda podem enviar mensagens para o número. A coluna Business account da lista mostra a conta à qual a supressão está vinculada, ou exibe All accounts quando ela cobre todo o seu espaço de trabalho.
POST /v1/whatsapp/suppressions registra a mesma coisa via código. waba é a conta à qual vincular o escopo; omita para bloquear o endereço em todo o seu espaço de trabalho, incluindo contas que você conectar depois:
// 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"}'
Um escopo, um registro
Uma supressão carrega um escopo, então o mesmo endereço bloqueado para duas contas são dois registros, não um. Para cobrir todo o espaço de trabalho, faça uma chamada sem waba.
Adicionar um endereço que já está suprimido para esse escopo retorna 200 com o registro existente em vez de criar um segundo. Um novo registro retorna 201.
Uma supressão é indexada pelo endereço que você registra. Um destinatário alcançado por número de telefone e o mesmo destinatário alcançado por um ID de usuário com escopo de negócio são duas chaves, então suprimir um não suprime o outro. Registre ambos se você endereça a mesma pessoa de qualquer forma.
Lendo sua lista de supressões
GET /v1/whatsapp/suppressions retorna as supressões em vigor, da mais recente para a mais antiga, como uma página de cursor. address filtra por prefixo e ignora maiúsculas e minúsculas: um valor parcial corresponde a todos os endereços abaixo dele, e um valor completo corresponde apenas àquele endereço. reason restringe a uma categoria, como manual para as que você adicionou:
// 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"A lista traz o que está em vigor, e registros encerrados ficam de fora. Um endereço ausente não prova que o espaço de trabalho nunca o suprimiu; o registro pode ter sido encerrado. Leia-o pelo ID para confirmar.
Lendo um registro
GET /v1/whatsapp/suppressions/{suppression_id} resolve tanto um registro encerrado quanto um em vigor, informando quando ele foi encerrado e o que o encerrou:
// 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"Encerrando uma supressão
A ação Delete em uma linha de supressão encerra a supressão em vez de removê-la. O bloqueio para. O registro continua legível e mostra quando foi encerrado e quem o encerrou. DELETE /v1/whatsapp/suppressions/{suppression_id} faz o mesmo e retorna 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"Uma supressão que você adicionou carrega o motivo manual e pode ser encerrada. O opt-out do próprio destinatário cabe a ele reverter, e a tentativa retorna 422. Chamar isso novamente em uma supressão já encerrada tem sucesso e não altera nada, e um ID que o espaço de trabalho não possui retorna 404.
Encerrar uma supressão exige o ID dela, então consulte a lista primeiro.
Monitorando novas supressões
whatsapp_suppression.created dispara quando uma supressão é registrada, para que seu próprio sistema veja novos bloqueios sem fazer polling. O payload carrega:
- suppression_id, o identificador do registro.
- address, o número suprimido no formato E.164.
- waba, a conta à qual o bloqueio está limitado, ou null quando cobre todo o espaço de trabalho.
- reason e workspace_id.
Nenhum evento dispara quando uma supressão é encerrada, então releia a lista antes de confiar em uma cópia que você possui. Consulte eventos de WhatsApp para o payload completo.
Próximos passos
- Preferências: os registros que os destinatários declaram, e quais deles você pode reverter.
- Eventos de WhatsApp: o payload de whatsapp.rejected que um envio bloqueado produz.
- Enviando mensagens WhatsApp: a API de envio e seu modelo de entrega assíncrono.
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.
Assista ao guiaConnecting WhatsApp to Bird: from buying a number to a live channelEntenda o conceitoWhat is the 24-hour customer service window on WhatsApp?Use a ferramentaWhatsApp message builderExplore a funcionalidadeWhatsApp
Experimente na prática e obtenha um resumo de implementação