مرجع API
مرجع API للتحقق من الهوية.
كل نقطة نهاية يمكنك استدعاؤها، وكل حقل ستراه في الاستجابة، وما يجب فعله بـ webhook عند وصوله. وللاطلاع على أنواع الحقول الدقيقة، اعتمد وثيقة OpenAPI الحية على /docs في أصل API الخاص بك مرجعًا نهائيًا — فهذه الصفحة هي النسخة المبسطة بلغة واضحة.
عنوان URL الأساسي والبيئات
عنوان URL أساسي واحد. وبيئتان.
تذهب كل الطلبات إلى المضيف نفسه. وتُحدَّد البيئة التي تعمل فيها بالكامل بحسب مفتاح API الذي ترسله.
| عنوان URL الأساسي (هذا التوثيق) | https://api.shieldid.ca — illustrative; your production API origin is published together with your API keys. |
|---|---|
| ترويسة المصادقة | X-Api-Key: <your key>، في كل طلب باستثناء نقطتي النهاية العامتين المذكورتين أدناه. |
| بادئة مفتاح sandbox | vk_sand_… — الجلسات المنشأة بهذا المفتاح تُوسَم بـ environment: "sandbox" ولا يتم احتساب رسوم عنها أبداً. |
| بادئة مفتاح الإنتاج | vk_live_… — الطلبات نفسها، مع احتساب الرسوم وفق خطتك. |
| نوع المحتوى | application/json في جسم كل طلب وكل استجابة. |
نقاط النهاية
كامل واجهة v1.
ست نقاط نهاية JSON، إضافةً إلى صفحة مستضافة وفحص اعتماد عام لا يستخدمان JSON إطلاقاً — يكفي أن تضع رابطاً إليهما.
| Endpoint | Auth | What it does |
|---|---|---|
| POST /v1/sessions | X-Api-Key | إنشاء جلسة تحقق. يتطلب return_url وwebhook_url. يعيد session_id وverification_url وstatus: "PENDING". |
| GET /v1/sessions/{id} | X-Api-Key | الحالة والحقول الرئيسية لجلسة واحدة: status وconfidence وenvironment. |
| GET /v1/sessions/{id}/result | X-Api-Key | النتيجة الكاملة بعد وصول الجلسة إلى VERIFIED أو FAILED: person، ونتائج كل فحص، وconfidence، وverified_until. |
| DELETE /v1/sessions/{id} | X-Api-Key | إلغاء جلسة ما زالت PENDING أو IN_PROGRESS. أما الجلسة التي بلغت VERIFIED أو FAILED أو EXPIRED فلا يمكن إلغاؤها. |
| GET /v1/credentials/{token} | None — public | التحقق مما إذا كان اعتماد تم التحقق منه صالحاً حالياً. لا يتطلب مفتاح API، لذا يمكن استدعاؤه من المتصفح. ملاحظة: تتضمن الاستجابة حالياً أيضاً اسم الشخص الذي تم التحقق منه ونوع الوثيقة/البلد، وليس مجرد علامة صالح/غير صالح — لا تمنح هذا الرابط لطرف ثالث لا تريد أن يطّلع على ذلك. |
| GET /v1/pricing/{country} | X-Api-Key | التسعير لكل بلد لرمز بلد مكوّن من حرفين وفق ISO 3166-1. |
| /v/{session_id} | صفحة التحقق المستضافة — وهي verification_url التي تعيدها الجلسة. يعرض سطح المكتب رمز QR؛ ومسحه يمنح هاتف مقدّم الطلب الرابط نفسه لالتقاط وثيقته وصورته الشخصية. |
|---|---|
| /c/{session_id} | صفحة عامة وغير موثّقة للتحقق من الاعتماد لجلسة واحدة تم التحقق منها. ملاحظة: تتضمن الاستجابة حالياً أيضاً اسم الشخص الذي تم التحقق منه ونوع الوثيقة/البلد، وليس مجرد علامة صالح/غير صالح — لا تمنح هذا الرابط لطرف ثالث لا تريد أن يطّلع على ذلك. |
| /docs | مرجع OpenAPI التفاعلي المباشر لأصل API الخاص بحسابك. |
إنشاء جلسة
POST /v1/sessions من البداية إلى النهاية.
الطلب، وما يعود بالضبط.
curl -X POST https://api.shieldid.ca/v1/sessions \
-H "X-Api-Key: vk_sand_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourapp.example/verified",
"webhook_url": "https://yourapp.example/hooks/shieldid",
"expected_name": "Jordan Smith",
"locale": "en",
"metadata": { "application_id": "app_9182" }
}'| return_url | string، مطلوب — الوجهة التي يُعاد إليها مقدّم الطلب بعد إنهائه. يجب أن يكون http أو https. |
|---|---|
| webhook_url | string، مطلوب — الوجهة التي تُسلَّم إليها النتيجة الموقّعة. راجع Webhooks أدناه. |
| expected_name | string، مطلوب — الاسم الذي تتوقع وجوده على الوثيقة، ويُستخدم للمقارنة مع ما تذكره الهوية فعلياً. |
| expected_dob / expected_address | string، اختياري — تتم مقارنته بالوثيقة عند تقديمه؛ وليس مطلوباً لإجراء التحقق. |
| locale | string، اختياري — "en" أو "fr". يحدد لغة الصفحة المستضافة التي يراها مقدّم الطلب. |
| metadata | object، اختياري — بياناتك المرجعية الخاصة — معرّف طلب، أو معرّف مستأجر، أو أي شيء تريد إعادته دون تغيير في النتيجة وفي webhook. |
النتيجة
GET /v1/sessions/{id}/result — بنية الاستجابة.
تُسلَّم البنية نفسها في حمولة webhook، لذا نادراً ما تحتاج إلى الاستعلام الدوري من نقطة النهاية هذه.
| session_id | المعرّف الذي أنشأته. |
|---|---|
| status | PENDING أو IN_PROGRESS أو VERIFIED أو FAILED أو EXPIRED. |
| environment | "sandbox" أو "production"، بما يطابق المفتاح الذي أنشأ الجلسة. |
| person | الحقول المقروءة من المستند: الاسم، تاريخ الميلاد، نوع المستند، بلد المستند وجهة إصداره، العنوان. |
| checks | حكم واحد لكل فحص — انظر أدناه. وليست درجة واحدة غامضة أبدًا. |
| confidence | رقم إجمالي واحد للتحقق. وتُبلَّغ الفحوصات الفردية، ومنها مطابقة الوجه، بشكل منفصل مقابل خط قرار ثابت — ولا يحل هذا الحقل محلها. |
| verified_until | المدة التي تُعد فيها النتيجة سارية، في جلسة VERIFIED. |
| failure_reason | يُعيَّن في جلسة FAILED — مثل FACE_MATCH_BELOW_THRESHOLD أو CANCELLED_BY_API. وقيمته null في غير ذلك. |
| metadata | كل ما أرسلته عند إنشاء الجلسة، دون تغيير. |
{
"session_id": "ses_9f2c1a",
"status": "VERIFIED",
"environment": "sandbox",
"person": {
"name": "Jordan Smith",
"dob": "1994-03-11",
"document_type": "drivers_licence",
"document_country": "CA",
"document_jurisdiction": "ON"
},
"checks": {
"document": "PASS",
"liveness": "PASS",
"antispoof": "PASS",
"face_match": "PASS"
},
"confidence": 88,
"verified_until": "2027-03-11T00:00:00Z",
"failure_reason": null,
"metadata": { "application_id": "app_9182" }
}Add-onتُحسم كل من checks.document وchecks.liveness وchecks.antispoof وchecks.face_match إلى PASS أو FAIL أو SKIPPED. أما فحص قوائم المراقبة (checks.sanctions — CLEAR أو MATCH أو SKIPPED) فهو إضافة اختيارية ولا يظهر إلا للحسابات التي تفعّله.
دورة حياة الجلسة
خمس حالات، مسار واحد.
تتقدم الجلسة من تلقاء نفسها؛ فأنت لا تقود آلة الحالات، بل تقرؤها فقط.
| PENDING | تم الإنشاء. لم يفتح أحد verification_url بعد. |
|---|---|
| IN_PROGRESS | فتح المتقدم الرابط وهو الآن في مرحلة ما من مسار الالتقاط. |
| VERIFIED | اكتملت جميع الفحوصات والنتيجة جاهزة. حالة نهائية — استدعِ نقطة نهاية النتيجة أو اقرأ webhook. |
| FAILED | لم ينجح فحص واحد على الأقل. ويحدد failure_reason أيًّا منها. قريبًا: إعادة محاولة تعيد الجلسة إلى PENDING — وحتى ذلك الحين، تعامل مع FAILED كحالة نهائية وأنشئ جلسة جديدة إذا أراد المتقدم المحاولة مجددًا. |
| EXPIRED | لم يُكمل أحد في الوقت المحدد. تنتهي صلاحية الجلسات تلقائيًا بعد مهلة افتراضية (30 دقيقة)؛ أنشئ جلسة جديدة للمحاولة مرة أخرى. |
يُلغي DELETE /v1/sessions/{id} جلسةً حالتها PENDING أو IN_PROGRESS قبل اكتمالها. أما الجلسة التي بلغت VERIFIED أو FAILED أو EXPIRED فلا يمكن إلغاؤها لأنها منتهية أصلاً.
الأخطاء
ما ينبغي التخطيط له.
هذه القائمة المختصرة التي تستحق البرمجة وفقها اليوم. أما المجموعة الكاملة والحالية من رموز الأخطاء والحمولات فموثقة في OpenAPI الحي على /docs.
| Status | Code | Meaning |
|---|---|---|
| 401 | UNAUTHORIZED | ترويسة X-Api-Key مفقودة. |
| 401 | INVALID_KEY_FORMAT | المفتاح لا يبدأ بـ vk_sand_ أو vk_live_، أو لا يطابق أي مفتاح في الحساب. |
| 403 | FORBIDDEN | المفتاح صالح لكنه لا يملك صلاحية الوصول إلى الجلسة أو المورد الذي طلبته. |
| 404 | NOT_FOUND | لا توجد جلسة أو بيانات اعتماد أو مورد بهذا المعرّف. |
| 409 | CONFLICT | الجلسة ليست في حالة تسمح بهذا الإجراء، كأن تحاول إلغاء جلسة بلغت VERIFIED بالفعل. |
| 422 | VALIDATION_ERROR | حقل مطلوب مفقود أو غير صالح الصيغة — مثلًا، return_url ليس عنوان URL صالحًا بصيغة http أو https. |
Webhooks
موقّعة، ومُسلَّمة، ومُعاد إرسالها.
عندما تصل الجلسة إلى VERIFIED أو FAILED، يرسل ShieldID بطلب POST الشكل الموثق أعلاه إلى webhook_url الخاص بك.
- يُسلَّم بطلب POST مع جسم JSON يطابق شكل النتيجة أعلاه.
- موقّع بـ HMAC-SHA256 على جسم الطلب الخام، ويُرسل في ترويسة X-Bio-Signature. تحقق منه مقابل السر السري لـ webhook قبل الوثوق بالحمولة.
- يُعاد الإرسال حتى ثلاث مرات مع تأخير خطي إذا لم تُجب نقطة النهاية لديك برمز حالة 2xx.
- قريبًا: إعادة محاولة لجلسة FAILED تُسلّم webhook ثانيًا بمجرد حسمها. أما اليوم، فاعتمد قاعدة webhook واحدًا لكل جلسة.
- تطابق أسماء الحقول هنا هذا المرجع. وإذا بدا ما يصل فعليًا مختلفًا، فاعتمد الحمولة الحية على هذه الصفحة وأخبرنا — فقائمة الحقول تُبقى متوافقة مع API وليس العكس.
تحقّق من التوقيع
import crypto from "node:crypto";
function isValidShieldIdSignature(rawBody, signatureHeader, secret) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const provided = signatureHeader || "";
const a = Buffer.from(expected, "hex");
const b = Buffer.from(provided, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
// rawBody must be the exact, unparsed request body
app.post("/hooks/shieldid", express.raw({ type: "application/json" }), (req, res) => {
const ok = isValidShieldIdSignature(req.body, req.headers["x-bio-signature"], process.env.SHIELDID_WEBHOOK_SECRET);
if (!ok) return res.status(401).send("invalid signature");
const result = JSON.parse(req.body);
// result.session_id, result.status, result.checks, …
res.status(200).send("ok");
});عدم التكرار (Idempotency) وإعادة المحاولة
ابنِ معالجات يكون تشغيلها مرتين آمنًا.
لا يوجد بعد مفتاح مخصص لعدم التكرار (idempotency)، لا عند إنشاء الجلسة ولا عند تسليم webhook.
- قد يصل تسليم webhook المعاد محاولته أكثر من مرة للجلسة نفسها. اجعل معالجك يعتمد على session_id + status واجعل كتابة النتيجة idempotent.
- لا تُعد محاولة POST /v1/sessions بشكل أعمى عند انتهاء المهلة — تحقق أولًا مما إذا كانت الجلسة قد أُنشئت، وإلا فقد ينتهي بك الأمر بجلستين لمتقدم واحد.
- من المخطط إضافة ترويسة Idempotency-Key مخصصة لإنشاء الجلسة.
قريبًادعم Idempotency-Key عند إنشاء الجلسة
مواكبة التحديثات
هذا المرجع يتغير. تابع سجل التغييرات.
تُعلن إضافات الحقول ورموز الأخطاء الجديدة وتغييرات نقاط النهاية هناك قبل ظهورها هنا.
أسئلة
الأسئلة الشائعة حول المرجع.
التالي
ابدأ بتطبيق هذا المرجع عملياً.
اتبع دليل البدء السريع للانتقال بالترتيب من مفتاح sandbox إلى جلسة تم التحقق منها وwebhook موقّع.