المطوّرون · مرجع الـAPI

مرجع الـAPI الكامل

مرجعٌ تقنيّ دقيق لكل نقطة نهاية وكائن في واجهة «وثائق» البرمجية: المصادقة، الأخطاء، ترقيم الصفحات، Idempotency، حدود المعدّل، طلبات التوقيع والموقّعين والمستندات والقوالب وتأكيد الهوية والتحقق والأحداث والويب هوك. أمثلة جاهزة بـcURL وNode لكل استدعاء.

BASE URL https://wthaiq.com/api/v1
الإصدار 2026-07-01 المصادقة Bearer sk_... الاستجابة application/json
create-signature-request.sh
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، وتنزيل الـPDF فهو application/pdf). جميع الطلبات تمرّ عبر HTTPS فقط.

الطوابع الزمنية أعداد صحيحة بصيغة Unix epoch بالثواني. كل مورد يحمل معرّفًا فريدًا مسبوقًا بنوعه، ما يجعل تتبّع الكائنات في السجلّات مباشرًا:

البادئةالموردمثال
sr_signature_requestsr_3n8Kd2Qa1V
sgr_signersgr_9fA2
doc_documentdoc_7Yq
tpl_templatetpl_employment
idv_identity_verificationidv_5k
evt_eventevt_2M
we_webhook_endpointwe_1a
key_api_keykey_88
عنوان القاعدة: جميع المسارات نسبية إلى https://wthaiq.com/api/v1. الإصدار مثبّت بالتاريخ عبر ترويسة Wthaiq-Version، والتغييرات مؤرّخة في سجل التغييرات.

المصادقة

تُصادَق الطلبات عبر مفتاح سرّي في ترويسة Authorization بنمط HTTP Bearer. مفاتيحك تحمل امتيازات كاملة؛ احفظها على الخادم فقط، ولا تضعها في شيفرة العميل أو المستودعات العامة أو تطبيقات الجوال.

المفتاحالصيغةالوصف
المفتاح السرّيsk_...صلاحية كاملة، للخادم فقط. حيّ منذ الإنشاء: يرسل رسائل فعلية، ويُصدر شهادات قانونية، ويُفوتَر. راجع لا وضع تجريبي.
المفتاح العامpk_...آمن للكشف في المتصفّح، مقفول على نطاقاتك، ومحدود بمجموعة مسارات ثابتة.
سرّ الويب هوكwhsec_...يُستخدم للتحقق من توقيع رسائل الويب هوك (HMAC-SHA256).
auth.sh
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 ثابتًا حتى لو أطلقنا تغييرات لاحقة. إن أغفلت الترويسة، يُستخدم أحدث إصدار مثبّت على حسابك.

version.sh
curl https://wthaiq.com/api/v1/templates \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
كل تغيير جذري (breaking change) يصدر بتاريخ جديد ويُوثّق في سجل التغييرات. الإضافات غير الجذرية (حقول جديدة، قيم enum جديدة) قد تظهر دون تغيير التاريخ، فصمّم عميلك ليتساهل مع الحقول غير المتوقّعة.

الأخطاء

تستخدم «وثائق» أكواد استجابة HTTP التقليدية: النطاق 2xx نجاح، والنطاق 4xx يشير إلى خطأ في المُدخلات، والنطاق 5xx يشير إلى خطأ في خوادمنا. كل خطأ يُعاد داخل مغلّف error موحّد يحمل نوعًا وكودًا ورسالة، وغالبًا اسم المُعامل المخالف ومعرّف الطلب.

error.json
{
  "error": {
    "type": "invalid_request_error",
    "code": "parameter_missing",
    "message": "المعامل signers مطلوب.",
    "param": "signers",
    "request_id": "req_9f2"
  }
}
أنواع الأخطاء وأكواد HTTP
النوعكود HTTPالمعنى
authentication_error401مفتاح مفقود أو غير صالح.
invalid_request_error400 / 404مُعامل ناقص أو غير صحيح، أو مورد غير موجود.
quota_error402تجاوز الحصّة أو الحاجة لخطة أعلى.
rate_limit_error429عدد طلبات أكثر من المسموح.
identity_error422فشل أو تعذّر تأكيد الهوية.
signing_error422تعذّر إتمام التوقيع (حالة غير صالحة للعملية).
idempotency_error409تعارض في مفتاح Idempotency.
api_error5xxخطأ داخلي في خوادم «وثائق».
أكواد HTTP الأخرى: 200 نجاح · 201 أُنشئ · 403 ممنوع · نطاق 5xx خطأ خادم.

Idempotency

لجعل إعادة المحاولة آمنة على طلبات POST، أرسِل ترويسة Idempotency-Key بقيمة UUID فريدة لكل عملية منطقية. إن وصل الطلب نفسه مرّتين (بسبب انقطاع شبكة مثلًا)، نعيد الاستجابة الأصلية بدل إنشاء مورد مكرّر. تُحفظ المفاتيح 24 ساعة.

idempotency.sh
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: عدد الثواني قبل إعادة المحاولة.
429.txt
# HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1754000010
Retry-After: 4
أفضل ممارسة: طبّق إعادة محاولة بتراجع أسّي (exponential backoff) عند استقبال 429، واحترم قيمة Retry-After.

معرّفات الطلب (Request IDs)

كل استجابة تحمل ترويسة Wthaiq-Request-Id بقيمة مسبوقة بـreq_، ويظهر المعرّف نفسه داخل حقل request_id في أي خطأ. احفظ هذا المعرّف في سجلّاتك؛ فهو ما نطلبه عند التواصل مع الدعم لتتبّع أي طلب بدقّة.

request-id.txt
# HTTP/1.1 200 OK
Content-Type: application/json
Wthaiq-Request-Id: req_9f2a1c

لا يوجد وضع تجريبي — sk_ مقابل pk_

لا توجد بيئة اختبار منفصلة في «وثائق». كل مفتاح sk_ حيّ منذ لحظة إنشائه: يرسل بريدًا فعليًا للموقّعين، يُصدر شهادات قانونية نافذة، ويُخصم من رصيدك مع كل نداء. حقل livemode يساوي true على كل كائن دائمًا — فلا تتحقّق منه لتمييز بيئة عن أخرى.

الفرق الحقيقي القائم بين المفاتيح ليس تجريبي/حيّ، بل صلاحية الوصول:

الجانبsk_ (سرّي)pk_ (عام)
مكان الاستخدامالخادم فقط — لا يُكشف أبدًاآمن للكشف في المتصفّح
الصلاحياتكاملة على كل المواردمحصورة بمسارات محدّدة (القوالب، طلبات التوقيع، الموقّعون، التدفّقات) للقراءة، مع إنشاء طلبات التوقيع فقط
قفل النطاقلا يوجدمقفول على نطاقات allowed_origins التي تحدّدها
الفوترةكل نداء يُفوتَر فعليًاكل نداء يُفوتَر فعليًا
كل استدعاء حقيقي ومُفوتَر. لا يوجد رصيد تجريبي منفصل ولا نداءات مجانية. تسعير الوضع الحيّ فقط: 20 ج.م لكل طلب توقيع، بالإضافة إلى 35 ج.م لكل موقّع يتطلّب تحقّق هوية.
الطريقة الآمنة للتجربة: اشحن رصيدًا صغيرًا، واستخدم بريدك الإلكتروني الخاص كمستلم أول طلب توقيع تُنشئه أثناء بناء تكاملك، بدل عناوين عملاء حقيقيين. استخدم sk_ فقط على خادمك، وpk_ المقفول على نطاقك لأي كود يعمل داخل المتصفّح.

Metadata

معظم الكائنات القابلة للإنشاء تقبل حقل metadata: خريطة مفتاح/قيمة نصّية تخزّن فيها مراجعك الداخلية (رقم طلب، معرّف مستخدم في نظامك، وسم حملة). لا نستخدم هذه القيم داخليًا، وتُعاد كما هي في كل استجابة وفي رسائل الويب هوك.

القيدالحدّ
عدد المفاتيححتى 50 مفتاحًا لكل كائن.
طول المفتاححتى 40 محرفًا.
طول القيمةحتى 500 محرف.
metadata.json
{
  "metadata": {
    "order_id": "A-1024",
    "crm_contact": "cust_58231",
    "campaign": "q3-onboarding"
  }
}

Signature Requests

طلب التوقيع هو الكائن المركزي: يمثّل مستندًا (من قالب أو ملف مرفوع) مُرسَلًا إلى موقّع واحد أو أكثر بمستوى قانوني (assurance) محدّد، مع تتبّع كامل لحالة كل موقّع حتى الإتمام حيث يُختم للطلب محضر أدلّة موثّق قابل للتحقّق المستقل.

/v1/signature_requests
POST/v1/signature_requests

إنشاء طلب توقيع جديد — كمسودة أو مع إرساله فورًا للموقّعين.

الحقلالنوعالإلزامالوصف
titlestringمطلوبعنوان الطلب الظاهر للموقّعين.
sourceobjectمطلوبمصدر المستند. type إمّا template مع template_id، أو document مع document_id.
legal_levelstringمطلوبالمستوى القانوني: ses أو aes أو qes.
signersarrayمطلوبقائمة الموقّعين (انظر الحقول أدناه).
formatstringاختياريمستوى الضمان المطلوب، يُسجَّل ويُعاد على الكائن: pades-b / pades-t / pades-lt / pades-lta (الافتراضي pades-lt). لا يُصدر مسار الـAPI حاليًا توقيع PAdES مضمّنًا داخل ملف الـPDF؛ الدليل التشفيري هو محضر الأدلّة المختوم (توقيع Ed25519 يتحقّق منه أي طرف بالمفتاح العام على /trust، وختم زمني RFC 3161).
orderedbooleanاختياريتوقيع تسلسلي حسب حقل order (الافتراضي false).
require_identitybooleanاختياريفرض تأكيد الهوية قبل التوقيع على مستوى الطلب.
ccarrayاختياريمستلمو نسخة — يستلمون العقد الموقّع عند الاكتمال دون أن يوقّعوا (حتى 20). كل عنصر { name, email }.
remindersobjectاختياريإعدادات التذكير: enabled, interval_hours, max.
expires_atintegerاختياريطابع Unix لانتهاء صلاحية الطلب.
sendbooleanاختياريإرسال فوري بعد الإنشاء؛ خلاف ذلك يُنشأ كمسودة.
metadataobjectاختياريبيانات وصفية مفتاح/قيمة.
signers[].namestringمطلوباسم الموقّع.
signers[].emailstringمطلوببريد الموقّع.
signers[].methodstringاختياريdraw (توقيع مرسوم + OTP) أو token (شهادة QES على رمز أجهزة).
signers[].require_identitybooleanاختياريتأكيد هوية هذا الموقّع تحديدًا (AES).
signers[].orderintegerاختياريترتيب التوقيع عند ordered: true.
signers[].fieldsobjectاختياريقيم حقول القالب المعبّأة مسبقًا.
cURLNode
request.sh
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" }
  }'
create.js
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 }
  ]
});
الاستجابة · 201 Created
signature_request.json
{
  "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
}
POST/v1/signature_requests/bulk

إرسال جماعي: نفس العقد لعدّة موقّعين دفعة واحدة — يُنشأ طلب توقيع مستقل لكل موقّع (حتى 200). يُفحص الرصيد للدفعة كاملة قبل البدء.

المُعاملالنوعالإلزامالوصف
sourceobjectمطلوبمصدر العقد — مثل { "type": "template", "template_id": "tpl_..." }.
recipientsarrayمطلوبقائمة الموقّعين، كل عنصر { name, email }.
fieldsobjectاختياريقيم الحقول المشتركة لكل العقود.
legal_levelstringاختياريses أو aes أو qes.
ccarrayاختياريمستلمو نسخة لكل عقد.
terminal
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": []
}
GET/v1/signature_requests

سرد طلبات التوقيع بترقيم بالمؤشّر، مع إمكانية التصفية بالحالة والتاريخ (created_after / created_before).

المُعاملالنوعالإلزامالوصف
limitintegerاختياريمن 1 إلى 100 (الافتراضي 20).
starting_afterstringاختياريمؤشّر الصفحة التالية.
ending_beforestringاختياريمؤشّر الصفحة السابقة.
statusstringاختياريتصفية بالحالة: draft, sent, completed ...
cURLNode
list.sh
curl "https://wthaiq.com/api/v1/signature_requests?limit=3&status=sent" \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
list.js
const list = await wt.signatureRequests.list({ limit: 3, status: 'sent' });
الاستجابة · 200 OK
list.json
{
  "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"
}
GET/v1/signature_requests/{id}

استرجاع طلب توقيع بمعرّفه، مع قائمة موقّعيه وحالتهم.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع (sr_).
cURLNode
retrieve.sh
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
retrieve.js
const sr = await wt.signatureRequests.retrieve('sr_3n8Kd2Qa1V');
الاستجابة · 200 OK
signature_request.json
{
  "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
}
POST/v1/signature_requests/{id}/send

إرسال طلب من حالة المسودة (draft) ودفعه إلى الموقّعين.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع.
send.sh
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/send \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
signature_request.json
{
  "id": "sr_3n8Kd2Qa1V",
  "object": "signature_request",
  "status": "sent",
  "created_at": 1754000000
}
POST/v1/signature_requests/{id}/cancel

إلغاء طلب توقيع لم يكتمل بعد؛ تصبح حالته canceled.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع.
cancel.sh
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/cancel \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
signature_request.json
{
  "id": "sr_3n8Kd2Qa1V",
  "object": "signature_request",
  "status": "canceled",
  "completed_at": null,
  "created_at": 1754000000
}
POST/v1/signature_requests/{id}/reminders

إطلاق تذكير فوري للموقّعين المعلّقين في هذا الطلب.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع.
reminders.sh
curl -X POST https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/reminders \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
reminder.json
{
  "object": "reminder",
  "signature_request": "sr_3n8Kd2Qa1V",
  "sent_to": ["ahmed@example.com"],
  "sent_at": 1754050000
}
GET/v1/signature_requests/{id}/download

تنزيل الـPDF الموقّع (application/pdf) — متاح فقط عند اكتمال الطلب.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع المكتمل.
download.sh
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
الاستجابة · 200 OK (ترويسات)
headers.txt
# HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="agreement-signed.pdf"
Wthaiq-Request-Id: req_9f2a1c
إن كان الطلب غير مكتمل، تُعاد حالة 422 ونوع خطأ signing_error.
GET/v1/signature_requests/{id}/certificate

شهادة الإتمام مع سجل التدقيق — PDF افتراضيًا، أو JSON عبر ?format=json.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع.
formatstring · queryاختياريpdf (الافتراضي) أو json.
certificate.sh
curl "https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/certificate?format=json" \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
certificate.json
{
  "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
}
GET/v1/signature_requests/{id}/events

سجل التدقيق الزمنيّ الخاص بهذا الطلب — كل حدث من الفتح إلى التوقيع.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف طلب التوقيع.
limitinteger · queryاختياريمن 1 إلى 100 (الافتراضي 20).
events.sh
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/events \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
events.json
{
  "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
GET/v1/signers/{id}

استرجاع موقّع بمعرّفه.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف الموقّع (sgr_).
retrieve.sh
curl https://wthaiq.com/api/v1/signers/sgr_9fA2 \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
signer.json
{
  "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" }
}
POST/v1/signers/{id}/signing_session

توليد رابط/رمز توقيع مدمج قصير العمر (white-label) لعرض صفحة التوقيع داخل تطبيقك.

الحقلالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف الموقّع.
expires_inintegerاختياريعمر الجلسة بالثواني (الافتراضي 3600).
redirect_urlstringاختياريعنوان يُعاد إليه الموقّع بعد الإتمام.
signing_session.sh
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" }'
الاستجابة · 201 Created
signing_session.json
{
  "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
POST/v1/documents

رفع ملف PDF عبر multipart/form-data ليُستخدم كمصدر مستند.

الحقلالنوعالإلزامالوصف
filefileمطلوبملف الـPDF (حقل نموذج متعدّد الأجزاء).
kindstringاختيارينوع المستند: pdf (الافتراضي) أو contract.
field_mapstring (JSON)اختياريخريطة حقول بالإحداثيات تُطبع القيم في أماكنها على الصفحات. الإحداثيات نسبية (0..1) من أعلى يسار الصفحة.
خريطة الحقول (field_map): مصفوفة عناصر بالشكل { "key", "label", "type", "page", "x", "y", "w", "h", "required" }. عند إرسال طلب توقيع بهذا المستند، تُطبع قيم fields في المواضع المحدّدة تمامًا.
upload.sh
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}
  ]'
الاستجابة · 201 Created
document.json
{
  "id": "doc_7Yq",
  "object": "document",
  "kind": "pdf",
  "filename": "agreement.pdf",
  "pages": 4,
  "bytes": 183221,
  "sha256": "a3f1..",
  "created_at": 1754000000
}

Templates

القوالب هي العقود الجاهزة (أكثر من 250 قالبًا) بحقولها القابلة للتعبئة. تُشير إليها طلبات التوقيع عبر source.template_id.

/v1/templates
GET/v1/templates

سرد القوالب الجاهزة، مع إمكانية التصفية بالفئة.

المُعاملالنوعالإلزامالوصف
limitinteger · queryاختياريمن 1 إلى 100 (الافتراضي 20).
categorystring · queryاختياريتصفية بالفئة، مثل hr.
starting_afterstring · queryاختياريمؤشّر الصفحة التالية.
cURLNode
list.sh
curl "https://wthaiq.com/api/v1/templates?category=hr" \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
list.js
const tpls = await wt.templates.list({ category: 'hr' });
الاستجابة · 200 OK
list.json
{
  "object": "list",
  "data": [
    {
      "id": "tpl_employment",
      "object": "template",
      "name": "عقد عمل",
      "category": "hr",
      "languages": ["ar"],
      "created_at": 1754000000
    }
  ],
  "has_more": false,
  "next_cursor": null
}
GET/v1/templates/{id}

استرجاع قالب مع تعريف حقوله القابلة للتعبئة.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف القالب (tpl_).
cURLNode
retrieve.sh
curl https://wthaiq.com/api/v1/templates/tpl_employment \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
retrieve.js
const tpl = await wt.templates.retrieve('tpl_employment');
الاستجابة · 200 OK
template.json
{
  "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
GET/v1/identity_verifications/{id}

استرجاع عملية تأكيد هوية بمعرّفها.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف تأكيد الهوية (idv_).
retrieve.sh
curl https://wthaiq.com/api/v1/identity_verifications/idv_5k \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
identity_verification.json
{
  "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-)، دون كشف بيانات الأطراف كاملة. يقارن بصمة المستند الحالية ببصمته المختومة.

/v1/verifications
GET/v1/verifications/{reference}

التحقق العلني من مستند عبر مرجعه.

المُعاملالنوعالإلزامالوصف
referencestring · pathمطلوبالمرجع العام، مثل WTQ-000123.
verify.sh
curl https://wthaiq.com/api/v1/verifications/WTQ-000123 \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
verification.json
{
  "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
GET/v1/events

سرد أحداث الحساب مع إمكانية التصفية بالنوع.

المُعاملالنوعالإلزامالوصف
limitinteger · queryاختياريمن 1 إلى 100 (الافتراضي 20).
typestring · queryاختياريتصفية بنوع الحدث، مثل signer.signed.
starting_afterstring · queryاختياريمؤشّر الصفحة التالية.
list.sh
curl "https://wthaiq.com/api/v1/events?limit=10&type=signer.signed" \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
list.json
{
  "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"
}
GET/v1/events/{id}

استرجاع حدث واحد بمعرّفه.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف الحدث (evt_).
retrieve.sh
curl https://wthaiq.com/api/v1/events/evt_2M \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
event.json
{
  "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
POST/v1/webhook_endpoints

إنشاء نقطة ويب هوك جديدة. تُعاد قيمة السرّ whsec_ مرّة واحدة عند الإنشاء.

الحقلالنوعالإلزامالوصف
urlstringمطلوبعنوان HTTPS الذي يستقبل رسائل POST.
enabled_eventsarrayمطلوبأنواع الأحداث المشترَك بها، مثل signature_request.completed.
cURLNode
create.sh
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"]
  }'
create.js
const we = await wt.webhookEndpoints.create({
  url: 'https://api.acme.com/hooks/wthaiq',
  enabled_events: ['signature_request.completed', 'signer.signed']
});
الاستجابة · 201 Created
webhook_endpoint.json
{
  "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
}
GET/v1/webhook_endpoints

سرد نقاط الويب هوك المسجّلة.

المُعاملالنوعالإلزامالوصف
limitinteger · queryاختياريمن 1 إلى 100 (الافتراضي 20).
list.sh
curl https://wthaiq.com/api/v1/webhook_endpoints \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
list.json
{
  "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
}
GET/v1/webhook_endpoints/{id}

استرجاع نقطة ويب هوك بمعرّفها.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف نقطة الويب هوك (we_).
retrieve.sh
curl https://wthaiq.com/api/v1/webhook_endpoints/we_1a \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
webhook_endpoint.json
{
  "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
}
DELETE/v1/webhook_endpoints/{id}

حذف نقطة ويب هوك؛ يتوقّف إرسال الأحداث إليها فورًا.

المُعاملالنوعالإلزامالوصف
idstring · pathمطلوبمعرّف نقطة الويب هوك.
delete.sh
curl -X DELETE https://wthaiq.com/api/v1/webhook_endpoints/we_1a \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الاستجابة · 200 OK
deleted.json
{
  "id": "we_1a",
  "object": "webhook_endpoint",
  "deleted": true
}
signature_request

الكائن المركزي لطلب توقيع.

signature_request
{
  "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
}
الحقلالنوعالوصف
idstringمعرّف الطلب.
statusstringdraft · sent · partially_signed · completed · declined · expired · canceled.
legal_levelstringses · aes · qes.
formatstringمستوى الضمان المطلوب المسجَّل على الكائن (pades-b / t / lt / lta). لا يُصدر مسار الـAPI توقيع PAdES مضمّنًا داخل الـPDF؛ الإثبات هو محضر الأدلّة المختوم القابل للتحقّق المستقل.
sourceobjectمصدر المستند (قالب أو مستند مرفوع).
signersarrayكائنات الموقّعين.
orderedbooleanتوقيع تسلسلي.
require_identitybooleanتأكيد الهوية قبل التوقيع (AES).
referencestring · nullرمز التحقق العام (WTQ-XXXXXX) عند الإتمام.
download_urlstring · nullرابط الـPDF الموقّع، يظهر عند الإتمام.
created_atintegerطابع Unix للإنشاء.
signer

طرف موقّع ضمن طلب.

signer
{
  "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" }
}
الحقلالنوعالوصف
typestringindividual أو company.
methodstringdraw (مرسوم + OTP بريدي) أو token (شهادة QES على رمز أجهزة).
statusstringpending · sent · viewed · otp_verified · identity_verified · signed · declined.
signing_urlstringصفحة التوقيع المستضافة أو القابلة للتضمين.
identityobjectنتيجة تأكيد الهوية عند require_identity.
fieldsobjectقيم حقول القالب المعبّأة مسبقًا.
document

ملف PDF مرفوع.

document
{
  "id": "doc_7Yq",
  "object": "document",
  "kind": "pdf",
  "filename": "agreement.pdf",
  "pages": 4,
  "bytes": 183221,
  "sha256": "a3f1..",
  "created_at": 1754000000
}
الحقلالنوعالوصف
kindstringpdf أو contract.
pagesintegerعدد الصفحات.
bytesintegerحجم الملف بالبايت.
sha256stringبصمة SHA-256 للمستند.
template

عقد جاهز بحقول قابلة للتعبئة.

template
{
  "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
}
الحقلالنوعالوصف
namestringاسم القالب.
categorystringفئة القالب، مثل hr.
languagesarrayلغات القالب المتاحة.
fieldsarrayتعريف الحقول: key, label, type, required.
identity_verification

نتيجة تأكيد هوية موقّع عبر Didit.

identity_verification
{
  "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
}
الحقلالنوعالوصف
providerstringمزوّد التحقق (didit).
signerstringمعرّف الموقّع المرتبط.
statusstringpending · approved · declined · in_review.
levelstringالمستوى القانوني المستهدف.
verification

نتيجة تحقق علني من سلامة مستند بمرجعه.

verification
{
  "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"
}
الحقلالنوعالوصف
referencestringالمرجع العام (WTQ-/WTH-).
foundbooleanهل عُثر على المستند.
integritystringintact · modified · unknown.
partiesarrayأطراف بأسماء مقنّعة جزئيًا.
qrstringرابط صفحة التحقق العلني.
event

إدخال غير قابل للتعديل في سجل التدقيق.

event
{
  "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
}
الحقلالنوعالوصف
typestringنوع الحدث، مثل signer.signed.
actorstringowner · signer · system.
ipstringعنوان IP للفاعل.
user_agentstringوكيل المستخدم للفاعل.
webhook_endpoint

عنوان مسجّل لتلقّي الأحداث.

webhook_endpoint
{
  "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
}
الحقلالنوعالوصف
urlstringعنوان HTTPS المستقبِل.
enabled_eventsarrayأنواع الأحداث المشترَك بها.
statusstringenabled أو disabled.
secretstringسرّ التوقيع whsec_ للتحقق من HMAC.
api_key

مفتاح وصول للـAPI (لا يُعرض السرّ كاملًا بعد الإنشاء).

api_key
{
  "id": "key_88",
  "object": "api_key",
  "name": "Production",
  "prefix": "sk_9a1b2c3d4e5f6",
  "livemode": true,
  "created_at": 1754000000,
  "last_used_at": 1754500000
}
الحقلالنوعالوصف
namestringاسم المفتاح الوصفي.
prefixstringالبادئة الظاهرة من المفتاح.
livemodebooleanهل المفتاح حيّ.
last_used_atinteger · nullآخر استخدام (طابع Unix).

جاهز للبناء على «وثائق»؟

ابدأ من دليل البدء السريع، وأصدر أول طلب توقيع خلال دقائق — برصيد صغير وبريدك الخاص كمستلم أول اختبار.

ابدأ خلال خمس دقائق