> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# واجهة برمجة تقدير العمر: التحقق من العمر عبر صورة السيلفي

> تقدير العمر عبر POST /v3/age-estimation/ من Didit بالذكاء الاصطناعي وكشف الحيوية السلبي. بلا هوية، واستدلال أقل من 2 ثانية، ودفع حسب الاستخدام.



## OpenAPI

````yaml ar/openapi-25.json POST /v3/age-estimation/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/age-estimation/:
    post:
      tags:
        - Standalone APIs
      summary: تقدير العمر (عمر الوجه + كشف الحيوية السلبي)
      description: >-
        تقدير عمر الشخص من صورة وجه واحدة وإجراء فحص كشف الحيوية السلبي في نفس
        الاستدعاء — يُرجع `age_estimation` المتوقع بواسطة النموذج (بالسنوات)،
        و`score` للحيوية (0–100)، و`status` بقيمة `Approved`/`Declined`. العمر
        **متوقع بواسطة النموذج من الوجه، وليس متحققاً منه مقابل مستند** —
        استخدمه لبوابات التحقق من العمر والفحوصات منخفضة الاحتكاك، وليس كإثبات
        قانوني للعمر.


        **آلية العمل.** تُحلل الصورة بحثاً عن الوجوه (اضبط `rotate_image=true`
        إذا كانت الصور الملتقطة قد تكون جانبية أو مقلوبة)؛ يحصل كل وجه مكتشف على
        عمر تقديري، وأكبر وجه في الإطار هو ما يحدد `age_estimation`. بالتوازي مع
        ذلك، يسجل نموذج كشف الحيوية السلبي درجة تقيس ما إذا كانت الصورة تُظهر
        شخصاً حياً (دون الحاجة إلى تفاعل من المستخدم) ويكتشف هجمات العرض (صور
        للصور، الشاشات، الأقنعة). أرسل وجهاً واحداً واضحاً وموجهاً للأمام ومضاءً
        جيداً لكل صورة للحصول على أفضل النتائج.


        **منطق القرار.** أي تحذير يؤدي إلى الرفض: تكون قيمة `status` هي
        `Approved` فقط عندما تكون مصفوفة `warnings` فارغة. تؤدي درجة الحيوية
        `score` التي تساوي `face_liveness_score_decline_threshold` أو تقل عنها
        (القيمة الافتراضية `30`) إلى إضافة `LOW_LIVENESS_SCORE`؛ يؤدي اكتشاف
        هجوم إلى إضافة `LIVENESS_FACE_ATTACK`؛ عدم العثور على أي وجه بواسطة
        نموذج كشف الحيوية يضيف `NO_FACE_DETECTED`؛ عدم القدرة على تقدير عمر
        الوجه يضيف `AGE_NOT_DETECTED` (تكون قيمة `age_estimation` هي `null`)؛
        تقدير عمر أقل من `age_estimation_decline_threshold` (القيمة الافتراضية
        `18`) يضيف `AGE_BELOW_MINIMUM`. تستحق الأعمار الحدية القريبة من الحد
        الخاص بك استخدام التحقق القائم على المستندات كإجراء بديل — حيث يزداد
        هامش خطأ النموذج للوجوه القريبة من الحد.


        **الفوترة.** يستهلك كل استجابة `200` رصيداً واحداً لـ API تقدير العمر
        (يُدفع من رصيد الخطة أو رصيد شحن الرصيد). عندما لا يغطي رصيد المؤسسة
        تكلفة الاستدعاء، يُرجع الـ endpoint الرمز `403` مع خطأ عدم كفاية الرصيد
        قبل إجراء أي معالجة للصورة.


        **حفظ الجلسة (`save_api_request`، القيمة الافتراضية `true`).** عندما
        تكون القيمة `true`، يُحفظ الاستدعاء كجلسة من نوع API: يظهر في Business
        Console، ويكون `request_id` المُرجع معرّف جلسة حقيقياً يمكنك تمريره إلى
        `GET /v3/session/{sessionId}/decision/` (تُعرض النتيجة هناك في
        `liveness_checks[]`، مع `features: ["AGE_ESTIMATION"]`)، وتُخزن صورة
        الوجه المقصوصة والصورة المرجعية، ويُضاف تضمين الوجه إلى فهرس الوجوه
        الخاص بتطبيقك (المستخدم في البحث بالوجه واكتشاف التكرار)، ويتم إرسال حدث
        webhook من نوع `status.updated`. وعندما تكون القيمة `false`، لا يتم
        تخزين أي شيء ويكون `request_id` معرّف UUID لربط العمليات لمرة واحدة لا
        يمكن البحث عنه لاحقاً.


        **البيئة التجريبية.** تتخطى مفاتيح API الخاصة بالبيئة التجريبية جميع
        عمليات المعالجة والفوترة: بعد التحقق من صحة الطلب (المدخلات غير الصحيحة
        لا تزال تُرجع `400`)، يُرجع الـ endpoint payload وهمياً ثابتاً بقيمة
        `Approved` (`age_estimation: 30`، دون تحذيرات)، ولا يتم حفظ أي جلسة، ولا
        يُستهلك أي رصيد.


        **المصادقة.** أرسل مفتاح API الخاص بتطبيقك في الرأس `x-api-key`. تُرجع
        بيانات الاعتماد المفقودة أو غير الصالحة الرمز `403` (`{"detail": "You do
        not have permission to perform this action."}`) — لا يُرجع هذا الـ API
        أبداً الرمز `401`.


        **حد المعدل.** ميزانية كتابة مشتركة تبلغ 300 طلب/دقيقة لكل مفتاح API عبر
        جميع الـ endpoints الخاصة بـ POST/PATCH/DELETE؛ وتجاوزها يُرجع `429`.
      operationId: post_v3age-estimation
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - user_image
              properties:
                user_image:
                  type: string
                  format: binary
                  description: >-
                    صورة الوجه المراد تحليلها (مثل صورة سيلفي). أرسل صورة أمامية
                    واحدة يكون فيها وجه الشخص ظاهراً بوضوح ومضاءً جيداً.
                    الامتدادات المسموح بها: `tiff`، `jpg`، `jpeg`، `png`، `webp`
                    (لا يُسمح بملفات PDF). الحد الأقصى لحجم الرفع: **5 MB**
                    (تُرفض الملفات الأكبر حجماً برمز `400`). تُضغط الصور
                    تلقائياً إلى نحو 0.3 MB قبل المعالجة، لذا فإن الدقات العالية
                    جداً لا تزيد من الدقة.
                face_liveness_score_decline_threshold:
                  type: number
                  format: float
                  default: 30
                  minimum: 0
                  maximum: 100
                  description: >-
                    حد كشف الحيوية (0–100). تضيف قيمة `score` الخاصة بكشف
                    الحيوية التي تكون **عند أو أقل من** هذه القيمة تحذير
                    `LOW_LIVENESS_SCORE` ويتم الرفض. ارفعها لمكافحة أكثر صرامة
                    للانتحال؛ تُرجع القيم خارج النطاق 0–100 الخطأ `400`.
                  example: 30
                age_estimation_decline_threshold:
                  type: integer
                  default: 18
                  minimum: 0
                  maximum: 100
                  description: >-
                    الحد الأدنى المقبول للعمر التقديري بالسنوات. العمر التقديري
                    **الأقل** من هذه القيمة يضيف تحذير `AGE_BELOW_MINIMUM` ويؤدي
                    إلى الرفض. عيّن `0` لتعطيل التحقق من العمر (يقوم الاستدعاء
                    بعد ذلك بتشغيل كشف الحيوية + تقدير العمر فقط دون اتخاذ قرار
                    بناءً على العمر).
                  example: 18
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    عندما تكون `true`، تجرب الخدمة صورة الإدخال بزيادات قدرها 90
                    درجة (0، 90، 180، 270) وتستخدم الاتجاه الذي يحقق أفضل كشف
                    للوجه — مفيد للصور الملتقطة عبر الهاتف مع فقدان اتجاه EXIF.
                    يضيف تأخيراً في الاستجابة، لذا لا تفعّله إلا إذا كنت لا
                    تستطيع ضمان أن تكون الصور بالاتجاه الصحيح للأعلى.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    عندما تكون القيمة `true` (الافتراضية)، يتم حفظ الاستدعاء
                    كجلسة من نوع API — مرئية في Business Console، ويمكن
                    استرجاعها عبر `GET /v3/session/{sessionId}/decision/`
                    باستخدام `request_id` المُرجع، ويتم الإشعار بها عبر webhook
                    لحدث `status.updated`، مع إضافة الوجه المكتشف إلى فهرس
                    الوجوه لتطبيقك. عندما تكون القيمة `false`، لا يتم تخزين أي
                    شيء ويكون `request_id` عبارة عن معرّف UUID مؤقت للربط
                    بالاستجابة فقط.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    سلسلة نصية مبهمة اختيارية (معرّف المستخدم الداخلي لديك،
                    البريد الإلكتروني، UUID...) تُخزَّن في الجلسة المحفوظة
                    وتُعاد في الاستجابة. استخدمها لربط استدعاءات API بسجلاتك
                    الخاصة ولتصفية الجلسات لاحقاً.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    كائن JSON اختياري يُخزن مع الجلسة (عندما يكون
                    `save_api_request=true`) ويُعاد في الاستجابة. في طلبات
                    multipart، أرسله كحقل سلسلة نصية بترميز JSON (مثل
                    `metadata={"flow":"age-gate"}`) — حيث يتم تحليله إلى كائن.
                  example:
                    flow: age-gate
            example:
              user_image: (binary JPEG/PNG of the selfie)
              face_liveness_score_decline_threshold: 30
              age_estimation_decline_threshold: 18
              rotate_image: false
              save_api_request: true
              vendor_data: user-123
              metadata:
                flow: age-gate
      responses:
        '200':
          description: >-
            اكتمل تقدير العمر وكشف الحيوية السلبي.
            `age_estimation.age_estimation` هو العمر المتوقع بالسنوات من النموذج
            لأكبر وجه تم اكتشافه (`null` إذا لم يوجد)؛ و`age_estimation.score`
            هي درجة كشف الحيوية السلبي (0–100)؛ وتكون `status` بقيمة `Approved`
            فقط عندما يكون `warnings` فارغاً. تظل عمليات الالتقاط لقاصر أو
            محاولة انتحال تُرجع `200` مع `status: "Declined"` — تحقق من نص
            الاستجابة، وليس فقط رمز حالة HTTP. عندما تكون
            `save_api_request=true`، فإن `request_id` يكون معرّف الجلسة الدائمة.
          content:
            application/json:
              examples:
                Approved:
                  summary: وجه حي لشخص بالغ — تم اجتياز كلا الفحصين
                  value:
                    request_id: 0c40ba43-64ab-4e2e-b4b8-7d1f12f81bc1
                    age_estimation:
                      status: Approved
                      method: PASSIVE
                      score: 97.5
                      user_image:
                        entities:
                          - age: 27.33
                            bbox:
                              - 40
                              - 40
                              - 100
                              - 100
                            confidence: 0.7177750468254089
                            gender: male
                        best_angle: 0
                      age_estimation: 27.33
                      warnings: []
                    vendor_data: user-123
                    metadata:
                      flow: age-gate
                    created_at: '2026-06-12T02:24:11.512941+00:00'
                Declined - age below threshold:
                  summary: العمر التقديري أقل من `age_estimation_decline_threshold`
                  value:
                    request_id: 9be41a6f-2f4e-4f57-92f4-b3a4f6f0a1c2
                    age_estimation:
                      status: Declined
                      method: PASSIVE
                      score: 95
                      user_image:
                        entities:
                          - age: 16.5
                            bbox:
                              - 40
                              - 40
                              - 100
                              - 100
                            confidence: 0.7177750468254089
                            gender: female
                        best_angle: 0
                      age_estimation: 16.5
                      warnings:
                        - risk: AGE_BELOW_MINIMUM
                          feature: LIVENESS
                          additional_data: null
                          log_type: error
                          short_description: Age below minimum
                          long_description: >-
                            The age of the face is below the minimum age
                            threshold for the application.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:26:40.118332+00:00'
                Declined - liveness too low:
                  summary: درجة كشف الحيوية عند أو أقل من حد الرفض (احتمال وجود انتحال)
                  value:
                    request_id: 5f6f2f1f-7c4f-43b9-8d62-0a8f4c2d9e77
                    age_estimation:
                      status: Declined
                      method: PASSIVE
                      score: 5
                      user_image:
                        entities:
                          - age: 25
                            bbox:
                              - 40
                              - 40
                              - 100
                              - 100
                            confidence: 0.7177750468254089
                            gender: male
                        best_angle: 0
                      age_estimation: 25
                      warnings:
                        - risk: LOW_LIVENESS_SCORE
                          feature: LIVENESS
                          additional_data: null
                          log_type: error
                          short_description: Low liveness score
                          long_description: >-
                            The liveness check resulted in a low score,
                            indicating potential use of non-live facial
                            representations or poor-quality biometric data.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:27:02.901547+00:00'
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      معرّف الجلسة المحفوظة عندما تكون `save_api_request=true`
                      (يمكن استخدامه مع `GET
                      /v3/session/{sessionId}/decision/`)؛ وإلا فسيكون UUID
                      ارتباط مؤقت.
                  age_estimation:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Approved` عند عدم إطلاق أي تحذيرات؛ و`Declined` خلاف
                          ذلك (كل تحذير يُنتجه هذا الـ endpoint يؤدي إلى الرفض).
                      method:
                        type: string
                        enum:
                          - PASSIVE
                        description: >-
                          طريقة كشف الحيوية. دائمًا `PASSIVE` في هذا الـ
                          endpoint (صورة واحدة، دون تحدٍ للمستخدم).
                      score:
                        type: number
                        format: float
                        nullable: true
                        minimum: 0
                        maximum: 100
                        description: >-
                          درجة كشف الحيوية السلبي من 0 إلى 100 — ثقة النموذج في
                          أن الصورة تُظهر شخصاً حقيقياً. تُقارن بـ
                          `face_liveness_score_decline_threshold`؛ وإذا كانت
                          مساوية له أو أقل منه، يُرفض الاستدعاء بـ
                          `LOW_LIVENESS_SCORE`. تكون `null` عندما لا يُرجع نموذج
                          كشف الحيوية أي درجة ثقة — ويظل الاستدعاء مرفوضاً بـ
                          `LOW_LIVENESS_SCORE` لأن القيمة الفارغة (null) تُعامل
                          معاملة 0 في مقارنة الحد الأدنى.
                        example: 97.5
                      user_image:
                        type: object
                        description: نتائج كشف الوجه للصورة التي تم تحليلها.
                        properties:
                          entities:
                            type: array
                            description: >-
                              إدخال واحد لكل وجه مكتشف. يكون فارغاً إذا لم يتم
                              العثور على أي وجه (وعندئذٍ يكون `age_estimation`
                              بقيمة `null` ويُضاف تحذير `AGE_NOT_DETECTED`).
                            items:
                              type: object
                              properties:
                                age:
                                  type: number
                                  format: float
                                  description: العمر المقدّر بالنموذج لهذا الوجه، بالسنوات.
                                  example: 27.33
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    المربع المحيط للوجه المكتشف كإحداثيات بكسل
                                    `[x_min, y_min, x_max, y_max]` في الصورة
                                    المُعالجة.
                                  example:
                                    - 40
                                    - 40
                                    - 100
                                    - 100
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: درجة الثقة في كشف الوجه (0–1).
                                  example: 0.7177750468254089
                                gender:
                                  type: string
                                  description: >-
                                    الجنس المتوقع بالنموذج للوجه المكتشف (`male`
                                    أو `female`). لأغراض إعلامية فقط.
                                  example: male
                          best_angle:
                            type: integer
                            nullable: true
                            description: >-
                              زاوية التدوير (بالدرجات: 0 أو 90 أو 180 أو 270)
                              التي حققت أفضل كشف للوجه. تكون غير صفرية فقط عندما
                              يصحح `rotate_image=true` الاتجاه.
                            example: 0
                      age_estimation:
                        type: number
                        format: float
                        nullable: true
                        description: >-
                          العمر المتوقع بالنموذج بالسنوات للوجه المكتشف
                          **الأكبر**. يكون `null` عندما يتعذر تقدير عمر الوجه
                          (يُضاف تحذير `AGE_NOT_DETECTED` ويتم رفض الاستدعاء).
                        example: 27.33
                      warnings:
                        type: array
                        description: >-
                          فارغ عند الموافقة السليمة. يؤدي أي إدخال إلى تعيين
                          `status` إلى `Declined`.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - NO_FACE_DETECTED
                                - LOW_LIVENESS_SCORE
                                - LIVENESS_FACE_ATTACK
                                - AGE_NOT_DETECTED
                                - AGE_BELOW_MINIMUM
                              description: >-
                                رمز مخاطر مقروء آلياً. `NO_FACE_DETECTED` — لم
                                يعثر نموذج كشف الحيوية على أي وجه؛
                                `LOW_LIVENESS_SCORE` — درجة (`score`) كشف
                                الحيوية تساوي أو تقل عن
                                `face_liveness_score_decline_threshold`؛
                                `LIVENESS_FACE_ATTACK` — تم رصد هجوم العرض
                                (صورة/شاشة/قناع)؛ `AGE_NOT_DETECTED` — تعذر
                                تقدير عمر الوجه؛ `AGE_BELOW_MINIMUM` — العمر
                                المقدر أقل من
                                `age_estimation_decline_threshold`. الرمزان
                                `NO_FACE_DETECTED` و`LOW_LIVENESS_SCORE`
                                متنافيان — عند عدم العثور على أي وجه يتم إصدار
                                `NO_FACE_DETECTED` فقط.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                الميزة التي أصدرت التحذير. دائماً `LIVENESS` في
                                هذا الـ endpoint.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: دائماً `null` للتحذيرات الخاصة بتقدير العمر.
                            log_type:
                              type: string
                              enum:
                                - error
                              description: >-
                                مستوى الخطورة. كل تحذير ينتجه هذا الـ endpoint
                                يُعد `error` ويضبط `status` على `Declined`.
                            short_description:
                              type: string
                              description: ملخص للمخاطر في سطر واحد مقروء للبشر.
                            long_description:
                              type: string
                              description: تفسير سهل القراءة للمخاطر.
                  vendor_data:
                    type: string
                    nullable: true
                    description: نسخة مطابقة من `vendor_data` التي أرسلتها، أو `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: نسخة مطابقة من كائن `metadata` الذي أرسلته، أو `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      طابع زمني بتنسيق ISO 8601 (بالتوقيت العالمي المنسق UTC)
                      لوقت إنشاء الاستجابة.
        '400':
          description: >-
            خطأ في التحقق. يتم إرجاعه عندما تكون `user_image` مفقودة، أو يتجاوز
            حجمها 5 MB، أو يكون امتدادها غير مدعوم، أو عندما يكون الحد خارج
            النطاق. يكون نص الاستجابة هو غلاف أخطاء الحقول القياسي لـ DRF:
            مصفوفة واحدة من الرسائل لكل حقل مخالف.
          content:
            application/json:
              examples:
                Missing user image:
                  summary: لم يتم تضمين `user_image` في بيانات النموذج
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: امتداد الملف خارج tiff/jpg/jpeg/png/webp
                  value:
                    user_image:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, webp.
                File too large:
                  summary: يتجاوز الملف المرفوع حد 5 ميجابايت
                  value:
                    user_image:
                      - File size should not exceed 5 MB
                Threshold out of range:
                  summary: '`face_liveness_score_decline_threshold` خارج النطاق 0–100'
                  value:
                    face_liveness_score_decline_threshold:
                      - Ensure this value is less than or equal to 100.
        '403':
          description: >-
            تم رفض الإذن. يُرجع عند فقدان الرأس `x-api-key`، وأيضاً عندما لا
            يتمكن رصيد المؤسسة الطالبة من تغطية الاستدعاء؛ ويُرجع المفتاح الخاطئ
            أو الملغى أو منتهي الصلاحية `401`. يؤدي المفتاح المفقود إلى إرجاع
            `403` مع `{"detail": ...}`؛ ويؤدي المفتاح الخاطئ أو الملغى أو منتهي
            الصلاحية إلى إرجاع `401`. يُرجع نقص الرصيد `403` مع `{"error": ...}`
            قبل إجراء أي معالجة للصور.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: لا يوجد رأس `x-api-key`، أو أن المفتاح غير صالح/ملغى
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: رصيد المؤسسة لا يمكنه تغطية تكلفة الاستدعاء
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            تم تجاوز حد المعدل. تشترك نقاط endpoint الخاصة بـ POST/PATCH/DELETE
            في ميزانية قدرها 300 طلب كتابة في الدقيقة لكل مفتاح API (إنشاء
            المعاملات واستيعاب الأحداث لهما ميزانية منفصلة تبلغ 600). تتضمن
            الاستجابة رؤوس `X-RateLimit-Limit` و`X-RateLimit-Remaining`
            و`X-RateLimit-Reset` و`Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: أكثر من 300 طلب كتابة في الدقيقة الحالية
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/age-estimation/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'user_image=@./selfie.jpg' \
              -F 'age_estimation_decline_threshold=18' \
              -F 'face_liveness_score_decline_threshold=30' \
              -F 'save_api_request=true' \
              -F 'vendor_data=user-123'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.age_estimation.estimate(
                user_image=open("user_image.jpg", "rb"),
                face_liveness_score_decline_threshold=30.0,
                age_estimation_decline_threshold=18,
                rotate_image=False,
                save_api_request=True,
                vendor_data="user-123",
                metadata={"flow": "age-gate"},
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.ageEstimation.estimate({
              user_image: await fileFromPath("user_image.jpg"),
              face_liveness_score_decline_threshold: 30.0,
              age_estimation_decline_threshold: 18,
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "age-gate" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AgeEstimation.Estimate(ctx, didit.AgeEstimationEstimateParams{\n\tUserImage:                         didit.FileFromPath(\"user_image.jpg\"),\n\tFaceLivenessScoreDeclineThreshold: didit.Float(30.0),\n\tAgeEstimationDeclineThreshold:     didit.Int(18),\n\tRotateImage:                       didit.Bool(false),\n\tSaveAPIRequest:                    didit.Bool(true),\n\tVendorData:                        didit.String(\"user-123\"),\n\tMetadata:                          didit.Some(map[string]any{\"flow\": \"age-gate\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.AgeEstimationEstimateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.ageEstimation().estimate(AgeEstimationEstimateParams.builder()
                    .userImage(Path.of("user_image.jpg"))
                    .faceLivenessScoreDeclineThreshold(30.0)
                    .ageEstimationDeclineThreshold(18L)
                    .rotateImage(false)
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .metadata(Map.of("flow", "age-gate"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;
            use Didit\File;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->ageEstimation->estimate([
                'user_image' => File::fromPath('user_image.jpg'),
                'face_liveness_score_decline_threshold' => 30.0,
                'age_estimation_decline_threshold' => 18,
                'rotate_image' => false,
                'save_api_request' => true,
                'vendor_data' => 'user-123',
                'metadata' => ['flow' => 'age-gate'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.age_estimation.estimate(
              user_image: Pathname("user_image.jpg"),
              face_liveness_score_decline_threshold: 30.0,
              age_estimation_decline_threshold: 18,
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "age-gate" }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.AgeEstimation.EstimateAsync(new
            AgeEstimationEstimateParams

            {
                UserImage = FileUpload.FromPath("user_image.jpg"),
                FaceLivenessScoreDeclineThreshold = 30.0,
                AgeEstimationDeclineThreshold = 18,
                RotateImage = false,
                SaveApiRequest = true,
                VendorData = "user-123",
                Metadata = new Dictionary<string, object> { ["flow"] = "age-gate" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.