API v2 (تجريبي)
الانتقال من v1 إلى v2
يفعل API v2 ما يفعله v1، مع مفاتيح أكثر أمانًا، وأسلوب واحد للعناوين، ورموز حالة HTTP حقيقية، وwebhooks بصيغة JSON موقّعة. تطابق هذه الصفحة كل نقطة نهاية وكل حقل في v1 مع ما يقابله في v2. أما الجديد في v2 نفسه فتجده في النظرة العامة.
ما يتغيّر في كل مكان#
- المفاتيح: يصبح
client_id+api_keyفي v1 ترويسة واحدة،Authorization: Bearer wbz_live_…. أنشئ مفتاح v2 في الإعدادات ← مفاتيح API، في بطاقة مفاتيح API v2، مع النطاقات التي يحتاج إليها التطبيق فقط. لا تعمل مفاتيح v1 على v2، ولا تعمل مفاتيح v2 على v1. - JSON فقط: لا حقول نموذج. تذهب عمليات رفع الملفات إلى
POST /media(بصيغة multipart) وتُرسَل عبرmedia_id. - الطرق والعناوين:
GETللقراءة، وPOSTللإنشاء، وPATCHللتغيير، وDELETEللإلغاء أو الحذف، تحتhttps://wbiztool.com/api/v2. - رموز حالة HTTP بدلًا من
"status": 0أو1(راجع الاستجابات والأخطاء). - أرقام الهواتف بالصيغة الدولية مع
+، دونcountry_code. - الأوقات بصيغة ISO 8601 مع فارق التوقيت، بدلًا من حقول منفصلة للتاريخ والوقت والمنطقة الزمنية.
- Webhooks هي نقاط استقبال تضيفها مرة واحدة لمساحة العمل، مع أحداث JSON موقّعة، بدلًا من عنوان
webhookفي كل رسالة.
نقطة نهاية تلو الأخرى#
مسارات v2 نسبية إلى https://wbiztool.com/api/v2.
الإرسال حقلًا بحقل#
| v1 | v2 | ملاحظات |
|---|---|---|
client_id + api_key (في الجسم أو Authorization: Bearer) | Authorization: Bearer wbz_live_… | مفتاح v2 جديد؛ لا يوجد client_id |
phone + country_code | to.phone | رقم واحد بصيغة E.164 مع +: "9876543210" مع "country_code": "91" يصبح {"phone": "+919876543210"}. لا يُضاف رمز الدولة تلقائيًا |
phone مع @username (Telegram) | to.username | @name أو t.me/name أو tg: متبوعًا بمعرّف، من حساب Telegram |
group_name | to.group | الاسم الدقيق للمجموعة |
| (غير موجود في v1) | to.contact_id | جهة اتصال محفوظة |
whatsapp_client | from | id الرقم؛ اختياري عندما يكون رقم واحد متصلًا، كما كان سابقًا |
msg (أو message) | text | حتى 3,000 حرف، كما كان سابقًا |
msg_type 0 و1 و2 | لا شيء | الرسالة التي تحتوي على media هي رسالة وسائط؛ وmedia.type (image أو file) عندما لا يدل الرابط على النوع |
img_url / file_url | media.url | رابط http(s) عام |
file (رفع في الطلب نفسه) | media.media_id | ارفع أولًا، ثم أرسل المعرّف كلما شئت |
file_name | media.file_name | للملفات |
date + time + timezone في schedule_msg/ | send_at | وقت واحد مع فارق توقيته: 24/12/2026 و10:30 وAsia/Kolkata تصبح "2026-12-24T10:30:00+05:30" |
expire_after_seconds | expires_at | وقت وليس مدة: الآن مضافًا إليه الثواني، مع فارق التوقيت |
webhook | نقاط استقبال webhook | تُضاف مرة واحدة عبر POST /webhooks، لكل رسائل مساحة العمل |
msg_id في الاستجابة | id | تعود الرسالة نفسها، مع status الخاص بها |
عملية الإرسال نفسها في v1 وv2:
# 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 عن قصد:
- لا تخمين لرموز الدول. كان v1 يضع
country_codeأمام الرقم (ومع91، دائمًا أمام الرقم المكوّن من 10 خانات). أما v2 فيأخذ الرقم كما كُتب تمامًا مع+. - لا تنزيل للملف عند الاستدعاء. كان v1 يجلب
img_urlوfile_urlأثناء الطلب. أما v2 فيتحقق من أن الرابط عام ويجلب الملف عند إرسال الرسالة؛ ويظهر الرابط السيئ كرسالةfailed. - لا صف فاشل عند الرفض. عندما يرفض v1 إرسالًا يتجاوز الحد اليومي البالغ 1,000، فإنه يحفظ الرسالة رغم ذلك كرسالة فاشلة. أما v2 فلا يحفظ شيئًا عندما يرفض إرسالًا.
- تُرفض الحقول غير المعروفة بدلًا من تجاهلها.
الحالات#
تصبح أرقام v1 وكلماته حقل status واحدًا:
| v1 | status في v2 |
|---|---|
0 Created / Pending | queued، أو scheduled ما دام send_at الخاص بها لم يحن بعد |
1 Sent | sent أو delivered أو read (علامات WhatsApp) |
2 Failed | failed |
3 Cancelled | cancelled |
4 Expired | expired |
أحداث webhook هي message.sent وmessage.failed وmessage.cancelled وmessage.expired، وتقابل SENT وFAILED وCANCELLED وEXPIRED في v1.
الاستجابات والأخطاء#
يجيب v1 عن كثير من الأخطاء بحالة HTTP 200 أو 400 مع "status": 0، وعن النجاح بـ "status": 1. أما v2 فيستخدم رمز حالة HTTP:
- النجاح هو
200أو201(أُنشئ) أو202(في قائمة الانتظار)، والجسم هو الكائن نفسه، مثل الرسالة. لا يوجد غلافstatus: 1. - الأخطاء هي
4xxأو5xxببنية واحدة:{"error": {"code", "message", "field", "docs", "request_id"}}. اعتمد في التفرّع علىcode، لا علىmessageالإنجليزي. كل رمز موجود في صفحة الأخطاء.
# 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
بعض رسائل v1 ورموزها في v2:
| رسالة v1 | رمز v2 |
|---|---|
Auth Error: invalid api key | 401 invalid_api_key أو api_key_revoked أو 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 |
Webhooks#
في v1، يمكن أن تحمل كل رسالة عنوان webhook يتلقى msg_id=…&status=SENT بترميز النموذج. أما في v2:
- أضف نقطة استقبال مرة واحدة عبر
POST /webhooksواحفظsecretالخاص بها. - تتلقى أحداث JSON لكل رسائل مساحة العمل، مع الرسالة كاملة في
data.message. طابقها مع سجلاتك عبرdata.message.id. - تحقّق من التوقيع: المخطط نفسه المستخدم في v1 (
WbizTool-Timestamp،WbizTool-Signature: v1=…)، لكن بسرّ نقطة الاستقبال الخاص بها بدلًا من سرّ مساحة العمل. - تجاهل التكرارات عبر
WbizTool-Event-Id. تستمر إعادة المحاولة نحو 23 ساعة، لا 4 محاولات خلال بضع دقائق كما في v1، ويُعاد إرسال الاستجابات4xxأيضًا.
ليس لأحداث الربط في v1 (webhook_url في whatsapp/connect/) حدث مقابل في v2 بعد: استطلع GET /numbers/{id} بدلًا من ذلك.
قائمة تحقق#
أنشئ مفتاح v2 لكل تطبيق
في الإعدادات ← مفاتيح API، مع النطاقات التي يحتاج إليها فقط. جرّبه أولًا بـمفتاح اختبار، الذي يتحقق من كل شيء ولا يرسل شيئًا.
غيّر الطلبات
عناوين وطرق جديدة، وأجسام JSON، و
to/from/text/media، وأرقام هواتف مع+، وأوقات مع فارق التوقيت. أضفIdempotency-Keyإلى كل عملية إرسال.غيّر طريقة التعامل مع الأخطاء
تحقّق من حالة HTTP، ثم من
error.code. تعامل مع429بالانتظار مدةRetry-After.انقل webhooks
أضف نقطة استقبال، وتحقّق من التوقيعات بسرّها، وتجاهل التكرارات عبر معرّف الحدث.
انتقل وألغِ المفتاح القديم
بمجرد أن يعمل التطبيق على v2، احذف مفتاح v1 الخاص به في الإعدادات ← مفاتيح API.
