TL;DR: Whapi.Cloud'un REST API'si, WhatsApp Kanallarındaki yedi gönderi türü üzerinde tam programatik kontrol sağlar -- metin, görsel, video, anket, sesli mesaj, çıkartma ve bağlantı önizlemesi. Minimum çalışır kurulum: bir Bearer token, Kanal kimliğiniz 120363171744447809@newsletter formatında ve to alanı Kanal kimliğine ayarlanmış şekilde https://gate.whapi.cloud/messages/{type} adresine bir POST. Medya türleri (görsel, video, ses, çıkartma), base64 ile kodlanmış bir dosya veya genel URL ile media alanını kullanır.
Whapi.Cloud'un REST API'si, her WhatsApp Kanalı gönderi türü üzerinde eksiksiz komut dosyası kontrolü sunar. Bu rehber, bugün bir zamanlayıcıya ekleyebileceğiniz çalışan Python koduyla yedi türün tamamını kapsar. Endpoint deseni her birinde aynıdır: Bearer token ile kimlik doğrulama, to alanını Kanal kimliğinize ayarlama, türe özgü alanları ekleme ve POST isteği gönderme. Meta onayı yok, şablon ön kaydı yok.
WhatsApp Kanalları Nedir ve Neden Otomatikleştirilmeli?
WhatsApp Kanalları gönderileri tüm takipçilere aynı anda iletir. Takipçiler emoji tepkileriyle yanıt verebilir ancak mesaj gönderemez; yalnızca Kanal yöneticisi yayın yapabilir.
Her sabah WhatsApp uygulamasında manuel olarak içerik oluşturmak, planlı kampanyalar veya çok formatlı içerik pipeline'ları için ölçeklenemez. WhatsApp Business uygulamasında yerleşik bir zamanlayıcı yoktur. Resmi Meta Cloud API, Kanalları programatik olarak hiç sunmamaktadır. Whapi.Cloud, bu boşluğu Kanal yayıncılığı için tam bir REST arayüzüyle doldurur. Tam özellik listesi için WhatsApp Channels API sayfasına bakın.
Ön Koşullar: API Token, Kanal Kimliği Formatı ve Kurulum
Bu rehberdeki herhangi bir örneği çalıştırmadan önce üç şeye ihtiyacınız var: aktif bir kanal bağlantısıyla bir Whapi.Cloud hesabı, panelinizden bir API token ve gönderi yapmak istediğiniz Kanalın kimliği.
- panel.whapi.cloud/register adresine kayıt olun ve WhatsApp numaranızı QR kodu ile bağlayın.
- Kanal panosundan API token'ınızı kopyalayın; bu, tüm istekler için Bearer token'ınızdır.
- Kanal kimliğinizi bulun: WhatsApp Kanalınızı açın, davet bağlantısını paylaşın ve URL'den sayısal kimliği çıkarın. API formatı
@newsletterekler -- örneğin,120363171744447809@newsletter. - Erişimi doğrulayın: Bearer token'ınızla
GET https://gate.whapi.cloud/newslettersçağrısı, bağlı numaranın yönettiği Kanalların kimliklerini de içeren listesini döndürür.
Aşağıdaki tüm örnekler temel URL olarak gate.whapi.cloud ve requests kütüphanesini kullanır. pip install requests ile yükleyin. Tam API referansı ve parametre belgeleri için Whapi.Cloud bilgi bankasındaki Kanal yayıncılığı rehberine bakın.
API ile WhatsApp Kanalına Metin Gönderisi Gönderme
Metin en basit gönderi türüdür ve diğer tüm türlerin temelidir. Önce bunu çalışır hale getirin, sonra deseni medya ve anketlere genişletin.
to alanı Kanal kimliğini doğrudan kabul eder -- özel bir kanal endpoint'i gerekmez; aynı /messages/text endpoint'i bireysel sohbetlere, gruplara ve Kanallara eşit şekilde hizmet eder. Tek fark, alıcı kimliğindeki @newsletter son ekidir.
Zorunlu alanlar to (Kanal kimliğiniz) ve body (mesaj metni) şeklindedir. WhatsApp biçimlendirme işaretlemesi, Kanal gönderilerinde normal mesajlardaki gibi çalışır: *yıldız işaretleriyle* kalın, _alt çizgilerle_ italik, `ters tırnaklarla` tek aralık.
import requests
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_text_post(text: str) -> dict:
"""Send a plain text post to a WhatsApp Channel. Returns the API response."""
url = f"{BASE_URL}/messages/text"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"body": text,
}
try:
response = requests.post(url, headers=headers, json=payload, timeout=30)
if response.status_code == 401:
raise ValueError("Authentication failed -- verify your API token in the dashboard")
if response.status_code == 429:
raise RuntimeError("Rate limit hit -- reduce send frequency and add backoff")
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"[ERROR] Text post failed: {e}")
raise
# Usage
result = send_text_post(
"*Weekly recap* -- here is what happened in our community this week.\n\n"
"- New feature launched\n"
"- Support hours extended\n"
"- Next webinar: Friday 3 PM UTC"
)
print(f"Sent. Message ID: {result['sent_message']['id']}")
Yanıt, sent_message.id değerini içerir; gönderiyi daha sonra düzenlemeniz veya referans almanız gerekirse bunu saklayın. Aynı endpoint'teki edit parametresi, mesaj kimliğini ileterek zaten gönderilmiş bir gönderiyi güncellemenize olanak tanır.
API ile WhatsApp Kanalına Görsel Gönderisi Gönderme
Görsel gönderileri iki adımlı bir süreç gerektirir: medyayı hazırlayın, ardından Kanala gönderin. API, JPEG ve PNG dosyalarını kabul eder.
media alanı, base64 ile kodlanmış bir veri URI'si, genel bir HTTPS URL'si veya önceki bir yüklemeden alınan medya kimliğini kabul eder -- üçü de takipçinin ekranında aynı sonucu üretir.
Aşağıdaki örnek yerel bir dosyayı okur, base64'e kodlar ve tek bir çağrıda yayınlar. 5 MB'ı aşan dosyalar için önce dosyayı yüklemek ve barındırılan URL almak üzere POST /media kullanın, ardından media alanında bu URL'ye başvurun. Bu, yavaş bağlantılarda payload boyutu sorunlarını önler. İsteğe bağlı caption alanı, takipçinin Kanal akışında görselin altına metin ekler.
import requests
import base64
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_image_post(image_path: str, caption: str = "") -> dict:
"""
Two-step image post to a WhatsApp Channel.
Step 1 -- read local file and encode as base64 data URI.
Step 2 -- POST to /messages/image with the encoded media.
Accepts JPEG or PNG. Returns the API response.
"""
# Step 1: Read and encode the image
with open(image_path, "rb") as f:
image_bytes = f.read()
mime = "image/jpeg" if image_path.lower().endswith((".jpg", ".jpeg")) else "image/png"
media_b64 = f"data:{mime};base64,{base64.b64encode(image_bytes).decode()}"
# Step 2: Post to the Channel
url = f"{BASE_URL}/messages/image"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"media": media_b64,
"caption": caption, # optional: text displayed below the image
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
return response.json()
# Usage
result = send_image_post(
"campaign_banner.jpg",
"Our spring sale starts today -- 30% off sitewide."
)
print(f"Image post sent. ID: {result['sent_message']['id']}")
Dosya kodlamak yerine genel bir URL iletmek için media_b64'ü doğrudan URL dizesiyle değiştirin: "media": "https://yourcdn.com/image.jpg". Whapi.Cloud, dosyayı sizin adınıza indirir ve iletir. Varlıklarınız zaten barındırılıyorsa bu daha hızlı bir yoldur.
API ile WhatsApp Kanalına Video Gönderisi Gönderme
Video gönderileri, görsellerle aynı yapıyı izler. Tek değişiklikler, endpoint yolu ve veri URI'sindeki MIME türüdür.
Video dosyalarını 16 MB'ın altında ve MP4 formatında tutun. WhatsApp bunu teslimat katmanında uygular ve uyumsuz dosyaları takipçilere ulaşmadan reddeder. Daha uzun kayıtlar için göndermeden önce kırpın veya sıkıştırın.
caption alanı, görsellerle aynı şekilde çalışır. Videolar Kanal akışında satır içi olarak görüntülenir ve WhatsApp'tan çıkmadan dokunarak oynatılır.
import requests
import base64
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_video_post(video_path: str, caption: str = "") -> dict:
"""
Two-step video post to a WhatsApp Channel.
Step 1 -- read MP4 file and encode as base64 data URI.
Step 2 -- POST to /messages/video.
Video must be MP4 format, under 16 MB. Returns the API response.
"""
# Step 1: Read and encode the video
with open(video_path, "rb") as f:
video_bytes = f.read()
media_b64 = f"data:video/mp4;base64,{base64.b64encode(video_bytes).decode()}"
# Step 2: Post to the Channel
url = f"{BASE_URL}/messages/video"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"media": media_b64,
"caption": caption,
}
response = requests.post(url, headers=headers, json=payload, timeout=120)
response.raise_for_status()
return response.json()
# Usage
result = send_video_post("product_demo.mp4", "See how it works in 90 seconds.")
print(f"Video post sent. ID: {result['sent_message']['id']}")
Büyük video dosyaları için timeout=120 veya daha yüksek bir değer ayarlayın. 10 MB'lık bir videoyu base64 ile kodlamak ~14 MB'lık bir payload üretir ve yavaş bağlantılar POST'u tamamlamak için varsayılan 30 saniyelik pencereden fazlasına ihtiyaç duyabilir.
API ile WhatsApp Kanalınızda Anket Düzenleme
WhatsApp Kanalı anket otomasyonu, pasif bir yayını yapılandırılmış izleyici geri bildirimine dönüştürür; takipçiler uygulamadan çıkmadan oy vermek için dokunur.
Tek seçimli anketler için count'u 1 olarak ayarlayın, çoklu seçimlere izin vermek için 0 kullanın. Sıfır, sıfır seçenek değil, sınırsız seçenek anlamına gelir. options alanı düz bir dize listesi alır; seçenek kimliği veya ağırlığı gerekmez.
Anket sonuçları yayıncılık API'si tarafından döndürülmez. Tepkiler ve oy sayıları ayrı bir alma konusudur. Bu endpoint anketi oluşturur ve gönderir. Haftalık bir izleyici anketi otomatikleştirmek için aşağıdaki işlevi bir zamanlayıcıya sarın ve title ile options'ı bir yapılandırma dosyasından veya veritabanından değiştirin.
import requests
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_poll_post(question: str, options: list, allow_multiple: bool = False) -> dict:
"""
Send a poll to a WhatsApp Channel.
Inputs: question (poll title), options (list of answer strings),
allow_multiple (True = followers can pick multiple answers).
Returns the API response.
"""
url = f"{BASE_URL}/messages/poll"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"title": question,
"options": options,
"count": 0 if allow_multiple else 1, # 0 = multiple answers allowed
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return response.json()
# Usage -- single-choice poll
result = send_poll_post(
question="What content do you want more of next month?",
options=["Tutorials", "Case studies", "Product updates", "Industry news"],
allow_multiple=False,
)
print(f"Poll sent. ID: {result['sent_message']['id']}")
# Usage -- multiple-choice poll
result = send_poll_post(
question="Which features do you use weekly? (select all that apply)",
options=["Messaging API", "Webhooks", "Channel posts", "Group management"],
allow_multiple=True,
)
Anketler özellikle içerik takvimleri için işe yarar: her hafta cuma günü gelecek haftanın gönderileri için konu içeren bir anketi otomatikleştirin, ardından sonucu pazartesi hangi içeriği yayınlayacağınıza karar vermek için kullanın. Otomasyon döngüsü kendiliğinden güçlenen bir yapıya kavuşur.
API ile WhatsApp Kanalına Sesli Mesaj Gönderme
WhatsApp Kanallarındaki sesli mesajlar, dalga formu göstergesiyle ses klipleri olarak görüntülenir; takipçiler Kanal akışından çıkmadan dokunarak oynatır. Bu format konuşma güncellemeleri, podcast tarzı segmentler veya yönetici konuşmaları için idealdir.
Kanallara gönderilen sesli mesajlar, OPUS ses kodeği ile OGG formatında olmalıdır. WhatsApp diğer ses formatlarını teslimat katmanında reddeder ve API başarı döndürürken ses klibi takipçinin akışında hiç oluşturulmaz. MP3 ve WAV dosyaları sesli mesaj olarak oluşturulmaz. Göndermeden önce kayıtlarınızı ffmpeg -i input.mp3 -c:a libopus output.ogg ile dönüştürün.
İki adımlı süreç: OGG dosyasını base64 veri URI'si olarak kodlayın, ardından /messages/voice adresine POST gönderin. İsteğe bağlı seconds parametresi gösterilen süreyi belirler; atlanırsa WhatsApp bunu dosyadan hesaplar. recording_time parametresi teslimattan önce yazma göstergesi simüle eder; Kanal bağlamlarında nadiren kullanışlıdır ancak mevcuttur.
import requests
import base64
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_voice_post(audio_path: str, duration_seconds: int = None) -> dict:
"""
Two-step voice message post to a WhatsApp Channel.
Step 1 -- read OGG/OPUS file and encode as base64 data URI.
Step 2 -- POST to /messages/voice.
Audio MUST be OGG format with OPUS codec. Returns the API response.
"""
# Step 1: Read and encode the audio (OGG/OPUS required)
with open(audio_path, "rb") as f:
audio_bytes = f.read()
media_b64 = (
f"data:audio/ogg;codecs=opus;base64,{base64.b64encode(audio_bytes).decode()}"
)
# Step 2: Post voice message to the Channel
url = f"{BASE_URL}/messages/voice"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"media": media_b64,
}
if duration_seconds is not None:
payload["seconds"] = duration_seconds # sets the displayed clip duration
response = requests.post(url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
return response.json()
# Usage
result = send_voice_post("weekly_update.ogg", duration_seconds=47)
print(f"Voice message sent. ID: {result['sent_message']['id']}")
Tekrarlayan bir ses segmentini otomatikleştirmek için OGG dosyasını bir metin okuma motoru (OpenAI TTS veya Google Cloud TTS gibi) ile programatik olarak oluşturun, çıktıyı update.ogg olarak kaydedin ve bir zamanlayıcıdan send_voice_post'a iletin.
API ile WhatsApp Kanalına Çıkartma Gönderisi Gönderme
Çıkartma endpoint'i hem statik hem de animasyonlu WebP dosyalarını işler; her ikisi için de aynı işlev çalışır, yalnızca aralarındaki animated bayrağı değişir.
WebP, kabul edilen tek çıkartma formatıdır. JPEG ve PNG yüklemeleri, WhatsApp API tarafından takipçilere teslimattan önce reddedilir. Animasyonlu çıkartmalar, birden fazla kare içeren aynı WebP konteynerini kullanır. Animasyonlu bir dosya gönderirken payload'da animated: True ayarlayın; bu bayrak WhatsApp'ın doğru şekilde oluşturmasına yardımcı olur.
Statik çıkartmalar için çıkartma boyutları 512×512 piksel olmalıdır. 500 KB'ı aşan dosyalar düşük kaliteli cihazlarda yavaş oluşturulabilir. Toplu çıkartma işleri çalıştırmadan önce WebP dosyalarını cwebp gibi araçlarla sıkıştırın. İki adımlı süreç, görsel ve sesle aynıdır: WebP dosyasını kodlayın ve çıkartma endpoint'ine POST gönderin.
import requests
import base64
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_sticker_post(sticker_path: str, animated: bool = False) -> dict:
"""
Two-step sticker post to a WhatsApp Channel.
Step 1 -- read WebP file and encode as base64 data URI.
Step 2 -- POST to /messages/sticker.
Sticker MUST be WebP format -- JPEG and PNG are rejected. Returns the API response.
"""
# Step 1: Read and encode the sticker (WebP format required)
with open(sticker_path, "rb") as f:
sticker_bytes = f.read()
media_b64 = f"data:image/webp;base64,{base64.b64encode(sticker_bytes).decode()}"
# Step 2: Post to the Channel
url = f"{BASE_URL}/messages/sticker"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"media": media_b64,
"animated": animated, # True for animated WebP stickers
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return response.json()
# Static sticker
result = send_sticker_post("celebration.webp", animated=False)
print(f"Sticker sent. ID: {result['sent_message']['id']}")
# Animated sticker
result = send_sticker_post("confetti_animation.webp", animated=True)
Mevcut PNG veya JPEG marka varlıklarını cwebp input.png -o output.webp -q 80 ile WebP'ye dönüştürün. Tutarlı bir marka çıkartma seti için tüm çıkartmaları önceden dönüştürün ve bir /stickers dizininde saklayın, ardından gönderi bağlamına göre setten programatik olarak seçin (kutlama, uyarı, hatırlatma vb.).
WhatsApp Kanalınıza Bağlantı Önizlemeli Gönderi Gönderme
Bağlantı önizlemeli gönderiler, URL'yi zengin bir kart olarak paylaşır: başlık, açıklama ve küçük resim görsel, takipçilerin önce tıklamasını gerektirmeden Kanal akışında satır içi olarak görüntülenir.
URL, body alanının içinde tam olarak görünmelidir. WhatsApp, önizleme kartı oluşturmak için bağlantıyı mesaj metninden okur. Gövdede URL olmayan bir başlık önizleme oluşturmaz. title alanı kart başlığını özelleştirir ve description altına alt başlık metni ekler.
import requests
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_link_preview_post(
message_text: str,
url: str,
title: str,
description: str = "",
) -> dict:
"""
Send a link preview card to a WhatsApp Channel.
Inputs: message_text (context before the link), url (must be in body),
title (card heading), description (card subtitle).
Returns the API response.
"""
endpoint = f"{BASE_URL}/messages/link-preview"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
payload = {
"to": CHANNEL_ID,
"body": f"{message_text}\n{url}", # URL must be present in body
"title": title,
"description": description,
}
response = requests.post(endpoint, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return response.json()
# Usage
result = send_link_preview_post(
message_text="Read our latest case study on WhatsApp automation:",
url="https://whapi.cloud/blog/automation-case-study",
title="How We 10x'd Customer Responses with WhatsApp API",
description="A step-by-step breakdown of the full automation stack, costs included.",
)
print(f"Link preview sent. ID: {result['sent_message']['id']}")
Önizleme kartına özel bir küçük resim görsel eklemek için preview alanını base64 ile kodlanmış bir JPEG görselle ekleyin. Bu alan olmadan WhatsApp, URL'den Open Graph görselini çeker. Bu, düzgün ayarlanmış og:image etiketlerine sahip çoğu sayfa için işe yarar.
n8n ve Make ile No-Code Otomasyonu
n8n ve Make, hiç Python gerektirmeden tam WhatsApp Kanalı yayıncılığı pipeline'larını otomatikleştirir. Aynı REST endpoint'leri her iki platformda da HTTP Request düğümleri aracılığıyla çalışır.
n8n'de: bir HTTP Request düğümü ekleyin, yöntemi POST olarak ayarlayın, URL olarak https://gate.whapi.cloud/messages/text girin, Authorization: Bearer token'ınız içeren bir başlık ekleyin ve gövdeyi to ve body alanlarıyla JSON olarak ayarlayın. Bir cron ifadesiyle çalıştırmak için önüne bir Schedule Trigger düğümü ekleyin. Bu rehberdeki her mesaj türü aynı şekilde çalışır: endpoint yolunu ve gövde alanlarını değiştirin. Make (eski adıyla Integromat), HTTP modülü aracılığıyla aynı yaklaşımı kullanır.
Her iki platform da koşullu dallanmaları, Google Sheets veya Airtable'dan veri aramalarını ve çok adımlı iş akışlarını destekler. Örneğin: yeni bir e-tablo satırında tetikle, mesajı biçimlendir, Kanala yayınla, teslimat durumunu kaydet. Platform aboneliği dışında sunucu gerekmez.
Hata Yönetimi, Hız Sınırları ve Yeniden Deneme Mantığı
Üretimdeki otomasyon iki öngörülebilir şekilde bozulur: kimlik doğrulama hataları ve teslimat redleri. İşlenmeyen istisnaların zamanlayıcınızı sessizce durdurmasına izin vermek yerine her ikisini de açıkça işleyin.
429 yanıtı, Whapi.Cloud düzeyinde bir sınır değil, WhatsApp sunucu tarafı spam algılamasının sinyalini verir -- üretim planlarının Whapi tarafında sabit API hız sınırı yoktur. Eklediğiniz herhangi bir kadans, API kotalarını aşmak için değil, WhatsApp uygulama kalıplarından kaçınmak için gereklidir. Bir Kanala aynı mesajların hızlı patlamaları birincil tetikleyicidir; çoğu iş yükü için gönderileri en az birkaç saniye arayla dağıtmak yeterlidir.
Aşağıdaki yeniden deneme işlevi, bu rehberdeki herhangi bir mesaj türünü sarar. Üç en yaygın hata modunu işler: 401 (geçersiz veya süresi dolmuş token), 429 (WhatsApp'tan geri basınç) ve geçici ağ zaman aşımları. Üstel geri çekilme her yeniden denemede beklemeyi ikiye katlar: 1 saniye, sonra 2, sonra 4.
import requests
import time
API_TOKEN = "your_whapi_token_here"
CHANNEL_ID = "120363171744447809@newsletter"
BASE_URL = "https://gate.whapi.cloud"
def send_with_retry(endpoint: str, payload: dict, max_retries: int = 3) -> dict:
"""
POST to a Whapi.Cloud message endpoint with exponential backoff retry.
Inputs: endpoint (e.g. 'text', 'image', 'poll'), payload dict, max_retries.
Handles 401 (auth), 429 (rate limit), and transient timeouts.
Returns the API response dict on success.
"""
url = f"{BASE_URL}/messages/{endpoint}"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
for attempt in range(max_retries):
try:
response = requests.post(url, headers=headers, json=payload, timeout=30)
if response.status_code == 401:
# No point retrying -- token is wrong or revoked
raise ValueError(
"API token rejected (401). Rotate your token in the Whapi.Cloud dashboard."
)
if response.status_code == 429:
# WhatsApp server signaling back-pressure -- back off and retry
wait = 2 ** attempt # 1s, 2s, 4s
print(f"[WARN] 429 received on attempt {attempt + 1}. Waiting {wait}s.")
time.sleep(wait)
continue
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print(f"[WARN] Timeout on attempt {attempt + 1} -- retrying.")
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
else:
raise
raise RuntimeError(f"All {max_retries} retries exhausted for endpoint '{endpoint}'.")
# Example: send text with retry
result = send_with_retry(
"text",
{"to": CHANNEL_ID, "body": "Scheduled daily update -- delivered automatically."},
)
print(f"Delivered. Message ID: {result['sent_message']['id']}")
# Example: send a poll with retry
result = send_with_retry(
"poll",
{
"to": CHANNEL_ID,
"title": "What should we cover next week?",
"options": ["Security", "Performance", "Integrations"],
"count": 1,
},
)
Üretim zamanlayıcısı için, her başarılı mesaj kimliğini ve her başarısız girişimi bir dosyaya veya veritabanına kaydedin. Bu, bir teslimat denetim izi sağlar ve zamanlayıcı çalışma ortasında yeniden başlarsa zaten gönderilmiş mesajları atlamanıza olanak tanır.
Çoğu Kanal için pratik güvenli yayıncılık kadansı: toplu gönderimde ardışık gönderiler arasında en az 10-30 saniye bekleyerek günde 1-10 gönderi. Büyük takipçi sayısına ve yerleşik geçmişe sahip hesaplar, zorunlu kılmayı tetiklemeden daha sık gönderi yapabilir. Muhafazakâr başlayın ve kademeli olarak artırın.
WhatsApp'ın geri basınç sinyali, belirli bir Kanala değil bağlı hesaba uygulanır. Bir numaradan birden fazla Kanalı yönetiyorsanız, aynı kadans kuralları hepsini yönetir. İkinci bir bağlı numara çalıştırmak, tamamen bağımsız bir verim bütçesi sağlar. Bu, tek bir hesabın güvenli günlük kadansı yetersiz kaldığında yayın hacmini ölçeklendirmenin pratik yoludur. Spam tetikleyicilerinin ve güvenli çalışma kalıplarının tam analizi için Whapi.Cloud'un hesap yasaklanmalarını önleme rehberine bakın.
Manuel Yayıncılık vs. Python API vs. No-Code: İş Akışınıza Hangisi Uygun?
Doğru yaklaşım, yayıncılık sıklığına, teknik ekip kullanılabilirliğine ve içerik değişkenliğine bağlıdır. Önce hangi yolu otomatikleştireceğinize karar vermek için bu tabloyu kullanın.
| Kriter | Manuel (WhatsApp Uygulaması) | Python API (Whapi.Cloud) | No-Code (n8n / Make) |
|---|---|---|---|
| Kurulum süresi | Yok | 1-2 saat | 30-60 dakika |
| Gönderi zamanlama | Hayır | Evet (cron / APScheduler) | Evet (Schedule Trigger) |
| 7 mesaj türünün tamamı | Evet | Evet | Evet |
| Koşullu mantık | Hayır | Tam Python | Temel (if/switch düğümleri) |
| Veriye dayalı içerik | Hayır | Veritabanı / API girişi | Sheets / Airtable satırları |
| Maliyet | Ücretsiz | Whapi.Cloud aboneliği | Araç aboneliği + Whapi.Cloud |
| Gerekli teknik beceri | Yok | Python | Düşük (sürükle ve bırak) |
| En iyi kullanım | Tek seferlik veya anlık gönderiler | Zamanlı / olay tetiklemeli pipeline'lar | Teknik olmayan ekipler, hızlı otomasyon |
Sabit bir programda günlük gönderi yapan ekipler için Python + cron kombinasyonu uzun vadede en az maliyetle çalışır ve en yüksek içerik varyantı hacmini yönetir. No-code platformları iş akışı başına aylık maliyet ekler ancak zamanlayıcıyı korumak için bir geliştirici ihtiyacını ortadan kaldırır. Manuel yayıncılık, yalnızca yayınlamadan önce gerçek zamanlı karar gerektiren seyrek, yüksek dokunuşlu duyurular için doğru seçim olmaya devam eder.
Yüksek yayıncılık hacimlerinde, fiyatlandırma modeli teknik kurulum kadar önemlidir. Whapi.Cloud'un numara başına sabit aboneliği, ayda 200 gönderi gönderen bir Kanalın 20 gönderi gönderenle tam olarak aynı maliyete sahip olduğu anlamına gelir. Kitleniz ve yayıncılık sıklığınız arttıkça bütçe öngörülebilir kalır; arka planda birikim yapan mesaj başı ücret yoktur.









