انتقل إلى المحتوى
WbizTool

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 في كل رسالة.

نقطة نهاية تلو الأخرى#

نقطة النهاية في v1العملية في v2
POST /api/v1/send_msg/POST /messages مع to.phone
POST /api/v1/send_msg/group/POST /messages مع to.group
POST /api/v1/send_msg/multi/POST /messages/batch، حتى 1,000 مستلم
POST /api/v1/schedule_msg/POST /messages مع send_at
POST /api/v1/cancel_msg/DELETE /messages/{id}
POST /api/v1/message/status/{msg_id}/GET /messages/{id}
POST /api/v1/report/GET /messages مع since وuntil وnumber وstatus وصفحات cursor
POST /api/v1/me/GET /me
POST /api/v1/whatsapp-client/list/GET /numbers
POST /api/v1/whatsapp/accounts/GET /numbers
POST /api/v1/whatsapp-client/status/GET /numbers/{id}
POST /api/v1/whatsapp/connect/POST /numbers، ثم استطلاع GET /numbers/{id}
POST /api/v1/reminder/create/POST /reminders
POST /api/v1/reminder/list/GET /reminders
POST /api/v1/reminder/cancel/DELETE /reminders/{id}، أو PATCH مع "active": false للإيقاف المؤقت
لا توجد نقطة نهاية في v1GET /reminders/{id} وPATCH /reminders/{id}
POST /api/v1/media/upload/POST /media، ملف واحد لكل طلب، الحقل file
GET /api/v1/media/list/GET /media
GET /api/v1/media/{media_id}/GET /media/{id}
لا توجد نقطة نهاية في v1DELETE /media/{id}
POST /api/v1/verification/create/POST /number-checks
GET /api/v1/verification/status/GET /number-checks/{id}
GET /api/v1/verification/results/GET /number-checks/{id}/results
‏webhook في كل عملية إرسالنقاط استقبال webhook: ‏POST /webhooks مرة واحدة

مسارات v2 نسبية إلى https://wbiztool.com/api/v2.

الإرسال حقلًا بحقل#

v1v2ملاحظات
‏client_id + api_key (في الجسم أو Authorization: Bearer)Authorization: Bearer wbz_live_…مفتاح v2 جديد؛ لا يوجد client_id
‏phone + country_codeto.phoneرقم واحد بصيغة E.164 مع +: ‏"9876543210" مع "country_code": "91" يصبح {"phone": "+919876543210"}. لا يُضاف رمز الدولة تلقائيًا
‏phone مع ‎@username (Telegram)to.username‏@name أو t.me/name أو tg: متبوعًا بمعرّف، من حساب Telegram
‏group_nameto.groupالاسم الدقيق للمجموعة
(غير موجود في v1)to.contact_idجهة اتصال محفوظة
‏whatsapp_clientfrom‏id الرقم؛ اختياري عندما يكون رقم واحد متصلًا، كما كان سابقًا
‏msg (أو message)textحتى 3,000 حرف، كما كان سابقًا
‏msg_type ‏0 و1 و2لا شيءالرسالة التي تحتوي على media هي رسالة وسائط؛ وmedia.type (image أو file) عندما لا يدل الرابط على النوع
‏img_url / file_urlmedia.urlرابط http(s) عام
‏file (رفع في الطلب نفسه)media.media_idارفع أولًا، ثم أرسل المعرّف كلما شئت
‏file_namemedia.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_secondsexpires_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 Failedfailed
‏3 Cancelledcancelled
‏4 Expiredexpired

أحداث 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:

  1. أضف نقطة استقبال مرة واحدة عبر POST /webhooks واحفظ secret الخاص بها.
  2. تتلقى أحداث JSON لكل رسائل مساحة العمل، مع الرسالة كاملة في data.message. طابقها مع سجلاتك عبر data.message.id.
  3. تحقّق من التوقيع: المخطط نفسه المستخدم في v1 ‏(WbizTool-Timestamp، WbizTool-Signature: v1=…)، لكن بسرّ نقطة الاستقبال الخاص بها بدلًا من سرّ مساحة العمل.
  4. تجاهل التكرارات عبر WbizTool-Event-Id. تستمر إعادة المحاولة نحو 23 ساعة، لا 4 محاولات خلال بضع دقائق كما في v1، ويُعاد إرسال الاستجابات 4xx أيضًا.

ليس لأحداث الربط في v1 ‏(webhook_url في whatsapp/connect/) حدث مقابل في v2 بعد: استطلع GET /numbers/{id} بدلًا من ذلك.

قائمة تحقق#

  1. أنشئ مفتاح v2 لكل تطبيق

    في الإعدادات ← مفاتيح API، مع النطاقات التي يحتاج إليها فقط. جرّبه أولًا بـمفتاح اختبار، الذي يتحقق من كل شيء ولا يرسل شيئًا.

  2. غيّر الطلبات

    عناوين وطرق جديدة، وأجسام JSON، وto / from / text / media، وأرقام هواتف مع +، وأوقات مع فارق التوقيت. أضف Idempotency-Key إلى كل عملية إرسال.

  3. غيّر طريقة التعامل مع الأخطاء

    تحقّق من حالة HTTP، ثم من error.code. تعامل مع 429 بالانتظار مدة Retry-After.

  4. انقل webhooks

    أضف نقطة استقبال، وتحقّق من التوقيعات بسرّها، وتجاهل التكرارات عبر معرّف الحدث.

  5. انتقل وألغِ المفتاح القديم

    بمجرد أن يعمل التطبيق على v2، احذف مفتاح v1 الخاص به في الإعدادات ← مفاتيح API.

صفحات ذات صلة#