سجل التحديثات — كل جديد في الـAPI أولًا بأول.
تتطوّر واجهة «وثائق» البرمجية باستمرار دون أن تُعطّل تكاملك، ويُثبَّت الإصدار بترويسة مؤرّخة Wthaiq-Version: 2026-07-01: فالتغييرات المتوافقة — مثل نقطة نهاية جديدة أو حقل اختياري أو نوع حدث جديد — تُطرح تباعًا على إصدارك نفسه، أما التغييرات الجذرية فتأتي في إصدار مؤرّخ جديد لا يسري عليك حتى تقرّر الترقية إليه بنفسك. وتوثّق هذه الصفحة كل تغيير بتاريخه ووسمه.
Wthaiq-Version: 2026-07-01
دليل الوسوم
يحمل كل تغيير في السجل وسمًا بلونه ونوعه، لتعرف أثره في تكاملك من النظرة الأولى.
الإصدارات الأحدث أولًا.
يضمّ الخط الزمني الإصدار المستقر v1 وتحديثاته، ثم الإصدارات التجريبية (beta) التي سبقته، بتواريخها ووسومها الدقيقة.
- إضافةتصدر رسالة الخطأ بالإنجليزية مع رأس الطلب
Accept-Language: enأو المعامل?lang=en، وتبقى العربية افتراضيًّا، ولا تتغيّر رموز الأخطاء. - إصلاحصار المسار
/en/api/v1/…يعمل كالمسار/api/v1/…تمامًا، ورسائل أخطائه بالإنجليزية. - إضافة
upgrade_urlصار حقلًا في الخطأين402 plan_requiredو402 plan_expired، وverify_urlحقلًا في الخطأ403 kyb_required، وmax_signersحقلًا في الخطأ400 too_many_signers. - تغيير
GET /v1/verifications/{reference}لمرجع غير موجود يعود بخطأ 404 بالصيغة الموحّدة والرمزnot_found، بدل جسم يشبه ردّ النجاح. - إصلاح
GET /v1/webhook_endpointsصار يعيدnext_cursorويقبلstarting_after، فتصل إلى كل نقاط الاستقبال صفحةً بعد صفحة. - إصلاحيشير الحقل
docsفيGET /v1إلى التوثيق في لوحة المطوّرين.
- إضافةبعد تأكيد الهوية نطابق الاسم في وثيقة الموقّع بالاسم المرسَل في الطلب. وحين يختلفان يُوقَف التوقيع حتى قرارك، ويصلك الحدث
signer.identity_match_holdثمsigner.identity_match_decidedبعد القرار. - إضافةنقطة جديدة للقرار:
POST /v1/signers/{id}/identity_matchبالقيمة approve أو reject، وصفحة «مراجعة الهوية» في لوحة المطوّرين بدور جديد «مراجع الهوية». - إضافةيحمل كائن الموقّع
identity.name_matchبحالة المطابقة والاسمين، ويمكنك من الصفحة نفسها اختيار «سجّل الاختلاف فقط» بدل إيقاف التوقيع.
- تغييرصارت لوحة المطوّرين منتجًا مستقلًّا بحساب مطوّر منفصل يُنشأ من صفحة التسجيل فيها، ولا يرتبط بحسابات منصّة وثائق في الدخول ولا في البيانات ولا في الأرصدة.
- تغييريتطلّب الإرسال الحيّ باقة سنوية مدفوعة وشركة موثّقة، وإلّا عاد الخطأ
402 plan_requiredأو402 plan_expiredأو403 kyb_required. ويبقى مفتاح التجربة مجانيًّا بحدود يومية. - تغييريُحتسب كل موقّع في الطلب الحيّ إرسالًا من رصيد باقتك السنوي، والحدّ الأقصى خمسة موقّعين في الطلب الواحد، وبعد نفاده تُخصم الزيادة من المحفظة بسعر باقتك، ويُخصم تأكيد الهوية من المحفظة دائمًا. وإن لم يكفِ الرصيد عاد الخطأ
402 insufficient_balanceولا يُنشأ الطلب. - إضافةيعود الخطأ
403 plan_feature_unavailableحين يطلب الطلب قدرة لا تتضمّنها باقتك، ويحمل الحقولfeatureوrequired_planوupgrade_url. - تغييرتعيد نقطتا
GET /v1/usageوGET /v1/balanceالمبالغ كائناتٍ بعملة محفظتك ومعها الباقة وأسعارها، وأُزيلت المفاتيحamount_egpوmonth_spent_egpوsend_egp. وصار الحقلcostفي الجلسة كائنًا بالمبلغ والعملة والمصدر. - إيقاف تدريجيأُلغيت الطلبات الحيّة المجانية التي كانت تُتاح قبل توثيق الحساب، ويبقى الحقل
trialفي الطلبات القديمة وحدها.
- إضافةثلاثة أحداث جديدة تتابع بها تأكيد هوية الموقّع قبل اعتماده:
signer.identity_in_reviewوsigner.identity_resubmission_requestedوsigner.identity_declined. يُطلَق كل حدث مرّة واحدة لكل تغيّر في الحالة. - تغييرأُضيف الحقل
identity.verification_idإلى كائنsigner، واتّسعت قيم الحقلينidentity.statusوidentity_verification.status.
- إضافةأُعيدت مفاتيح التجربة بالبادئتين
sk_test_وpk_test_إلى جانب المفتاحين الحيّينsk_وpk_. ويُختار نوع المفتاح عند إنشائه، ويبيّن الحقلlivemodeفي كل كائن وحدث أيَّ المفتاحين أنشأه. - تغييرلا يُخصم بمفتاح التجربة شيء من رصيدك، ولا تُرسَل به دعوة ولا تذكير ولا نسخة إلى أحد، ويقتصر الموقّعون فيه على بريد حسابك أو رقمه وبريد أعضاء فريقك أو أرقامهم.
- تغييريقتصر مفتاح التجربة على التوقيع البسيط
sesبلا تأكيد هوية، ولا يُختم لطلباته محضر أدلّة، ولا يصدر له الحدثانdocument.sealedوverification.created. - تغييرتصل أحداث التجربة إلى نقاط الاستقبال المُنشأة بمفتاح تجربة عبر
POST /v1/webhook_endpointsوحدها.
- تغيير جوهريأُزيل نظام البيئتين
sk_live_/sk_test_. وأصبح لكل مفتاح سرّي صيغة موحّدة: البادئةsk_يليها 40 محرفًا بالنظام السداسي العشري، ويعمل المفتاح فعليًّا منذ لحظة إنشائه؛ فلا يوجد وضع اختبار منفصل، والحقلlivemodeيساويtrueدائمًا. ملاحظة (2026-09-26): أُعيدت مفاتيح التجربة لاحقًا؛ راجِع التحديث في أعلى السجل. - إضافةمفاتيح عامة (Publishable) بالبادئة
pk_يمكن كشفها في المتصفّح بأمان، إذ تقتصر على نطاقات محدّدة عبرallowed_origins، وعلى مجموعة ثابتة من المسارات (القوالب وطلبات التوقيع والموقّعين والتدفّقات)، مع منع الكتابة على القوالب والموقّعين والتدفّقات. - أمانيُحتسب فعليًّا كل استدعاء لواجهة برمجة التطبيقات، أيًّا كان نوع المفتاح، على رصيدك المدفوع مسبقًا: سعر لكل طلب توقيع، وسعر إضافي لكل موقّع يتطلّب التحقّق من هويته. ولا توجد بيئة تجريبية معفاة من الفوترة. ملاحظة (2026-09-26): لم يعد هذا ساريًا على مفاتيح التجربة بعد إعادتها؛ راجِع التحديث في أعلى السجل.
- إضافةأُطلقت للعموم واجهة طلبات التوقيع على المسار
POST /v1/signature_requestsبدورة الحياة الكاملة (draftثمsentثمcompleted) ونقاط النهايةsendوcancelوremindersوdownloadوcertificate. - إضافةإشعارات أحداث آلية (Webhooks) موقّعة عبر الترويسة
Wthaiq-Signature(HMAC-SHA256 بصيغةt=..,v1=..)، مع هامش سماح زمني قدره 300 ثانية، وإعادة المحاولة على فترات متزايدة مدةً تصل إلى 24 ساعة. - إضافةمفاتيح الواجهة البرمجية بصيغتَي
sk_live_وsk_test_، وسرّ توقيع إشعارات الأحداثwhsec_؛ ولا يُرسل وضع الاختبار بريدًا حقيقيًّا ولا يُصدر شهادات قانونية. ملاحظة (2026-07-26): أُزيل نظام البيئتين هذا لاحقًا؛ راجِع التحديث في أعلى السجل. - متاححِزم تطوير البرمجيات (SDKs) الرسمية:
wthaiq/wthaiq-php(PHP) ·wthaiq(Node.js) ·wthaiq(Python) — تثبّت ترويسة الإصدار افتراضيًّا، وتتبع نظام الترقيم الدلالي (SemVer). ملاحظة: نُشرت هذه الحِزم مع الإطلاق الرسمي، ومعها مكتبتا التوقيع داخل التطبيق (iOS · Android)؛ وأوامر التثبيت في صفحة المكتبات الرسمية. - تغييرأصبح
Wthaiq-Version: 2026-07-01هو الإصدار المؤرّخ الافتراضي لكل الحسابات الجديدة، مع ترويسةWthaiq-Request-Idفي كل استجابة. - أمانأصبح استخدام TLS 1.2 أو أعلى إلزاميًّا، وأُتيح تدوير سرّ توقيع إشعارات الأحداث
whsec_من لوحة التحكّم دون انقطاع الخدمة.
- إضافةنقطتا نهاية للقوالب:
GET /v1/templatesوGET /v1/templates/{id}مع تعريف الحقول (keyوlabelوtypeوrequired). - إضافةإنشاء طلب توقيع مباشرة من قالب عبر
source.type = "template"مع تمرير قيم الحقول فيsigners[].fields. - إصلاحتصحيح احتساب القيم الافتراضية للحقول عند غياب كائن
fieldsمن جسم الطلب.
- إضافةنقطة نهاية للتحقّق العلني بالرقم المرجعي:
GET /v1/verifications/{reference}(بالبادئتينWTQ-وWTH-) دون مصادقة، لفحص سلامة المستند وأطرافه. - إضافةحقل
integrityبقيمintactوmodifiedوunknownفي كائنverification، مع تقنيع أسماء الأطراف. - إضافةحدث
verification.createdإلى قائمة أحداث الإشعارات الآلية.
- إضافةجلسات توقيع مضمّنة بعلامتك التجارية:
POST /v1/signers/{id}/signing_sessionتُصدر رابط توقيع أو رمز جلسة قصير الصلاحية لتضمينه داخل تطبيقك. - تغييرأُضيف الحقل
signing_urlإلى كائنsignerلدعم صفحة التوقيع المستضافة والمضمّنة بالحقل نفسه. - إصلاحالتزام رموز الجلسات المضمّنة الصارم بموعد
expires_atوإبطالها فور اكتمال التوقيع أو رفضه.
- إضافةتأكيد الهوية للمستوى المتقدّم (AES) عبر مزوّد متخصّص في التحقّق منها: الكائن
identity_verificationونقطة النهايةGET /v1/identity_verifications/{id}(مستند رسمي ومطابقة وجه حيّة). - إضافةشرط
require_identityعلى مستوى الطلب والموقّع، والحدثانsigner.otp_verifiedوsigner.identity_verified. - إضافةدعم
legal_level = "aes"الذي يربط التوقيع بشخص حقيقي مؤكَّد الهوية قبل فتح صفحة التوقيع.
- إضافةختم
pades-ltمع DSS/LTV في توقيعات التوكن (بتضمين الشهادات وقوائم الإبطال CRL) للحفظ طويل الأمد، وللتحقّق دون الرجوع إلى جهة الإصدار. - تغييرأصبح
format = "pades-lt"القيمة الافتراضية لطلبات المستوىaesبدلًا منpades-t. - إضافةحدث
document.sealedيُطلَق عند ختم محضر الأدلّة للطلب بعد اكتمال جميع التواقيع.
- إضافةختم زمني وفق RFC 3161 على محضر أدلّة كل طلب مكتمل لإثبات لحظة الختم إثباتًا مستقلًّا.
- تغييرتُعيد كل نقاط النهاية الأخطاء ببنية موحّدة
{ error: { type, code, message, param, request_id } }مع رموز HTTP قياسية (400/401/402/409/422/429). - إضافةدعم ترويسة
Idempotency-Keyعلى طلباتPOST(تُخزَّن 24 ساعة) لجعل إعادة المحاولة آمنة. - إضافةحدّ للمعدّل قدره 100 طلب لكل 10 ثوانٍ، مع الترويسات
X-RateLimit-LimitوRemainingوReset، ورمز 429 مصحوبًا بـRetry-After. - إيقاف تدريجيإيقاف تدريجي لمسار المعاينة القديم غير المؤرّخ
/v1/previewلصالح الإصدار المؤرّخ الجديد؛ وستُزال نقطة النهاية هذه في إصدار مؤرّخ لاحق.
كيف نُصدر التغييرات دون أن نكسر تكاملك.
نعتمد ترقيم الإصدارات بالتاريخ (date-based versioning)، فلا يتغيّر سلوك إصدارك المثبّت أبدًا بسبب تغيير جذري، وأنت وحدك من يقرّر موعد ترقيته.
تغييرات جذرية
تتطلّب إصدارًا مؤرّخًا جديدًا
- حذف نقطة نهاية أو حقل أو قيمة
enum، أو إعادة تسميتها. - تغيير نوع حقل قائم (مثلًا من
stringإلىinteger). - إضافة معامل إلزامي جديد (
required) إلى طلب قائم. - تشديد قواعد التحقّق بحيث تُرفض طلبات كانت تُقبل سابقًا.
- تغيير المعنى الافتراضي لاستجابة، أو تغيير ترتيب عناصر قائمة.
تغييرات متوافقة
تُطرح تباعًا على إصدارك نفسه
- إضافة نقطة نهاية جديدة كليًّا.
- إضافة حقل جديد اختياري إلى جسم استجابة.
- إضافة قيمة
enumجديدة (احرص على معالجة القيم غير المعروفة بمرونة). - إضافة نوع حدث جديد إلى قائمة الإشعارات الآلية.
- إضافة معامل اختياري جديد إلى طلب قائم.
Wthaiq-Deprecation مع الاستجابات المعنيّة، ونُبقي السلوك القديم عاملًا مدةً لا تقل عن 6 أشهر قبل إزالته في إصدار مؤرّخ جديد، ليتّسع لك الوقت للترقية بأمان. ثبّت الإصدار بإرسال ترويسة Wthaiq-Version مع كل طلب. وإن لم تُرسلها، فسيُستخدم آخر إصدار مؤرّخ مثبّت على حسابك (أو أحدث إصدار افتراضي). ولا يتغيّر سلوك إصدارك المثبّت أبدًا بسبب تغيير جذري. مثال:
curl https://wthaiq.com/api/v1/signature_requests \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
# الاستجابة تعيد الإصدار المستخدم فعليًّا في الترويسة:
# Wthaiq-Version: 2026-07-01
# Wthaiq-Request-Id: req_9f2a1c
Wthaiq-Version في بيئة الإنتاج. ولا حاجة إلى ترقية كل تكاملاتك دفعة واحدة؛ فكل تكامل يُرقّى بالإيقاع الذي يناسبه. جاهز لبناء تكاملك؟
ابدأ من الوثائق الكاملة للواجهة البرمجية، وثبّت إصدارك المؤرّخ، واشترك لتصلك كل التحديثات أولًا بأول.