API v2 (beta)
v1'den v2'ye geçiş
API v2, v1'in yaptığı her şeyi daha güvenli anahtarlar, tek bir URL stili, gerçek HTTP durum kodları ve imzalı JSON webhook'larıyla yapar. Bu sayfa her v1 endpoint'ini ve alanını v2'deki karşılığıyla eşleştirir. v2'nin kendisindeki yenilikler genel bakış sayfasındadır.
Her yerde değişenler#
- Anahtarlar: v1'deki
client_id+api_key, tek bir başlığa dönüşür:Authorization: Bearer wbz_live_…. Ayarlar → API anahtarları sayfasındaki API v2 anahtarları kartında, yalnızca uygulamanın ihtiyaç duyduğu kapsamlarla bir v2 anahtarı oluşturun. v1 anahtarları v2'de, v2 anahtarları da v1'de çalışmaz. - Yalnızca JSON: form alanları yok. Dosya yüklemeleri
POST /mediaendpoint'ine (multipart) gider vemedia_idile gönderilir. - Yöntemler ve URL'ler: okumak için
GET, oluşturmak içinPOST, değiştirmek içinPATCH, iptal etmek veya silmek içinDELETE; hepsihttps://wbiztool.com/api/v2altında. "status": 0veya1yerine HTTP durum kodları (bkz. Yanıtlar ve hatalar).country_codeolmadan,+ile uluslararası biçimde telefon numaraları.- Ayrı tarih, saat ve saat dilimi alanları yerine ofsetli ISO 8601 biçiminde zamanlar.
- Webhook'lar, her mesajdaki bir
webhookURL'si yerine, çalışma alanı için bir kez eklediğiniz ve imzalı JSON olayları gönderen uç noktalardır.
Endpoint bazında#
v2 yolları https://wbiztool.com/api/v2 adresine göredir.
Gönderim, alan alan#
| v1 | v2 | Notlar |
|---|---|---|
client_id + api_key (gövdede veya Authorization: Bearer) | Authorization: Bearer wbz_live_… | Yeni bir v2 anahtarı; client_id yok |
phone + country_code | to.phone | + ile E.164 biçiminde tek bir numara: "country_code": "91" ile "9876543210", {"phone": "+919876543210"} olur. Ülke kodu sizin için eklenmez |
@username içeren phone (Telegram) | to.username | Bir Telegram hesabından @name, t.me/name veya tg: ve bir ID |
group_name | to.group | Grubun tam adı |
| (v1'de yok) | to.contact_id | Kayıtlı bir kişi |
whatsapp_client | from | Numaranın id değeri; önceden olduğu gibi tek numara bağlıyken isteğe bağlı |
msg (veya message) | text | Önceden olduğu gibi en fazla 3.000 karakter |
msg_type 0, 1, 2 | yok | media içeren bir mesaj medya mesajıdır; bağlantı türü belli etmediğinde media.type (image veya file) |
img_url / file_url | media.url | Herkese açık bir http(s) bağlantısı |
file (aynı istekte yükleme) | media.media_id | Önce yükleyin, ardından ID'yi istediğiniz kadar gönderin |
file_name | media.file_name | Dosyalar için |
schedule_msg/ endpoint'inin date + time + timezone alanları | send_at | Ofsetiyle tek bir zaman: 24/12/2026, 10:30 ve Asia/Kolkata, "2026-12-24T10:30:00+05:30" olur |
expire_after_seconds | expires_at | Bir süre değil, bir zaman: şimdi artı saniyeler, ofsetiyle |
webhook | webhook uç noktaları | Çalışma alanının her mesajı için POST /webhooks ile bir kez eklenir |
Yanıttaki msg_id | id | Message nesnesinin kendisi, status değeriyle birlikte döner |
Aynı gönderim v1 ve v2'de:
# v1
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-H "Authorization: Bearer YOUR_V1_KEY" \
-H "Content-Type: application/json" \
-d '{"whatsapp_client": 101, "msg_type": 1, "country_code": "91", "phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg", "msg": "Our Diwali sale starts today",
"expire_after_seconds": 3600}'
# v2
curl -X POST https://wbiztool.com/api/v2/messages \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: diwali-9876543210" \
-d '{"from": 101, "to": {"phone": "+919876543210"},
"media": {"url": "https://example.com/offers/diwali-sale.jpg"}, "text": "Our Diwali sale starts today",
"expires_at": "2026-10-20T11:30:00+05:30"}'
v1'in bazı davranışları bilerek kaldırıldı:
- Ülke kodu tahmini yok. v1, bir numaranın önüne
country_codeekliyordu (91ile, 10 haneli bir numaranın önüne her zaman). v2 numarayı+ile tam yazıldığı gibi alır. - Çağrı sırasında dosya indirme yok. v1,
img_urlvefile_urldosyalarını istek sırasında indiriyordu. v2 bağlantının herkese açık olduğunu kontrol eder ve dosyayı mesaj gönderilirken indirir; hatalı bir bağlantıfailedbir mesaj olarak görünür. - Reddedilen gönderim için başarısız kayıt yok. v1, günlük 1.000 sınırını aşan bir gönderimi reddettiğinde mesajı yine de başarısız olarak kaydeder. v2, bir gönderimi reddettiğinde hiçbir şey kaydetmez.
- Bilinmeyen alanlar yok sayılmak yerine reddedilir.
Durumlar#
v1'in sayıları ve sözcükleri tek bir status alanına dönüşür:
| v1 | v2 status |
|---|---|
0 Created / Pending | queued veya send_at zamanı henüz gelmemişken scheduled |
1 Sent | sent, delivered veya read (WhatsApp tikleri) |
2 Failed | failed |
3 Cancelled | cancelled |
4 Expired | expired |
Webhook olayları message.sent, message.failed, message.cancelled ve message.expired olup v1'deki SENT, FAILED, CANCELLED ve EXPIRED değerlerine karşılık gelir.
Yanıtlar ve hatalar#
v1 birçok hatayı HTTP 200 veya 400 ve "status": 0 ile, başarıyı ise "status": 1 ile yanıtlar. v2 HTTP durum kodunu kullanır:
- Başarı
200,201(oluşturuldu) veya202(kuyruğa alındı) olur ve gövde, Message gibi nesnenin kendisidir.status: 1sarmalayıcısı yoktur. - Hatalar tek bir yapıyla
4xxveya5xxolur:{"error": {"code", "message", "field", "docs", "request_id"}}. İngilizcemessagedeğerine değil,codedeğerine göre dallanın. Tüm kodlar hatalar sayfasındadır.
# v1
result = response.json()
if result.get("status") == 1:
msg_id = result["msg_id"]
# v2
if response.status_code == 202:
message_id = response.json()["id"]
else:
error = response.json()["error"]
if error["code"] == "number_daily_cap_reached":
... # try again tomorrow
Bazı v1 mesajları ve v2 kodları:
| v1 mesajı | v2 kodu |
|---|---|
Auth Error: invalid api key | 401 invalid_api_key, api_key_revoked veya api_key_expired |
Invalid phone number / Invalid Contact Number "…" | 422 invalid_phone |
Msg cant be null | 400 text_required |
Message length is too long | 400 text_too_long |
Invalid whatsapp client | 422 number_not_found |
Invalid whatsapp client id. | 422 from_required |
Not enough credits | 402 no_credits |
Daily limit reached: … | 429 number_daily_cap_reached |
Demo Account can not access apis | 403 demo_account |
Account Disabled | 403 account_disabled |
Invalid JSON format: … | 400 invalid_json |
Webhook'lar#
v1'de her mesaj, form kodlamalı bir msg_id=…&status=SENT alan bir webhook URL'si taşıyabilir. v2'de:
POST /webhooksile bir kez bir uç nokta ekleyin vesecretdeğerini saklayın.- Uç nokta, çalışma alanının her mesajı için,
data.messageiçinde Message nesnesinin tamamıyla JSON olayları alır. Bunları kayıtlarınızladata.message.idüzerinden eşleştirin. - İmzayı doğrulayın: v1'dekiyle aynı yöntem (
WbizTool-Timestamp,WbizTool-Signature: v1=…), ancak çalışma alanınınki yerine uç noktanın kendi gizli anahtarıyla. - Tekrarları
WbizTool-Event-Idile atın. Yeniden denemeler, v1'deki gibi birkaç dakika içinde 4 deneme değil, yaklaşık 23 saat sürer ve4xxyanıtları da yeniden denenir.
v1'in bağlantı olaylarının (whatsapp/connect/ üzerindeki webhook_url) henüz v2 karşılığı yok: bunun yerine GET /numbers/{id} sorgulayın.
Kontrol listesi#
Her uygulama için bir v2 anahtarı oluşturun
Ayarlar → API anahtarları sayfasında, yalnızca ihtiyaç duyduğu kapsamlarla. Önce her şeyi kontrol eden ve hiçbir şey göndermeyen bir test anahtarıyla deneyin.
İstekleri değiştirin
Yeni URL'ler ve yöntemler, JSON gövdeler,
to/from/text/media,+ile telefon numaraları, ofsetli zamanlar. Her gönderime birIdempotency-Keyekleyin.Hata işlemeyi değiştirin
Önce HTTP durumunu, ardından
error.codedeğerini kontrol edin.429yanıtındaRetry-Afterkadar bekleyin.Webhook'ları taşıyın
Bir uç nokta ekleyin, imzaları onun gizli anahtarıyla doğrulayın ve tekrarları olay ID'sine göre atın.
Geçişi tamamlayın ve iptal edin
Uygulama v2'de çalışmaya başladığında, Ayarlar → API anahtarları sayfasında onun v1 anahtarını silin.
