نظرة عامة
واجهة «وثائق» البرمجية واجهة REST منظّمة حول الموارد، تستخدم مسارات HTTP يمكن التنبّؤ بها، وترمز الأخطاء بأكواد HTTP قياسية، وتُصدر وتستقبل حمولات application/json (باستثناء رفع الملفات فهو multipart/form-data، وتنزيل الـPDF فهو application/pdf). جميع الطلبات تمرّ عبر 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، والتغييرات مؤرّخة في سجل التغييرات.المصادقة
تُصادَق الطلبات عبر مفتاح سرّي في ترويسة Authorization بنمط HTTP Bearer. مفاتيحك تحمل امتيازات كاملة؛ احفظها على الخادم فقط، ولا تضعها في شيفرة العميل أو المستودعات العامة أو تطبيقات الجوال.
| المفتاح | الصيغة | الوصف |
|---|---|---|
| المفتاح السرّي | sk_... | صلاحية كاملة، للخادم فقط. حيّ منذ الإنشاء: يرسل رسائل فعلية، ويُصدر شهادات قانونية، ويُفوتَر. راجع لا وضع تجريبي. |
| المفتاح العام | 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 بقيمة تاريخ الإصدار الذي بنيت تكاملك عليه، فيبقى سلوك الـAPI ثابتًا حتى لو أطلقنا تغييرات لاحقة. إن أغفلت الترويسة، يُستخدم أحدث إصدار مثبّت على حسابك.
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 | تجاوز الحصّة أو الحاجة لخطة أعلى. |
| rate_limit_error | 429 | عدد طلبات أكثر من المسموح. |
| identity_error | 422 | فشل أو تعذّر تأكيد الهوية. |
| signing_error | 422 | تعذّر إتمام التوقيع (حالة غير صالحة للعملية). |
| idempotency_error | 409 | تعارض في مفتاح Idempotency. |
| api_error | 5xx | خطأ داخلي في خوادم «وثائق». |
200 نجاح · 201 أُنشئ · 403 ممنوع · نطاق 5xx خطأ خادم.ترقيم الصفحات (Pagination)
كل نقاط القوائم تستخدم ترقيمًا بالمؤشّر (cursor). تتحكّم بها ثلاثة مُعاملات استعلام، وتُعيد كل قائمة مغلّفًا موحّدًا يحمل object: "list".
| المُعامل | النوع | الوصف |
|---|---|---|
| limit | integer | عدد العناصر في الصفحة، من 1 إلى 100 (الافتراضي 20). |
| starting_after | string | معرّف العنصر الذي يبدأ الترقيم بعده (الصفحة التالية). |
| ending_before | 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.حدود المعدّل (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_ حيّ منذ لحظة إنشائه: يرسل بريدًا فعليًا للموقّعين، يُصدر شهادات قانونية نافذة، ويُخصم من رصيدك مع كل نداء. حقل livemode يساوي true على كل كائن دائمًا — فلا تتحقّق منه لتمييز بيئة عن أخرى.
الفرق الحقيقي القائم بين المفاتيح ليس تجريبي/حيّ، بل صلاحية الوصول:
| الجانب | sk_ (سرّي) | pk_ (عام) |
|---|---|---|
| مكان الاستخدام | الخادم فقط — لا يُكشف أبدًا | آمن للكشف في المتصفّح |
| الصلاحيات | كاملة على كل الموارد | محصورة بمسارات محدّدة (القوالب، طلبات التوقيع، الموقّعون، التدفّقات) للقراءة، مع إنشاء طلبات التوقيع فقط |
| قفل النطاق | لا يوجد | مقفول على نطاقات allowed_origins التي تحدّدها |
| الفوترة | كل نداء يُفوتَر فعليًا | كل نداء يُفوتَر فعليًا |
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. |
| legal_level | string | مطلوب | المستوى القانوني: ses أو aes أو qes. |
| signers | array | مطلوب | قائمة الموقّعين (انظر الحقول أدناه). |
| format | string | اختياري | مستوى الضمان المطلوب، يُسجَّل ويُعاد على الكائن: pades-b / pades-t / pades-lt / pades-lta (الافتراضي pades-lt). لا يُصدر مسار الـAPI حاليًا توقيع PAdES مضمّنًا داخل ملف الـPDF؛ الدليل التشفيري هو محضر الأدلّة المختوم (توقيع Ed25519 يتحقّق منه أي طرف بالمفتاح العام على /trust، وختم زمني RFC 3161). |
| ordered | boolean | اختياري | توقيع تسلسلي حسب حقل order (الافتراضي false). |
| require_identity | boolean | اختياري | فرض تأكيد الهوية قبل التوقيع على مستوى الطلب. |
| cc | array | اختياري | مستلمو نسخة — يستلمون العقد الموقّع عند الاكتمال دون أن يوقّعوا (حتى 20). كل عنصر { name, email }. |
| reminders | object | اختياري | إعدادات التذكير: enabled, interval_hours, max. |
| expires_at | integer | اختياري | طابع Unix لانتهاء صلاحية الطلب. |
| send | boolean | اختياري | إرسال فوري بعد الإنشاء؛ خلاف ذلك يُنشأ كمسودة. |
| metadata | object | اختياري | بيانات وصفية مفتاح/قيمة. |
| signers[].name | string | مطلوب | اسم الموقّع. |
| signers[].email | string | مطلوب | بريد الموقّع. |
| signers[].method | string | اختياري | draw (توقيع مرسوم + OTP) أو token (شهادة QES على رمز أجهزة). |
| signers[].require_identity | boolean | اختياري | تأكيد هوية هذا الموقّع تحديدًا (AES). |
| signers[].order | integer | اختياري | ترتيب التوقيع عند ordered: true. |
| 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/node';
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://sign.wthaiq.com/s/uZ8..",
"viewed_at": null,
"signed_at": null,
"identity": { "status": "pending", "provider": "didit", "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). يُفحص الرصيد للدفعة كاملة قبل البدء.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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 | اختياري | مؤشّر الصفحة التالية. |
| ending_before | 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.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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
}
إطلاق تذكير فوري للموقّعين المعلّقين في هذا الطلب.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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",
"sent_to": ["ahmed@example.com"],
"sent_at": 1754050000
}
تنزيل الـPDF الموقّع (application/pdf) — متاح فقط عند اكتمال الطلب.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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" \
-o agreement-signed.pdf
# HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="agreement-signed.pdf"
Wthaiq-Request-Id: req_9f2a1c
422 ونوع خطأ signing_error.شهادة الإتمام مع سجل التدقيق — PDF افتراضيًا، أو JSON عبر ?format=json.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف طلب التوقيع. |
| format | string · query | اختياري | pdf (الافتراضي) أو json. |
curl "https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/certificate?format=json" \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "certificate",
"signature_request": "sr_3n8Kd2Qa1V",
"reference": "WTQ-000123",
"legal_level": "aes",
"format": "pades-lt",
"document": { "sha256": "a3f1..", "sealed_at": 1754500000 },
"signers": [
{ "name": "أحمد محمد", "signed_at": 1754500000, "identity": "approved" }
],
"events_count": 7,
"issued_at": 1754500050
}
سجل التدقيق الزمنيّ الخاص بهذا الطلب — كل حدث من الفتح إلى التوقيع.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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": "viewed",
"signing_url": "https://sign.wthaiq.com/s/uZ8..",
"viewed_at": 1754000100,
"signed_at": null,
"identity": { "status": "approved", "provider": "didit", "level": "aes" },
"fields": { "job_title": "مهندس برمجيات", "start_date": "2026-08-01" }
}
توليد رابط/رمز توقيع مدمج قصير العمر (white-label) لعرض صفحة التوقيع داخل تطبيقك.
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| id | string · path | مطلوب | معرّف الموقّع. |
| expires_in | integer | اختياري | عمر الجلسة بالثواني (الافتراضي 3600). |
| redirect_url | string | اختياري | عنوان يُعاد إليه الموقّع بعد الإتمام. |
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 '{ "expires_in": 3600, "redirect_url": "https://app.acme.com/done" }'
{
"object": "signing_session",
"signer": "sgr_9fA2",
"signing_url": "https://sign.wthaiq.com/s/uZ8..?t=st_9Qa..",
"token": "st_9Qa1V..",
"expires_at": 1754003600
}
Documents
المستند يمثّل ملف PDF مرفوعًا لتُبنى عليه طلبات التوقيع (بديلًا عن القوالب الجاهزة). يُحفظ مع بصمة SHA-256 وعدد صفحاته وحجمه.
/v1/documentsرفع ملف PDF عبر multipart/form-data ليُستخدم كمصدر مستند.
| الحقل | النوع | الإلزام | الوصف |
|---|---|---|---|
| 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
القوالب هي العقود الجاهزة (أكثر من 250 قالبًا) بحقولها القابلة للتعبئة. تُشير إليها طلبات التوقيع عبر 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
تأكيد الهوية يربط توقيع الموقّع بشخص حقيقي مُتحقّق عبر Didit (مستند رسمي ومطابقة وجه حيّة)، وهو شرط المستوى المتقدّم (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": "didit",
"signer": "sgr_9fA2",
"status": "approved",
"level": "aes",
"verification_url": "https://verify.wthaiq.com/i/..",
"created_at": 1754000000
}
Verifications
التحقق العلني من سلامة مستند موقّع عبر مرجعه العام (WTQ- / WTH-)، دون كشف بيانات الأطراف كاملة. يقارن بصمة المستند الحالية ببصمته المختومة.
التحقق العلني من مستند عبر مرجعه.
| المُعامل | النوع | الإلزام | الوصف |
|---|---|---|---|
| reference | string · path | مطلوب | المرجع العام، مثل WTQ-000123. |
curl https://wthaiq.com/api/v1/verifications/WTQ-000123 \
-H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Wthaiq-Version: 2026-07-01"
{
"object": "verification",
"reference": "WTQ-000123",
"found": true,
"status": "completed",
"integrity": "intact",
"document": {
"title": "عقد عمل",
"sha256": "a3f1..",
"format": "pades-lt",
"legal_level": "aes"
},
"signed_at": 1754500000,
"parties": [
{ "name": "أ**** م****", "role": "signer" },
{ "name": "ش**** و****", "role": "owner" }
],
"qr": "https://wthaiq.com/verify?c=WTQ-000123"
}
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
}
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-XXXXXX) عند الإتمام. |
| 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": "viewed",
"signing_url": "https://sign.wthaiq.com/s/uZ8..",
"viewed_at": 1754000100,
"signed_at": null,
"identity": { "status": "approved", "provider": "didit", "level": "aes" },
"fields": { "job_title": "مهندس برمجيات", "start_date": "2026-08-01" }
}
| الحقل | النوع | الوصف |
|---|---|---|
| type | string | individual أو company. |
| method | string | draw (مرسوم + OTP بريدي) أو token (شهادة QES على رمز أجهزة). |
| status | string | pending · sent · viewed · otp_verified · identity_verified · signed · declined. |
| signing_url | string | صفحة التوقيع المستضافة أو القابلة للتضمين. |
| identity | object | نتيجة تأكيد الهوية عند require_identity. |
| 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. |
نتيجة تأكيد هوية موقّع عبر Didit.
{
"id": "idv_5k",
"object": "identity_verification",
"provider": "didit",
"signer": "sgr_9fA2",
"status": "approved",
"level": "aes",
"verification_url": "https://verify.wthaiq.com/i/..",
"created_at": 1754000000
}
| الحقل | النوع | الوصف |
|---|---|---|
| provider | string | مزوّد التحقق (didit). |
| signer | string | معرّف الموقّع المرتبط. |
| status | string | pending · approved · declined · in_review. |
| level | string | المستوى القانوني المستهدف. |
نتيجة تحقق علني من سلامة مستند بمرجعه.
{
"object": "verification",
"reference": "WTQ-000123",
"found": true,
"status": "completed",
"integrity": "intact",
"document": {
"title": "عقد عمل",
"sha256": "a3f1..",
"format": "pades-lt",
"legal_level": "aes"
},
"signed_at": 1754500000,
"parties": [
{ "name": "أ**** م****", "role": "signer" },
{ "name": "ش**** و****", "role": "owner" }
],
"qr": "https://wthaiq.com/verify?c=WTQ-000123"
}
| الحقل | النوع | الوصف |
|---|---|---|
| reference | string | المرجع العام (WTQ-/WTH-). |
| found | boolean | هل عُثر على المستند. |
| integrity | string | intact · modified · unknown. |
| 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 | وكيل المستخدم للفاعل. |
عنوان مسجّل لتلقّي الأحداث.
{
"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. |
مفتاح وصول للـAPI (لا يُعرض السرّ كاملًا بعد الإنشاء).
{
"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 | توقيع إلكتروني بسيط: توقيع مرسوم + OTP بريدي إلزامي. | pades-b / pades-t |
| aes | توقيع متقدّم: SES + هوية مؤكَّدة عبر Didit (مستند رسمي ومطابقة وجه حيّة) تربط التوقيع بشخص حقيقي. | حتى pades-lt |
| qes | توقيع مؤهّل: شهادة رقمية على رمز أجهزة من جهة مرخّصة (مصر المقاصة / MCDR) — أعلى حجّية بموجب قانون التوقيع الإلكتروني المصري رقم 15 لسنة 2004. | حتى pades-lta |
| الصيغة | ما تضيفه |
|---|---|
| pades-b | التوقيع الأساسي (baseline). |
| pades-t | + ختم زمني معتمد (RFC 3161). |
| pades-lt | + DSS: الشهادات وOCSP وCRL للحفظ طويل الأمد. |
| pades-lta | + ختم زمني أرشيفي — تستهدف «وثائق» هذا المستوى. |
GET /api/evidence.php?scope=api&doc=<id> (بمصادقة المالك).SubFilter adbe.pkcs7.detached · SHA256withRSA · ESS signingCertificateV2. في QES لا يغادر مفتاح الرمز الجهاز؛ يوقّع وكيل سطح مكتب محلّي (تحضير signedAttributes ← توقيع على الجهاز ← تضمين CMS).