تخطّي إلى المحتوى
للمطوّرين · دليل البدء السريع

من الصفر لأول عقد موقّع في دقائق.

يرشدك هذا الدليل في خمس خطوات مباشرة، من إنشاء مفتاح واجهة برمجة التطبيقات (API) حتى الحصول على عقد موقّع ذي حجّية قانونية والتحقّق منه. وتأتي الأمثلة جاهزة للنسخ بصيغ cURL و Node و Python و PHP. وابدأ بمفتاح تجربة: لا يُخصم به شيء ولا تُرسَل به رسالة إلى أحد، ثم انتقل إلى المفتاح الحيّ عند الإطلاق.

وضع اختبار مجاني بحدّ يومي المكتبات الرسمية: PHP · Node.js · Python · iOS · Android محضر أدلّة مختوم وقابل للتحقّق
201 Created عقد موقّع
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}
    ]
  }'
قبل أن تبدأ

ثلاثة متطلّبات للانطلاق.

تجهيزات بسيطة تُنجزها في دقيقة، ثم تنتقل مباشرة إلى أول استدعاء برمجي.

حساب مطوّر

أنشئ حساب مطوّر في لوحة المطوّرين ببريد عملك، ومنها تُدير مفاتيحك وقوالبك وطلبات التوقيع وسجلّات الأحداث. وحساب المطوّر منفصل عن حسابات منصّة وثائق، فإن كان بريدك مسجّلًا فيها فاستعمل بريدًا آخر.

مفتاح وصول سري

أنشئ مفتاحًا يبدأ بالبادئة sk_ من صفحة «مفاتيح الربط» في لوحة المطوّرين. يمنحك هذا المفتاح وصولًا كاملًا إلى واجهة برمجة التطبيقات، ويكون فعّالًا منذ لحظة إنشائه؛ فكل طلب توقيع تُرسله بالمفتاح الحيّ حقيقي ويُحتسب من رصيد باقتك.

باقة للإرسال الحيّ

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

ابدأ بمفتاح تجربة. مفتاح التجربة sk_test_ لا يخصم رصيدًا، ولا يُرسل دعوة ولا تذكيرًا إلى أحد، ويقبل بريد حسابك موقّعًا، ولا يتجاوز التوقيع البسيط. أمّا المفتاح الحيّ sk_ فيُرسل الرسائل فعلًا، ويُصدر عقودًا نافذة ذات حجّية قانونية، ويُحتسب كل موقّع إرسالًا من رصيد باقتك السنوي، ثم من محفظتك بسعر الزيادة بعد نفاده، و$1.50 من المحفظة لكل موقّع يتطلّب التحقّق من هويته.
باقة مدفوعة وشركة موثّقة قبل الإرسال الحيّ. الطلبات الحيّة تتطلّب باقة مدفوعة سارية وشركة موثّقة من صفحة «توثيق الشركة» في لوحة المطوّرين، وإلّا عاد الخطأ 402 plan_required أو 403 kyb_required. ومفتاح التجربة مجاني بحدّ يومي.
خمس خطوات

من المفتاح إلى العقد الموقّع، خطوة بخطوة.

اتبع الخطوات بالترتيب. كل خطوة قائمة بذاتها ومزوّدة بأمثلة جاهزة للنسخ في أربع لغات.

1 المصادقة

احصل على مفتاح الوصول

من لوحة المطوّرين، افتح مفاتيح الربط وأنشئ مفتاحًا جديدًا، واختر «مفتاح تجربة» ما دمت تبني تكاملك. وتتوفّر المفاتيح بنوعين:

المفتاحالوصف
sk_...مفتاح سرّي للاستخدام على الخادم فقط، بصلاحيات كاملة. الحيّ منه يُرسل الرسائل فعليًّا ويُصدر عقودًا نافذة ذات حجّية قانونية وتُحتسب تكلفة إرسالاته، ونسخة التجربة (sk_test_) لا تفعل شيئًا من ذلك.
pk_...مفتاح عامّ قابل للنشر، يمكن كشفه في المتصفّح بأمان، ومُقيَّد بنطاقاتك (allowed_origins)، ومحصور في مجموعة من المسارات (القوالب، وطلبات التوقيع، والموقّعون، والتدفّقات).

تجري المصادقة بإرسال الترويسة Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx مع كل طلب. وثبّت أيضًا إصدار الواجهة البرمجية بالترويسة Wthaiq-Version: 2026-07-01 ليبقى سلوكها ثابتًا مع التحديثات.

لا تكشف المفتاح السرّي أبدًا في شيفرة جانب العميل. المفتاح السرّي (sk_) مخصّص للخادم وحده؛ فلا تضعه في تطبيق ويب أو تطبيق للهاتف المحمول أو في مستودع عام. وإن تسرّب فألغِه فورًا من لوحة المطوّرين وأنشئ مفتاحًا بديلًا. راجع دليل الأمان للتفاصيل.
2 التهيئة

اضبط الاتصال بالواجهة

استدعِ الواجهة مباشرةً عبر cURL أو أي عميل HTTP دون تثبيت أي حزمة، أو استخدم إحدى مكتبات الخادم الرسمية (PHP · Node.js · Python) كما تعرض التبويبات التالية.

cURLNodePythonPHP
shell
# لا يحتاج cURL أي SDK — فقط اضبط مفتاحك
export WTHAIQ_API_KEY="sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# تحقّق من الاتصال بجلب قوالب حسابك
curl https://wthaiq.com/api/v1/templates \
  -H "Authorization: Bearer $WTHAIQ_API_KEY" \
  -H "Wthaiq-Version: 2026-07-01"
terminal + index.js
npm install wthaiq
import Wthaiq from 'wthaiq';
const wt = new Wthaiq('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
terminal + main.py
pip install wthaiq
import wthaiq
wt = wthaiq.Client('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
terminal + index.php
composer require wthaiq/wthaiq-php
$wt = new \Wthaiq\Client('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
استعرض القائمة الكاملة للمكتبات، ومعها مكتبتا التوقيع داخل التطبيق (iOS · Android)، في صفحة المكتبات. وتتبع جميعها نظام الإصدار الدلالي (SemVer)، وتثبّت مكتبات الخادم ترويسة إصدار الواجهة البرمجية تلقائيًّا.
3 الإنشاء

أنشئ أول طلب توقيع

أنشئ الآن طلب توقيع من قالب جاهز. يستخدم المثال التالي قالب عقد العمل (tpl_employment)، وموقّعًا واحدًا يوقّع برسم توقيعه (method: draw) بعد اجتياز تأكيد الهوية (require_identity: true)، وهو ما يرفع الطلب إلى مستوى التوقيع المتقدّم (AES).

POST /v1/signature_requests
cURLNodePythonPHP
create.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
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', 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' }
});

console.log(sr.signers[0].signing_url);
create.py
sr = wt.signature_requests.create(
    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'},
)

print(sr.signers[0].signing_url)
create.php
$sr = $wt->signatureRequests->create([
    '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'],
]);

echo $sr->signers[0]->signing_url;

الاستجابة كائنٌ من نوع signature_request بحالة sent، ويتضمّن بيانات الموقّع ورابط التوقيع signing_url الجاهز للفتح أو التضمين:

201 Created · application/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" },
  "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,
  "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..",
      "identity": { "status": "required", "provider": "external", "level": "aes" }
    }
  ]
}
idمُعرّف الطلب، ويبدأ بالبادئة sr_. استخدمه في كل الاستدعاءات اللاحقة (المتابعة، التنزيل، الإلغاء).
statusحالة الطلب: تكون sent بعد الإرسال، ثم تمرّ بالحالتين viewed و partially_signed وصولًا إلى completed.
livemodetrue لأن الطلب أُنشئ بمفتاح حيّ فأُرسل فعليًّا، وستُصدَر شهادة نافذة عند اكتمال التوقيع. وبمفتاح تجربة تكون القيمة false ولا يُرسَل شيء.
signers[].signing_urlرابط صفحة التوقيع المستضافة. وجّه الموقّع إليه مباشرةً، أو ضمّنه في تطبيقك عبر جلسة توقيع قصيرة الأمد.
signers[].identityحالة تأكيد الهوية لدى مزوّد متخصّص في التحقّق من الهوية (مستند رسمي ومطابقة حيّة للوجه). ويجب اعتمادها قبل أن يتمكّن الموقّع من التوقيع، لأن الطلب يتضمّن require_identity.
referencenull في هذه المرحلة، ويُسنَد رمز المرجع العامّ WTQ-... تلقائيًا عند اكتمال التوقيع.

طريق أقصر — جلسة من مسار عمل: إن ضبطت المستند وطريقة التوقيع وقناة الإرسال في مسار عمل منشور من لوحة المطوّرين، كفى خادمك ثلاثة أشياء: معرّف المسار، والمفتاح السرّي، وسرّ توقيع الإشعارات. يسمّي الطلب المسار والموقّعين وحدهم، وتعود النتيجة إلى خادمك في إشعار موقَّع.

POST /v1/sessions
الطلبالإشعارالتحقّق
session.sh
curl -X POST https://wthaiq.com/api/v1/sessions \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f3c9c2e-..." \
  -d '{
    "workflow_id":"wf_8f3a1c9e2b",
    "vendor_data":"A-1024",
    "signers":[
      {"name":"أحمد محمد","email":"ahmed@example.com"}
    ]
  }'
# {"id":"sr_3n8Kd2Qa1V","object":"session","status":"sent","workflow_id":"wf_8f3a1c9e2b","workflow_version":1,"vendor_data":"A-1024","sign_url":"https://wthaiq.com/sign.php?token=uZ8..",…}
signature_request.completed · POST body
{
  "id": "evt_2M",
  "object": "event",
  "type": "signature_request.completed",
  "created_at": 1754500000,
  "livemode": true,
  "data": {
    "object": {
      "id": "sr_3n8Kd2Qa1V",
      "object": "signature_request",
      "status": "completed",
      "reference": "WTQ-1A2B3C4D5E6F",
      "workflow_id": "wf_8f3a1c9e2b",
      "workflow_version": 1,
      "vendor_data": "A-1024"
    }
  }
}
verify.js
const crypto = require('crypto');

// rawBody: الجسم الخام كما وصل · header: قيمة الترويسة Wthaiq-Signature · secret: whsec_...
function verify(rawBody, header, secret) {
  const p = Object.fromEntries(header.split(',').map(x => x.split('=')));
  if (!p.t || Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false;
  const expected = crypto.createHmac('sha256', secret)
    .update(p.t + '.' + rawBody).digest('hex');
  return expected.length === (p.v1 || '').length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(p.v1));
}

// بعد نجاح التحقّق: event.data.object.vendor_data هو مرجعك، و workflow_id هو مسارك
wf_…معرّف مسار العمل المنشور في حسابك، ويُرسَل في الحقل workflow_id.
sk_…المفتاح السرّي، ويُرسَل من خادمك وحده في الترويسة Authorization.
whsec_…سرّ توقيع الإشعارات، وتتحقّق به من الترويسة Wthaiq-Signature قبل أن تعتمد على أي إشعار.

وإن ضبطت في المسار رابط العودة بعد التوقيع عاد الموقّع إلى موقعك بعد أن يوقّع أو يرفض. وتجد حقول الطلب كلّها، وما يجوز تغييره مع كل طلب، والأخطاء، في صفحة التوقيع عبر API.

4 المتابعة

تابع الحالة

لمعرفة وقت توقيع الطرف الآخر طريقتان: الاستعلام الدوري (Polling) للتجارب السريعة، وإشعارات الأحداث الآلية (Webhooks) لبيئة الإنتاج.

الطريقة الأولى — الاستعلام الدوري: استعلم عن الطلب متى شئت؛ فالحقل status يعكس أحدث حالة له.

GET /v1/signature_requests/{id}
poll.sh
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Wthaiq-Version: 2026-07-01"
الطريقة المُوصى بها: إشعارات الأحداث. بدلًا من الاستعلام المتكرر، دع «وثائق» تُخطر خادمك لحظيًّا: سجّل نقطة استقبال واستمع إلى الحدث signature_request.completed، لتتصرّف فور اكتمال التوقيع دون أي استعلام يدوي. وتجد تفاصيل التسجيل والتحقّق من التوقيع في صفحة إشعارات الأحداث.

الطريقة الثانية — إشعارات الأحداث: يصل الحدث كاملًا في طلب POST إلى نقطة الاستقبال لديك، ويأتي المورد المعنيّ ضمن الحقل data.object:

signature_request.completed · POST body
{
  "id": "evt_2M",
  "object": "event",
  "type": "signature_request.completed",
  "created_at": 1754500000,
  "livemode": true,
  "data": {
    "object": {
      "id": "sr_3n8Kd2Qa1V",
      "object": "signature_request",
      "status": "completed",
      "legal_level": "aes",
      "reference": "WTQ-1A2B3C4D5E6F",
      "completed_at": 1754500000,
      "download_url": "https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/download"
    }
  }
}

تحقّق من ترويسة التوقيع Wthaiq-Signature على كل طلب وارد، وأعِد استجابة 2xx بسرعة، ثم نفّذ المعالجة الثقيلة على نحو غير متزامن.

5 التنزيل والتحقّق

نزّل العقد الموقّع وتحقّق منه

بمجرد أن تصبح الحالة completed، اطلب بيانات العقد النهائي الموقّع. ونقطة النهاية هذه متاحة للطلبات المكتملة فقط، وتُرجع JSON فيه pdf_url (ملف PDF النهائي بشهادة التحقّق ومرجعها، ويُنزَّل بمفتاح سرّي) و final_document_url (صفحة الوثيقة النهائية). أمّا الدليل التشفيري المستقلّ لهذا المسار فهو محضر الأدلّة المختوم (JSON)، وليس توقيع PAdES مضمّنًا في ملف PDF، ويمكنك تنزيله عبر GET /v1/signature_requests/{id}/evidence.

GET /v1/signature_requests/{id}/download
download.sh
curl https://wthaiq.com/api/v1/signature_requests/sr_3n8Kd2Qa1V/download \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# {"object":"download","final_document_url":"https://wthaiq.com/final/…","reference":"WTQ-1A2B3C4D5E6F","pdf_url":null,…}

للتحقّق العلني من سلامة العقد، استخدم رمز المرجع WTQ-... الذي أُسنِد إلى الطلب عند اكتماله. ويستطيع أي طرف يملك هذا الرمز التأكّد من أصالة الوثيقة وسلامتها، برمجيًّا أو عبر الصفحة العامّة ‎/verify‎.

GET /v1/verifications/{reference}
verify.sh
curl https://wthaiq.com/api/v1/verifications/WTQ-1A2B3C4D5E6F \
  -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# الاستجابة
{
  "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" }
}
كيف تُضمن السلامة؟ تُحسَب تجزئة HMAC-SHA256 لنصّ الوثيقة عند الختم، لا لملف PDF المنزَّل، ويُختم للطلب محضر أدلّة موثّق يحمل توقيع Ed25519 (يتحقّق منه أي طرف بالمفتاح العام على /trust) وختمًا زمنيًا معتمدًا RFC 3161. وأي تعديل لاحق على نصّ الوثيقة المحفوظ يغيّر التجزئة فتتحوّل integrity إلى modified ويُكشَف التلاعب فورًا. وتجد مزيدًا من التفاصيل في صفحة الحجّية.
أسئلة شائعة

أسئلة المطوّرين قبل البدء.

هل توجد بيئة اختبار؟

نعم. أنشئ مفتاح تجربة sk_test_ من لوحة المطوّرين بعلامة «مفتاح تجربة»: لا يخصم رصيدًا، ولا يرسل دعوة ولا تذكيرًا إلى أحد، ويقبل بريد حسابك موقّعًا، ولا يتجاوز التوقيع البسيط، وتحمل كائناته livemode: false. وللاستخدام في المتصفّح دون كشف صلاحيات كاملة، استخدم مفتاحًا عامًا pk_ — محدود بمسارات معيّنة ومقفول على نطاقاتك.

ما الفرق بين SES و AES و QES بالنسبة لي كمطوّر؟

تتحكّم في المستوى عبر حقلي legal_level و method. المستوى البسيط SES = توقيع مرسوم مع رمز تحقّق عبر البريد. المستوى المتقدّم AES يضيف تأكيد هوية موثّق (مستند رسمي ومطابقة وجه حيّة عبر مزوّد متخصص للتحقق من الهوية) يربط التوقيع بشخص حقيقي — فعّله بضبط require_identity: true. المستوى المؤهّل QES يستخدم شهادة على رمز أجهزة (method: token) من جهة تصديق مرخّصة ويبلغ أعلى حجّية بموجب قانون التوقيع الإلكتروني المصري رقم 15 لسنة 2004. تفاصيل أوفى في صفحة الحجّية.

هل يحدث التوقيع داخل تطبيقي؟

لك الخياران. الأسهل هو استخدام signing_url المُستضاف الذي يعود مع كل موقّع. وإن أردت تجربة مدمجة بعلامتك دون مغادرة تطبيقك، فاطلب جلسة توقيع قصيرة الأمد عبر POST /v1/signers/{id}/signing_session وضمّنها في واجهتك. راجع مرجع الـAPI لتفاصيل التوقيع المدمج (White-label).

كيف أؤمّن مفاتيحي؟

استخدم المفتاح السرّي على الخادم فقط، ولا تضعه أبدًا في كود عميل ويب أو موبايل أو في مستودع عام. احفظه في متغيّرات بيئة أو خزنة أسرار، وقيّده بأقل صلاحية ممكنة، وبدّله دوريًا. إن اشتبهت في تسرّبه فألغِه فورًا من لوحة المطوّرين وأنشئ غيره. أمّن أيضًا نقاط الـWebhooks بالتحقّق من ترويسة Wthaiq-Signature. راجع دليل الأمان.

ما لغات SDK المدعومة؟

خمس مكتبات رسمية: ثلاث لتكامل الخادم (PHP · Node.js · Python) واثنتان للتوقيع داخل التطبيق (iOS · Android). مستودعاتها على منظمة github.com/wthaiq، وتتبع إصدارًا دلاليًا (SemVer)، وتثبّت مكتبات الخادم ترويسة إصدار الـAPI تلقائيًا. القائمة الكاملة وأوامر التثبيت في صفحة الـSDK.

جاهز لأول عقد موقّع؟

ابدأ الآن بمفتاح تجربة مجاني، ونفّذ المسار كاملًا في دقائق، وبريدك الإلكتروني مستلمًا للاختبار الأول.