API ile WhatsApp Mesajı Gönderme: cURL, Node, Python, PHP
API ile WhatsApp mesajı nasıl gönderilir: şablon ve oturum mesajları için çalışan cURL, Node.js, Python ve PHP örnekleri, durum takibi ve hata yönetimi.
Yazar: OmniChannels.ai Editorial Team · İnceleyen: BroadNet Messaging Solutions Team
Entegrasyon
Kısa yanıt
OmniChannels.ai API'siyle her WhatsApp mesajını tek bir uç noktadan gönderirsiniz: Authorization: Bearer başlığıyla multipart form verisi olarak POST https://api.broadnet.me/whatsapp/message/sendbulk. messageType alanı yükü seçer: sohbeti başlatmak veya 24 saatlik pencerenin dışında yazmak için gereken onaylı şablonlar için TEMPLATE, pencere içindeki yanıtlar için TEXT, IMAGE veya INTERACTIVE.
Bu sayfada
- API üzerinden WhatsApp mesajı nasıl gönderirim?
- Şablon mu oturum mesajı mı: hangisini göndermeliyim?
- Onaylı bir şablonu nasıl gönderirim?
- Hangi istek alanları en önemlidir?
- Düğmeli bir şablonu veya OTP'yi nasıl gönderirim?
- Müşteri hizmetleri penceresi içinde nasıl yanıt veririm?
- İletimi nasıl takip ederim?
- Hangi hataları yönetmeliyim?
- Örnek senaryo: Bir sipariş bildirim servisi
- Yaygın hatalar nelerdir?
- OmniChannels.ai nasıl yardımcı olur?
Öne çıkan noktalar
- Tüm WhatsApp mesajları POST /whatsapp/message/sendbulk üzerinden gider; messageType (TEMPLATE, TEXT, IMAGE, INTERACTIVE ve diğerleri) hangi alanların zorunlu olduğunu belirler.
- İstek JSON değil multipart/form-data'dır; bu yüzden Python'da files=, PHP'de url-encode'u önlemek için dizi gövdesi gerekir.
- 24 saatlik müşteri hizmetleri penceresinin dışında yalnızca onaylı bir şablon gönderilebilir; pencere içinde serbest metin, medya ve etkileşimli mesajlar gönderebilirsiniz.
- Çağrı mesajları kuyruğa alır ve hemen bir batchId döndürür; alıcı bazlı durumlar webhook'unuza ve bulk-insights uç noktasından gelir.
- API idempotency anahtarı almaz; bu yüzden her gönderimi çağrıdan önce kaydedin ve zaman aşımından sonra yeniden göndermek yerine durumu kontrol edin.
Bu rehber, bir uygulamaya WhatsApp gönderimi entegre eden geliştiriciler için hazırlandı. cURL, Node.js, Python ve PHP'de çalışan istekleri gösterir, şablon ile oturum mesajları arasındaki farkı açıklar ve takip ile hataları kapsar. Her uç nokta ve alan WhatsApp API referansımızdan ve OpenAPI belirtimimizden gelir.
API üzerinden WhatsApp mesajı nasıl gönderirim?
Form alanlarıyla https://api.broadnet.me/whatsapp/message/sendbulk adresine kimliği doğrulanmış tek bir POST yaparsınız. messageType alanı mesaj türünü seçer ve yanıt mesajların kuyruğa alındığını doğrular.
| Öğe | Değer |
|---|---|
| Temel URL | https://api.broadnet.me (/v1 öneki yok) |
| Uç nokta | POST /whatsapp/message/sendbulk |
| Kimlik doğrulama | Authorization: Bearer $BROADNET_TOKEN |
| İçerik türü | multipart/form-data (HTTP istemciniz tarafından otomatik ayarlanır) |
| Yanıt | batchId içeren JSON batch özeti |
Test kimlik bilgileri kısa bir erişim talebinden sonra verilir ve test gönderimleri doğrulanmış kendi numaralarınıza gider. Hızlı başlangıç ve kimlik doğrulama sayfalarına bakın. Token'ı yalnızca sunucunuzda tutun.
Şablon mu oturum mesajı mı: hangisini göndermeliyim?
Sohbeti başlatmak veya pencerenin dışında yazmak için şablon, müşteri son 24 saat içinde size yazdıysa oturum mesajı gönderin. Bu kuralı biz değil Meta koyar.
| Şablon mesajı | Oturum mesajı | |
|---|---|---|
messageType |
TEMPLATE |
TEXT, IMAGE, VIDEO, AUDIO, DOCUMENT, INTERACTIVE ve diğerleri |
| Ne zaman izinli | Şablon onaylandıktan sonra her zaman | Yalnızca müşteri hizmetleri penceresi açıkken |
| Onay gerekir mi | Evet, Meta tarafından | Hayır |
| Tipik kullanım | Sipariş güncellemeleri, OTP, hatırlatmalar, kampanyalar | Destek yanıtları, sorulara cevaplar |
Meta teslim edilen mesaj başına kategoriye göre ücret alır ve hizmet mesajları ile bilgilendirme (Utility) şablonlarına ilişkin kuralları 1 Ekim 2026'da değişti. Pencere rehberimiz mekaniği, fiyat sayfamız ve hesaplayıcımız maliyeti kapsar.
Onaylı bir şablonu nasıl gönderirim?
messageType=TEMPLATE yapın, şablonun adını ve dil kodunu belirtin ve değişken değerlerini geçirin. Yeni bir batch başlatmak için batchId=0 kullanın.
curl -X POST https://api.broadnet.me/whatsapp/message/sendbulk \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-F batchId=0 \
-F campaignName=order-updates \
-F destinationNo=971500000000 \
-F messageType=TEMPLATE \
-F templateName=order_update \
-F templateLanguage=en_US \
-F bodyTemplateVariables=INV-400
// Node.js 18+ (yerleşik fetch ve FormData)
const form = new FormData();
form.append("batchId", "0");
form.append("campaignName", "order-updates");
form.append("destinationNo", "971500000000");
form.append("messageType", "TEMPLATE");
form.append("templateName", "order_update");
form.append("templateLanguage", "en_US");
form.append("bodyTemplateVariables", "INV-400");
const res = await fetch("https://api.broadnet.me/whatsapp/message/sendbulk", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BROADNET_TOKEN}` }, // fetch multipart sınırını kendisi ayarlar
body: form,
});
console.log(await res.json());
import os
import requests
fields = {
"batchId": "0",
"campaignName": "order-updates",
"destinationNo": "971500000000",
"messageType": "TEMPLATE",
"templateName": "order_update",
"templateLanguage": "en_US",
"bodyTemplateVariables": "INV-400",
}
# Her alanı url-encode (data=) yerine multipart parçası (files=) olarak gönderin.
r = requests.post(
"https://api.broadnet.me/whatsapp/message/sendbulk",
headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
files={k: (None, v) for k, v in fields.items()},
timeout=30,
)
print(r.json())
<?php
$ch = curl_init("https://api.broadnet.me/whatsapp/message/sendbulk");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BROADNET_TOKEN")],
// Dize değil dizi, cURL'un multipart/form-data göndermesini sağlar.
CURLOPT_POSTFIELDS => [
"batchId" => "0",
"campaignName" => "order-updates",
"destinationNo" => "971500000000",
"messageType" => "TEMPLATE",
"templateName" => "order_update",
"templateLanguage" => "en_US",
"bodyTemplateVariables" => "INV-400",
],
]);
echo curl_exec($ch);
curl_close($ch);
Hedef, ülke kodu artı numara, yalnızca rakamlardır. Çağrı hemen bir batch özetiyle döner:
{
"totalFiles": 1,
"totalSuccess": 1,
"totalFailed": 0,
"totalDuplicates": 0,
"batchId": "2609091405000000001",
"fileResults": [
{
"fileName": "direct",
"totalRecords": 1,
"successCount": 1,
"failedRecipients": [],
"duplicateRecipients": []
}
],
"message": "Messages queued for delivery"
}
batchId değerini kendi kaydınızın yanında saklayın. "Kuyruğa alındı", "iletildi" değildir.
Hangi istek alanları en önemlidir?
Hangi alanların zorunlu olduğu messageType değerine bağlıdır. Yaygın olanlar şunlardır.
| Alan | Zorunlu | Açıklama |
|---|---|---|
messageType |
Evet | TEXT, IMAGE, VIDEO, AUDIO, DOCUMENT, STICKER, LOCATION, CONTACTS, TEMPLATE, INTERACTIVE, REACTION veya FLOW |
destinationNo veya destinationFiles |
İkisinden biri | Virgül, noktalı virgül veya yeni satırla ayrılmış numaralar; ya da bir TXT, CSV veya XLSX dosyası |
batchId |
Hayır | 0 yeni bir batch başlatır |
campaignName |
Hayır | Raporlama için kendi etiketiniz |
allowDuplicate |
Hayır | false mükerrer alıcıları kaldırır |
templateName, templateLanguage |
TEMPLATE için |
Onaylı şablon adı ve en_US veya ar gibi dil kodu |
bodyTemplateVariables |
Şablona göre | Gövde değişken değeri; adlandırılmış parametreler JSON olarak geçirilir |
buttonsTemplateVariable |
Şablona göre | Dinamik düğme değeri: URL soneki, kupon kodu veya OTP kodu |
content |
TEXT için |
En çok 4.096 karakterlik metin gövdesi veya medya için bir başlık |
mediaUrl |
Türe göre | Medyanın herkese açık HTTPS URL'si |
interactivePayload |
INTERACTIVE için |
Meta'nın etkileşimli nesnesi, JSON dizesi olarak |
Zamanlama scheduled, scheduleTime ve gmt kullanır; delay iletimi yavaşlatır. Tam liste WhatsApp API referansında.
Düğmeli bir şablonu veya OTP'yi nasıl gönderirim?
Düğme değerini buttonsTemplateVariable içine ekleyin. Kod kopyalama düğmeli bir kimlik doğrulama şablonu için kodu hem gövde hem düğme alanlarında geçirin.
curl -X POST https://api.broadnet.me/whatsapp/message/sendbulk \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-F batchId=0 \
-F destinationNo=971500000000 \
-F messageType=TEMPLATE \
-F templateName=login_code \
-F templateLanguage=en_US \
-F bodyTemplateVariables=482913 \
-F buttonsTemplateVariable=482913
Burada login_code, kendi onaylı kimlik doğrulama şablonunuz için bir yer tutucudur. Birden fazla düğme için buttonsTemplateVariable bir JSON dizisi alır. Kodu sunucunuzda üretin, geçerlilik süresiyle hash'lenmiş saklayın ve asla günlüğe yazmayın. OTP rehberimiz tek dokunuşlu, sıfır dokunuşlu ve kod kopyalama iletimini kapsar.
Müşteri hizmetleri penceresi içinde nasıl yanıt veririm?
Bir oturum mesajı türü kullanın. Düz metin yanıtı için messageType=TEXT ve content gerekir.
curl -X POST https://api.broadnet.me/whatsapp/message/sendbulk \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-F batchId=0 \
-F destinationNo=971500000000 \
-F messageType=TEXT \
-F campaignName=support \
-F "content=Your order has shipped. Reply here if you need anything."
Yanıt düğmeleri için messageType=INTERACTIVE ve Meta'nın etkileşimli mesaj biçimini izleyen bir interactivePayload gönderin.
curl -X POST https://api.broadnet.me/whatsapp/message/sendbulk \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-F batchId=0 \
-F destinationNo=971500000000 \
-F messageType=INTERACTIVE \
-F campaignName=support \
-F 'interactivePayload={"type":"button","body":{"text":"Confirm your delivery slot?"},"action":{"buttons":[{"type":"reply","reply":{"id":"slot_ok","title":"Confirm"}},{"type":"reply","reply":{"id":"slot_change","title":"Change"}}]}}'
Gelen bir mesajı okundu olarak işaretlemek ve isteğe bağlı olarak yazıyor göstergesi göstermek için JSON ile POST /whatsapp/message/read çağırın:
curl -X POST https://api.broadnet.me/whatsapp/message/read \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "messageId": "wamid.HBgMOTcxNTAwMDAwMDAwFQIAEhgg", "typing": true }'
Tasarım rehberliği için etkileşimli mesajlar rehberimize bakın.
İletimi nasıl takip ederim?
Durumlar hesabınızda yapılandırılan webhook'a itilir ve batch bazında da okunabilir. Her alıcı SUBMITTED, SENT, DELIVERED ve READ aşamalarından ilerler ya da bir nedenle FAILED veya REJECTED olarak sonlanır.
curl "https://api.broadnet.me/whatsapp/message/bulk-insights?batch_Id=2609091405000000001&status=FAILED&page=0&size=50" \
-H "Authorization: Bearer $BROADNET_TOKEN"
batch_Id zorunludur; status, destination, search, page ve size isteğe bağlıdır ve page sıfırdan başlar. Kaçırılan olaylar için polling'i yedek olarak kullanın ve alıcınızı webhook rehberimizde anlatıldığı gibi oluşturun. Batch'ler ayrıca referanstaki batch uç noktalarıyla duraklatılabilir, sürdürülebilir ve iptal edilebilir.
Hangi hataları yönetmeliyim?
Önce HTTP durumunu, sonra hata gövdesini okuyun. API hataları beş alanlı bir JSON gövdesiyle bildirir ve WhatsApp'a özgü başarısızlıklar Meta'dan gelebilir.
| Durum | Anlamı | Eylem |
|---|---|---|
400 |
Türe özgü eksik alan veya geçersiz hedef gibi doğrulama hatası | İsteği düzeltin; değiştirmeden yeniden denemeyin |
401 / 403 |
Eksik veya geçersiz token ya da izin verilmeyen işlem | Token'ı düzeltin veya işlemi etkinleştirmemizi isteyin |
404 |
Şablon veya gönderici bulunamadı | Şablon adını ve dilini kontrol edin |
413 |
Yüklenen dosya çok büyük | Dosyayı küçültün |
429 |
Hız sınırı | Retry-After süresini bekleyin |
502 |
Meta çağrıyı reddetti; message Meta'nın hata kodunu ve metnini taşır |
Okuyun; yalnızca geçiciyse yeniden deneyin |
500, 503, 504 |
Sunucu veya yukarı akış sorunu | Üstel backoff ve jitter ile yeniden deneyin |
Hata kodları rehberimiz yaygın Meta kodlarını açıklar. İdempotency anahtarı olmadığı için Hatalar ve limitler sayfasındaki mükerrer koruma adımlarını izleyin: önce bekleyen bir kayıt yazın, dönen batchId'yi saklayın ve zaman aşımından sonra yeniden göndermeden önce durumu kontrol edin.
Örnek senaryo: Bir sipariş bildirim servisi
BAE'li bir perakendeci olan "Souq Rafiq" (kurgusal), bir sipariş kargoya verildiğinde order_update şablonunu gönderir.
- Sipariş servisi,
order-8842-shippedanahtarlı vependingdurumlu bir satır yazar. - Şablon ve sipariş numarasını
bodyTemplateVariablesolarak verereksendbulkçağırır. 200alıncabatchId'yi saklar ve satırıacceptedolarak işaretler.- Webhook işleyicisi satırı
DELIVEREDveyaREADya da nedenleFAILEDolarak günceller. - Müşteri yanıt verirse destek aracı pencere içinde
TEXToturum mesajı kullanır. - Gece çalışan bir iş dünkü batch'ler için
bulk-insights'ı okur ve eksik durumları mutabık hale getirir.
Yaygın hatalar nelerdir?
- JSON göndermek. WhatsApp gönderim uç noktası multipart'tır;
Content-Type: application/jsonçalışmaz. files=yerine Pythondata=; bu, formu url-encode eder.- Pencere dışında serbest metin; başarısız olur. Şablon kullanın.
- Yanlış dil kodu; şablonun
en_USdeğeri yerineengibi. 200'ü iletildi saymak. Kuyruğa alındı demektir.- Zaman aşımından sonra kör yeniden denemeler; bir müşteriye iki kez mesaj gidebilir.
- İstemci kodunda token. API'yi yalnızca arka ucunuzdan çağırın.
- Limitler: yük ayrıntıları şablona göre değişir. İlk kişiselleştirilmiş kampanyanız için değişken düzenini ekibimizle teyit edin.
OmniChannels.ai nasıl yardımcı olur?
BroadNet resmi bir Meta Business Solution Provider'dır ve WhatsApp Business API'ye devreye alma Meta Embedded Signup kullanır; ekibimiz kaydı sizinle birlikte hazırlar, onaylar Meta'da kalır. REST API bir OpenAPI 3.1 belirtimi ve bir TypeScript SDK'sı olan @broadnet/cpaas-sdk ile belgelenmiştir; iletim durumları kanallar arasında normalleştirilir. WhatsApp API belgeleriyle veya hızlı başlangıçla başlayın.
Sık sorulan sorular
WhatsApp mesajlarını JSON olarak mı yoksa form verisi olarak mı gönderirim?
Form verisi olarak. WhatsApp gönderim uç noktası POST /whatsapp/message/sendbulk, her alanı bir form parçası olarak multipart/form-data kabul eder. SMS tekli gönderimleri JSON kullanır; bu yaygın bir karışıklık kaynağıdır. Python'da alanları data= yerine files= ile, PHP'de cURL'un multipart oluşturması için gövde olarak bir dizi gönderin.
Şablon olmadan WhatsApp mesajı gönderebilir miyim?
Yalnızca müşteri hizmetleri penceresi içinde. Bir müşteri size mesaj yazdığında 24 saatlik bir pencere açılır ve metin, medya veya etkileşimli mesajlarla yanıt verebilirsiniz. Pencerenin dışında veya bir sohbeti başlatmak için onaylı bir şablon göndermeniz gerekir. API Meta'nın kurallarını uygular; kapalı bir pencereye serbest metin gönderimi başarısız olur.
Mesajın iletilip iletilmediğini nasıl anlarım?
Gönderim çağrısı yalnızca mesajların kuyruğa alındığını doğrular ve bir batchId döndürür. Alıcı bazlı durumlar SUBMITTED, SENT, DELIVERED ve READ aşamalarından ilerler ya da FAILED veya REJECTED olarak sonlanır. Webhook'unuza itilirler ve ayrıca bulk-insights uç noktasından batch bazında okuyabilirsiniz.
Tek istekte birçok alıcıya gönderebilir miyim?
Evet. destinationNo virgül, noktalı virgül veya yeni satırla ayrılmış birden fazla numara, destinationFiles ise bir TXT, CSV veya XLSX dosyası kabul eder. Alıcı başına farklı değişkenli bir şablon için alıcı başına bir satır içeren kişiselleştirilmiş bir dosya yükleyin. Mükerrer numaraları kaldırmak için allowDuplicate değerini false yapın.
Mükerrer gönderimleri önleyen bir idempotency anahtarı var mı?
Hayır. API idempotency anahtarı kabul etmez. Bir istek zaman aşımına uğrarsa istemci tarafından kabul edilip edilmediğini anlayamazsınız. Her gönderimi çağırmadan önce kendi veritabanınızda kaydedin, dönen batchId'yi saklayın ve herhangi bir yeniden denemeden önce durumu ya da batch listesini kontrol edin.
Göndermeden önce opt-in gerekir mi?
Evet. Meta'nın politikası, her alıcının işletmenizden mesaj almayı kabul etmiş olmasını gerektirir ve şablonlar kullanımdan önce onaylanmalıdır. API sizin yerinize onayı kontrol etmez. Opt-in'i kaynağında toplayın, kanıtı saklayın ve opt-out yapanları bastırın.
Kaynaklar
Okumaya devam edin
Diğer rehberlerEntegrasyon
WhatsApp Webhook Rehberi: Olaylar, Güvenlik ve Yeniden Denemeler
WhatsApp webhook'ları nasıl çalışır: mesaj ve durum olayları, güvenilir işleyici, Meta imza kontrolü, yeniden denemeler, idempotency ve kayıp olayları kurtarma.
10 dk okuma
Entegrasyon
API ile SMS Gönderme: Python, Node.js, PHP ve cURL Örnekleri
Python, Node.js, PHP ve cURL ile SMS API: tekli ve toplu gönderim, Unicode ve Arapça, segment sayımı, iletim durumu webhook'ları ve hata yönetimi.
10 dk okuma
WhatsApp
WhatsApp OTP ve SMS OTP Karşılaştırması: Maliyet ve Fallback
WhatsApp OTP ve SMS OTP karşılaştırması: maliyet, iletim, kullanıcı deneyimi, kimlik doğrulama şablonları, SMS'e fallback ve dolandırıcılık kontrolleri.
10 dk okuma
