من الصفر لأول عقد موقّع في دقائق.
يرشدك هذا الدليل في خمس خطوات مباشرة، من إنشاء مفتاح واجهة برمجة التطبيقات (API) حتى الحصول على عقد موقّع ذي حجّية قانونية والتحقّق منه. وتأتي الأمثلة جاهزة للنسخ بصيغ cURL و Node و Python و PHP. وابدأ بمفتاح تجربة: لا يُخصم به شيء ولا تُرسَل به رسالة إلى أحد، ثم انتقل إلى المفتاح الحيّ عند الإطلاق.
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. ومفتاح التجربة مجاني بحدّ يومي.من المفتاح إلى العقد الموقّع، خطوة بخطوة.
اتبع الخطوات بالترتيب. كل خطوة قائمة بذاتها ومزوّدة بأمثلة جاهزة للنسخ في أربع لغات.
احصل على مفتاح الوصول
من لوحة المطوّرين، افتح مفاتيح الربط وأنشئ مفتاحًا جديدًا، واختر «مفتاح تجربة» ما دمت تبني تكاملك. وتتوفّر المفاتيح بنوعين:
| المفتاح | الوصف |
|---|---|
| sk_... | مفتاح سرّي للاستخدام على الخادم فقط، بصلاحيات كاملة. الحيّ منه يُرسل الرسائل فعليًّا ويُصدر عقودًا نافذة ذات حجّية قانونية وتُحتسب تكلفة إرسالاته، ونسخة التجربة (sk_test_) لا تفعل شيئًا من ذلك. |
| pk_... | مفتاح عامّ قابل للنشر، يمكن كشفه في المتصفّح بأمان، ومُقيَّد بنطاقاتك (allowed_origins)، ومحصور في مجموعة من المسارات (القوالب، وطلبات التوقيع، والموقّعون، والتدفّقات). |
تجري المصادقة بإرسال الترويسة Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx مع كل طلب. وثبّت أيضًا إصدار الواجهة البرمجية بالترويسة Wthaiq-Version: 2026-07-01 ليبقى سلوكها ثابتًا مع التحديثات.
sk_) مخصّص للخادم وحده؛ فلا تضعه في تطبيق ويب أو تطبيق للهاتف المحمول أو في مستودع عام. وإن تسرّب فألغِه فورًا من لوحة المطوّرين وأنشئ مفتاحًا بديلًا. راجع دليل الأمان للتفاصيل.اضبط الاتصال بالواجهة
استدعِ الواجهة مباشرةً عبر cURL أو أي عميل HTTP دون تثبيت أي حزمة، أو استخدم إحدى مكتبات الخادم الرسمية (PHP · Node.js · Python) كما تعرض التبويبات التالية.
# لا يحتاج 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"
npm install wthaiq
import Wthaiq from 'wthaiq';
const wt = new Wthaiq('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
pip install wthaiq
import wthaiq
wt = wthaiq.Client('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
composer require wthaiq/wthaiq-php
$wt = new \Wthaiq\Client('sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
أنشئ أول طلب توقيع
أنشئ الآن طلب توقيع من قالب جاهز. يستخدم المثال التالي قالب عقد العمل (tpl_employment)، وموقّعًا واحدًا يوقّع برسم توقيعه (method: draw) بعد اجتياز تأكيد الهوية (require_identity: true)، وهو ما يرفع الطلب إلى مستوى التوقيع المتقدّم (AES).
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"}
}'
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);
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)
$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 الجاهز للفتح أو التضمين:
{
"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" }
}
]
}
viewed و partially_signed وصولًا إلى completed.require_identity.WTQ-... تلقائيًا عند اكتمال التوقيع.طريق أقصر — جلسة من مسار عمل: إن ضبطت المستند وطريقة التوقيع وقناة الإرسال في مسار عمل منشور من لوحة المطوّرين، كفى خادمك ثلاثة أشياء: معرّف المسار، والمفتاح السرّي، وسرّ توقيع الإشعارات. يسمّي الطلب المسار والموقّعين وحدهم، وتعود النتيجة إلى خادمك في إشعار موقَّع.
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..",…}
{
"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"
}
}
}
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 هو مسارك
وإن ضبطت في المسار رابط العودة بعد التوقيع عاد الموقّع إلى موقعك بعد أن يوقّع أو يرفض. وتجد حقول الطلب كلّها، وما يجوز تغييره مع كل طلب، والأخطاء، في صفحة التوقيع عبر API.
تابع الحالة
لمعرفة وقت توقيع الطرف الآخر طريقتان: الاستعلام الدوري (Polling) للتجارب السريعة، وإشعارات الأحداث الآلية (Webhooks) لبيئة الإنتاج.
الطريقة الأولى — الاستعلام الدوري: استعلم عن الطلب متى شئت؛ فالحقل status يعكس أحدث حالة له.
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:
{
"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 بسرعة، ثم نفّذ المعالجة الثقيلة على نحو غير متزامن.
نزّل العقد الموقّع وتحقّق منه
بمجرد أن تصبح الحالة completed، اطلب بيانات العقد النهائي الموقّع. ونقطة النهاية هذه متاحة للطلبات المكتملة فقط، وتُرجع JSON فيه pdf_url (ملف PDF النهائي بشهادة التحقّق ومرجعها، ويُنزَّل بمفتاح سرّي) و final_document_url (صفحة الوثيقة النهائية). أمّا الدليل التشفيري المستقلّ لهذا المسار فهو محضر الأدلّة المختوم (JSON)، وليس توقيع PAdES مضمّنًا في ملف PDF، ويمكنك تنزيله عبر GET /v1/signature_requests/{id}/evidence.
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.
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 ويُكشَف التلاعب فورًا. وتجد مزيدًا من التفاصيل في صفحة الحجّية.أكملت أول تكامل، إلى أين الآن؟
تعمّق في المرجع الكامل، وأمِّن استقبال إشعارات الأحداث، ووسّع تكاملك.
التوثيق الكامل
المرجع الشامل للمفاهيم والمصادقة وإدارة الأخطاء وترقيم الصفحات.
افتح التوثيقالـWebhooks
استقبل الأحداث لحظيًا وتحقّق من التوقيع بترويسة Wthaiq-Signature.
مرجع الـAPI
جميع نقاط النهاية والكائنات والحقول والأخطاء موثّقة بالتفصيل مع أمثلة حيّة.
تصفّح المرجعالمكتبات
المكتبات الرسمية: PHP · Node.js · Python · iOS · Android.
اطّلع على المكتباتالتكاملات
اربط «وثائق» بأدواتك وأنظمتك عبر تكاملات جاهزة ومسارات عمل مؤتمتة.
استعرض التكاملاتالحجّية والمصداقية
تعرّف على مستويات التوقيع SES و AES و QES، ومعايير PAdES، والإطار القانوني المصري.
اعرف المزيدأسئلة المطوّرين قبل البدء.
هل توجد بيئة اختبار؟
نعم. أنشئ مفتاح تجربة 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.
جاهز لأول عقد موقّع؟
ابدأ الآن بمفتاح تجربة مجاني، ونفّذ المسار كاملًا في دقائق، وبريدك الإلكتروني مستلمًا للاختبار الأول.