Coinvolgi i clienti in tutto il mondo con WhatsApp API
Collega i team di marketing, assistenza e operations con i clienti sull'app di messaggistica più diffusa al mondo.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({
apiKey: process.env.BIRD_API_KEY!,
});
const msg = await bird.whatsapp.send({
to: "+15551234567",
template: {
slug: "bird_delivery_update",
components: [{ type: "body", parameters: [
{ type: "text", name: "ref", text: "#4821" },
{ type: "text", name: "date", text: "Wednesday" },
] }],
},
});
console.log(msg.id, msg.status);
// → "wam_01krdgeqcxet5s7t44vh8rt9mg", "accepted"5 minuti da npm install al primo invio
Invia un messaggio WhatsApp dal linguaggio che già utilizzi.
SDK per ogni runtime principale. Il primo invio parte con un template gestito da Bird come bird_delivery_update, già approvato da Meta e con mittente selezionato automaticamente: così vedi un messaggio reale arrivare prima ancora di crearne uno tuo.
const msg = await bird.whatsapp.send({
to: "+15551234567",
template: {
slug: "bird_otp",
components: [{ type: "body", parameters: [{ type: "text", text: "123456" }] }],
},
});
console.log(msg.id, msg.status);Otto cose che gestiamo noi tra te e Meta.
WhatsApp è soggetto a restrizioni: un template approvato, un destinatario con opt-in, un'azienda verificata. Queste regole non cambiano. Il tuo provider decide se mostrarle nel codice o nasconderle in una dashboard.
- 01
Meta Business Solution Provider (BSP) ufficiale
Rapporto diretto con Meta da quando esiste l'API. Nessun transito rivenduto, nessun passaggio tramite terzi.
- 02
Gestione dei template
Consulta il catalogo e il verdetto di Meta per ogni lingua dalla CLI o dagli strumenti MCP. Creazione e invio sono nella dashboard.
- 03
Template in ogni lingua
Uno slug, molte lingue. Specificane uno nell'invio, oppure lascia che il template usi la lingua predefinita.
- 04
Pulsanti e caroselli
Pulsanti link, risposta rapida, numero di telefono e copia codice, più caroselli da 2 a 10 card.
- 05
Media e contenuti rich
Immagini, video, audio, sticker, documenti e posizione, ciascuno in un singolo campo di invio.
- 06
Tag e metadati su ogni invio
I tag diventano dimensioni di filtro e analisi; i metadati ritornano su ogni webhook.
- 07
Webhook per messaggi in entrata
Eventi firmati con HMAC per messaggi in entrata, ricevute di consegna e conferme di lettura.
- 08
Oltre 3 miliardi di utenti su un unico endpoint
Oltre tre miliardi di utenti WhatsApp attivi mensilmente, raggiungibili con una singola chiamata bird.whatsapp.send.
Esplora la piattaforma WhatsApp
Ogni funzionalità nel dettaglio. Una sola API, un unico set di chiavi.
Template.
Categorie, approvazione per lingua e segnaposto compilati al momento dell'invio.
Invio.
Un tipo di contenuto per richiesta, chiavi di idempotenza, tag e metadati.
Bidirezionale.
Messaggi in entrata, finestra di assistenza clienti di 24 ore e risposte.
Numeri.
Mittenti gestiti da Bird, utilizzo del proprio numero e account business.
Prezzi.
Una tariffa unica per messaggio, in base al paese di destinazione e alla categoria.
FAQ.
Tutte le domande su WhatsApp in un unico posto, dal primo invio all'analisi dei dati.
Perché sviluppiamo WhatsApp
Siamo stati tra i primi BSP di WhatsApp. Siamo ancora tra i pochi che scrivono codice insieme a te.
WhatsApp è soggetto a restrizioni. Serve un template approvato; serve una finestra di assistenza aperta per inviare qualsiasi altra cosa; serve una verifica aziendale Meta. Questo non cambia, e non cambierà. Ciò che cambia è se il tuo BSP rende queste barriere più facili o più difficili da superare: esponendole nel codice, nei webhook a cui puoi iscriverti, negli errori che dicono esattamente cosa non va. Noi abbiamo scelto la prima strada.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({
apiKey: process.env.BIRD_API_KEY!,
});
const msg = await bird.whatsapp.send({
to: "+15551234567",
template: {
slug: "bird_delivery_update",
components: [{ type: "body", parameters: [
{ type: "text", name: "ref", text: "#4821" },
{ type: "text", name: "date", text: "Wednesday" },
] }],
},
});
console.log(msg.id, msg.status);
// → "wam_01krdgeqcxet5s7t44vh8rt9mg", "accepted"Ogni cambio di stato è un webhook.
Payload firmati con HMAC, protetti da replay, idempotenti. Lo stesso formato su ogni canale Bird: imparatene uno e li avrete imparati tutti.
{
"type": "whatsapp.read",
"timestamp": "2026-05-19T15:42:08.114Z",
"data": {
"whatsapp_id": "wam_01krdgeqcxet5s7t44vh8rt9mg",
"workspace_id": "ws_01krdgeqcxet5s7t44vh8rt9mg",
"direction": "outbound",
"from": { "phone_number": "+15557654321" },
"to": { "phone_number": "+15551234567" },
"tags": [{ "name": "campaign", "value": "order-updates" }],
"metadata": { "order_id": "BRD-49217" }
}
}Programma di retry: 5s, 5m, 30m, 2h, 5h, poi 10h due volte. Dopo l'ultimo tentativo la consegna fallisce definitivamente, e il replay la recupera dalla dashboard o dall'API.
whatsapp.acceptedAccettato dall'API e in coda per l'invio a Meta.whatsapp.sentConsegnato alla Cloud API di Meta.whatsapp.deliveredMeta conferma che il messaggio è arrivato sul dispositivo del destinatario.whatsapp.readIl destinatario ha aperto il messaggio (se le conferme di lettura sono attive).whatsapp.rejectedRifiutato prima dell'invio, senza addebito: codice motivo nel payload.whatsapp.failedErrore permanente: codice motivo nel payload.whatsapp.receivedMessaggio in entrata da un utente WhatsApp.
Raggiungere lo stesso cliente via SMS è la stessa chiamata, basta cambiare un campo.
Stesso client, stessa autenticazione, stesso formato di errore, stessa struttura webhook. Ciò che cambia è il payload: WhatsApp usa un template approvato da Meta, SMS porta testo semplice. Tag e metadati viaggiano su entrambi, così un unico set di dashboard copre entrambi i canali.
await bird.whatsapp.send({
to: "+15551234567",
template: {
slug: "bird_delivery_update",
language: "en",
components: [{ type: "body", parameters: [
{ type: "text", name: "ref", text: "BRD-49217" },
{ type: "text", name: "date", text: "10 Jul 2026" },
] }],
},
});Un template gestito da Bird: approvato da Meta, disponibile in oltre 70 lingue, con selezione automatica del mittente. I valori segnaposto vengono passati come componenti.
SMS
await bird.sms.send({
from: "Bird",
to: "+15551234567",
text: `Your order BRD-49217 has shipped.`,
category: "transactional",
});Lo stesso verbo sull'altro canale: testo libero più una categoria, senza approvazione di template.
Una tariffa per messaggio, commissione Meta inclusa.
Prezzi in base all'utilizzo. Ogni tariffa comprende la commissione di Meta e la nostra in un unico importo e varia in base al paese di destinazione e alla categoria di messaggio. Nessun costo per utente e nulla che richieda un impegno annuale.