مرجع الـAPI الكامل
مرجع تقني دقيق لواجهة برمجة التطبيقات (API) في «وثائق»، يتناول كل نقطة نهاية وكل كائن، ويشمل المصادقة والأخطاء وترقيم الصفحات ومنع التنفيذ المكرّر (Idempotency) وحدود المعدّل، وطلبات التوقيع والموقّعين والمستندات والقوالب وتأكيد الهوية والتحقّق والأحداث وإشعاراتها الآلية (Webhooks). ولكل استدعاء أمثلة جاهزة بـcURL و Node.
https://wthaiq.com/api/v1
2026-07-01
المصادقة Bearer sk_...
الاستجابة application/json
curl -X POST https://wthaiq.com/api/v1/signature_requests \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f3c9c2e-..." \
-d '{
"title": "عقد عمل — أحمد م.",
"source": { "type": "template", "template_id": "tpl_employment" },
"legal_level": "aes",
"ordered": true,
"signers": [
{ "name": "أحمد محمد", "email": "ahmed@example.com",
"method": "draw", "require_identity": true }
]
}'
نظرة عامة
تتبع واجهة برمجة التطبيقات في «وثائق» نمط REST المنظَّم حول الموارد، فتستخدم مسارات HTTP يسهل توقّعها، وترمز الأخطاء بأكواد HTTP القياسية، وتتبادل البيانات بصيغة application/json (يُستثنى من ذلك رفع الملفات بصيغة multipart/form-data). وتمرّ جميع الطلبات عبر HTTPS حصرًا.
الطوابع الزمنية أعداد صحيحة تمثّل الثواني المنقضية منذ Unix epoch. ويحمل كل مورد معرّفًا فريدًا تسبقه بادئة تدلّ على نوعه، فيسهل تتبّع الكائنات في السجلّات:
| البادئة | المورد | مثال |
|---|---|---|
| sr_ | signature_request | sr_3n8Kd2Qa1V |
| sgr_ | signer | sgr_9fA2 |
| doc_ | document | doc_7Yq |
| tpl_ | template | tpl_employment |
| idv_ | identity_verification | idv_5k |
| evt_ | event | evt_2M |
| we_ | webhook_endpoint | we_1a |
| key_ | api_key | key_88 |
https://wthaiq.com/api/v1. ويُثبَّت الإصدار بتاريخه عبر الترويسة Wthaiq-Version، وتُوثَّق التغييرات بتواريخها في سجل التغييرات.wthaiq الرسمية، وأمر تثبيتها وأمثلة المكتبات الأخرى في صفحة المكتبات الرسمية.المصادقة
تُصادَق الطلبات بمفتاح سرّي يُرسَل في الترويسة Authorization وفق نمط HTTP Bearer. ولمفاتيحك صلاحيات كاملة، فاحفظها على الخادم فقط، ولا تضعها في شيفرة جهة العميل أو المستودعات العامة أو تطبيقات الهاتف.
| المفتاح | الصيغة | الوصف |
|---|---|---|
| المفتاح السرّي | sk_... | له صلاحيات كاملة، ويُستخدم على الخادم فقط. والمفتاح الحيّ يُرسل رسائل فعلية ويُصدر شهادات قانونية وتُفوتَر إرسالاته، أمّا مفتاح التجربة sk_test_ فلا يفعل شيئًا من ذلك. راجع قسم «مفاتيح التجربة والمفاتيح الحيّة». |
| المفتاح العام | pk_... | آمن عند كشفه في المتصفّح، ومُقيَّد بنطاقاتك، ومحصور في مجموعة ثابتة من المسارات. |
| سرّ إشعارات الأحداث | whsec_... | يُستخدم للتحقّق من توقيع إشعارات الأحداث (HMAC-SHA256). |
curl https://wthaiq.com/api/v1/signature_requests \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
401 ونوع الخطأ authentication_error. أدِر مفاتيحك من لوحة المطوّرين، واحذف فورًا أي مفتاح تسرَّب.الإصدارات (Versioning)
يُثبَّت الإصدار بتاريخه، فأرسِل الترويسة Wthaiq-Version بتاريخ الإصدار الذي بنيت عليه تكاملك، ليبقى سلوك الواجهة ثابتًا وإن أطلقنا تغييرات لاحقة. وإن لم تُرسل الترويسة، اعتُمِد أحدث إصدار مثبَّت على حسابك.
curl https://wthaiq.com/api/v1/templates \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
الأخطاء
تستخدم «وثائق» أكواد استجابة HTTP المتعارف عليها: النطاق 2xx يشير إلى النجاح، والنطاق 4xx يشير إلى خطأ في المُدخلات، والنطاق 5xx يشير إلى خطأ في خوادمنا. ويُعاد كل خطأ داخل مغلّف error موحَّد يتضمّن النوع والكود والرسالة، وفي الغالب اسم المُعامل المخالف ومعرّف الطلب.
{
"error": {
"type": "invalid_request_error",
"code": "parameter_missing",
"message": "المعامل signers مطلوب.",
"param": "signers",
"request_id": "req_9f2"
}
}
| النوع | كود HTTP | المعنى |
|---|---|---|
| authentication_error | 401 | مفتاح مفقود أو غير صالح. |
| invalid_request_error | 400 / 404 | مُعامل ناقص أو غير صحيح، أو مورد غير موجود. |
| quota_error | 402 | تجاوز الحصّة، أو الحاجة إلى خطة أعلى. |
| permission_error | 403 | لا تسمح باقتك أو حالة حسابك بالعملية: توثيق الشركة مطلوب للطلب الحيّ، أو الخاصية خارج باقتك، أو عنوان IP غير مسموح به للمفتاح. |
| rate_limit_error | 429 | تجاوز عدد الطلبات الحدَّ المسموح به. |
| idempotency_error | 409 | تعارض في قيمة Idempotency-Key. |
| api_error | 5xx | خطأ داخلي في خوادم «وثائق». |
200 نجاح · 201 أُنشئ · 403 ممنوع · النطاق 5xx خطأ خادم.| الحقل | مع الرمز | المعنى |
|---|---|---|
| upgrade_url | plan_required · plan_expired · plan_feature_unavailable | رابط صفحة الباقات في لوحة المطوّرين، لتختار باقة أو تجدّدها أو ترقّيها. |
| verify_url | kyb_required | رابط صفحة «توثيق الشركة» في لوحة المطوّرين. |
| feature · required_plan | plan_feature_unavailable | الخاصية المطلوبة، وأقلّ باقة تتيحها. |
| max_signers | too_many_signers | الحدّ الأقصى للموقّعين في الطلب الحيّ الواحد، وهو 5. |
Accept-Language حين تبدأ قيمته بالحرفين en، أو المعامل ?lang=en، أو المسار /en/api/v1/… الذي يعمل كالمسار /api/v1/… تمامًا. ولا يتغيّر الرمز code بتغيّر اللغة، فابنِ منطق تكاملك عليه لا على نصّ الرسالة.ترقيم الصفحات (Pagination)
تعتمد جميع نقاط نهاية القوائم الترقيمَ بالمؤشّر (cursor)، ويتحكّم فيه مُعاملا استعلام، وتُعيد كل قائمة مغلّفًا موحَّدًا يحمل object: "list".
| المُعامل | النوع | الوصف |
|---|---|---|
| limit | integer | عدد العناصر في الصفحة، من 1 إلى 100 (الافتراضي 20). |
| starting_after | string | معرّف العنصر الذي تبدأ النتائج بعده (لجلب الصفحة التالية). |
{
"object": "list",
"data": [
{ "id": "sr_3n8Kd2Qa1V", "object": "signature_request", "status": "sent" }
],
"has_more": true,
"next_cursor": "sr_2m7Xa9"
}
next_cursor في المُعامل starting_after، وتوقَّف عن طلب الصفحات حين يُعاد الحقل has_more بالقيمة false.Idempotency
لتكون إعادة المحاولة آمنة في طلبات POST، أرسِل ترويسة Idempotency-Key تحمل قيمة UUID فريدة لكل عملية منطقية. فإذا وصل الطلب نفسه مرّتين (بسبب انقطاع الشبكة مثلًا)، أعدنا الاستجابة الأصلية بدلًا من إنشاء مورد مكرّر. وتُحفظ المفاتيح مدة 24 ساعة.
curl -X POST https://wthaiq.com/api/v1/signature_requests \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f3c9c2e-8b1a-4c7d-9e21-2f0a6b3d1c44" \
-d '{ "title": "عقد عمل — أحمد م." }'
409 ونوع الخطأ idempotency_error.409 بالرمز idempotency_in_progress مع الترويسة Retry-After؛ فأعد المحاولة بعد لحظات لتصلك الاستجابة الأصلية دون تنفيذ ثانٍ.حدود المعدّل (Rate limits)
الحدّ 100 طلب لكل 10 ثوانٍ لكل حساب، وهو حدّ واحد يتشاركه وضعا التجربة والحيّ. وتحمل كل استجابة ترويسات تبيّن حصّتك المتبقّية، وعند تجاوز الحدّ تُعاد الحالة 429 مع الترويسة Retry-After التي تحدّد عدد الثواني الواجب انتظارها قبل إعادة المحاولة.
| الترويسة | الوصف |
|---|---|
| X-RateLimit-Limit | الحدّ الأقصى لعدد الطلبات في النافذة الزمنية الحالية. |
| X-RateLimit-Remaining | عدد الطلبات المتبقّية في النافذة الزمنية الحالية. |
| X-RateLimit-Reset | الطابع الزمني (Unix) الذي تتجدّد عنده النافذة. |
| Retry-After | يظهر مع الحالة 429، ويحدّد عدد الثواني الواجب انتظارها قبل إعادة المحاولة. |
# HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1754000010
Retry-After: 4
Retry-After.معرّفات الطلب (Request IDs)
تحمل كل استجابة الترويسة Wthaiq-Request-Id بقيمة مسبوقة بـreq_، ويظهر المعرّف نفسه في الحقل request_id عند أي خطأ. احفظ هذا المعرّف في سجلّاتك؛ فهو ما نطلبه منك عند التواصل مع الدعم لنتتبّع الطلب بدقّة.
# HTTP/1.1 200 OK
Content-Type: application/json
Wthaiq-Request-Id: req_9f2a1c
مفاتيح التجربة والمفاتيح الحيّة
لكل مفتاح صيغتان: حيّة sk_ / pk_ وتجريبية sk_test_ / pk_test_، وتختار التجريبية عند إنشاء المفتاح بعلامة «مفتاح تجربة» في لوحة المطوّرين ← مفاتيح الربط. ويبيّن الحقل livemode في كل كائن وحدث أيَّ المفتاحين أنشأه.
| الجانب | المفتاح الحيّ | مفتاح التجربة |
|---|---|---|
| الفوترة | يُخصم إرسال كل طلب من رصيدك | لا يُخصم شيء |
| الرسائل | تُرسَل الدعوات والتذكيرات والنسخ فعلًا | تصل الدعوة والتذكير بالبريد وعليهما علامة «تجربة»، ولا تُرسَل نسخ؛ ولا تُرسَل رسائل واتساب بل تُسجَّل في أحداث الطلب «كان سيُرسَل عبر واتساب إلى …» |
| الحدود | بحسب الباقة، والخصائص بحسبها | كل الخصائص عدا الدومين الخاص؛ و20 طلبًا و50 رسالة بريد في اليوم لكل حساب، و5 موقّعين في الطلب، و10 مستلمين في الدفعة الجماعية |
| الموقّعون | أي بريد أو رقم | بريد حسابك أو رقمه، أو بريد أحد أعضاء فريقك أو رقمه، وحده |
| المستوى القانوني | ses · aes · qes | المستوى المطلوب نفسه، وتأكيد الهوية محاكاة يختار فيها الموقّع «اعتماد» أو «رفض» دون جلسة لدى المزوّد؛ والطلب كله بلا حجّية قانونية |
| محضر الأدلّة | يُختم عند الاكتمال، ويصدر الحدثان document.sealed و verification.created | لا يُختم ولا يُطلب له ختم زمني، ولا يصدر الحدثان؛ ويعود من GET /signature_requests/{id}/evidence محضر تجريبي غير مختوم بالحقل test، وعلى الملف النهائي علامة مائية «تجريبي — بلا حجّية قانونية» |
| إشعارات الأحداث | تصل إلى نقاط الاستقبال الحيّة | تصل إلى نقاط الاستقبال المُنشأة بمفتاح تجربة عبر POST /v1/webhook_endpoints وحدها؛ فالنقاط المضافة من لوحة المطوّرين حيّة |
وبين المفتاح السرّي والعام فرقٌ آخر في صلاحية الوصول:
| الجانب | sk_ (سرّي) | pk_ (عام) |
|---|---|---|
| مكان الاستخدام | على الخادم فقط، ولا يُكشف أبدًا | آمن عند كشفه في المتصفّح |
| الصلاحيات | كاملة على كل الموارد | مقصورة على القراءة في مسارات محدّدة (القوالب وطلبات التوقيع والموقّعين والتدفّقات)، إضافةً إلى إنشاء طلبات التوقيع فقط |
| قفل النطاق | لا يوجد | مُقيَّد بنطاقات allowed_origins التي تحدّدها — وهذا يقلّل المخاطر لكنه ليس مصادقة: فترويسة Origin يضعها المتصفّح، ويستطيع أي برنامج نصّي يعمل خارج المتصفّح انتحالها. والحماية الفعلية هي حدّ الإنفاق اليومي للمفتاح، وتدويره فور الاشتباه في كشفه. |
| السقف اليومي | لا يوجد | لكل مفتاح سقف يومي لعمليات الإنشاء والإرسال مهما تعدّدت العناوين. عند بلوغه تُعاد الحالة 429 بالرمز daily_cap_reached حتى بداية اليوم التالي (UTC)، ويصلك إشعار في لوحتك عند 80% من السقف وعند بلوغه. |
sk_ على خادمك فقط، و pk_ المُقيَّد بنطاقك في أي شيفرة تعمل داخل المتصفّح.Metadata
تقبل معظم الكائنات القابلة للإنشاء الحقل metadata: خريطة نصّية من أزواج مفتاح/قيمة تحفظ فيها مراجعك الداخلية (مثل رقم طلب الشراء، أو معرّف المستخدم في نظامك، أو وسم الحملة). لا نستخدم هذه القيم داخليًّا، وتُعاد كما هي في كل استجابة وفي إشعارات الأحداث.
| القيد | الحدّ |
|---|---|
| عدد المفاتيح | حتى 50 مفتاحًا لكل كائن. |
| طول المفتاح | حتى 40 محرفًا. |
| طول القيمة | حتى 500 محرف. |
{
"metadata": {
"order_id": "A-1024",
"crm_contact": "cust_58231",
"campaign": "q3-onboarding"
}
}
Signature Requests
طلب التوقيع هو الكائن المركزي: يمثّل مستندًا (من قالب أو ملف مرفوع) يُرسَل إلى موقّع واحد أو أكثر بمستوى قانوني (assurance) محدّد، وتُتتبَّع حالة كل موقّع تتبّعًا كاملًا حتى الإتمام، وعندها يُختم الطلب بمحضر أدلّة موثّق قابل للتحقّق المستقلّ.
/v1/signature_requestsإنشاء طلب توقيع جديد يُحفظ مسودّةً أو يُرسَل فورًا إلى الموقّعين.
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| title | string | مطلوب | عنوان الطلب الظاهر للموقّعين. |
| source | object | مطلوب | مصدر المستند، وقيمة الحقل type إمّا template مع template_id، أو document مع document_id. ومصدر document (ملف PDF مرفوع) غير متاح بعد (قريبًا)، ويُرفض بالخطأ 400. |
| legal_level | string | مطلوب | المستوى القانوني: ses أو aes أو qes. |
| signers | array | مطلوب | قائمة الموقّعين (انظر الحقول أدناه). |
| format | string | اختياري | مستوى الضمان المطلوب، ويُسجَّل ويُعاد ضمن الكائن: pades-b / pades-t / pades-lt / pades-lta (الافتراضي pades-lt). لا يُصدر مسار واجهة برمجة التطبيقات حاليًا توقيع PAdES مضمَّنًا داخل ملف PDF؛ فالدليل التشفيري هو محضر الأدلّة المختوم (توقيع Ed25519 يتحقّق منه أي طرف بالمفتاح العام على /trust، وختم زمني RFC 3161). |
| ordered | boolean | اختياري | توقيع تسلسلي بترتيب الموقّعين في المصفوفة signers (الافتراضي false). |
| require_identity | boolean | اختياري | فرض تأكيد الهوية على مستوى الطلب قبل التوقيع. |
| cc | array | اختياري | مستلمو نسخة — يستلمون العقد الموقّع عند الاكتمال دون أن يوقّعوا (حتى 20). صيغة كل عنصر: { name, email }. |
| reminders | object | اختياري | { "enabled": true } يرسل حتى ثلاثة تذكيرات تلقائية للموقّع الذي حان دوره، قبل انتهاء المهلة بخمسة أيام ثم ثلاثة ثم يوم، للطلبات الحيّة المُرسَلة وحدها. ويُحفظ interval_hours و max ويُعادان كما أُرسلا دون أن يُستخدما. وتنتهي صلاحية الطلب بعد 7 أيام من إرساله. |
| send | boolean | اختياري | إرسال الطلب فور إنشائه (الافتراضي true). وقيمة false تُنشئ مسودّة لا يعمل رابط توقيعها حتى ترسلها عبر POST /v1/signature_requests/{id}/send. |
| metadata | object | اختياري | بيانات وصفية بصيغة مفتاح/قيمة. |
| signers[].name | string | مطلوب | اسم الموقّع. |
| signers[].email | string | اختياري* | البريد الإلكتروني للموقّع. * مطلوب ما لم يُرسَل phone. |
| signers[].phone | string | اختياري* | رقم واتساب الموقّع (يُطبَّع تلقائيًّا إلى الصيغة الدولية، مثال 201012345678). إن أُرسل مع البريد وصلت الدعوة بالقناتين. وإرساله وحده لا يُقبل إلا حين يكون إيصال رمز التحقّق عبر واتساب مفعَّلًا، وإلّا رُدّ الطلب بـ400 — كي لا يقف الموقّع أمام رمز لا سبيل لإيصاله إليه. |
| signers[].method | string | اختياري | draw (توقيع مرسوم + رمز تحقّق) أو token (شهادة QES على توكن مادي). |
| signers[].require_identity | boolean | اختياري | فرض تأكيد الهوية على هذا الموقّع تحديدًا (AES). |
| signers[].fields | object | اختياري | قيم حقول القالب المعبّأة مسبقًا. |
curl -X POST https://wthaiq.com/api/v1/signature_requests \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f3c9c2e-..." \
-d '{
"title": "عقد عمل — أحمد م.",
"source": { "type": "template", "template_id": "tpl_employment" },
"legal_level": "aes",
"ordered": true,
"signers": [
{ "name": "أحمد محمد", "email": "ahmed@example.com", "type": "individual",
"method": "draw", "require_identity": true,
"fields": { "job_title": "مهندس برمجيات", "salary": "25000" } }
],
"reminders": { "enabled": true, "interval_hours": 48, "max": 3 },
"metadata": { "order_id": "A-1024" }
}'
import Wthaiq from 'wthaiq';
const wt = new Wthaiq('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
const sr = await wt.signatureRequests.create({
title: 'عقد عمل — أحمد م.',
source: { type: 'template', template_id: 'tpl_employment' },
legal_level: 'aes',
ordered: true,
signers: [
{ name: 'أحمد محمد', email: 'ahmed@example.com', method: 'draw', require_identity: true }
]
});
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"livemode": true,
"status": "sent",
"title": "عقد عمل — أحمد م.",
"legal_level": "aes",
"format": "pades-lt",
"source": { "type": "template", "template_id": "tpl_employment" },
"signers": [
{
"id": "sgr_9fA2",
"object": "signer",
"name": "أحمد محمد",
"email": "ahmed@example.com",
"type": "individual",
"method": "draw",
"require_identity": true,
"order": 1,
"status": "sent",
"signing_url": "https://wthaiq.com/sign.php?token=uZ8..",
"viewed_at": null,
"signed_at": null,
"identity": { "status": "required", "provider": "external", "level": "aes" },
"fields": { "job_title": "مهندس برمجيات", "start_date": "2026-08-01" }
}
],
"ordered": true,
"require_identity": true,
"reference": null,
"reminders": { "enabled": true, "interval_hours": 48, "max": 3 },
"expires_at": 1755000000,
"completed_at": null,
"download_url": null,
"metadata": { "order_id": "A-1024" },
"created_at": 1754000000
}
إرسال جماعي: يُرسَل العقد نفسه إلى عدّة موقّعين دفعةً واحدة، ويُنشأ طلب توقيع مستقل لكل موقّع (حتى 200)، ويُتحقَّق من كفاية الرصيد للدفعة كاملةً قبل بدء الإرسال. ويُتحقَّق كذلك من بيانات كل الموقّعين قبل إنشاء أي طلب؛ فإن أخطأ أحدها رُدّت الدفعة كلّها بالخطأ 400 مع موضعه في الحقل param، ولا يُنشأ منها شيء.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| source | object | مطلوب | مصدر العقد، مثل { "type": "template", "template_id": "tpl_..." }. |
| recipients | array | مطلوب | قائمة الموقّعين، وصيغة كل عنصر: { name, email }. |
| fields | object | اختياري | قيم الحقول المشتركة بين جميع العقود. |
| legal_level | string | اختياري | ses أو aes أو qes. |
| cc | array | اختياري | مستلمو نسخة من كل عقد. |
curl -X POST https://wthaiq.com/api/v1/signature_requests/bulk \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{
"source": { "type": "template", "template_id": "tpl_265" },
"recipients": [
{ "name": "محمد سالم", "email": "m1@example.com" },
{ "name": "سارة أحمد", "email": "s2@example.com" }
],
"fields": { "amount": "5000" },
"legal_level": "ses"
}'{
"object": "bulk_send",
"created": 2,
"failed": 0,
"requests": [
{ "signature_request": "sr_3n8Kd2Qa1V", "email": "m1@example.com", "status": "sent" },
{ "signature_request": "sr_9Kx2Ld7Pq3", "email": "s2@example.com", "status": "sent" }
],
"errors": []
}
سرد طلبات التوقيع مع ترقيم الصفحات بالمؤشّر، وإمكانية التصفية حسب الحالة والتاريخ (created_after / created_before).
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| limit | integer | اختياري | من 1 إلى 100 (الافتراضي 20). |
| starting_after | string | اختياري | مؤشّر الصفحة التالية. |
| status | string | اختياري | التصفية حسب الحالة: draft, sent, completed ... |
curl "https://wthaiq.com/api/v1/signature_requests?limit=3&status=sent" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
const list = await wt.signatureRequests.list({ limit: 3, status: 'sent' });
{
"object": "list",
"data": [
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"livemode": true,
"status": "sent",
"title": "عقد عمل — أحمد م.",
"legal_level": "aes",
"format": "pades-lt",
"created_at": 1754000000
}
],
"has_more": true,
"next_cursor": "sr_2m7Xa9"
}
استرجاع طلب توقيع بمعرّفه، مع قائمة موقّعيه وحالة كلٍّ منهم.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع (sr_). |
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
const sr = await wt.signatureRequests.retrieve('sr_3n8Kd2Qa1V');
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"livemode": true,
"status": "partially_signed",
"title": "عقد عمل — أحمد م.",
"legal_level": "aes",
"format": "pades-lt",
"source": { "type": "template", "template_id": "tpl_employment" },
"ordered": true,
"require_identity": true,
"reference": null,
"expires_at": 1755000000,
"completed_at": null,
"download_url": null,
"metadata": { "order_id": "A-1024" },
"created_at": 1754000000
}
إرسال طلب في حالة المسودّة (draft) إلى موقّعيه.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/send \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"status": "sent",
"created_at": 1754000000
}
إلغاء طلب توقيع لم يكتمل بعد، فتصبح حالته canceled. والطلب المكتمل أو المُلغى سلفًا يُرفض بالحالة 409 والرمز request_not_cancelable. ولا يُستردّ ما خُصم عن الطلب بعد إرساله، ولو أُلغي قبل أن يوقّعه أحد.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/cancel \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"status": "canceled",
"completed_at": null,
"created_at": 1754000000
}
إرسال تذكير فوري إلى الموقّعين الذين يُنتظَر توقيعهم في هذا الطلب. والطلب المسودّة أو المُلغى يُرفض بالحالة 400.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/reminders \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "reminder",
"signature_request": "sr_3n8Kd2Qa1V",
"reminders_sent": 1
}
يُرجع بيانات العقد الموقّع بصيغة JSON بعد اكتمال الطلب: pdf_url رابط ملف PDF النهائي (نصّ العقد المجمَّد مع شهادة التحقّق بمرجعها ورمز QR)، و pdf_status حالته: ready أو pending أو unavailable، و pdf_sha256 بصمته، و final_document_url صفحة الوثيقة النهائية، و reference مرجع التحقّق. ويُنزَّل الملف نفسه عبر GET /v1/signature_requests/{id}/download/pdf بمفتاح سرّي، وفي الوضع الحيّ يصل رابطه إلى كل الموقّعين والمُرسِل بالبريد عند الاكتمال. والدليل التشفيري المستقل هو محضر الأدلّة عبر GET /v1/signature_requests/{id}/evidence.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع المكتمل. |
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/download \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "download",
"signature_request": "sr_3n8Kd2Qa1V",
"pdf_url": "https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/download/pdf",
"pdf_status": "ready",
"pdf_sha256": "455e49ec8a9975bb6ba5500fffb0d3af1a364ab2a1b1c1335020b17aef8316ef",
"pdf_bytes": 100993,
"pdf_generated_at": 1791021338,
"final_document_url": "https://wthaiq.com/final/9c1e..",
"reference": "WTQ-1A2B3C4D5E6F",
"format": "pades-lt",
"legal_level": "aes"
}
400 ونوع خطأ invalid_request_error.بيانات شهادة الإتمام مع سجلّ التدقيق بصيغة JSON.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/certificate \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "certificate",
"signature_request": "sr_3n8Kd2Qa1V",
"status": "completed",
"reference": "WTQ-1A2B3C4D5E6F",
"legal_level": "aes",
"format": "pades-lt",
"completed_at": 1754500000,
"signers": [
{ "name": "أحمد محمد", "email": "ahmed@example.com", "phone": null, "status": "signed", "signed_at": 1754500000 }
],
"audit_trail": [
{ "event": "sent", "actor": "owner", "ip": "203.0.113.7", "at": 1754000000 },
{ "event": "signed", "actor": "signer", "ip": "198.51.100.4", "at": 1754500000 }
],
"verify_url": "https://wthaiq.com/verify?c=WTQ-1A2B3C4D5E6F"
}
محضر الأدلّة المختوم للطلب المكتمل، للتحقّق المستقلّ منه: النصّ المعياري للمحضر record_raw وتوقيع Ed25519 عليه والمفتاح العام والختم الزمني RFC 3161. يتطلّب مفتاحًا سرّيًا sk_، ويُرجع 404 ما لم يُختم المحضر؛ وطلبات التجربة لا يُختم لها محضر.
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/evidence \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "evidence",
"signature_request": "sr_3n8Kd2Qa1V",
"format": "wthaiq-evidence-v1",
"verify_ref": "WTQ-1A2B3C4D5E6F",
"record_raw": "{\"document\":{..}}",
"seal": {
"signature_alg": "ed25519",
"signature": "b64..",
"public_key": "b64..",
"trust_url": "https://wthaiq.com/trust",
"timestamp_token": "b64.."
}
}
سجلّ التدقيق الزمني لهذا الطلب، بكل أحداثه من الفتح حتى التوقيع.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
| limit | integer · query | اختياري | من 1 إلى 100 (الافتراضي 20). |
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/events \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "list",
"data": [
{
"id": "evt_2M",
"object": "event",
"type": "signer.signed",
"signature_request": "sr_3n8Kd2Qa1V",
"signer": "sgr_9fA2",
"actor": "signer",
"ip": "197.44.x.x",
"user_agent": "..",
"created_at": 1754500000
}
],
"has_more": false,
"next_cursor": null
}
Signers
يمثّل الموقّع طرفًا في طلب التوقيع، وله حالته الخاصة وطريقة توقيعه ونتيجة تأكيد هويته. يُنشَأ تلقائيًا مع إنشاء الطلب، ويمكن استرجاعه أو إنشاء جلسة توقيع مدمجة له.
/v1/signersاسترجاع موقّع بمعرّفه.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف الموقّع (sgr_). |
curl https://wthaiq.com/api/v1/signers/sgr_9fA2 \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "sgr_9fA2",
"object": "signer",
"name": "أحمد محمد",
"email": "ahmed@example.com",
"type": "individual",
"method": "draw",
"require_identity": true,
"order": 1,
"status": "identity_verified",
"signing_url": "https://wthaiq.com/sign.php?token=uZ8..",
"viewed_at": 1754000100,
"signed_at": null,
"identity": { "status": "approved", "provider": "external", "level": "aes" },
"fields": { "job_title": "مهندس برمجيات", "start_date": "2026-08-01" }
}
إنشاء رابط توقيع مدمج صالح 30 دقيقة، لعرض صفحة التوقيع داخل تطبيقك بعلامتك التجارية (white-label). ولا يُنشأ لطلب مسودّة أو مُلغى.
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف الموقّع. |
| return_url | string | اختياري | رابط https كامل على دومين مقبول في حسابك، يُعاد إليه الموقّع بعد إتمام التوقيع، ومتاح في باقة «الأعمال» فأعلى. وصلاحية الجلسة ثابتة: 30 دقيقة. |
| mode | string | اختياري | iframe (الافتراضي) للتضمين في إطار داخل صفحة على دومين مقبول في حسابك، أو redirect لتحويل المتصفّح إلى صفحة التوقيع ثم إعادته إلى success_url أو cancel_url. ولا يُرسَل return_url مع نمط redirect. |
| success_url | string | مطلوب مع redirect | رابط https على دومين مقبول في حسابك (حتى 500 حرف، بلا اسم مستخدم ولا #)، يُحوَّل إليه الموقّع بعد أن يوقّع ومعه session_id (معرّف الطلب) و signer_id و status=completed. ويُستبدل {signature_request} و{signer} في الرابط بمعرّفي الطلب والموقّع. |
| cancel_url | string | اختياري | مثل success_url، ويُحوَّل إليه الموقّع إن رفض التوقيع ومعه status=declined. وإن لم يُرسَل بقي الموقّع في صفحة التوقيع بعد الرفض. واعتمد النتيجة من الإشعار الموقَّع، لا من العودة. |
curl -X POST https://wthaiq.com/api/v1/signers/sgr_9fA2/signing_session \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-d '{ "return_url": "https://app.acme.com/done" }'
{
"object": "signing_session",
"signer": "sgr_9fA2",
"signing_url": "https://wthaiq.com/embed/sign/9Qa1V..",
"expires_at": 1754001800
}
Documents
يمثّل المستند ملف PDF مرفوعًا يُحفظ في حسابك مع بصمته الرقمية (SHA-256) وعدد صفحاته وحجمه. واستخدامه مصدرًا لطلبات التوقيع عبر الواجهة البرمجية غير متاح بعد (قريبًا).
/v1/documentsرفع ملف PDF عبر multipart/form-data وحفظه في حسابك، ويُحتسب ضمن حدّ العقود في باقتك. ولا يُقبل بعدُ مصدرًا لطلب توقيع؛ فالطلب الذي يشير إليه يُرفض بالخطأ 400 إلى أن يتاح (قريبًا).
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| file | file | مطلوب | ملف PDF (حقل ضمن نموذج متعدّد الأجزاء). |
| kind | string | اختياري | نوع المستند: pdf (الافتراضي) أو contract. |
| field_map | string (JSON) | اختياري | خريطة حقول بالإحداثيات تُطبَع بموجبها القيم في مواضعها على الصفحات. الإحداثيات نسبية (0..1) وتُقاس من أعلى يسار الصفحة. |
{ "key", "label", "type", "page", "x", "y", "w", "h", "required" }. تُحفظ الخريطة مع المستند وتُعاد في الحقل fields، ولا تُطبع قيمها على الملف بعد (قريبًا). curl -X POST https://wthaiq.com/api/v1/documents \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-F "file=@agreement.pdf" \
-F "kind=pdf" \
-F 'field_map=[
{"key":"signer_name","label":"اسم الموقّع","type":"text",
"page":1,"x":0.12,"y":0.34,"w":0.30,"h":0.04,"required":true},
{"key":"contract_date","label":"التاريخ","type":"date",
"page":1,"x":0.62,"y":0.34,"w":0.22,"h":0.04}
]'
{
"id": "doc_7Yq",
"object": "document",
"kind": "pdf",
"filename": "agreement.pdf",
"pages": 4,
"bytes": 183221,
"sha256": "a3f1..",
"created_at": 1754000000
}
Templates
القوالب هي العقود المحفوظة في حسابك بحقولها القابلة للتعبئة. تُشير إليها طلبات التوقيع عبر source.template_id.
سرد القوالب المحفوظة في حسابك.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| limit | integer · query | اختياري | من 1 إلى 100 (الافتراضي 20). |
| category | string · query | اختياري | التصفية حسب الفئة، مثل hr. |
| starting_after | string · query | اختياري | مؤشّر الصفحة التالية. |
curl "https://wthaiq.com/api/v1/templates?category=hr" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
const tpls = await wt.templates.list({ category: 'hr' });
{
"object": "list",
"data": [
{
"id": "tpl_employment",
"object": "template",
"name": "عقد عمل",
"category": "hr",
"languages": ["ar"],
"created_at": 1754000000
}
],
"has_more": false,
"next_cursor": null
}
استرجاع قالب مع تعريف حقوله القابلة للتعبئة.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف القالب (tpl_). |
curl https://wthaiq.com/api/v1/templates/tpl_employment \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
const tpl = await wt.templates.retrieve('tpl_employment');
{
"id": "tpl_employment",
"object": "template",
"name": "عقد عمل",
"category": "hr",
"languages": ["ar"],
"fields": [
{ "key": "job_title", "label": "المسمى الوظيفي", "type": "text", "required": true },
{ "key": "salary", "label": "الراتب", "type": "number", "required": true }
],
"created_at": 1754000000
}
Identity Verifications
يربط تأكيد الهوية توقيع الموقّع بشخص حقيقي جرى التحقّق منه عبر مزوّد متخصّص في التحقّق من الهوية (بمستند رسمي ومطابقة حيّة للوجه)، وهو شرط المستوى المتقدّم (AES).
/v1/identity_verificationsاسترجاع عملية تأكيد هوية بمعرّفها.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف تأكيد الهوية (idv_). |
curl https://wthaiq.com/api/v1/identity_verifications/idv_5k \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "idv_5k",
"object": "identity_verification",
"provider": "external",
"signer": "sgr_9fA2",
"status": "approved",
"level": "aes",
"verification_url": "https://verify.wthaiq.com/u/..",
"created_at": 1754000000
}
Verifications
التحقّق العلني من سلامة مستند موقّع عبر مرجعه العام (WTQ- / WTH-)، دون كشف بيانات الأطراف كاملةً، وذلك بمقارنة البصمة الحالية للمستند ببصمته المختومة.
التحقّق العلني من مستند عبر مرجعه.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| reference | string · path | مطلوب | المرجع العام، مثل WTQ-1A2B3C4D5E6F. |
curl https://wthaiq.com/api/v1/verifications/WTQ-1A2B3C4D5E6F \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "verification",
"reference": "WTQ-1A2B3C4D5E6F",
"found": true,
"status": "completed",
"integrity": "intact",
"document": {
"title": "عقد عمل",
"sha256": "a3f1..",
"hash_alg": "hmac-sha256",
"format": "platform-evidence",
"legal_level": "aes"
},
"signed_at": 1754500000,
"parties": [
{ "name": "أ**** م****", "role": "signer" },
{ "name": "ش**** و****", "role": "owner" }
],
"qr": "https://wthaiq.com/verify?c=WTQ-1A2B3C4D5E6F"
}
Events
الحدث كائن غير قابل للتعديل، يمثّل قيدًا في سجلّ التدقيق ويعكس تغيّرًا في أحد الموارد. وهذه الأحداث نفسها هي ما تحمله إشعارات الأحداث الآلية، ويمكن سردها واسترجاعها لاحقًا.
/v1/eventsسرد أحداث الحساب، مع إمكانية التصفية حسب النوع.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| limit | integer · query | اختياري | من 1 إلى 100 (الافتراضي 20). |
| type | string · query | اختياري | التصفية حسب نوع الحدث، مثل signer.signed. |
| starting_after | string · query | اختياري | مؤشّر الصفحة التالية. |
curl "https://wthaiq.com/api/v1/events?limit=10&type=signer.signed" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "list",
"data": [
{
"id": "evt_2M",
"object": "event",
"type": "signer.signed",
"signature_request": "sr_3n8Kd2Qa1V",
"signer": "sgr_9fA2",
"actor": "signer",
"ip": "197.44.x.x",
"user_agent": "..",
"created_at": 1754500000
}
],
"has_more": true,
"next_cursor": "evt_1L"
}
استرجاع حدث واحد بمعرّفه.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف الحدث (evt_). |
curl https://wthaiq.com/api/v1/events/evt_2M \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "evt_2M",
"object": "event",
"type": "signer.signed",
"signature_request": "sr_3n8Kd2Qa1V",
"signer": "sgr_9fA2",
"actor": "signer",
"ip": "197.44.x.x",
"user_agent": "..",
"created_at": 1754500000
}
إعادة إرسال إشعار حدث سابق بحمولته نفسها ومعرّفه نفسه، موقَّعًا بسرّ الوجهة الحالي. تُنشأ عملية تسليم جديدة تُحاوَل فورًا، وتتبع جدول إعادة المحاولة المعتاد إن لم يردّ خادمك برمز 2xx. والحدّ: خمس مرات للحدث الواحد وثلاثون للحساب كل عشر دقائق، ثم 429.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف الحدث (evt_). |
| endpoint | string | اختياري | معرّف وجهة مفعّلة (we_) لإعادة الإرسال إليها وحدها. وبدونه يُعاد الإرسال إلى كل وجهة مفعّلة مشتركة في نوع الحدث. |
curl -X POST https://wthaiq.com/api/v1/events/evt_2M/redeliver \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-d '{ "endpoint": "we_8Hk2" }'
{
"object": "event_redelivery",
"event": "evt_2M",
"deliveries": [
{ "endpoint": "we_8Hk2", "status": "succeeded", "response_code": 200, "error": null }
]
}
Webhook Endpoints
تُسجِّل نقطة استقبال الإشعارات رابطًا (URL) يتلقّى إشعارات لحظية بالأحداث التي تشترك فيها. راجع دليل إشعارات الأحداث الآلية لمعرفة طريقة التحقّق من توقيع الإشعار وآلية إعادة المحاولة.
/v1/webhook_endpointsإنشاء نقطة استقبال إشعارات جديدة. تُعاد قيمة السرّ whsec_ مرّة واحدة عند الإنشاء.
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| url | string | مطلوب | عنوان HTTPS الذي يستقبل رسائل POST. |
| enabled_events | array | مطلوب | أنواع الأحداث المشترَك فيها، مثل signature_request.completed. |
curl -X POST https://wthaiq.com/api/v1/webhook_endpoints \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.acme.com/hooks/wthaiq",
"enabled_events": ["signature_request.completed", "signer.signed"]
}'
const we = await wt.webhookEndpoints.create({
url: 'https://api.acme.com/hooks/wthaiq',
enabled_events: ['signature_request.completed', 'signer.signed']
});
{
"id": "we_1a",
"object": "webhook_endpoint",
"url": "https://api.acme.com/hooks/wthaiq",
"enabled_events": ["signature_request.completed", "signer.signed"],
"status": "enabled",
"secret": "whsec_..",
"created_at": 1754000000
}
سرد نقاط استقبال الإشعارات المسجّلة.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| limit | integer · query | اختياري | من 1 إلى 100 (الافتراضي 20). |
curl https://wthaiq.com/api/v1/webhook_endpoints \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "list",
"data": [
{
"id": "we_1a",
"object": "webhook_endpoint",
"url": "https://api.acme.com/hooks/wthaiq",
"enabled_events": ["signature_request.completed", "signer.signed"],
"status": "enabled",
"created_at": 1754000000
}
],
"has_more": false,
"next_cursor": null
}
استرجاع نقطة استقبال إشعارات بمعرّفها.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف نقطة استقبال الإشعارات (we_). |
curl https://wthaiq.com/api/v1/webhook_endpoints/we_1a \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "we_1a",
"object": "webhook_endpoint",
"url": "https://api.acme.com/hooks/wthaiq",
"enabled_events": ["signature_request.completed", "signer.signed"],
"status": "enabled",
"secret": "whsec_..",
"created_at": 1754000000
}
حذف نقطة استقبال إشعارات، فيتوقّف إرسال الأحداث إليها فورًا.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف نقطة استقبال الإشعارات. |
curl -X DELETE https://wthaiq.com/api/v1/webhook_endpoints/we_1a \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"id": "we_1a",
"object": "webhook_endpoint",
"deleted": true
}
الكائن المركزي الذي يمثّل طلب التوقيع.
{
"id": "sr_3n8Kd2Qa1V",
"object": "signature_request",
"livemode": true,
"status": "sent",
"title": "عقد عمل — أحمد م.",
"legal_level": "aes",
"format": "pades-lt",
"source": { "type": "template", "template_id": "tpl_employment" },
"signers": [ ],
"ordered": true,
"require_identity": true,
"reference": null,
"reminders": { "enabled": true, "interval_hours": 48, "max": 3 },
"expires_at": 1755000000,
"completed_at": null,
"download_url": null,
"metadata": { "order_id": "A-1024" },
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| id | string | معرّف الطلب. |
| status | string | draft · sent · partially_signed · completed · declined · expired · canceled. |
| legal_level | string | ses · aes · qes. |
| format | string | مستوى الضمان المطلوب المسجَّل على الكائن (pades-b / t / lt / lta). لا يُصدر مسار الـAPI توقيع PAdES مضمّنًا داخل الـPDF؛ الإثبات هو محضر الأدلّة المختوم القابل للتحقّق المستقل. |
| source | object | مصدر المستند (قالب أو مستند مرفوع). |
| signers | array | كائنات الموقّعين. |
| ordered | boolean | توقيع تسلسلي. |
| require_identity | boolean | تأكيد الهوية قبل التوقيع (AES). |
| reference | string · null | مرجع التحقّق العامّ (WTQ-XXXXXXXXXXXX)، ويصدر عند الإتمام. |
| download_url | string · null | رابط الملف الموقّع بصيغة PDF، ويظهر عند الإتمام. |
| created_at | integer | وقت الإنشاء (طابع زمني بصيغة Unix). |
طرف يوقّع ضمن طلب توقيع.
{
"id": "sgr_9fA2",
"object": "signer",
"name": "أحمد محمد",
"email": "ahmed@example.com",
"type": "individual",
"method": "draw",
"require_identity": true,
"order": 1,
"status": "identity_verified",
"signing_url": "https://wthaiq.com/sign.php?token=uZ8..",
"viewed_at": 1754000100,
"signed_at": null,
"identity": { "status": "approved", "provider": "external", "level": "aes" },
"fields": { "job_title": "مهندس برمجيات", "start_date": "2026-08-01" }
}
| الحقل | النوع | الوصف |
|---|---|---|
| type | string | individual أو company. |
| method | string | draw (توقيع مرسوم + رمز تحقّق عبر البريد الإلكتروني) أو token (شهادة QES على توكن مادي). |
| status | string | pending · sent · viewed · otp_verified · identity_verified · signed · declined. |
| signing_url | string | رابط صفحة التوقيع المستضافة أو القابلة للتضمين. |
| identity | object | نتيجة تأكيد الهوية عند تفعيله عبر require_identity. |
| identity.status | string | none · required · in_review · resubmission_requested · declined · approved. تتغيّر القيمة مع أحداث signer.identity_*. |
| identity.verification_id | string | معرّف أحدث عملية تأكيد هوية للموقّع (idv_)، أو null قبل أن تبدأ. |
| identity.reason_code | string | سبب عامّ مصنَّف عند الرفض، بلا بيانات شخصية: reviewer_decision · face_mismatch · face_unclear · document_expired · document_unreadable · document_not_original · document_not_supported · not_accepted. |
| identity.resubmit_steps | array | الخطوات المطلوب إعادتها عند طلب الإعادة: document · liveness. |
| identity.updated_at | integer | وقت آخر تغيّر في حالة تأكيد الهوية. |
| fields | object | قيم حقول القالب المعبّأة مسبقًا. |
ملف PDF مرفوع.
{
"id": "doc_7Yq",
"object": "document",
"kind": "pdf",
"filename": "agreement.pdf",
"pages": 4,
"bytes": 183221,
"sha256": "a3f1..",
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| kind | string | pdf أو contract. |
| pages | integer | عدد الصفحات. |
| bytes | integer | حجم الملف بالبايت. |
| sha256 | string | البصمة الرقمية للمستند (SHA-256). |
عقد جاهز بحقول قابلة للتعبئة.
{
"id": "tpl_employment",
"object": "template",
"name": "عقد عمل",
"category": "hr",
"languages": ["ar"],
"fields": [
{ "key": "job_title", "label": "المسمى الوظيفي", "type": "text", "required": true },
{ "key": "salary", "label": "الراتب", "type": "number", "required": true }
],
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| name | string | اسم القالب. |
| category | string | فئة القالب، مثل hr. |
| languages | array | لغات القالب المتاحة. |
| fields | array | تعريف الحقول: key, label, type, required. |
نتيجة تأكيد هوية الموقّع عبر مزوّد متخصّص في التحقّق من الهوية.
{
"id": "idv_5k",
"object": "identity_verification",
"provider": "external",
"signer": "sgr_9fA2",
"status": "approved",
"level": "aes",
"verification_url": "https://verify.wthaiq.com/u/..",
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| provider | string | مزوّد التحقّق (external). |
| signer | string | معرّف الموقّع المرتبط. |
| status | string | pending · in_review · resubmission_requested · approved · declined · expired. |
| level | string | المستوى القانوني المستهدف. |
نتيجة التحقّق العلني من سلامة مستند عبر مرجعه.
{
"object": "verification",
"reference": "WTQ-1A2B3C4D5E6F",
"found": true,
"status": "completed",
"integrity": "intact",
"document": {
"title": "عقد عمل",
"sha256": "a3f1..",
"hash_alg": "hmac-sha256",
"format": "platform-evidence",
"legal_level": "aes"
},
"signed_at": 1754500000,
"parties": [
{ "name": "أ**** م****", "role": "signer" },
{ "name": "ش**** و****", "role": "owner" }
],
"qr": "https://wthaiq.com/verify?c=WTQ-1A2B3C4D5E6F"
}
| الحقل | النوع | الوصف |
|---|---|---|
| reference | string | المرجع العام (WTQ-/WTH-). |
| found | boolean | يبيّن ما إذا عُثر على المستند. |
| integrity | string | intact قُورن فطابق · modified قُورن فاختلف · recorded البصمة مسجَّلة ولم يكن الملفّ متاحًا للمقارنة · unknown لا بصمة مسجَّلة. |
| structure | string | الالتزام البنيويّ — يغطّي الوسوم والسمات والتنسيق والصور، وهو ما لا تغطّيه بصمة النصّ: match · changed · absent لتوقيع سابق لهذا الالتزام. |
| document.sha256 | string | بصمة الوثيقة المسجّلة لحظة الختم، وخوارزميتها في الحقل hash_alg. |
| document.hash_alg | string | hmac-sha256 في مراجع WTQ-: بصمة نصّ الوثيقة بمفتاح سرّي لدى المنصّة، فلا تساوي تجزئة ملف PDF المنزَّل ولا يعيد حسابها طرف خارجي، وتُطابَق عبر صفحة التحقّق. · sha256 في مراجع WTH-: تجزئة الملف النهائي نفسه، ويعيد حسابها أي طرف. |
| document.format | string | مستوى توقيع PAdES المضمَّن فعلًا في الملف حين يوقّع الطرف بالتوكن: pades-b · pades-t · pades-lt · pades-lta. وفي غير ذلك platform-evidence: محضر أدلّة مختوم بالوقت، بلا توقيع مضمَّن في الملف. |
| parties | array | الأطراف بأسماء محجوبة جزئيًا. |
| qr | string | رابط صفحة التحقّق العلني. |
قيد غير قابل للتعديل في سجلّ التدقيق.
{
"id": "evt_2M",
"object": "event",
"type": "signer.signed",
"signature_request": "sr_3n8Kd2Qa1V",
"signer": "sgr_9fA2",
"actor": "signer",
"ip": "197.44.x.x",
"user_agent": "..",
"created_at": 1754500000
}
| الحقل | النوع | الوصف |
|---|---|---|
| type | string | نوع الحدث، مثل signer.signed. |
| actor | string | owner · signer · system. |
| ip | string | عنوان IP لمنفّذ الإجراء. |
| user_agent | string | وكيل المستخدم (User-Agent) لمنفّذ الإجراء. |
رابط مسجَّل لتلقّي إشعارات الأحداث.
{
"id": "we_1a",
"object": "webhook_endpoint",
"url": "https://api.acme.com/hooks/wthaiq",
"enabled_events": ["signature_request.completed", "signer.signed"],
"status": "enabled",
"secret": "whsec_..",
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| url | string | عنوان HTTPS الذي يستقبل الإشعارات. |
| enabled_events | array | أنواع الأحداث المشترَك فيها. |
| status | string | enabled أو disabled. |
| secret | string | سرّ التوقيع whsec_ للتحقّق من توقيع HMAC على الإشعارات. |
مفتاح وصول إلى واجهة برمجة التطبيقات (لا يُعرض السرّ كاملًا بعد إنشائه).
{
"id": "key_88",
"object": "api_key",
"name": "Production",
"prefix": "sk_9a1b2c3d4e5f6",
"livemode": true,
"created_at": 1754000000,
"last_used_at": 1754500000
}
| الحقل | النوع | الوصف |
|---|---|---|
| name | string | اسم وصفي للمفتاح. |
| prefix | string | البادئة الظاهرة من المفتاح. |
| livemode | boolean | يبيّن ما إذا كان المفتاح حيًّا. |
| last_used_at | integer · null | وقت آخر استخدام (طابع زمني بصيغة Unix). |
المستويات القانونية — مرجع سريع
تُحدِّد قيمةُ legal_level قوّة الإثبات ومستوى الضمان المستهدف. وللتفاصيل الكاملة راجع صفحة الحجّية والمصداقية.
| المستوى | الوصف | صيغة PAdES |
|---|---|---|
| ses | توقيع إلكتروني بسيط: توقيع مرسوم مع رمز تحقّق إلزامي عبر البريد الإلكتروني. | platform-evidence |
| aes | توقيع متقدّم: SES مع هوية مؤكَّدة عبر مزوّد متخصّص في التحقّق من الهوية (بمستند رسمي ومطابقة حيّة للوجه) تربط التوقيع بشخص حقيقي. | platform-evidence |
| qes | توقيع مؤهّل: شهادة رقمية على توكن مادي صادرة عن جهة مرخّصة (مصر المقاصة / MCDR)، وهو الأعلى حجّيةً بموجب قانون التوقيع الإلكتروني المصري رقم 15 لسنة 2004. | حتى pades-lta |
| الصيغة | ما تضيفه |
|---|---|
| pades-b | التوقيع الأساسي (baseline). |
| pades-t | + ختم زمني معتمد (RFC 3161). |
| pades-lt | + DSS: الشهادات و OCSP و CRL للحفظ طويل الأمد. |
| pades-lta | + ختم زمني أرشيفي، وهو أعلى مستوى يُنتجه التوقيع بالتوكن. |
| platform-evidence | لا توقيع PAdES مضمَّن في الملف: محضر أدلّة مختوم بالوقت (Ed25519 + RFC 3161) وسجلّ تدقيق. هذا ما يناله التوقيع المرسوم وتأكيد الهوية. |
GET /v1/signature_requests/{id}/evidence (بمصادقة المالك).SubFilter adbe.pkcs7.detached · SHA256withRSA · ESS signingCertificateV2. في QES لا يغادر مفتاح الرمز الجهاز؛ يوقّع وكيل سطح مكتب محلّي (تحضير signedAttributes ← توقيع على الجهاز ← تضمين CMS).جاهز للبناء على «وثائق»؟
ابدأ بدليل البدء السريع، وأصدر أول طلب توقيع خلال دقائق بمفتاح تجربة مجاني، واجعل بريدك الإلكتروني مستلِمَ أول اختبار.
ابدأ خلال خمس دقائق