يجب على كل دولة عضو في الاتحاد الأوروبي توفير محفظة هوية رقمية للاتحاد الأوروبي (EUDI) بحلول 24 ديسمبر 2026، ويجب على الشركات الخاضعة للتنظيم قبولها بحلول 24 ديسمبر 2027. تدير Didit خمس هويات إلكترونية وطنية (eIDs) اليوم، وقبول محفظة EUDI قادم قريبًا إلى نفس سير العمل.
محفظة EUDI هي تطبيق مجاني يجب على كل دولة عضو في الاتحاد الأوروبي توفيره بموجب اللائحة (EU) 2024/1183، المعروفة باسم eIDAS 2. تحتوي على بيانات تعريف الشخص (PID)، أي الاسم وتاريخ ومكان الميلاد والجنسية، بالإضافة إلى شهادات إلكترونية لسمات مثل رخصة القيادة أو الدبلوم. استخدامها طوعي.
عندما تطلب شركة بيانات، يرى الشخص من يطلب ويشارك فقط السمات المطلوبة. وهذا ما يسمى الإفصاح الانتقائي: يمكن للموقع أن يعرف أن شخصًا ما يزيد عمره عن 18 عامًا دون رؤية تاريخ الميلاد. تعمل المحفظة بمستوى ضمان عالٍ، وهو الأقوى من مستويات eIDAS الثلاثة، وتتحقق الشركة من توقيع المصدر قبل الاعتماد على البيانات.
آخر مراجعة: 5 أكتوبر 2026. ليس استشارة قانونية.
تواريخ رئيسية
المحافظ بحلول نهاية عام 2026. القبول بحلول 24 ديسمبر 2027.
هذه هي التواريخ في اللائحة (EU) 2024/1183 وأفعالها التنفيذية التي يجب على الشركات التخطيط لها.
30 أبريل 2024
نشر eIDAS 2
تظهر اللائحة (EU) 2024/1183، التي تعدل لائحة eIDAS (EU) No 910/2014، في الجريدة الرسمية للاتحاد الأوروبي. وتدخل حيز التنفيذ في اليوم العشرين بعد النشر.
24 ديسمبر 2024
دخول أول قواعد المحفظة حيز التنفيذ
تدخل اللوائح التنفيذية الخمس الأولى للمحفظة حيز التنفيذ: بيانات تعريف الشخص، والوظائف الأساسية، والإشعارات، والشهادات، والبروتوكولات والواجهات. تبدأ هذه اللوائح العد التنازلي لمدة 24 شهرًا و 36 شهرًا المذكورين أدناه.
15 يوليو 2026
تحديث قواعد المحفظة
تعتمد المفوضية اللائحة التنفيذية (EU) 2026/1731. تحدد هذه اللائحة تنسيقي الاعتماد، وهما SD-JWT VC و ISO/IEC mdoc، وتحدد الصورة الشخصية الإلزامية لعام 2028.
23 يوليو 2026
ARF v3.0.0
يصل إطار العمل المعماري والمرجعي (ARF)، وهو المخطط التقني الذي تبنى عليه المحافظ والأطراف المعتمدة، إلى الإصدار 3.0.0.
24 ديسمبر 2026
المحافظ في كل دولة عضو
يجب على كل دولة عضو توفير محفظة EUDI واحدة على الأقل. تسري قواعد تسجيل الأطراف المعتمدة، اللائحة التنفيذية (EU) 2025/848، اعتبارًا من نفس اليوم.
24 ديسمبر 2027
يجب على الشركات الخاصة قبولها
يجب على الشركات الخاصة التي يتوجب عليها استخدام مصادقة قوية للمستخدم بموجب القانون أو العقد، بخلاف الشركات الصغيرة والمتناهية الصغر، قبول المحفظة عندما يطلب المستخدم استخدامها (المادة 5f(2)). هذا الموعد يأتي بعد 36 شهرًا من دخول أولى القوانين التنفيذية حيز التنفيذ في 24 ديسمبر 2024، أي في موعد أقصاه 24 ديسمبر 2027.
11 أغسطس 2028
فحوصات الصورة الشخصية والتسجيل
تصبح الصورة الشخصية جزءًا من بيانات تعريف الشخص الإلزامية، ويجب على المحافظ مصادقة والتحقق من شهادة تسجيل كل طرف معتمد.
من يجب عليه قبولها
من يجب عليه قبول المحفظة، ومتى.
تحدد المادة 5f من لائحة eIDAS، بصيغتها المعدلة بموجب اللائحة (EU) 2024/1183، واجبات القبول. في كل حالة يختار فيها المستخدم استخدام المحفظة، وتحتفظ بطرقك الأخرى لتحديد هوية الأشخاص.
من
المعنى بوضوح
المادة · التاريخ
من
هيئات القطاع العام
المعنى بوضوح
إذا اشترطت إحدى الدول الأعضاء استخدام الهوية الإلكترونية للوصول إلى خدمة عامة عبر الإنترنت، فيجب على هذه الخدمة قبول محفظة الهوية الرقمية الأوروبية (EUDI Wallet) أيضًا.
المادة · التاريخ
المادة 5f(1)
من
الخدمات الخاصة التي تتطلب مصادقة قوية للمستخدم
المعنى بوضوح
إذا كان القانون أو العقد يلزمك باستخدام مصادقة قوية للمستخدم للتحقق من الهوية عبر الإنترنت، فيجب عليك أيضًا قبول محفظة الهوية الرقمية الأوروبية (EUDI Wallet). المحفز هو هذا الشرط، وليس قطاع عملك.
المادة · التاريخ
المادة 5f(2) · 24 ديسمبر 2027
من
المجالات التي تشملها المادة
المعنى بوضوح
النقل، الطاقة، الخدمات المصرفية، الخدمات المالية، الضمان الاجتماعي، الصحة، مياه الشرب، الخدمات البريدية، البنية التحتية الرقمية، التعليم والاتصالات. تشير المادة إلى أنها تشمل هذه المجالات، مما يعني أن القائمة هي أمثلة وليست حصرية.
المادة · التاريخ
المادة 5f(2)
من
الشركات متناهية الصغر والصغيرة
المعنى بوضوح
معفاة من واجب القطاع الخاص، كما هو محدد في توصية المفوضية 2003/361/EC. يمكنها قبول المحفظة إذا اختارت ذلك.
المادة · التاريخ
المادة 5f(2)
من
بناءً على طلب المستخدم فقط
المعنى بوضوح
يجب قبول المحفظة عندما يطلب المستخدم استخدامها. استخدامها طوعي للأفراد، ويجب أن تظل الخدمات مفتوحة لوسائل التعريف والمصادقة الأخرى.
المادة · التاريخ
المادتان 5f(2)، 5a(15)
من
المنصات الكبيرة جدًا عبر الإنترنت
المعنى بوضوح
المنصات المحددة بموجب قانون الخدمات الرقمية والتي تتطلب مصادقة المستخدم يجب أن تقبل المحفظة بناءً على طلب المستخدم، للحد الأدنى من البيانات التي تحتاجها الخدمة. لا يحدد النص تاريخًا منفصلاً لهذا الواجب.
المادة · التاريخ
المادة 5f(3)
يجب على الأطراف المعتمدة أيضًا التسجيل في الدولة العضو التي يقع مقرها فيها، وقد تطلب فقط البيانات التي سجلتها (المادة 5b). آخر مراجعة: 5 أكتوبر 2026. هذه ليست استشارة قانونية.
كيف تقبل الشركات المحفظة
كيف يقبل الطرف المعتمد محفظة الهوية الرقمية الأوروبية (EUDI Wallet) في خمس خطوات.
الخطوة 01 / 05
01
التسجيل كطرف معتمد
سجل في الدولة العضو التي يقع مقر عملك فيها، مع تفاصيلك والبيانات التي تنوي طلبها. ستحصل على شهادة وصول، والتي تصادق هويتك للمحفظة، وإذا كانت دولتك العضو تصدرها، شهادة تسجيل تسرد السمات التي سجلتها.
اطلب فقط ما تحتاجه
اطلب سمات محددة، مثل العمر فوق 18 عامًا، باستخدام OpenID for Verifiable Presentations (OpenID4VP) واستعلام Digital Credentials Query Language (DCQL)، أو باستخدام ISO/IEC 18013-7. لا يجوز لك طلب بيانات تتجاوز ما سجلته.
المستخدم يوافق في المحفظة
على نفس الهاتف، ينتقل المتصفح إلى تطبيق المحفظة. على الكمبيوتر، يقوم المستخدم بمسح رمز QR. تعرض المحفظة من يطلب البيانات، وتتحقق من أنك لا تطلب أكثر مما سجلته، ويوافق المستخدم أو يرفض.
التحقق من العرض
تحقق من توقيع المُصدر مقابل القوائم الموثوقة، وتأكد من أن الاعتماد لم يتم إلغاؤه، وتحقق من ربط الجهاز، والذي يوضح أن الاعتماد لم يتم نسخه أو إعادة استخدامه.
استلام السمات واتخاذ القرار
تتلقى فقط السمات التي شاركها المستخدم، والموقعة من قبل المُصدر. قرار الإعداد أو الوصول، والسجل الذي تحتفظ به، يبقى لديك.
ستقوم Didit بتنفيذ هذه الخطوات نيابة عنك عند إطلاق قبول محفظة الهوية الرقمية الأوروبية (EUDI Wallet) (قريبًا).
ما تتلقاه مقابل ما لا يزال يتطلبه KYC
المحفظة تثبت هوية الشخص. لكن العناية الواجبة تتطلب المزيد.
بموجب لائحة مكافحة غسل الأموال (AMLR)، اللائحة (EU) 2024/1624، يعد التعريف الإلكتروني بمستوى ضمان كبير أو عالٍ إحدى الطريقتين للتحقق من الهوية (المادة 22(6)). لكنه لا يغطي كل ما تتطلبه فحوصات اعرف عميلك (KYC). إليك ما تحتويه بيانات تعريف الشخص (PID)، وكيف تغطي Didit كل عنصر اليوم.
متطلبات العناية الواجبة
في بيانات تعريف الشخص (PID) بمحفظة EUDI
كيف تغطيها Didit اليوم
متطلبات العناية الواجبة
الاسم الكامل
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
اسم العائلة والاسم الأول، كلاهما إلزامي.
كيف تغطيها Didit اليوم
بطاقات الهوية الوطنية الإلكترونية الحية تُرجع الاسم الكامل. مسار المستندات يقرأه من أكثر من 14,000 نوع مستند.
متطلبات العناية الواجبة
مكان وتاريخ الميلاد الكامل
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
تاريخ ومكان الميلاد، كلاهما إلزامي.
كيف تغطيها Didit اليوم
بطاقات الهوية الوطنية الإلكترونية الحية تُرجع تاريخ الميلاد. مسار المستندات يقرأ مكان الميلاد حيثما يظهر في المستند.
متطلبات العناية الواجبة
الجنسيات
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
الجنسية، إلزامية، بلد واحد أو أكثر.
كيف تغطيها Didit اليوم
مسار المستندات يقرأ الجنسية من وثيقة الهوية أو شريحتها.
متطلبات العناية الواجبة
رقم الهوية الوطنية، حيثما ينطبق
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
الرقم الإداري الشخصي، اختياري. كل دولة عضو تقرر ما إذا كانت ستصدره.
كيف تغطيها Didit اليوم
بطاقات الهوية الوطنية الإلكترونية الحية تُرجع معرّفًا خاصًا بالنظام: رقم الهوية السويدي (personnummer)، أو رمز الهوية الشخصية الفنلندي، أو الرمز الشخصي البلطيقي. MitID يُرجع معرفًا مستعارًا، وليس رقم CPR.
متطلبات العناية الواجبة
مكان الإقامة المعتاد
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
حقول العنوان اختيارية وغالبًا ما تكون مفقودة. المعايير النهائية المقترحة من AMLA تنص على وجوب الحصول على السمات المفقودة بوسائل أخرى.
كيف تغطيها Didit اليوم
لا توجد بطاقة هوية وطنية إلكترونية حية تُرجع عنوانًا. التحقق من العنوان يفحص فاتورة خدمات، كشف حساب بنكي، أو رسالة حكومية.
متطلبات العناية الواجبة
الرقم التعريفي الضريبي، حيثما يتوفر
المادة 22(1)(أ) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
ليس جزءًا من PID.
كيف تغطيها Didit اليوم
اجمعه بخطوة استبيان في نفس سير العمل.
متطلبات العناية الواجبة
تطابق الشخص مع الهوية
ARF · ربط المستخدم
في بيانات تعريف الشخص (PID) بمحفظة EUDI
الصورة الشخصية تبقى اختيارية حتى تصبح إلزامية في 11 أغسطس 2028.
كيف تغطيها Didit اليوم
تحقق حيوي سلبي ومطابقة وجه 1:1 مقابل صورة المستند أو صورة الشريحة، ضمن فحص KYC الكامل بسعر $0.33.
متطلبات العناية الواجبة
المالكون المستفيدون من الشركة
المادة 20(1)(ب) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
ليس في PID. المحفظة تحدد شخصًا، وليس من يملك شركة.
كيف تغطيها Didit اليوم
التحقق من الأعمال يسحب بيانات السجل والمالكين حيثما يحتفظ السجل بهم، مع فحص هوية لكل مالك.
متطلبات العناية الواجبة
العقوبات والأشخاص المعرضون سياسياً (PEPs)
المادة 20(1)(د)، (ز) من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
ليس في PID.
كيف تغطيها Didit اليوم
فحص AML ضد أكثر من 1,300 قائمة عقوبات، PEP، وقوائم مراقبة، بسعر $0.20 لكل فحص.
متطلبات العناية الواجبة
الغرض من العلاقة والمراقبة المستمرة
المادتان 25، 26 من لائحة مكافحة غسل الأموال
في بيانات تعريف الشخص (PID) بمحفظة EUDI
ليس في PID.
كيف تغطيها Didit اليوم
تسجل الاستبيانات الغرض من العلاقة. المراقبة المستمرة تعيد فحص العملاء يوميًا بسعر $0.07 لكل شخص سنويًا.
تظل العناية الواجبة بالعملاء (CDD) مسؤوليتك. توفر Didit الفحوصات والأدلة ولا تضمن امتثالك. يسري قانون مكافحة غسل الأموال (AMLR) اعتبارًا من 10 يوليو 2027، والمعايير الفنية لقانون مكافحة غسل الأموال (AMLA) هي مسودة نهائية بتاريخ 30 سبتمبر 2026، وليست قانونًا بعد.
جاهزية المحافظ الرقمية حسب الدولة
أين تقف المحافظ الوطنية، بتواريخها ومصادرها.
هذا ما نشرته كل دولة، أو ما يذكره مصدر مُسمّى، مع التاريخ ورابط لكل صف.
الحالة اعتبارًا من 5 أكتوبر 2026
الدولة
المحفظة أو التطبيق
الحالة
التاريخ
المعلومات المتوفرة
الدولة
إيطاليا
المحفظة أو التطبيق
IT-Wallet (app IO)
الحالة
تطبيق مباشر
التاريخ
17 فبراير 2026
المعلومات المتوفرة
متاح في تطبيق IO، مع 10.1 مليون تفعيل و17.3 مليون وثيقة تم تحميلها بحلول 17 فبراير 2026. مجاني واختياري للبالغين، الذين يسجلون الدخول باستخدام CIE أو SPID.
بيئة اختبار عامة (Public sandbox) منذ ديسمبر 2025. من المقرر إطلاق التطبيق في أوائل عام 2027، بدءًا بوظيفة الهوية. تمت القراءة الأولى للقانون التنفيذي في البوندستاغ في 23 سبتمبر 2026.
غير مدرج: النمسا, بلجيكا, إستونيا, هنغاريا, لاتفيا, ليتوانيا, لوكسمبورغ, مالطا, البرتغال, سلوفينيا. لم نجد أي حالة عامة لهم في هذا التاريخ. نقوم بتحديث هذا الجدول مع إطلاق التطبيقات الوطنية.
كيف تساعدك Didit على تحقيق ذلك · خمسة صفوف
اقبل الهويات الإلكترونية الوطنية الآن. أضف محفظة EUDI لاحقًا.
تُضيف محفظة الهوية الرقمية الأوروبية (EUDI Wallet) مسارًا جديدًا، لكنها لا تلغي المسارات الأخرى. صمم سير العمل مرة واحدة: الهويات الوطنية الإلكترونية والمستندات اليوم، وقبول محفظة الهوية الرقمية الأوروبية في نفس خطوة التحقق من الهوية عند إطلاقها.
اقبل الهويات الوطنية الإلكترونية التي يستخدمها عملاؤك بالفعل.
خمس هويات وطنية إلكترونية متاحة على Didit في سبع دول: MitID، BankID Sweden، Finnish Trust Network، Smart-ID، و Mobile-ID. يسجل المستخدم الدخول بهويته الإلكترونية، وتتلقى الجلسة سمات موقّعة: الاسم الكامل، تاريخ الميلاد، معرّفًا خاصًا بالنظام (مثل رقم personnummer السويدي؛ ويعيد MitID معرّفًا مستعارًا)، ومستوى الضمان الذي أكده النظام. يتم الفوترة فقط على عمليات تسجيل الدخول المكتملة.
المستويات كما تصنفها Didit. لا يتم إرجاع العنوان أو الصورة الشخصية.
02 · محفظة الهوية الرقمية الأوروبية، قريبًا
قبول محفظة الهوية الرقمية الأوروبية، ضمن سير العمل نفسه.
قبول محفظة الهوية الرقمية الأوروبية (EUDI Wallet) قادم قريبًا. يضم كتالوج المحافظ لدينا 30 دولة من المنطقة الاقتصادية الأوروبية، ضمن نفس خطوة التحقق من الهوية المستخدمة مع الهويات الإلكترونية الوطنية. لا يوجد تاريخ أو سعر محدد بعد.
لن يمتلك أو يستخدم الجميع محفظة، والقانون يتيح وسائل أخرى. يقرأ مسار المستندات الشريحة في جوازات السفر وبطاقات الهوية عبر NFC (0.15 دولار)، ويُجري التحقق من الحيوية السلبية ويطابق الوجه مع صورة المستند، عبر أكثر من 14,000 نوع مستند في أكثر من 220 دولة ومنطقة.
يمكن لمحفظة الهوية الرقمية الأوروبية إثبات أن شخصًا ما تجاوز 18 عامًا دون الحاجة إلى تاريخ ميلاد. حتى تصبح المحافظ شائعة، يكلف تقدير العمر من صورة سيلفي 0.10 دولار لكل فحص ويرسل النتائج الحدية إلى حل احتياطي للتحقق من الهوية. كما يعيد تسجيل الدخول الحي للهوية الإلكترونية تاريخ ميلاد موقّع دون صورة مستند.
الهوية جزء من العناية الواجبة للعملاء. في نفس سير العمل، افحص الأشخاص مقابل أكثر من 1,300 قائمة عقوبات، PEP، وقوائم مراقبة (0.20 دولار لكل فحص)، وأعد فحصهم يوميًا بمراقبة مستمرة (0.07 دولار للشخص الواحد سنويًا)، وتحقق من الشركات ومالكيها.
عرض عبر الأجهزة كما يصفه ARF: يبدأ الشخص على جهاز كمبيوتر وينتهي على الهاتف الذي يحمل المحفظة.
01امسح للمتابعة
امسح رمز QR
تعرض الخدمة رمز QR، ويمسحه الشخص باستخدام تطبيق المحفظة.
02المتجر الإلكتروني يطلب: العمر فوق 18
راجع الطلب
تعرض المحفظة من يطلب وما هي السمات المطلوبة.
03شارك سمة واحدة
شارك
يوافق الشخص، وتغادر السمات المطلوبة فقط الهاتف.
04تم التحقق
تم التحقق
تتحقق الخدمة من توقيع المصدر وتستمر. لم يتم مشاركة أي شيء آخر.
توضيح لسير العمل القياسي. قبول Didit لمحفظة الهوية الرقمية الأوروبية قادم قريبًا.
ابدأ التكامل اليوم
ابدأ التكامل اليوم، وحافظ عليه عند إطلاق المحفظة.
لا يوجد حاليًا واجهة برمجة تطبيقات (API) خاصة بمحفظة الهوية الرقمية الأوروبية (EUDI) من Didit. أنشئ جلسة لسير عمل يقبل الهويات الإلكترونية الوطنية الحالية والمستندات، ثم اقرأ النتيجة. من المخطط أن يتم قبول محفظة الهوية الرقمية الأوروبية (EUDI Wallet) في نفس خطوة التحقق من الهوية.
استعد لمحفظة الهوية الرقمية الأوروبية (EUDI Wallet) في أمر واحد.
انسخ هذا الأمر إلى وكيل البرمجة الخاص بك. يقوم بإنشاء سير العمل الذي يمكنك تشغيله اليوم، والهويات الإلكترونية الوطنية الحية مع خيار المستندات الاحتياطي، بالإضافة إلى استدعاء الجلسة وwebhook الموقّع. لا يقوم بإنشاء أي نقطة نهاية (endpoint) خاصة بمحفظة الهوية الرقمية الأوروبية (EUDI)، لأنه لا يوجد أي منها بعد.
didit-integration-prompt.md
# Didit: get ready for the EUDI Wallet with the ID Verification step you run today
You are adding electronic identification to my_stack so the product is ready
for the EU Digital Identity (EUDI) Wallet. Every URL, header and enum value
below is canonical. Do not paraphrase or "improve" them.
## 0. What exists today, and what does not
- EUDI Wallet acceptance on Didit is coming soon. There is NO EUDI-specific
endpoint, wallet id, field or flag to integrate yet. Do not invent one, do
not send any EUDI identifier in a workflow, and do not build an OpenID4VP
verifier yourself as part of this task.
- What is live: national digital ID wallets inside the ID Verification step,
with document capture (chip reading, liveness, face match) as the fallback.
EUDI Wallet acceptance is planned for the same ID Verification step, so the
workflow, session call and webhook you build now are the ones you keep.
- The live wallets, as listed by the methods catalog:
- MitID: wallet id mitid, country keys DNK (Denmark)
- BankID: wallet id bankid_se, country keys SWE (Sweden)
- Finnish Trust Network: wallet id ftn, country keys FIN (Finland)
- Smart-ID: wallet id smart_id, country keys EST (Estonia), LVA (Latvia), LTU (Lithuania), BEL (Belgium)
- Mobile-ID: wallet id mobile_id, country keys EST (Estonia), LTU (Lithuania)
Check the catalog for your environment before you go live. Never
hard-code dates.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Copy the API key of your application from the console.
## 2. Read the methods catalog
Availability is server-driven per country. Only wallets marked available can
be enabled on a live application.
- Business Console: your application -> Workflows -> the ID Verification
step -> Countries -> "Wallets accepted". Coming-soon wallets are listed
but cannot be switched on. https://docs.didit.me/console/id-verification-methods
- Didit MCP server (https://mcp.didit.me/mcp), tool
didit_workflow_get_id_verification_methods_catalog; pass country as ISO
3166-1 alpha-3 to narrow it. The MCP server signs in with "Log in with
Didit" (OAuth). It does not accept the x-api-key.
https://docs.didit.me/integration/mcp/tools
- Public coverage table (no sign-in, read-only):
https://docs.didit.me/core-technology/id-verification/digital-id-wallets#supported-wallets
If your code holds only an API key, it cannot read the catalog itself: use the
wallet ids listed in this prompt, and treat the answer of the workflow save as
the check. A live application answers 400 for a wallet that is not available
in that country ("<wallet> is not offered in <ISO3>", "unknown wallet").
## 3. Create the workflow (ID Verification = feature OCR)
POST https://verification.didit.me/v3/workflows/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["mitid"],
"on_failure": "fallback_to_document"
}
},
"EST": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["smart_id", "mobile_id"],
"on_failure": "fallback_to_document"
}
}
}
}
}
]
}
Response: 201. The workflow id is uuid (workflow_id carries the same value);
the workflow is published straight away. Create it once and keep the id:
every call to this endpoint makes a new workflow.
is_desktop_allowed defaults to false: on a desktop browser the hosted flow
then shows a QR code to continue on a phone. Add "is_desktop_allowed": true
next to workflow_label to let people finish on desktop.
Rules the API enforces:
- OCR is UPPERCASE; ID_VERIFICATION is rejected in this body (the decision
later lists the step as ID_VERIFICATION in its features)
- country keys are ISO 3166-1 alpha-3; method keys are document, id_lookup, wallet
- providers is an accept-list, not a ranking; the end user picks
- on_failure is fallback_to_document or decline
- a wallet the catalog does not mark available rejects the whole save (400)
- every other country keeps document capture, so people without an eID
can still verify
- this body runs document capture only. Chip reading, liveness and face
match are their own features: add { "feature": "NFC" },
{ "feature": "LIVENESS" } and { "feature": "FACE_MATCH" } to features
when your policy needs them
## 4. Create a session
POST https://verification.didit.me/v3/session/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{ "workflow_id": "<id from step 3>", "vendor_data": "<your user id>" }'
Response: 201 with session_id, session_token, url and status "Not Started".
Redirect the user to url (hosted flow) or open it in the Web, iOS, Android,
React Native or Flutter SDK. The field is named url on this response.
One unfinished session exists per workflow_id and vendor_data pair: calling
create again with the same pair answers 201 again with that same session.
## 5. Webhook
Register a destination in the console (API & Webhooks), or over the API:
POST https://verification.didit.me/v3/webhook/destinations/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{
"label": "Verification webhooks",
"url": "https://<your-public-host>/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'
label, url and subscribed_events are required. url must be a public HTTPS
address: Didit does not deliver to localhost or private addresses. Response:
201 with uuid and secret_shared_key. Store secret_shared_key as the webhook
secret (DIDIT_WEBHOOK_SECRET); it is unique to this destination. Remove a
destination with DELETE /v3/webhook/destinations/{uuid}/ (204).
What arrives:
- webhook_type is "status.updated" (the session changed status) or
"data.updated" (verification data was corrected after the fact)
- a destination receives the events of every session of the application,
so filter on workflow_id or vendor_data when several flows share it
- creating a session already sends status.updated with status
"Not Started". The decision key is present only when status is Approved,
Declined, In Review or Abandoned.
Verify every delivery:
Header: X-Signature-V2 (not X-Signature, not X-Signature-Simple)
Algorithm: HMAC-SHA256, hex digest, over the canonical JSON of the payload
(Python json.dumps(sort_keys=True, separators=(",", ":"),
ensure_ascii=False) after whole-valued floats become ints).
Never hash the raw request bytes under this header.
Freshness: the signed body field timestamp is the dispatch time (Unix
seconds). Reject when abs(now - timestamp) > 300 seconds, and
reject when the X-Timestamp header does not equal it.
Idempotency: event_id is the same on every retry of one event, so store it
and skip a delivery you already processed. One session can
still send the same status under two event ids, and the
console's Try Webhook test deliveries carry no event_id, so
also make the handler safe to run twice for one
(session_id, status, webhook_type).
Compare: constant-time (crypto.timingSafeEqual)
Reference handler (Express). Keep the verification lines as written.
The handler is a fragment. Put this above it and app.listen(process.env.PORT)
below it. It needs Express and Node 21 or newer (an older Node rejects
every delivery). It expects a JSON body: answer 400 yourself if you accept
anything else on this route, and refuse to start without the secret.
const express = require("express");
const app = express();
const SECRET = process.env.DIDIT_WEBHOOK_SECRET; // secret_shared_key of the destination
// Your endpoint receives a signed payload
const crypto = require("node:crypto"); // ESM: import crypto from "node:crypto"
// X-Signature-V2 = HMAC over the canonical JSON, never the raw bytes. Match the sender byte for
// byte: keys sorted by code point, integers digit for digit, floats in Python's repr.
class Num { constructor(src) { this.src = src; } } // a number as written on the wire, not a double
const num = (s) => { if (/^-?\d+$/.test(s)) return BigInt(s).toString(); const n = +s; // ints stay exact
if (Number.isInteger(n)) return BigInt(n).toString(); const [m, e] = n.toExponential().split("e"); // 27.0 -> 27
return +e >= -4 ? String(n) : `${m}e-${String(-e).padStart(2, "0")}`; }; // 1e-05, not 0.00001
const byCodePoint = (a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)); // UTF-8 order = Python's
const canon = (v) => Array.isArray(v) ? `[${v.map(canon)}]` : v instanceof Num ? num(v.src)
: v && typeof v === "object" ? `{${Object.keys(v).sort(byCodePoint).map((k) => `${JSON.stringify(k)}:${canon(v[k])}`)}}`
: JSON.stringify(v);
// Read the body as text: express.json() would round 1000000000000000129 to a double first.
// Register this route ABOVE any global app.use(express.json()): the first parser to run
// consumes the stream, and a body it already parsed has lost the digits the signature covers.
app.post("/webhooks/didit", express.text({ type: "application/json" }), (req, res) => {
const exact = JSON.parse(req.body, (k, v, c) => typeof v === "number" ? new Num(c.source) : v); // Node 21+
const body = JSON.parse(req.body);
const mac = crypto.createHmac("sha256", SECRET).update(canon(exact), "utf8").digest("hex");
const sig = Buffer.from(String(req.headers["x-signature-v2"] ?? ""));
// Freshness comes from the signed body timestamp; the header alone is unsigned and replayable.
const ts = body.timestamp, fresh = String(ts) === req.headers["x-timestamp"]
&& Math.abs(Date.now() / 1000 - ts) <= 300;
if (!fresh || sig.length !== mac.length
|| !crypto.timingSafeEqual(sig, Buffer.from(mac))) return res.sendStatus(401);
const { status, decision } = body;
// One entry per ID Verification node; pick yours by node_id when you run several.
const [idv] = decision?.id_verifications ?? [];
// idv.verification_method: "document" | "id_lookup" | "wallet"
res.sendStatus(200);
});
Status values (exact strings): Not Started, In Progress, Approved, Declined,
In Review, Resubmitted, Expired, Abandoned, Kyc Expired. Awaiting User only
appears on business verification sessions.
## 6. Read the result
The same V3 decision reaches you two ways:
- webhook body: body.decision.id_verifications[]
- GET https://verification.didit.me/v3/session/{session_id}/decision/
-H "x-api-key: <your-api-key>"
This response IS the decision object. Read id_verifications at the top
level: there is no decision wrapper here.
Until the user finishes the ID step, status is "Not Started" or "In Progress"
and id_verifications is null, not an empty array. Guard for it.
id_verifications[] has one entry per ID Verification node; with a single step
take index 0. A wallet sign-in sets:
verification_method "wallet"
assurance "cryptographic"
wallet_provider the catalog wallet id the user picked
wallet_verification provider, provider_name, issuing_authority,
issuing_country, credential_type, level_of_assurance,
verified_at, signature_valid, attributes, portrait
(null for the live wallets), face_match_score
fallback_from { method, reason, action } when the wallet sign-in failed
and on_failure declined the session; otherwise
null. After a document fallback that succeeds the
entry reads verification_method "document" with
fallback_from null
full_name, the normalised identity fields, on the entry itself
date_of_birth
On a live application, check wallet_verification.signature_valid before you
trust attributes. The
live wallets return name, date of birth and a scheme identifier (for example
the Swedish personnummer; MitID returns a pseudonymised identifier), never an
address or a portrait: collect those through other steps if your policy
needs them.
Reference: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
## 7. Billing
Only completed wallet sign-ins are billed; cancelled, timed-out and failed
ones are free. Prices per wallet: https://didit.me/pricing
## 8. Verify your integration
Sandbox (an application in sandbox mode: nothing is billed and no real eID is
called). https://docs.didit.me/integration/sandbox-testing
- a sandbox application can enable every wallet in the catalog, the
coming-soon ones included. A workflow that saves in sandbox can still be
refused on a live application, so only use wallets marked available.
- open the session url, pick the wallet and confirm: the default approve
scenario simulates the sign-in. The entry then has verification_method
"wallet", assurance "cryptographic" and wallet_provider set, and the
normalised full_name and date_of_birth are filled. But
wallet_verification.signature_valid and level_of_assurance are null and
attributes is { "sandbox": true }: no real credential was checked.
Assert signature_valid === true and the level of assurance only against
a live application.
- to exercise on_failure, create the session with
"sandbox_scenario": "wallet_cancelled" (also wallet_timeout and
wallet_provider_error). The wallet sign-in then fails and the flow moves
to document capture or declines, as on_failure says. A fallback that
ends in an approved document reads verification_method "document".
- POST /v3/session/{session_id}/simulate/ forces a final status but writes
no id_verifications entry, so it cannot stand in for a sign-in.
Checks:
- create the workflow, create a session, and read its decision: expect 201,
201 with url, and 200 with status "Not Started"
- run one sandbox session per accepted wallet through the hosted flow and
assert verification_method is "wallet" and wallet_provider is the wallet
you picked
- run one session with sandbox_scenario "wallet_cancelled" and assert the
flow offers document capture
- assert the webhook accepts a correctly signed payload and rejects a wrong
X-Signature-V2, a changed body, and a payload whose signed timestamp is
older than 300 seconds, even when X-Timestamp is refreshed
- on a live application, assert wallet_verification.signature_valid is true
Docs: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
متوافق حسب التصميم
افتح دولة جديدة بنقرة واحدة. نحن نقوم بالعمل الشاق.
نحن نفتح الشركات التابعة المحلية، ونؤمن التراخيص، ونجري اختبارات الاختراق، ونحصل على الشهادات، ونتوافق مع كل لائحة جديدة. لنشر عمليات التحقق في بلد جديد، ما عليك سوى تفعيل مفتاح. أكثر من 220 دولة تعمل، يتم تدقيقها واختبار اختراقها كل ربع سنة, المزود الوحيد للهوية الذي وصفته حكومة دولة عضو في الاتحاد الأوروبي رسميًا بأنه أكثر أمانًا من التحقق الشخصي.