Wysyłanie wiadomości WhatsApp
Ten przewodnik opisuje endpoint wysyłki, POST /v1/whatsapp/messages. Budujesz jeden payload JSON z odbiorcą i dokładnie jednym typem treści: zatwierdzonym szablonem lub wiadomością serwisową zawierającą tekst, obraz, wideo, audio, naklejkę, dokument, lokalizację, wizytówki lub element do dotknięcia. Bird zwraca 202 Accepted z identyfikatorem wiadomości i dostarcza asynchronicznie. To, którą z dwóch opcji możesz wysłać, zależy od okna obsługi klienta. Każde żądanie wysyła jedną wiadomość do jednego odbiorcy i nie ma endpointu zbiorczego.
Minimalna wysyłka
Najmniejszy prawidłowy payload to odbiorca to i template z jego slug. Dodaj language, jeśli chcesz konkretny język; pominięcie wysyła domyślny język szablonu. Zmienne zadeklarowane w szablonie wypełnij przez components.
Wywołanie curl wskazuje hosta US; jeśli Twój klucz zaczyna się od bk_eu1_, wywołaj zamiast tego https://eu1.platform.bird.com. SDK-i odczytują region z klucza, więc nie ustawiają hosta.
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);msg = client.whatsapp.send(
to="+31612345678",
template="bird_otp",
language="en",
components=[{"type": "body", "parameters": [{"type": "text", "text": "123456"}]}],
)
print(msg.id, msg.status)code := "123456"
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+15551234567",
Template: "bird_otp",
Language: "en",
Components: []bird.WhatsAppMessageTemplateComponent{{
Type: "body",
Parameters: &[]bird.WhatsAppMessageTemplateComponentParameter{{Type: "text", Text: &code}},
}},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)$message = $bird->whatsapp->send(
to: '+15551234567',
template: 'bird_otp',
language: 'en',
components: [
(new WhatsAppMessageTemplateComponent())
->setType('body')
->setParameters([
(new WhatsAppMessageTemplateComponentParameter())->setType('text')->setText('123456'),
]),
],
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--components '[{"parameters":[{"text":"1234","type":"text"}],"type":"body"},{"parameters":[{"text":"1234","type":"text"}],"type":"button"}]' \
--language en \
--template bird_otp \
--to +31612345678curl -X POST "https://{region}.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "+31612345678",
"template": {
"slug": "bird_otp",
"language": "en",
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "1234"
}
]
},
{
"type": "button",
"parameters": [
{
"type": "text",
"text": "1234"
}
]
}
]
}
}'Okno obsługi klienta
To, którą z dwóch opcji możesz wysłać, zależy od jednego stanu: czy okno obsługi klienta jest otwarte.
Kontakt otwiera okno, wysyłając wiadomość lub dzwoniąc na Twój numer biznesowy. Okno pozostaje otwarte przez 24 godziny i resetuje się za każdym razem, gdy kontakt ponownie do Ciebie napisze. Dopóki jest otwarte, możesz wysłać wiadomość serwisową, czyli dowolną treść: tekst, obraz, wideo, audio, naklejkę, dokument, lokalizację lub interaktywną. Gdy wygaśnie, dotrze do odbiorcy tylko zatwierdzony szablon, a jego odpowiedź na niego ponownie otworzy okno.
Bird śledzi okno za Ciebie, więc wiadomość serwisowa wysłana do zamkniętego okna jest odrzucana, zanim cokolwiek zostanie utworzone lub obciążone: żądanie zwraca 422 E15044 WhatsAppServiceWindowClosed. Sprawdzenie działa na zasadzie best effort i przepuszcza w razie wątpliwości, więc 202 nie jest dowodem, że okno było faktycznie otwarte w momencie wysyłki; okno, które wygaśnie między akceptacją a wysyłką, kończy się błędem asynchronicznym, z service_window_expired w polu last_error wiadomości.
Zobacz okno obsługi klienta, aby poznać pełny cykl życia: co je otwiera, co je resetuje i jak wpływa na cenę.
Budowanie payloadu
Odbiorca
to to pojedynczy odbiorca podany jako numer telefonu lub identyfikator użytkownika w zakresie firmy. Numer telefonu ma format E.164: wiodący +, kod kraju i numer abonenta, np. +14155550100. Walidujemy numer, więc wartość, która nie może być prawdziwym, wybieralnym numerem (błędna długość, nieprzypisany prefiks), jest odrzucana z 422 WhatsAppInvalidRecipient przed naliczeniem opłaty. Jedna wiadomość trafia do jednego odbiorcy; nie ma tablicy odbiorców ani wysyłki zbiorczej, więc aby dotrzeć do wielu osób, wykonaj jedno wywołanie na odbiorcę.
Identyfikator użytkownika w zakresie firmy, np. US.13491208655302741918, adresuje kontakt, którego numeru telefonu nie masz. W ten sposób odpowiadasz kontaktowi, który skontaktował się z Tobą bez numeru. Dwie rzeczy się zmieniają: numer wysyłający musi należeć do tego samego portfolio biznesowego, do którego jest przypisany identyfikator, a szablon jednorazowego kodu weryfikacyjnego wymaga numeru telefonu. Szablon zarządzany przez Bird jest odrzucany przy akceptacji z 422 WhatsAppRecipientNotSupportedForTemplate; szablon uwierzytelniający utworzony w Twoim obszarze roboczym jest akceptowany, a następnie kończy się błędem, ponieważ Meta wymaga dla niego numeru telefonu.
Szablon
template wskazuje zatwierdzony szablon do wysłania:
- slug (wymagane): slug szablonu, np. bird_order_confirmation. Musi pasować do szablonu w Twoim katalogu (małe litery, cyfry i podkreślenia).
- language: tag języka szablonu, np. en lub pt-BR. Pomiń, aby wysłać domyślny język szablonu; podanie języka, którego szablon nie ma, zwraca 422 z listą dostępnych. Zaakceptowana wiadomość zwraca rozwiązany język.
- components: wartości wypełniające zmienne szablonu (zobacz Komponenty i parametry). Pomiń dla szablonu bez zmiennych.
Przeglądaj swoje szablony, ich języki i wyrenderowany podgląd każdego z nich na stronie Szablony.
Komponenty i parametry
Szablony zawierają zmienne, nazwane ({{ref}}, {{amount}}) lub numerowane ({{1}}, {{2}}). Ich wartości podajesz przez components. Każdy komponent określa type (body lub button) i tablicę parameters. Każdy parametr określa swój type (text, image, video, gif, document lub location) i zawiera odpowiednie pole: text to zwykły string, image/video/gif/document to publiczny https url, a location to punkt na mapie. Szablon z nazwanymi parametrami wymaga name na każdym parametrze, dokładnie odpowiadającego nazwom zadeklarowanym w szablonie (zobacz Referencja pól). Szablon pozycyjny pomija name i przyjmuje wartości w kolejności {{n}}, więc pierwszy parametr wypełnia {{1}}. W obu przypadkach parametry nieodpowiadające deklaracji szablonu zwracają 422 WhatsAppTemplateParameterMismatch. Typ komponentu header również istnieje na poziomie protokołu: w szablonie zarządzanym przez Bird jest pomijany, ponieważ żaden szablon zarządzany przez Bird nie deklaruje zmiennej nagłówka, ale w szablonie utworzonym w Twoim obszarze roboczym jest przekazywany, i w ten sposób szablon narzędziowy lub marketingowy z nagłówkiem medialnym otrzymuje swój obraz.
Na przykład szablon jednorazowego kodu weryfikacyjnego, którego treść brzmi {{1}} is your verification code i którego przycisk kopiuje kod, przyjmuje kod zarówno jako parametr body, jak i parametr button, pozycyjnie (bez name):
Przykład kodu
{
"components": [
{ "type": "body", "parameters": [{ "type": "text", "text": "481920" }] },
{ "type": "button", "parameters": [{ "type": "text", "text": "481920" }] }
]
}Kategoria i nadawca
Kategoria szablonu (authentication, utility lub marketing) określa, jak WhatsApp traktuje wiadomość, a w połączeniu z krajem docelowym, ile kosztuje.
To, kto jest właścicielem nadawcy, decyduje, czy go podajesz:
- Szablon zarządzany przez Bird (jego slug zaczyna się od bird_) wysyła z numeru, który Bird utrzymuje dla danej kategorii, więc pomiń from. Ustawienie go zwraca 422 WhatsAppSenderNotAllowed.
- Wszystko inne podaje swojego nadawcę w from: wiadomość serwisowa dowolnego typu i każdy szablon utworzony w Twoim obszarze roboczym. Numer musi być numerem należącym do Twojego obszaru roboczego. Pominięcie zwraca 422 WhatsAppSenderRequired, a numer, z którego obszar roboczy nie może wysyłać, zwraca 422 WhatsAppSenderNotFound. Utworzony szablon musi też być na tym samym koncie WhatsApp Business Account co numer, w przeciwnym razie wysyłka zwraca 422 WhatsAppSenderWABAMismatch.
Konfiguracja numeru telefonu opisuje oba typy numerów i sposób podłączenia własnego numeru.
Wiadomości serwisowe
Zamiast template przekaż dokładnie jedno z text, image, video, audio, sticker, document, location, contact_cards lub interactive. Wszystkie dziewięć to wiadomości serwisowe, więc wymagają otwartego okna obsługi klienta. Każda z nich wymaga też from, numeru należącego do Twojego obszaru roboczego; zarządzane numery Bird nie mogą jej przenosić.
- text: { "body": "..." }, do 4096 znaków. Dodaj "preview_url": true, aby wyrenderować podgląd linku dla pierwszego URL w body.
- image, video, audio, sticker, document: każdy przyjmuje publiczny URL https, który WhatsApp pobiera w momencie wysyłki (url), więc podpisany URL musi być ważny dłużej niż trwa wysyłka. URL http jest odrzucany natychmiast. WhatsApp pobiera sam plik, więc URL, którego nie może osiągnąć, serwujący nieobsługiwany typ lub plik przekraczający limit rozmiaru dla danego typu, jest akceptowany, a następnie kończy się błędem, z media_rejected w polu last_error wiadomości i przyczyną WhatsApp w description. image, video i document przyjmują też opcjonalny caption; document przyjmuje też opcjonalny filename; audio przyjmuje opcjonalną flagę voice dla renderowania notatki głosowej.
- location: { "latitude": ..., "longitude": ... } (oba wymagane, stopnie dziesiętne) plus opcjonalne name i address.
- contact_cards: tablica do pięciu kontaktów udostępnionych w jednej wiadomości. name każdej wizytówki wymaga formatted_name plus co najmniej jednej innej części (first_name, last_name, middle_name, prefix lub suffix); phone_numbers, emails, urls i addresses przyjmują do dziesięciu wpisów, a org i birthday (jako YYYY-MM-DD) są opcjonalne. phone_number w formacie E.164 dodaje do wizytówki przycisk otwierający z nią czat.
- interactive: tekst body plus element do dotknięcia, w jednym z sześciu typów: przyciski odpowiedzi, menu listowe, przycisk z linkiem, karuzela medialna lub pojedynczy przycisk proszący odbiorcę o lokalizację lub numer telefonu. Wiadomości interaktywne opisują kształt protokołu każdego typu, odpowiedzi generowane przez dotknięcie i limity.
Przykład kodu
{
"to": "+16505551234",
"from": "+13124495648",
"text": { "body": "Your order shipped: https://example.com/track/A1B2C3", "preview_url": true }
}Żądanie bez treści lub z więcej niż jednym typem jest odrzucane z 422.
Cytowanie wiadomości
Ustaw in_reply_to_message_id na identyfikator wiadomości WhatsApp, aby wysłać swoją wiadomość jako odpowiedź na nią, tak jak dotknięcie odpowiedzi w aplikacji WhatsApp cytuje wiadomość. Odbiorca widzi Twoją wiadomość z cytowaną nad nią, a pole wraca przy każdym odczycie wiadomości.
Działa to też w drugą stronę: wiadomość przychodząca, którą WhatsApp oznaczy jako odpowiedź, zawiera identyfikator cytowanej wiadomości w tym samym polu. W ten sposób rozpoznajesz, na którą z Twoich wiadomości jest odpowiedź. Wiadomość przychodząca, której WhatsApp nie oznaczy, nie zawiera identyfikatora, a rozwiązanie może też nie nastąpić. Aby uzyskać niezawodną korelację, używaj jawnych identyfikatorów odpowiedzi interaktywnych ze stanem konwersacji lub zadania przechowywanym w Twojej aplikacji. Wychodzący metadata pozostaje na rekordzie wychodzącym i nie jest automatycznie kopiowany na odpowiedź.
Cytat jest rozwiązywany przed akceptacją wysyłki, więc cytat, którego nie można wyrenderować, powoduje błąd samego żądania i nic nie jest tworzone ani obciążane. Identyfikator wskazujący wiadomość, której ten obszar roboczy nie posiada, lub starszą niż 15 dni (tyle wiadomość pozostaje cytowalna), zwraca 404 E15071 WhatsAppReferencedMessageNotFound. Identyfikator wskazujący wiadomość, która nigdy nie dotarła do WhatsApp, lub wiadomość z innej konwersacji niż to i from tej wysyłki, zwraca 422 E15072 WhatsAppMessageNotQuotable. Jeśli Bird nie może połączyć się ze sklepem odpowiadającym na to zapytanie, wysyłka zwraca 503 E15073 WhatsAppMessageLookupUnavailable, co warto spróbować ponownie. Cytowanie działa zarówno przy wysyłce szablonu, jak i przy wysyłce dowolnej treści.
Przykład kodu
{
"to": "+16505551234",
"from": "+13124495648",
"in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
"text": { "body": "Yes, that slot is still free." }
}Tagi i metadane
Dwa opcjonalne pola dołączają Twój własny kontekst do wiadomości; oba wracają przy odczytach API i towarzyszą każdemu zdarzeniu webhooka dla tej wiadomości:
- tags: do 20 strukturyzowanych etykiet { "name": ..., "value": ... } dla wymiarów o niskiej kardynalności, po których filtrujesz i raportujesz (kampania, wariant eksperymentu). Nazwy i wartości przyjmują litery ASCII, cyfry, podkreślenie i myślnik; nazwy mają limit 32 znaków i muszą być unikalne w ramach wysyłki, wartości 64. Filtruj listę wiadomości po tagu (?tag=campaign lub ?tag=campaign:launch-week), a strona Metryki rozbija dostarczenia według tagu.
- metadata: jeden dowolny obiekt JSON, do 2 KB po serializacji, na kontekst per wysyłka, którego nie potrzebujesz jako wymiaru filtrowania (wewnętrzny identyfikator zamówienia, referencja sesji).
Przykład kodu
{
"tags": [{ "name": "campaign", "value": "order-confirmations" }],
"metadata": { "order_id": "ord_8271" }
}Referencja pól
| Pole | Typ | Wymagane | Limity / uwagi |
|---|---|---|---|
| to | string | tak | Jeden odbiorca na wiadomość: numer telefonu E.164 lub identyfikator użytkownika w zakresie firmy, którego nie akceptuje żaden szablon jednorazowego kodu weryfikacyjnego |
| from | string (E.164) | nie** | Pomiń dla szablonu zarządzanego przez Bird, który sam wybiera nadawcę; wymagane dla wiadomości serwisowej i szablonu utworzonego w Twoim obszarze roboczym, i musi być numerem należącym do Twojego obszaru roboczego |
| template.slug | string | nie** | Slug szablonu, który może wysłać Twój obszar roboczy; slugi zarządzane przez Bird zaczynają się od bird_ |
| template.language | string | nie* | Tag języka szablonu (en, pt-BR); pomiń, aby wysłać domyślny język szablonu |
| template.components | array | nie | Wypełnia zmienne szablonu; type komponentu to body lub button |
| template.components[].parameters[].name | string | nie† | Placeholder, który ta wartość wypełnia, np. ref; wymagane i musi odpowiadać zadeklarowanym nazwom szablonu dla szablonu z nazwanymi parametrami, pomijane dla pozycyjnego |
| interactive | object | nie** | Tekst body plus jeden typ treści do dotknięcia; wiadomość serwisowa, więc wymaga otwartego okna serwisowego. Zobacz Wiadomości interaktywne |
| in_reply_to_message_id | string | nie | Identyfikator wiadomości WhatsApp posiadany przez ten obszar roboczy, cytowany w wysyłanej wiadomości; zwracany przy odczytach. Zobacz Cytowanie wiadomości |
| tags | array | nie | Do 20 etykiet {name, value}; nazwa ≤ 32 znaki, wartość ≤ 64, nazwy unikalne |
| metadata | object | nie | Dowolny JSON, do 2 KB po serializacji |
* language jest opcjonalne; pominięcie wysyła domyślny język szablonu.
† name jest wymagane na każdym parametrze dla szablonu z nazwanymi parametrami. Pomiń je dla szablonu pozycyjnego. Zobacz Komponenty i parametry.
** Przekaż dokładnie jedno z template lub pole treści wiadomości serwisowej (text, image, video, audio, sticker, document, location, interactive); zobacz Wiadomości serwisowe.
Model asynchroniczny: co oznacza 202
Udana wysyłka zwraca 202 Accepted z identyfikatorem wiadomości i status: accepted. 202 jest zwracany dopiero po trwałym zaakceptowaniu wysyłki; nigdy nie jest akceptowany, a potem po cichu odrzucany. Twarde błędy, które możesz naprawić, kończą się natychmiast z 422: nieprawidłowy odbiorca, nieznany slug lub język szablonu, niedopasowanie parametrów albo wiadomość serwisowa wysłana do zamkniętego okna obsługi klienta (WhatsAppServiceWindowClosed). Brak środków na portfelu nie jest jednym z nich: wysyłka jest akceptowana, a wiadomość kończy się jako rejected z insufficient_balance, gdy Bird próbuje ją obciążyć. Faktyczne dostarczenie odbywa się asynchronicznie: wiadomość przechodzi do sent, gdy przekazujemy ją do WhatsApp, a następnie do statusu końcowego (delivered lub failed), gdy nadejdzie potwierdzenie, raportowane przez zdarzenia, webhooki i endpointy odczytu. Potwierdzenie odczytu jest prezentowane osobno jako znacznik czasu read_at i zdarzenie whatsapp.read, a nie jako status.
Uwaga dotycząca prywatności: dla szablonów kategorii authentication API nigdy nie zwraca wypełnionych wartości. Echo 202 i każdy późniejszy odczyt zawierają pustą tablicę components dla tych wiadomości, więc kod weryfikacyjny nigdy nie pojawia się ponownie.
Bezpieczne ponawianie
Wyślij nagłówek Idempotency-Key z unikalną wartością na logiczną wysyłkę, a ponawianie staje się bezpieczne. Jeśli Twoje pierwsze żądanie się powiodło, ale nigdy nie zobaczyłeś odpowiedzi (timeout, zerwane połączenie), ponowne wysłanie z tym samym kluczem zwraca oryginalny wynik zamiast wysyłania i naliczania opłaty za zduplikowaną wiadomość. Ponowiona odpowiedź zawiera nagłówek Idempotency-Replay. Zobacz idempotencja, aby poznać format klucza i czas przechowywania.
Odbieranie odpowiedzi
Wiadomości przychodzące trafiają na ten sam zasób co wychodzące, a każda z nich resetuje okno serwisowe. Odbieranie wiadomości WhatsApp opisuje ich odczytywanie przez API, pobieranie mediów wysłanych przez kontakt i webhook whatsapp.received.
Koszty i rozliczenia
WhatsApp jest wyceniany za wiadomość, na podstawie kategorii szablonu i kraju odbiorcy; zobacz cennik WhatsApp. Wiadomość jest obciążana w dwóch krokach, w dwóch różnych momentach, a obiekt cost na wiadomości raportuje oba:
| Pole | Co to jest | Kiedy się pojawia |
|---|---|---|
| transaction_amount | Opłata Bird za obsługę wysyłki | Gdy Bird przetwarza zaakceptowaną wysyłkę, przed dispatchem |
| passthrough_amount | Udział Meta w cenie wiadomości, przekazywany przez Bird | Gdy nadejdzie odpowiedni receipt delivered lub read |
| amount | Suma wycenionych dotychczas składników | Rośnie w miarę pojawiania się kolejnych składników |
| currency_code | Waluta portfela Twojej organizacji, wspólna dla obu składników | Z pierwszym składnikiem |
Obie kwoty to stringi dziesiętne, netto (bez podatku).
Oba składniki są wyceniane na podstawie różnych danych wejściowych. Opłata Bird korzysta z kategorii wysłanego szablonu i kraju odbiorcy, który pochodzi z kodu kraju numeru telefonu lub, w przypadku wysyłki do identyfikatora użytkownika w zakresie firmy, z dwuliterowego prefiksu tego identyfikatora. Udział Meta korzysta z kategorii, którą Meta sama raportuje na odpowiednim potwierdzeniu, co może się różnić od kategorii szablonu: Meta może zgłosić authentication-international, gdy mają zastosowanie jej reguły dotyczące miejsca docelowego, lokalizacji firmy i kwalifikowalności. Zobacz stawki authentication-international WhatsApp.
To, co cost zwraca, zależy od tego, jak daleko wiadomość dotarła:
- W momencie 202 cost jest null. Nic nie zostało wycenione.
- Po przetworzeniu transaction_amount jest ustawione i amount jest mu równe. passthrough_amount pozostaje null.
- Po odpowiednim potwierdzeniu delivered lub read pomyślnie zarejestrowana opłata Meta wypełnia passthrough_amount, a amount odzwierciedla zarejestrowane składniki.
Składnik null oznacza, że w tej projekcji nie zarejestrowano kwoty; nie jest dowodem, że wiadomość była bezpłatna. Składnik jawnie wyceniony na zero zwraca "0.00000".
Oba obciążenia reagują na błędy inaczej. Opłata Bird działa w trybie fail-closed: gdy nie może przejść po 202, ponieważ portfel nie pokrywa wysyłki lub trasa nie ma skonfigurowanej ceny, wiadomość kończy się jako rejected z kodem błędu insufficient_balance lub price_not_found i nic nie jest obciążane. Wiadomość rejected nigdy nie dotarła do WhatsApp, i to odróżnia ją od failed. Udział Meta działa w trybie fail-open: jeśli portfel nie ma środków lub brakuje stawki, gdy nadejdzie potwierdzenie, obciążenie jest pomijane bez cofania obserwowanego stanu wiadomości. Dostarczenie nigdy nie jest wstrzymywane przez drugie obciążenie.
Wiadomość obciążona przez Bird zachowuje to obciążenie wychodzące, nawet jeśli dostarczenie później się nie powiedzie. Opłata Meta jest przetwarzana z odpowiedniego callbacku delivered lub read, gdy Meta zgłasza regularne ceny z rozwiązywalną kategorią i miejscem docelowym. Obie ścieżki callbacków używają tej samej tożsamości opłaty i polegają na deduplikacji usługi rozliczeniowej. Porównuj ponowione potwierdzenia z rekordami rozliczeniowymi, zamiast traktować projekcję wiadomości jako trwałe potwierdzenie obciążenia. Cennik serwisowy lub free-entry może sprawić, że składnik Meta wyniesie zero; nierozwiązany składnik nie jest dowodem, że wiadomość była bezpłatna.
Do uzgadniania finansowego używaj księgi rozliczeniowej. Pola cost na wiadomości to projekcje obciążeń, które mogą być opóźnione lub niekompletne. Zobacz metryki WhatsApp, aby poznać różnicę między obserwacjami wiadomości a rekordami rozliczeniowymi.
Zdarzenia WhatsApp nie zawierają kosztów. Aby odczytać którykolwiek składnik, odczytaj wiadomość ponownie za pomocą GET /v1/whatsapp/messages/{id}.
Następne kroki
- Wiadomości serwisowe: dziewięć typów treści dowolnej i co każdy z nich przyjmuje
- Odbieranie wiadomości WhatsApp: wiadomości przychodzące, media i webhook whatsapp.received
- Identyfikatory użytkowników w zakresie firmy: adresowanie kontaktu, który skontaktował się z Tobą bez numeru telefonu
- Szablony: przeglądaj katalog i odczytuj zmienne szablonu
- Idempotencja: bezpieczne ponawianie z nagłówkiem Idempotency-Key
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