للمطورين
مرجع الواجهة البرمجية
الإصدار 1 · العنوان الأساسي https://api.lumex.id/v1
البداية السريعة
- أنشئ عملية تحقق من خادمك لأحد مستخدميك.
- أرسل المستخدم إلى الرابط
urlفي الرد. يصور بطاقته المدنية أو جواز سفره ويلتقط صورة شخصية قصيرة من متصفح هاتفه. - نرسل النتيجة إلى عنوان الإشعارات لديك، ونعيد المستخدم إلى
redirect_url.
جميع الطلبات والردود بصيغة JSON. استدع الواجهة من خادمك فقط، وليس من المتصفح أو تطبيق الجوال، لأن مفتاحك السري يجب أن يبقى سريا.
المصادقة
أرسل مفتاحك السري في الترويسة Authorization. تحصل على مفتاحين في لوحة التحكم:
| المفتاح | الاستخدام |
|---|---|
lx_test_… | وضع التجربة. يشغل الخطوات كاملة مع شريط يوضح أنها تجربة. بلا رسوم. |
lx_live_… | الوضع الفعلي. تحقق حقيقي، يخصم من العمليات المشمولة أو من رصيدك المسبق. |
Authorization: Bearer lx_live_…
إنشاء عملية تحقق
| الحقل | النوع | الوصف |
|---|---|---|
reference | نص، إلزامي | معرف المستخدم لديك، حتى 100 حرف. يعود في كل رد وإشعار. |
document | نص | id_card أو passport أو any. الافتراضي any ويترك الاختيار للمستخدم. |
locale | نص | en أو ar. الافتراضي en، ويمكن للمستخدم تغيير اللغة أثناء الخطوات. |
redirect_url | نص | عنوان HTTPS يعود إليه المستخدم عند الانتهاء. نضيف إليه ?verification=vrf_…. |
metadata | كائن | حتى 20 مفتاحا وقيمة نصية خاصة بك، تعود كما أرسلتها. |
أرسل الترويسة Idempotency-Key بقيمة فريدة لتكون إعادة المحاولة آمنة. استخدام المفتاح نفسه خلال 24 ساعة يعيد النتيجة الأولى بدل إنشاء عملية ثانية.
curl https://api.lumex.id/v1/verifications \ -H "Authorization: Bearer lx_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 6f1c2b7e-signup-1042" \ -d '{ "reference": "user_1042", "document": "any", "locale": "ar", "redirect_url": "https://your-site.com/verified" }'
الرد 201 Created:
{
"id": "vrf_7KQ2M9",
"reference": "user_1042",
"status": "created",
"url": "https://verify.lumex.id/v/…",
"expires_at": "2026-10-09T08:00:00Z",
"created_at": "2026-10-08T08:00:00Z"
}يعمل الرابط لمدة 24 ساعة ولشخص واحد فقط. أنشئ عملية جديدة إذا انتهت صلاحيته.
جلب عملية تحقق
يعيد كائن التحقق كاملا. استخدمه للتأكد من إشعار وصلك، أو للاستعلام الدوري إذا لم تتمكن من استقبال الإشعارات.
curl https://api.lumex.id/v1/verifications/vrf_7KQ2M9 \
-H "Authorization: Bearer lx_live_…"كائن التحقق
{
"id": "vrf_7KQ2M9",
"reference": "user_1042",
"status": "approved",
"decline_reasons": [],
"document": {
"type": "id_card",
"country": "KWT",
"number": "287041501234",
"surname": "ALSALEM",
"given_names": "FAHAD",
"nationality": "KWT",
"birth_date": "1987-04-15",
"sex": "M",
"expiry_date": "2029-03-01"
},
"checks": {
"code_lines": "passed",
"expiry": "passed",
"liveness": "passed",
"face_match": { "result": "passed", "score": 0.97 }
},
"metadata": {},
"created_at": "2026-10-08T08:00:00Z",
"completed_at": "2026-10-08T08:01:04Z"
}الحالة تتقدم في اتجاه واحد:
| الحالة | المعنى |
|---|---|
created | تم إنشاء الرابط، ولم يفتحه المستخدم بعد. |
in_progress | فتح المستخدم الرابط ويقوم بالتصوير. |
approved | نجحت جميع الفحوصات. حالة نهائية. |
declined | فشل فحص أو أكثر، انظر decline_reasons. حالة نهائية. |
expired | لم يكتمل الرابط خلال 24 ساعة. حالة نهائية ولا تحتسب. |
أسباب الرفض: document_unreadable، document_unsupported، code_lines_invalid، document_expired، liveness_failed، face_mismatch.
رموز الدول هي الرموز الثلاثية المطبوعة في السطور المرمزة للوثيقة. تحذف صور الوثيقة والوجه بمجرد صدور النتيجة، لذلك لا تعيدها الواجهة أبدا.
الإشعارات
أضف عنوان الإشعارات في لوحة التحكم. نرسل طلب POST بمحتوى JSON لكل حدث:
| الحدث | متى |
|---|---|
verification.started | فتح المستخدم الرابط. |
verification.approved | تم قبول التحقق. |
verification.declined | تم رفض التحقق. |
verification.expired | انتهت صلاحية الرابط دون إكمال. |
{
"id": "evt_3HZ81L",
"type": "verification.approved",
"created_at": "2026-10-08T08:01:04Z",
"data": { /* the verification object */ }
}رد بأي حالة 2xx خلال 10 ثوان. إن لم يحدث ذلك نعيد الإرسال على فترات متزايدة لمدة تصل إلى 24 ساعة. قد يصل الحدث نفسه أكثر من مرة، لذا تجاهل أي id سبق أن عالجته.
تحقق من التوقيع في كل إشعار. يحمل كل طلب الترويسة Lumex-Signature بالشكل t=1791446464,v1=5257a8…. احسب HMAC-SHA256 للنص t + "." + المحتوى الخام بالمفتاح السري للإشعارات وقارنه مع v1. ارفض الطلب إذا كان عمر t أكثر من 5 دقائق.
import crypto from "node:crypto"; export function verifyLumex(rawBody, header, secret) { const p = Object.fromEntries(header.split(",").map(x => x.split("="))); const t = Number(p.t); if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; const expected = crypto.createHmac("sha256", secret) .update(`${t}.${rawBody}`).digest("hex"); if (!p.v1 || p.v1.length !== expected.length) return false; return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(p.v1)); }
function verify_lumex(string $raw, string $header, string $secret): bool { parse_str(str_replace(',', '&', $header), $p); if (empty($p['t']) || abs(time() - (int)$p['t']) > 300) return false; $expected = hash_hmac('sha256', $p['t'] . '.' . $raw, $secret); return hash_equals($expected, $p['v1'] ?? ''); }
استخدم المحتوى الخام كما وصل تماما. تحليل JSON ثم إعادة ترميزه يغير البايتات ويفسد التوقيع.
الأخطاء
تعيد الأخطاء محتوى JSON فيه رمز ثابت code يمكنك فحصه في برنامجك، ورسالة مقروءة message:
{ "error": { "code": "invalid_field", "message": "redirect_url must start with https://" } }| HTTP | متى |
|---|---|
400 | حقل مفقود أو غير صحيح. |
401 | المفتاح مفقود أو خاطئ أو ملغى. |
402 | خطتك غير مفعلة أو نفد رصيدك المسبق. اشحن رصيدك من لوحة التحكم. |
404 | لا توجد عملية تحقق بهذا المعرف في هذا الوضع. |
409 | استخدم المفتاح Idempotency-Key نفسه مع محتوى مختلف. |
429 | طلبات كثيرة. انتظر عدد الثواني في Retry-After. |
5xx | خطأ من جهتنا. أعد المحاولة بالمفتاح Idempotency-Key نفسه. |
تحتاج مساعدة؟
أخبرنا عن نظامك عبر نموذج التواصل وسنساعدك في ربط موقعك الأول.