> ## 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.

# डेटा मॉडल्स और JSON स्कीमा

> Didit की सभी रिपोर्ट ऑब्जेक्ट्स के लिए मानक JSON स्कीमा: NFC, ID, लाइवनेस, चेहरा मिलान, AML, IP, POA, फ़ोन, ईमेल, KYB रजिस्ट्री, दस्तावेज़, प्रमुख व्यक्ति।

## अवलोकन

हर सुविधा-वार रिपोर्ट `service-didit-verification` में परिभाषित V3 सीरियलाइज़र संरचना का पालन करती है। यही ऑब्जेक्ट तीन जगहों पर दिखता है, इसलिए यहाँ दिखने वाला स्कीमा इन सभी के लिए एकमात्र स्रोत है:

* `GET /v3/session/{sessionId}/decision/`: हर सुविधा एक बहुवचन ऐरे के रूप में लौटाई जाती है (`id_verifications[]`, `nfc_verifications[]`, `liveness_checks[]`, `face_matches[]`, `poa_verifications[]`, `phone_verifications[]`, `email_verifications[]`, `aml_screenings[]`, `ip_analyses[]`, `database_validations[]`, `questionnaire_responses[]`, `signatures[]`, `bank_verifications[]` (देखें [बैंक सत्यापन विधियाँ](https://docs.didit.me/hi/core-technology/bank-verification/verification-methods.md#परिणाम-में-विधि-पढ़ें)), और KYB के समकक्ष `registry_checks[]`, `document_verifications[]`, `key_people_checks[]`)।
* Webhook payloads (`status.updated`, `data.updated`): `decision` एनवेलप के भीतर वही संरचना।
* स्टैंडअलोन API: एकल-ऑब्जेक्ट रिस्पॉन्स (चेहरा खोज, आयु अनुमान, बायोमेट्रिक प्रमाणीकरण) वही फ़ील्ड सेट इस्तेमाल करते हैं।

> [!NOTE]
>
> V3 ने मल्टी-इंस्टेंस वर्कफ़्लो पेश किए: हर सुविधा ऑब्जेक्ट में एक `node_id` होता है जो रिपोर्ट को उस वर्कफ़्लो ग्राफ़ नोड से जोड़ता है जिसने उसे बनाया। V2 एंडपॉइंट (एकवचन `kyc`, `face`, `aml`, आदि) बैकवर्ड-कम्पैटिबल बने रहते हैं, लेकिन केवल पहला इंस्टेंस लौटाते हैं।

## सामान्य फ़ील्ड

हर रिपोर्ट ऑब्जेक्ट में ये फ़ील्ड होते हैं:

| फ़ील्ड | प्रकार | विवरण |
| - | - | - |
| `status` | string | सुविधा-स्तर की लाइफ़साइकल स्थिति, [Status enum](#स्टेटस-एनम-संदर्भ) के मानों में से एक। स्रोत: `common/config/choices.py:FeatureStatusChoices` (पंक्तियाँ 343-348)। मूल सत्र की शीर्ष-स्तरीय `status` व्यापक सत्र enum (`StatusChoices`, पंक्तियाँ 106-117) का उपयोग करती है। |
| `node_id` | string \| null | वर्कफ़्लो ग्राफ़ नोड का पहचानकर्ता। V3 मल्टी-इंस्टेंस वर्कफ़्लो के लिए भरा जाता है; लेगेसी एकल-सुविधा सत्रों के लिए `null`। |
| `warnings` | [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट) का ऐरे | इस सुविधा और `node_id` के अनुसार फ़िल्टर किए गए जोखिम संकेत। `Session.get_logs(...)` (`sessions/models/session.py:1611`) द्वारा लौटाए जाते हैं। |

मीडिया फ़ील्ड (`portrait_image`, `front_image`, `document_file`, …) सीमित वैधता अवधि वाले प्रीसाइंड URL हैं। URL को सहेजकर न रखें; उन्हें तुरंत डाउनलोड करें। उदाहरणों में इन्हें `https://<media-host>/...` के रूप में दिखाया गया है।

## चेतावनी ऑब्जेक्ट

हर `warnings[]` ऐरे में यह लौटाया जाता है। स्कीमा `logs/serializers/log.py:8-65` (`LogV3Serializer`) से है।

| फ़ील्ड | प्रकार | शून्य-योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `feature` | string (enum) | नहीं | वह सुविधा जिसने चेतावनी जारी की। मान `LogWarningChoices` (`common/config/choices.py:190-204`) से हैं: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACEMATCH`, `PROOF_OF_ADDRESS`, `PHONE`, `EMAIL`, `AML`, `LOCATION`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`। | `"ID_VERIFICATION"` |
| `risk` | string | नहीं | स्थिर जोखिम कोड (जैसे `DOCUMENT_EXPIRED`, `LOW_LIVENESS_SCORE`)। मान `logs/choices.py:RiskChoices` से हैं। विवरण तालिकाओं में यह कुंजी के रूप में इस्तेमाल होता है। | `"DOCUMENT_EXPIRED"` |
| `additional_data` | object \| null | हाँ | जोखिम-विशिष्ट संदर्भ (जैसे स्कोर थ्रेशोल्ड, मिलान किए गए फ़ील्ड)। आकार जोखिम कोड के अनुसार बदलता है। | `{ "score": 42.1, "threshold": 70 }` |
| `log_type` | string (enum) | नहीं | इनमें से एक: `error`, `warning`, `information`। `LogTypeChoices` (`common/config/choices.py:207-210`) से। | `"error"` |
| `short_description` | string | नहीं | जोखिम का मानव-पठनीय लेबल। `logs/choices.py:RISK_SHORT_DESCRIPTIONS` से। | `"Document expired"` |
| `long_description` | string | नहीं | अंतिम उपयोगकर्ता को दिखाई जाने वाली सतहों के लिए उपयुक्त लंबा, मानव-पठनीय स्पष्टीकरण। `logs/choices.py:RISK_LONG_DESCRIPTIONS` से। | `"The document's expiration date has passed, rendering it no longer valid for use."` |
| `node_id` | string \| null | हाँ | वह वर्कफ़्लो ग्राफ़ नोड जिस पर चेतावनी उठाई गई। लेगेसी V2 लॉग के लिए, जिनमें `node_id` नहीं है, `null`। | `"first_id_verification"` |

```json theme={null}
{
  "feature": "ID_VERIFICATION",
  "risk": "DOCUMENT_EXPIRED",
  "additional_data": null,
  "log_type": "error",
  "short_description": "Document expired",
  "long_description": "The document's expiration date has passed, rendering it no longer valid for use.",
  "node_id": "first_id_verification"
}
```

## रिपोर्ट ऑब्जेक्ट

बाकी सेक्शन हर सुविधा के लिए अलग रिपोर्ट ऑब्जेक्ट का वर्णन करते हैं। H3 हेडिंग का टेक्स्ट जानबूझकर स्थिर रखा गया है, ताकि अन्य दस्तावेज़ सीधे उस तक लिंक कर सकें।

### पहचान सत्यापन

यह हर उस KYC/ID दस्तावेज़ के लिए लौटाया जाता है जो उपयोगकर्ता जमा करता है। यह `GET /v3/session/{sessionId}/decision/` में `id_verifications[]` के रूप में दिखता है, और V2 रिस्पॉन्स में `kyc` फ़ील्ड के अंदर। स्रोत: `kyc/serializers/kyc.py:383-414` (`IDVerificationV3Serializer`, जो `kyc/serializers/kyc.py:320-380` पर `IDVerificationV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्थिति enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `document_type` | string | हाँ | मानव-पठनीय दस्तावेज़ श्रेणी (`Passport`, `Identity Card`, `Driver's License`, `Residence Permit`, `Health Insurance Card`, `Tax Card`, `Social Security Card`, `Work Permit`, `Visa`, `Public Service Card`, `Birth Certificate`, `Firearm License`, `Other`)। स्रोत: `DOC_TYPE_MAPPING` (`common/config/choices.py:1275-1289`)। | `"Passport"` |
| `document_subtype` | string | हाँ | Didit की दस्तावेज़ रजिस्ट्री से दस्तावेज़ उप-प्रकार कोड, जो वर्कफ़्लो की दस्तावेज़ सेटिंग्स द्वारा स्वीकार किए गए दस्तावेज़ों तक सीमित है। क्षेत्र-विशिष्ट दस्तावेज़ों में क्षेत्र शामिल होता है। पूरी कोड सूची: [दस्तावेज़ उप-प्रकार](https://docs.didit.me/hi/core-technology/id-verification/document-subtypes-id-verification.md)। | `"QUEENSLAND_DRIVER_LICENSE_GENERIC"` |
| `document_number` | string | हाँ | OCR द्वारा निकाला गया दस्तावेज़ नंबर। | `"AB1234567"` |
| `personal_number` | string | हाँ | OCR द्वारा निकाला गया व्यक्तिगत/राष्ट्रीय पहचानकर्ता। | `"99999999R"` |
| `portrait_image` | string (URL) | हाँ | चेहरे के क्रॉप की प्री-साइन्ड URL। | `"https://<media-host>/.../portrait.jpg?..."` |
| `front_image` | string (URL) | हाँ | साफ़ किए गए दस्तावेज़ के फ्रंट की प्री-साइन्ड URL। | `"https://<media-host>/.../front.jpg?..."` |
| `front_video` | string (URL) | हाँ | फ्रंट कैप्चर वीडियो की प्री-साइन्ड URL (उपलब्ध होने पर)। | `"https://<media-host>/.../front.mp4?..."` |
| `back_image` | string (URL) | हाँ | साफ़ किए गए दस्तावेज़ के बैक की प्री-साइन्ड URL। | `"https://<media-host>/.../back.jpg?..."` |
| `back_video` | string (URL) | हाँ | बैक कैप्चर वीडियो की प्री-साइन्ड URL। | `null` |
| `full_front_image` | string (URL) | हाँ | बिना कटे (पूरे फ़्रेम वाला) फ्रंट कैप्चर। | `"https://<media-host>/.../full_front.jpg?..."` |
| `full_back_image` | string (URL) | हाँ | बिना कटे (पूरे फ़्रेम वाला) बैक कैप्चर। | `null` |
| `front_image_camera_front` | string (URL) | हाँ | दस्तावेज़ के फ्रंट के साथ उसी समय लिया गया फ्रंट कैमरा इमेज। | `null` |
| `back_image_camera_front` | string (URL) | हाँ | दस्तावेज़ के बैक के साथ उसी समय लिया गया फ्रंट कैमरा इमेज। | `null` |
| `front_image_camera_front_face_match_score` | float (0-100) | हाँ | दस्तावेज़ के चेहरे और फ्रंट कैमरा कैप्चर के बीच समानता। | `null` |
| `back_image_camera_front_face_match_score` | float (0-100) | हाँ | ऊपर जैसा ही, लेकिन बैक कैप्चर के लिए। | `null` |
| `document_selfie_face_matches` | array | हाँ | दस्तावेज़ कैप्चर के दौरान लिए गए सेल्फ़ी से मेल खाने वाले पिछले सत्र या चेहरा ब्लॉकलिस्ट प्रविष्टियाँ। वही प्रविष्टि प्रारूप जो `liveness_checks[].matches` का है। खोज न चलने पर `null`, और कोई मिलान न होने पर `[]`। | `null` |
| `front_image_quality_score` | object | हाँ | फ्रंट इमेज के गुणवत्ता मापदंड: 0-100 के स्कोर (`focus_score`, `brightness_score`, `resolution_score`, `overall_score`), साथ ही `brightness_issue` (`ok`, `too_dark`, `too_bright`) और `is_document_fully_visible` (boolean)। | `{ "focus_score": 91.0, "overall_score": 88.5 }` |
| `back_image_quality_score` | object | हाँ | `front_image_quality_score` जैसी ही संरचना। | `null` |
| `date_of_birth` | string (YYYY-MM-DD) | हाँ | OCR द्वारा निकाली गई जन्म तिथि (DOB)। | `"1990-05-12"` |
| `age` | integer | हाँ | निष्कर्षण के समय वर्षों में गणना की गई आयु। | `35` |
| `expiration_date` | string (YYYY-MM-DD) | हाँ | दस्तावेज़ की समाप्ति तिथि। | `"2032-05-11"` |
| `date_of_issue` | string (YYYY-MM-DD) | हाँ | दस्तावेज़ की जारी होने की तिथि। | `"2022-05-11"` |
| `issuing_state` | string (ISO 3166-1 alpha-3) | हाँ | जारीकर्ता देश का कोड। | `"ESP"` |
| `issuing_state_name` | string | हाँ | स्थानीयकृत जारीकर्ता देश का नाम। | `"Spain"` |
| `first_name` | string | हाँ | OCR द्वारा निकाले गए प्रथम नाम। | `"María"` |
| `last_name` | string | हाँ | OCR द्वारा निकाला गया उपनाम। | `"García López"` |
| `full_name` | string | हाँ | पूरा सामान्यीकृत नाम (विक्रेता द्वारा प्रदान किया गया)। | `"María García López"` |
| `gender` | string | हाँ | `M`, `F`, या विक्रेता द्वारा दिया गया कोई अन्य मान। | `"F"` |
| `address` | string | हाँ | OCR द्वारा निकाली गई पते की मूल पंक्ति। | `"Calle Mayor 1, 28001 Madrid"` |
| `formatted_address` | string | हाँ | जियोकोड किया गया/प्रारूपित पता (जब पार्स हो सके)। | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `parsed_address` | object | हाँ | संरचित, जियोकोड किया गया पता: `street_1`, `street_2`, `city`, `region`, `country`, `postal_code`, `address_type`, `formatted_address`, `document_location` (`{latitude, longitude}`), `raw_results`, `is_best_match`। स्रोत: `kyc/utils/address.py:147-197`। | `{ "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" }` |
| `place_of_birth` | string | हाँ | OCR द्वारा निकाला गया जन्म स्थान। | `"Madrid"` |
| `marital_status` | string | हाँ | जब निकाला जा सके। | `null` |
| `nationality` | string (ISO 3166-1 alpha-3) | हाँ | OCR द्वारा निकाली गई राष्ट्रीयता। | `"ESP"` |
| `extra_fields` | object | हाँ | दस्तावेज़ प्रकार-विशिष्ट फ़ील्ड जो मानक स्कीमा में शामिल नहीं हैं (जैसे ड्राइविंग लाइसेंस श्रेणियाँ)। | `{ "DL Class": "B" }` |
| `mrz` | object | हाँ | मौजूद होने पर पार्स किए गए MRZ फ़ील्ड (`document_number`, `birth_date`, `expiry_date`, `surname`, `given_names`, …)। | `{ "document_number": "AB1234567", "surname": "GARCIA", "given_names": "MARIA" }` |
| `extra_files` | array of strings (URL) | नहीं | किसी भी अतिरिक्त अपलोड की गई फ़ाइलों की प्री-साइन्ड URL। | `[]` |
| `matches` | array of objects | नहीं | सत्रों के बीच दस्तावेज़ मिलान। हर आइटम: `{ session_id, session_number, vendor_data, verification_date, user_details: { name, document_type, document_number }, status, is_blocklisted, api_service, front_image_url }`। `front_image_url` प्री-साइन्ड है। | `[]` |
| `verification_method` | string | नहीं | यह पंक्ति किस [पहचान सत्यापन विधि](https://docs.didit.me/hi/core-technology/id-verification/verification-methods.md) से बनी है: `document`, `id_lookup` या `wallet`। फ़ोटो खींचे गए दस्तावेज़ के लिए यह हमेशा `document` होता है, जिसमें अन्य विधियाँ शुरू होने से पहले बने सभी सत्र भी शामिल हैं। | `"id_lookup"` |
| `assurance` | string | नहीं | `verification_method` से निकला आश्वासन स्तर: `documentary`, `data_match` या `cryptographic`। | `"data_match"` |
| `wallet_provider` | string \| null | हाँ | कैटलॉग वॉलेट ID, जब किसी वॉलेट ने यह पंक्ति बनाई हो (`mitid`, `bankid_se`, `itsme`, ...)। अन्यथा `null`। | `"mitid"` |
| `fallback_from` | object \| null | हाँ | गैर-दस्तावेज़ विधि ने ID चरण क्यों समाप्त किया: `{ method, reason, action }`। यह तब सेट होता है जब लुकअप या वॉलेट साइन-इन विफल हुआ: देश का स्विच `decline` होने पर अस्वीकृत पंक्ति पर (`action: "decline"`), और `fallback_to_document` होने पर उस दस्तावेज़ सत्यापन पर जिसे उपयोगकर्ता जारी रखता है (`action: "fallback_to_document"`)। जब कोई पिछली गैर-दस्तावेज़ विफलता दर्ज नहीं होती, तो `null`। | `{ "method": "id_lookup", "reason": "no_match", "action": "decline" }` |
| `id_lookup` | object \| null | हाँ | स्रोत साक्ष्य, केवल तब मौजूद जब `verification_method` `id_lookup` हो: `source` (ठीक वह स्रोत जिससे पूछा गया: अधिकतर देशों में सरकारी रजिस्टर, कुछ देशों में क्रेडिट ब्यूरो या आवासीय रिकॉर्ड फ़ाइल), `checked_at`, `attempts`, `max_attempts`, `outcome` (`match`, `partial_match`, `no_match`, `provider_error`, `format_rejected`), `comparison[]` (`{ field, label, provided, record, result }`; `field` इनमें से एक होता है: `identification_number`, `full_name`, `date_of_birth`, `address`, और `result` `match`, `partial` या `no_match` होता है; पिछले रिलीज़ में `error` वाली `provider` पंक्ति हो सकती है), `source_errors[]` (वर्तमान staging: अलग स्रोत निदान; प्रोडक्शन में रोलआउट की पुष्टि करें), `registry_portrait` (प्रीसाइन्ड URL, केवल उन स्रोतों के लिए जो एक लौटाते हैं) और `face_match_score`। | नीचे देखें |
| `wallet_verification` | object \| null | हाँ | क्रेडेंशियल साक्ष्य, केवल तब मौजूद जब `verification_method` `wallet` हो: `provider`, `provider_name`, `issuing_authority`, `issuing_country`, `credential_type`, `level_of_assurance` (`low`, `substantial`, `high`), `verified_at`, `signature_valid`, `attributes` (वॉलेट ने जो साझा किया), `portrait` (प्रीसाइन्ड URL, जब वॉलेट ऐसा URL साझा करता है) और `face_match_score`। | नीचे देखें |
| `document_liveness` | object \| null | हाँ | हर फ़्रॉड प्रकार के लिए दस्तावेज़ लाइवनेस स्कोर (`portrait_replace`, `printed_copy`, `screen_replay`), चाहे चेतावनी चली हो या नहीं, रिपोर्ट किए जाते हैं। हर एक में: `score` (0-100, जितना अधिक उतना ही संभावित रूप से वास्तविक; निचली ओर का मान, यानी वह मान जिसका निर्णय में उपयोग हुआ), `front`, `back`, `decline_threshold`, `review_threshold`, `bucket` (`approve`, `review`, `decline`, या `null`)। थ्रेशोल्ड और बकेट मूल्यांकन के समय सहेजे जाते हैं; जब ऐतिहासिक मूल्यांकन साक्ष्य उपलब्ध न हो तो तीनों `null` होते हैं, जबकि संग्रहीत स्कोर दिखते रहते हैं। जब जाँच नहीं चली तो `null`। देखें [दस्तावेज़ लाइवनेस स्कोर](https://docs.didit.me/hi/core-technology/id-verification/report-id-verification.md#दस्तावेज़-लाइवनेस-स्कोर)। केवल V3। | `{ "portrait_replace": { "score": 96.46, "bucket": "approve" } }` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_id_verification"` |
| `warnings` | array | नहीं | [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट) देखें। | `[]` |
| `region` | string | हाँ | जारीकर्ता देश का क्षेत्र या राज्य, जिसकी दस्तावेज़ में पहचान की गई हो। | `"CA"` |
| `extracted_data` | object | हाँ | दस्तावेज़ से निकाले गए डेटा का स्नैपशॉट, जो व्यक्ति को समीक्षा के लिए दिखाया गया था और पुष्ट मानों के साथ रखा गया है, ताकि आप उनकी तुलना कर सकें। जब व्यक्ति से समीक्षा नहीं माँगी गई थी तो `null`। | |
| `barcodes` | array of objects | नहीं | दस्तावेज़ के बारकोड से पढ़ा गया डेटा, हर बारकोड के लिए एक प्रविष्टि, जिसमें `type`, `position`, `data`, `data_raw` और `side` होते हैं। कोई न हो तो `[]`। | `[]` |

```json theme={null}
{
  "status": "Approved",
  "document_type": "Passport",
  "document_subtype": "PASSPORT_GENERIC",
  "document_number": "AB1234567",
  "personal_number": "99999999R",
  "portrait_image": "https://<media-host>/.../portrait.jpg?signature=...",
  "front_image": "https://<media-host>/.../front.jpg?signature=...",
  "front_video": null,
  "back_image": "https://<media-host>/.../back.jpg?signature=...",
  "back_video": null,
  "full_front_image": "https://<media-host>/.../full_front.jpg?signature=...",
  "full_back_image": null,
  "front_image_camera_front": null,
  "back_image_camera_front": null,
  "front_image_camera_front_face_match_score": null,
  "back_image_camera_front_face_match_score": null,
  "front_image_quality_score": {
    "focus_score": 91.0,
    "brightness_score": 88.0,
    "brightness_issue": "ok",
    "is_document_fully_visible": true,
    "resolution_score": 95.0,
    "overall_score": 88.5
  },
  "back_image_quality_score": null,
  "date_of_birth": "1990-05-12",
  "age": 35,
  "expiration_date": "2032-05-11",
  "date_of_issue": "2022-05-11",
  "issuing_state": "ESP",
  "issuing_state_name": "Spain",
  "first_name": "María",
  "last_name": "García López",
  "full_name": "María García López",
  "gender": "F",
  "address": "Calle Mayor 1, 28001 Madrid",
  "formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "parsed_address": { "street_1": "Calle Mayor 1", "street_2": null, "city": "Madrid", "region": "Madrid", "postal_code": "28001", "country": "ES", "address_type": "Calle" },
  "place_of_birth": "Madrid",
  "marital_status": null,
  "nationality": "ESP",
  "extra_fields": {},
  "mrz": {
    "document_number": "AB1234567",
    "surname": "GARCIA",
    "given_names": "MARIA",
    "birth_date": "900512",
    "expiry_date": "320511"
  },
  "extra_files": [],
  "matches": [],
  "node_id": "first_id_verification",
  "verification_method": "document",
  "assurance": "documentary",
  "wallet_provider": null,
  "fallback_from": null,
  "id_lookup": null,
  "wallet_verification": null,
  "document_liveness": {
    "portrait_replace": {
      "score": 96.46,
      "front": 96.46,
      "back": 98.2,
      "decline_threshold": 35,
      "review_threshold": 70,
      "bucket": "approve"
    },
    "printed_copy": {
      "score": 91.2,
      "front": 91.2,
      "back": 93.7,
      "decline_threshold": 35,
      "review_threshold": 77,
      "bucket": "approve"
    },
    "screen_replay": {
      "score": 99.9,
      "front": 99.9,
      "back": 99.5,
      "decline_threshold": 30,
      "review_threshold": 70,
      "bucket": "approve"
    }
  },
  "warnings": []
}
```

वही ऑब्जेक्ट गैर-दस्तावेज़ विधि के साथ। केवल विधि-विशिष्ट कुंजियाँ बदलती हैं: जो कुछ दस्तावेज़ पढ़ने से भरा जाता है, वह इसके बजाय रजिस्टर रिकॉर्ड या वॉलेट विशेषताओं से भरा जाता है, और जो कुंजियाँ लागू नहीं होतीं वे `null` होती हैं।

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "ZAF",
  "first_name": "Thabo",
  "last_name": "Mokoena",
  "full_name": "Thabo Mokoena",
  "date_of_birth": "1991-06-15",
  "personal_number": "9106155043088",
  "node_id": "first_id_verification",
  "verification_method": "id_lookup",
  "assurance": "data_match",
  "wallet_provider": null,
  "fallback_from": null,
  "id_lookup": {
    "source": "Department of Home Affairs",
    "checked_at": "2026-09-04T09:12:44Z",
    "attempts": 1,
    "max_attempts": 2,
    "outcome": "match",
    "comparison": [
      { "field": "identification_number", "label": "ID number", "provided": "9106155043088", "record": "9106155043088", "result": "match" },
      { "field": "full_name", "label": "Full name", "provided": "Thabo Mokoena", "record": "Thabo Mokoena", "result": "match" },
      { "field": "date_of_birth", "label": "Date of birth", "provided": "1991-06-15", "record": "1991-06-15", "result": "match" }
    ],
    "registry_portrait": "https://<media-host>/.../registry_portrait.jpg?signature=...",
    "face_match_score": 96.4
  },
  "wallet_verification": null,
  "warnings": []
}
```

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "DNK",
  "first_name": "Freja",
  "last_name": "Nielsen",
  "full_name": "Freja Nielsen",
  "date_of_birth": "1988-03-02",
  "node_id": "first_id_verification",
  "verification_method": "wallet",
  "assurance": "cryptographic",
  "wallet_provider": "mitid",
  "fallback_from": null,
  "id_lookup": null,
  "wallet_verification": {
    "provider": "mitid",
    "provider_name": "MitID",
    "issuing_authority": "Danish Agency for Digital Government",
    "issuing_country": "DNK",
    "credential_type": "person_identification",
    "level_of_assurance": "substantial",
    "verified_at": "2026-09-04T09:12:44Z",
    "signature_valid": true,
    "attributes": {
      "full_name": "Freja Nielsen",
      "date_of_birth": "1988-03-02",
      "cpr_alias": "b0f1c2d3-e4f5-4678-9abc-def012345678"
    },
    "portrait": null,
    "face_match_score": null
  },
  "warnings": []
}
```

### NFC सत्यापन

ID दस्तावेज़ के विरुद्ध हर चिप रीड के लिए लौटाया जाता है: ICAO 9303 ePassport या eID चिप, या `chip_protocol: "jpki"` के माध्यम से JPKI से पढ़ा गया जापान का My Number Card। यह `GET /v3/session/{sessionId}/decision/` में `nfc_verifications[]` के रूप में दिखता है (हर मूल KYC रिकॉर्ड के लिए एक)। स्रोत: `kyc/serializers/epassport.py:121-139` (`NFCV3Serializer`, जो `kyc/serializers/epassport.py:83-118` पर `NFCV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | शून्य स्वीकार्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | [स्थिति enum](#स्टेटस-एनम-संदर्भ) देखें। | `"Approved"` |
| `portrait_image` | string (URL) | हाँ | चिप से निकाली गई चेहरे की छवि का प्रीसाइन्ड URL। | `"https://<media-host>/.../nfc_portrait.jpg?..."` |
| `signature_image` | string (URL) | हाँ | चिप से निकाली गई हस्ताक्षर छवि का प्रीसाइन्ड URL (जब वह चिप पर संग्रहीत हो)। | `null` |
| `chip_data` | object | हाँ | चिप के डेटा ग्रुप से पार्स किया गया व्यक्तिगत डेटा, समतल रूप में (`kyc/utils/epassport.py:165-212`): `dgs` (पढ़े गए डेटा ग्रुप), `surname`, `name`, `country`, `nationality`, `birth_date` (`YYYY-MM-DD`), `expiry_date` (`YYYY-MM-DD`), `sex` (`M`/`F`), `document_type` (MRZ दस्तावेज़ कोड), `document_number`, `optional_data`, MRZ चेक अंक (`birth_date_hash`, `expiry_date_hash`, `document_number_hash`, `optional_data_hash`, `final_hash`), `mrz_string`, `mrz_type` (`TD1`/`TD2`/`TD3`); साथ ही `place_of_birth` और `address` (और गैर-लैटिन नामों के लिए `full_name` / `full_name_non_latin`), जब चिप में DG11 हो। अन्यथा ये कुंजियाँ मौजूद नहीं होतीं। NFC चरण छोड़ा गया हो तो `null`। | `{ "document_number": "AB1234567", "name": "MARIA" }` |
| `authenticity` | object | हाँ | `{ sod_integrity, dg_integrity }`; JPKI रीड के लिए `null`। `sod_integrity` जाँचता है कि Document Security Object (SOD) का हस्ताक्षर जारीकर्ता देश के मान्य CSCA तक पहुँचता है (और DSC न तो रद्द है और न ही समाप्त हुआ है)। `dg_integrity` जाँचता है कि हर डेटा ग्रुप का हैश SOD से मेल खाता है। दोनों `true` होने का अर्थ है कि चिप वास्तविक है और उसमें छेड़छाड़ नहीं हुई। | `{ "sod_integrity": true, "dg_integrity": true }` |
| `certificate_summary` | object | हाँ | दस्तावेज़-हस्ताक्षरकर्ता प्रमाणपत्र का सारांश (`kyc/utils/epassport.py:338-348`): `issuer`, `subject`, `serial_number` (पूर्णांक), `not_valid_before`, `not_valid_after` (`YYYY-MM-DD HH:MM:SS`), साथ में `validation` ऑब्जेक्ट `{ csca_verified, dsc_revoked, dsc_expired, csca_expired }` (`kyc/views/epassport.py:86`)। | `{ "issuer": "Common Name: CSCA SPAIN, Country: ES", "not_valid_after": "2031-02-18 10:21:11" }` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड का पहचानकर्ता (V3)। | `"first_nfc"` |
| `is_nfc_skipped` | boolean | नहीं | `true` तब होता है जब यह NFC चरण पढ़ने के बजाय स्पष्ट रूप से छोड़ा गया हो; `skip_reason` बताता है कि क्यों। | `false` |
| `skip_reason` | string | हाँ | चरण क्यों छोड़ा गया। यह केवल तब सेट होता है जब `is_nfc_skipped` `true` हो। इनमें से एक: `USER_SKIPPED`, `DOCUMENT_WITHOUT_CHIP`, `CHIP_CERTIFICATE_UNAVAILABLE`, `DEVICE_WITHOUT_NFC`, `INTEGRATION_WITHOUT_NFC_ACCESS`, `MRZ_KEY_UNAVAILABLE`, `JPKI_UNAVAILABLE`; देखें [स्किप के कारण](https://docs.didit.me/hi/core-technology/nfc-verification/warnings-nfc-verification.md#स्किप-के-कारण)। निर्णय payload में सत्र-स्तर का `nfc_skip_reason` भी होता है, जिसकी श्रेणियाँ यही हैं और जो उन NFC चरणों को कवर करता है जो कोई रिपोर्ट बनाने से पहले ही छोड़ दिए गए थे। | `null` |
| `chip_protocol` | string | नहीं | चिप कैसे पढ़ी जाती है: `icao` (ICAO 9303 ePassport या eID चिप) या `jpki` (Japan My Number Card)। `jpki` के लिए `portrait_image`, `signature_image`, `chip_data`, `authenticity` और `certificate_summary` `null` होते हैं। छोड़े गए चरणों पर भी सेट होता है। | `"icao"` |
| `jpki` | object | हाँ | My Number Card पढ़ने से क्या सिद्ध हुआ: `certificate_types`, `chain_valid`, `signature_valid`, `revocation_status` (`good`, `revoked` या `unchecked`), `ca_generation`, `certificate_expires_at`, `certificates[]`, `attributes` (हस्ताक्षर प्रमाणपत्र से नाम, जन्म तिथि, लिंग और पता), `attributes_match_ocr` और `mismatched_attributes`। प्रमाणपत्र, उनके सीरियल नंबर या हस्ताक्षर कभी शामिल नहीं होते। ICAO चिप के लिए, छोड़े गए चरणों के लिए, और तब `null` होता है जब चरण बिना कोई कार्ड पढ़े बंद हुआ हो। देखें [JPKI फ़ील्ड](https://docs.didit.me/hi/core-technology/nfc-verification/report-nfc-verification.md#jpki-फ़ील्ड)। | `null` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "status": "Approved",
  "portrait_image": "https://<media-host>/.../nfc_portrait.jpg?signature=...",
  "signature_image": null,
  "chip_data": {
    "dgs": ["DG1", "DG2", "DG11"],
    "surname": "GARCIA LOPEZ",
    "name": "MARIA",
    "country": "ESP",
    "nationality": "ESP",
    "birth_date": "1990-05-12",
    "expiry_date": "2032-05-11",
    "sex": "F",
    "document_type": "P",
    "document_number": "AB1234567",
    "optional_data": "",
    "birth_date_hash": "4",
    "expiry_date_hash": "7",
    "document_number_hash": "3",
    "optional_data_hash": "",
    "final_hash": "8",
    "mrz_string": "P<ESPGARCIA<LOPEZ<<MARIA<<<<<<<<<<<<<<<<<<<<AB1234567ESP9005124F3205117<<<<<<<<<<<<<<08",
    "mrz_type": "TD3",
    "place_of_birth": "MADRID",
    "address": "CALLE MAYOR 1, MADRID"
  },
  "authenticity": { "sod_integrity": true, "dg_integrity": true },
  "certificate_summary": {
    "issuer": "Common Name: CSCA SPAIN, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
    "subject": "Common Name: DS n-eID SPAIN 2, Organizational Unit: PASSPORT, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
    "serial_number": 118120836164494130086420187336801405660,
    "not_valid_before": "2020-11-18 10:21:11",
    "not_valid_after": "2031-02-18 10:21:11",
    "validation": {
      "csca_verified": true,
      "dsc_revoked": false,
      "dsc_expired": false,
      "csca_expired": false
    }
  },
  "node_id": "first_nfc",
  "is_nfc_skipped": false,
  "skip_reason": null,
  "chip_protocol": "icao",
  "jpki": null,
  "warnings": []
}
```

### लाइवनेस जाँच

प्रत्येक लाइवनेस सत्र के लिए लौटाया जाता है। यह `GET /v3/session/{sessionId}/decision/` में `liveness_checks[]` के रूप में दिखता है। स्रोत: `face/serializers/face.py:301-320` (`LivenessV3Serializer`, जो `face/serializers/face.py:216-298` के `LivenessV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्थिति enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `method` | string (enum) | हाँ | `ACTIVE_3D`, `FLASHING`, या `PASSIVE` (`LivenessMethodChoices`, `common/config/choices.py:514-517`)। डेस्कटॉप सत्र की अनुमति होने पर और उपयोगकर्ता डेस्कटॉप पर होने पर पैसिव चलता है। | `"PASSIVE"` |
| `score` | float (0-100) | हाँ | लाइवनेस विश्वास स्कोर, 2 दशमलव तक गोल किया गया। | `92.41` |
| `reference_image` | string (URL) | हाँ | उपयोगकर्ता के रेफ़रेंस चेहरे के क्रॉप का प्रीसाइन्ड URL। | `"https://<media-host>/.../reference.jpg?..."` |
| `video_url` | string (URL) | हाँ | लाइवनेस वीडियो का प्रीसाइन्ड URL (केवल एक्टिव मोड में)। | `"https://<media-host>/.../liveness.webm?..."` |
| `age_estimation` | float | हाँ | रेफ़रेंस इमेज में सबसे बड़े चेहरे की अनुमानित आयु (वर्षों में)। | `34.2` |
| `matches` | array of objects | नहीं | सत्रों के बीच चेहरा मिलान। हर आइटम: `{ session_id, session_number, similarity_percentage, vendor_data, vendor_user_id, biometric_template_id, verification_date, user_details: { full_name, document_type, document_number }, match_image_url, status, is_blocklisted, is_allowlisted, api_service, source }`। `source` `session`, `imported`, `list_entry`, या `retained_template` होता है। रखे गए टेम्पलेट के मिलान में `vendor_user_id`, `vendor_data` और `biometric_template_id` होते हैं; उसके सत्र, इमेज, पहचान विवरण, स्थिति और API सेवा के फ़ील्ड `null` होते हैं। | `[]` |
| `face_quality` | float (0-100) | हाँ | पैसिव लाइवनेस के चेहरे की गुणवत्ता का स्कोर (प्रतिशत में सामान्यीकृत)। | `87.50` |
| `face_luminance` | float (0-100) | हाँ | पैसिव लाइवनेस के चेहरे की चमक का स्कोर (0-255 से प्रतिशत में सामान्यीकृत)। | `54.12` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड का पहचानकर्ता (V3)। | `"first_liveness"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "status": "Approved",
  "method": "PASSIVE",
  "score": 92.41,
  "reference_image": "https://<media-host>/.../reference.jpg?signature=...",
  "video_url": null,
  "age_estimation": 34.2,
  "matches": [],
  "face_quality": 87.50,
  "face_luminance": 54.12,
  "node_id": "first_liveness",
  "warnings": []
}
```

### चेहरा मिलान

हर चेहरा-मिलान तुलना के लिए लौटाई जाती है (आमतौर पर उपयोगकर्ता का लाइवनेस चेहरा दस्तावेज़ के पोर्ट्रेट से मिलाया जाता है)। यह `GET /v3/session/{sessionId}/decision/` में `face_matches[]` के रूप में दिखता है। स्रोत: `face/serializers/face.py:367-389` (`FaceMatchV3Serializer`, जो `face/serializers/face.py:323-364` के `FaceMatchV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्थिति enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `score` | float (0-100) | हाँ | समानता, 2 दशमलव तक गोल किया गया। जब प्रदाता केवल `unmatched_faces[].Confidence` लौटाता है, तो इसे `100 - confidence` में बदला जाता है। | `97.83` |
| `source_image_session_id` | string (UUID) | हाँ | वह सत्र जिसकी संग्रहीत पोर्ट्रेट से स्रोत (रेफ़रेंस) इमेज प्राप्त हुई। यह पोर्ट्रेट-आधारित फ़्लो में सेट होता है (बायोमेट्रिक प्रमाणीकरण, या सत्र बनाते समय दिया गया पोर्ट्रेट)। जब रेफ़रेंस उसी सत्र का दस्तावेज़ पोर्ट्रेट हो, तो `null` होता है। | `null` |
| `source_image` | string (URL) | हाँ | स्रोत (रेफ़रेंस) इमेज का प्रीसाइन्ड URL, जो आमतौर पर दस्तावेज़ पोर्ट्रेट होती है, या बायोमेट्रिक प्रमाणीकरण फ़्लो में संग्रहीत पोर्ट्रेट। | `"https://<media-host>/.../source.jpg?..."` |
| `target_image` | string (URL) | हाँ | लाइवनेस के दौरान ली गई टारगेट (लाइव चेहरा) इमेज का प्रीसाइन्ड URL। | `"https://<media-host>/.../target.jpg?..."` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड का पहचानकर्ता (V3)। | `"first_face_match"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |
| `face_coverage` | object | हाँ | कैप्चर की गई इमेज में `eyes`, `mouth` और `face` ढके हैं या नहीं। हर क्षेत्र में `covered`, `calibrated` और `visibility_score` होते हैं; `calibrated: false` का मतलब छाया का प्रमाण है, जिस पर कोई चेतावनी लागू नहीं होती। यह केवल `GET /v3/session/{sessionId}/decision/` से लौटाया जाता है, वेबहुक payload में कभी नहीं। | `{ "eyes": { "covered": false, "calibrated": true, "visibility_score": 0.98 } }` |

```json theme={null}
{
  "status": "Approved",
  "score": 97.83,
  "source_image_session_id": null,
  "source_image": "https://<media-host>/.../source.jpg?signature=...",
  "target_image": "https://<media-host>/.../target.jpg?signature=...",
  "node_id": "first_face_match",
  "warnings": []
}
```

### चेहरा खोज

स्टैंडअलोन चेहरा खोज API (`POST /v3/face-search/`) यह डेटा लौटाता है। Face Search `/v3/session/{sessionId}/decision/` में कभी भी बहुवचन array के रूप में नहीं आता। जब `save_api_request=true` के साथ सहेजा जाता है, तब सत्र वहाँ `features[]` में `FACE_SEARCH` entry के रूप में और एक `liveness_checks[]` आइटम के रूप में दिखता है, जिसमें सहेजे गए `matches` होते हैं। स्रोत: `apis/serializers/face_search.py:8-79` (`FaceSearchResponseSerializer`, जो `FaceSearchDetailsSerializer` को wrap करता है); match dicts `face/utils/utils.py:869-884` में बनते हैं।

शीर्ष-स्तर का रिस्पॉन्स:

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `request_id` | string (UUID) | नहीं | `save_api_request=true` होने पर सहेजा गया सत्र ID (इसे `GET /v3/session/{sessionId}/decision/` के साथ उपयोग किया जा सकता है); अन्यथा एक अस्थायी सहसंबंध UUID। | `"4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f"` |
| `face_search` | object | नहीं | खोज का विवरण वाला payload, नीचे दिए गए फ़ील्ड देखें। | — |
| `vendor_data` | string | हाँ | अनुरोध से दोहराया गया `vendor_data`। | `null` |
| `metadata` | object | हाँ | अनुरोध से दोहराया गया `metadata`। | `null` |
| `created_at` | string (ISO 8601) | नहीं | सर्वर-साइड अनुरोध समय-चिह्न। | `"2026-06-12T01:04:42.763237+00:00"` |

`face_search` object:

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | `Declined` केवल तब होता है जब `FACE_IN_BLOCKLIST` या `POSSIBLE_FACE_IN_BLOCKLIST` चेतावनी सक्रिय होती है; अन्यथा `Approved` होता है। केवल डुप्लिकेट मिलान से कभी अस्वीकृति नहीं होती (`apis/views/face_search.py:242-248`)। | `"Approved"` |
| `total_matches` | integer | नहीं | `matches[]` में लौटाए गए मिलानों की संख्या (0–5)। | `1` |
| `matches` | [face-search match objects](#चेहरा-खोज-मिलान-ऑब्जेक्ट) का array | नहीं | समानता की न्यूनतम सीमा से ऊपर के अधिकतम 5 मिलान, समानता के अवरोही क्रम में सॉर्ट किए गए (ब्लॉकलिस्ट वाली entries `search_type=blocklisted_or_approved` के साथ सबसे पहले)। | `[…]` |
| `user_image` | object | नहीं | जमा की गई इमेज का detection परिणाम: `{ entities: [{ bbox, confidence }], best_angle }`, जिसमें हर पहचाने गए चेहरे के लिए एक entity होती है। | `{ "entities": [{ "bbox": [40, 40, 120, 120], "confidence": 0.73 }], "best_angle": 0 }` |
| `warnings` | objects का array | नहीं | इस स्टैंडअलोन API के लिए घटा हुआ चेतावनी ढाँचा, जिसमें `node_id` नहीं है। serializer contract में `{ risk, additional_data, log_type, short_description, long_description }` घोषित है (`apis/serializers/face_search.py:49-54`); runtime payload में `feature` भी होता है, जिसका मान हमेशा `"LIVENESS"` होता है (`apis/views/face_search.py:332-341`)। | `[]` |

#### चेहरा खोज मिलान ऑब्जेक्ट

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `session_id` | string (UUID) | हाँ | मिलान किया गया मिलान किए गए सत्यापन सत्र। जब `source` `imported`, `list_entry` या `retained_template` हो, तब `null` होता है। | `"a3f2a6f1-…"` |
| `session_number` | integer | हाँ | मिलान किए गए सत्र की Console-अनुकूल संख्या; गैर-सत्र मिलानों के लिए `null`। | `1024` |
| `similarity_percentage` | float (0-100) | नहीं | जमा किए गए चेहरे और मिलान किए गए चेहरे के बीच समानता। | `96.42` |
| `source` | string (enum) | नहीं | मिलान किया गया चेहरा कहाँ से दर्ज हुआ था: `session` (verification सत्र या सहेजी गई स्टैंडअलोन कॉल), `imported` (सीधे उपयोगकर्ता प्रोफ़ाइल में चेहरा अपलोड), `list_entry` (किसी सूची से जुड़ा चेहरा), `retained_template` (स्रोत सत्र हटाए जाने के बाद रखा गया, बिना इमेज वाला [बायोमेट्रिक टेम्पलेट](https://docs.didit.me/hi/management-api/biometric-templates/overview.md))। | `"session"` |
| `vendor_data` | string | हाँ | मिलान किए गए सत्र का `vendor_data`, या `imported` और `retained_template` मिलानों के लिए जुड़े उपयोगकर्ता का। | `"user-12345"` |
| `vendor_user_id` | string (UUID) | हाँ | जुड़ा हुआ उपयोगकर्ता। `list_entry` मिलानों और ऐसे सत्रों के लिए `null` होता है जिनका कोई User नहीं है। | `"2f7c1a9e-…"` |
| `biometric_template_id` | string (UUID) | हाँ | मिलान किया गया रखा हुआ टेम्पलेट। यह केवल `retained_template` मिलानों के लिए सेट होता है; इसे `GET`/`DELETE /v3/biometric-templates/{id}/` के साथ उपयोग करें। | `null` |
| `verification_date` | string (ISO 8601) | हाँ | मिलान किया गया चेहरा कब कैप्चर हुआ था, या `retained_template` कब रखा गया था; `list_entry` मिलानों के लिए `null`। | `"2024-11-04T09:14:02Z"` |
| `user_details` | object | हाँ | मिलान किए गए सत्र के दस्तावेज़ सत्यापन से `{ full_name, document_type, document_number }`; `imported` मिलानों के लिए केवल `full_name` सेट होता है; कोई पहचान डेटा न होने पर `null`, और `retained_template` मिलानों के लिए हमेशा `null`। | `{ "full_name": "María García López", "document_type": "Passport", "document_number": "AB1234567" }` |
| `match_image_url` | string (URL) | हाँ | मिलान किए गए उपयोगकर्ता का संदर्भ चेहरा: `save_api_request=true` होने पर presigned URL, अन्यथा raw storage path। `retained_template` मिलानों के लिए हमेशा `null`, क्योंकि उनमें कोई इमेज नहीं होती। | `"https://<media-host>/.../matched.jpg?..."` |
| `status` | string | हाँ | मिलान किए गए सत्र की verification स्थिति (देखें [स्टेटस एनम](#स्टेटस-एनम-संदर्भ)); गैर-सत्र मिलानों के लिए `null`। | `"Approved"` |
| `is_blocklisted` | boolean | नहीं | क्या मिलान किया गया चेहरा आपकी face blocklist में है। `retained_template` मिलानों के लिए हमेशा `false`; ब्लॉकलिस्ट वाला चेहरा अलग से `list_entry` मिलान के रूप में बताया जाता है। | `false` |
| `is_allowlisted` | boolean | नहीं | क्या मिलान किया गया चेहरा आपकी किसी allowlist में है। | `false` |
| `api_service` | string (enum) | हाँ | मिलान किए गए सत्र का स्टैंडअलोन API प्रकार (बड़े अक्षरों में, जैसे `PASSIVE_LIVENESS`, `FACE_MATCH`); workflow सत्रों और गैर-सत्र मिलानों के लिए `null`। | `null` |

```json theme={null}
{
  "request_id": "4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f",
  "face_search": {
    "status": "Approved",
    "total_matches": 1,
    "matches": [
      {
        "session_id": "a3f2a6f1-1c1c-4eec-8b69-1c1c2f3a2c7f",
        "session_number": 1024,
        "similarity_percentage": 96.42,
        "source": "session",
        "vendor_data": "user-12345",
        "verification_date": "2024-11-04T09:14:02Z",
        "user_details": {
          "full_name": "María García López",
          "document_type": "Passport",
          "document_number": "AB1234567"
        },
        "match_image_url": "https://<media-host>/.../matched.jpg?signature=...",
        "status": "Approved",
        "is_blocklisted": false,
        "is_allowlisted": false,
        "api_service": null
      }
    ],
    "user_image": {
      "entities": [
        {
          "bbox": [40, 40, 120, 120],
          "confidence": 0.732973
        }
      ],
      "best_angle": 0
    },
    "warnings": []
  },
  "vendor_data": null,
  "metadata": null,
  "created_at": "2026-06-12T01:04:42.763237+00:00"
}
```

### AML स्क्रीनिंग

इसे स्क्रीन की गई प्रत्येक इकाई के लिए लौटाया जाता है। KYC और KYB, दोनों सत्रों के लिए यह `GET /v3/session/{sessionId}/decision/` में `aml_screenings[]` के रूप में दिखता है। स्रोत: `aml/serializers/aml.py:63-85` (`AMLV3Serializer`, जो `aml/serializers/aml.py:28-60` के `AMLV2Serializer` का विस्तार करता है)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्टेटस एनम](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `total_hits` | integer | नहीं | स्क्रीनिंग हिट्स की संख्या (हमेशा मौजूद रहती है, डिफ़ॉल्ट `0`)। | `2` |
| `entity_type` | string (enum) | हाँ | `person` या `company` (`EntityTypeChoices`, `common/config/choices.py:675-677`)। | `"person"` |
| `hits` | objects का array | नहीं | हर हिट के लिए एक entry। मुख्य फ़ील्ड: `id`, `caption`, `match` (bool), `target` (bool \| null: क्या इकाई सूची में प्रत्यक्ष लक्ष्य है), `match_score` (float 0-100; मिलान स्कोर, पहचान का विश्वास), `risk_score` (float 0-100, इकाई जोखिम स्कोर), `score` (deprecated 0-1 float), `datasets[]` (जैसे `PEP`, `PEP Level 1`-`4`, `Sanctions`, `Adverse Media`, `Warnings and Regulatory Enforcement`, `Fitness and Probity`), `properties` (नाम, उपनाम, जन्म तिथियाँ, …), `features`, `url`, `first_seen`, `last_seen`, `rca_name`, `risk_view`, `score_breakdown`, `pep_matches`, `sanction_matches`, `warning_matches`, `adverse_media_matches`, `adverse_media_details`, `linked_entities`, `additional_information`, और `review_status` (`Unreviewed`, `Confirmed Match`, `False Positive`, `Inconclusive`), जिसे update-AML-hit-status endpoint से संपादित किया जा सकता है (`AMLHitStatusChoices`)। | `[…]` |
| `score` | float (0-100) | हाँ | समग्र स्क्रीनिंग स्कोर: `False Positive` के रूप में चिह्नित न किए गए हिट्स में सबसे ऊँचा `risk_score` (`aml/services/aml.py:832-842`)। जब हर हिट फ़ॉल्स पॉज़िटिव हो, तो `0`। गणना होने तक `null`। | `42.7` |
| `screened_data` | object | हाँ | स्क्रीनिंग को भेजे गए डेटा का स्नैपशॉट: `full_name`, `nationality`, `date_of_birth`, `document_number`। | `{ "full_name": "María García López", "date_of_birth": "1990-05-12" }` |
| `is_ongoing_monitoring_enabled` | boolean | नहीं | क्या इकाई सतत निगरानी के तहत पुनः स्क्रीनिंग के लिए सब्सक्राइब की गई है। | `false` |
| `next_ongoing_monitoring_bill_date` | string (YYYY-MM-DD) | हाँ | सतत निगरानी सक्षम होने पर `last_aml_bill_date + 365 days` के रूप में गणना की जाती है। यह **बिलिंग** तिथि है, स्क्रीनिंग तिथि नहीं। | `null` |
| `last_ongoing_screening_at` | string (ISO 8601) | हाँ | जब सतत निगरानी ने इस रिकॉर्ड की पुनः स्क्रीनिंग अंतिम बार पूरी की, चाहे परिणाम बदला हो या नहीं। कभी पुनः स्क्रीन न होने पर `null`; इसे कभी पीछे जाकर नहीं भरा जाता। | `"2026-09-12T04:03:11Z"` |
| `last_ongoing_screening_datasets_updated_at` | string (ISO 8601) | हाँ | उस स्क्रीनिंग के लिए प्रदाता द्वारा रिपोर्ट की गई सबसे हाल की AML डेटासेट अपडेट। कोई डेटासेट तिथि रिपोर्ट न होने पर `null`; इसका कभी अनुमान नहीं लगाया जाता। | `null` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_aml"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "status": "In Review",
  "total_hits": 1,
  "entity_type": "person",
  "hits": [
    {
      "id": "Q7XW3-aml-hit-1",
      "caption": "Maria Garcia Lopez",
      "match": true,
      "target": true,
      "match_score": 86.4,
      "risk_score": 42.7,
      "datasets": ["PEP Level 2"],
      "properties": {
        "name": ["María García López", "M. García"],
        "alias": ["Maria Garcia"],
        "birthDate": ["1990-05-12"]
      },
      "url": "https://example.org/registry/entities/Q7XW3",
      "first_seen": "2023-11-02T00:00:00Z",
      "last_seen": "2026-05-01T00:00:00Z",
      "review_status": "Unreviewed"
    }
  ],
  "score": 42.7,
  "screened_data": {
    "full_name": "María García López",
    "date_of_birth": "1990-05-12",
    "nationality": "ES",
    "document_number": "AB1234567"
  },
  "is_ongoing_monitoring_enabled": false,
  "next_ongoing_monitoring_bill_date": null,
  "last_ongoing_screening_at": null,
  "last_ongoing_screening_datasets_updated_at": null,
  "node_id": "first_aml",
  "warnings": []
}
```

### IP विश्लेषण

प्रत्येक कैप्चर किए गए नेटवर्क स्थान के लिए लौटाया जाता है। KYC और KYB, दोनों सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `ip_analyses[]` के रूप में दिखता है। स्रोत: `kyc/serializers/location.py:196-243` (`IPAnalysisSerializerV3`)।

| फ़ील्ड | प्रकार | शून्य-योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्टेटस एनम](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_ip_analysis"` |
| `device_brand` | string | हाँ | यूज़र एजेंट से निकला डिवाइस ब्रांड। | `"Apple"` |
| `device_model` | string | हाँ | डिवाइस मॉडल। | `"iPhone"` |
| `browser_family` | string | हाँ | ब्राउज़र परिवार। | `"Mobile Safari"` |
| `os_family` | string | हाँ | OS परिवार। | `"iOS"` |
| `platform` | string | हाँ | उच्च-स्तरीय प्लेटफ़ॉर्म (`mobile`, `desktop`, `tablet`)। | `"mobile"` |
| `device_fingerprint` | string | हाँ | स्थिर प्रति-डिवाइस फ़िंगरप्रिंट हैश। | `"f2a3…"` |
| `ip_country` | string | हाँ | IP से निकाला गया देश का नाम। | `"Spain"` |
| `ip_country_code` | string (ISO 3166-1 alpha-2) | हाँ | IP से निकाला गया देश कोड। | `"ES"` |
| `ip_state` | string | हाँ | IP से निकाला गया क्षेत्र / राज्य। | `"Comunidad de Madrid"` |
| `ip_city` | string | हाँ | IP से निकाला गया शहर। | `"Madrid"` |
| `latitude` | float | हाँ | IP से प्राप्त अक्षांश। | `40.4168` |
| `longitude` | float | हाँ | IP से प्राप्त देशांतर। | `-3.7038` |
| `ip_address` | string | हाँ | कैप्चर किया गया IP पता। | `"203.0.113.42"` |
| `isp` | string | हाँ | ISP का नाम। | `"Telefonica de Espana"` |
| `organization` | string | हाँ | संगठन का नाम (अक्सर ISP के समान)। | `"Telefonica de Espana"` |
| `is_vpn_or_tor` | boolean | हाँ | `true` जब IP किसी VPN, प्रॉक्सी या Tor एग्ज़िट नोड का हो। | `false` |
| `is_data_center` | boolean | हाँ | `true` जब IP किसी ज्ञात होस्टिंग / डेटा-सेंटर ASN का हो। | `false` |
| `time_zone` | string | हाँ | IANA टाइम-ज़ोन नाम। | `"Europe/Madrid"` |
| `time_zone_offset` | string | हाँ | UTC ऑफ़सेट। | `"+02:00"` |
| `ip` | object | नहीं | `{ location, distance_from_id_document, distance_from_poa_document }`। `location = { latitude, longitude }`। दूरी किलोमीटर में; जब कोई एक पक्ष न हो, तो `null`। | `{ "location": { "latitude": 40.4168, "longitude": -3.7038 }, "distance_from_id_document": 3.4, "distance_from_poa_document": 1.1 }` |
| `id_document` | object | नहीं | `{ location, distance_from_ip, distance_from_poa_document }`। पहचान दस्तावेज़ का स्थान `issuing_state` और पार्स किए गए पते से निकाला गया। | `{ "location": { "latitude": 40.4165, "longitude": -3.7026 }, "distance_from_ip": 3.4, "distance_from_poa_document": 4.0 }` |
| `poa_document` | object | नहीं | `{ location, distance_from_ip, distance_from_id_document }`। पते के प्रमाण (POA) दस्तावेज़ का पता, भू-कोडित। | `{ "location": { "latitude": 40.4170, "longitude": -3.7040 }, "distance_from_ip": 1.1, "distance_from_id_document": 4.0 }` |
| `matches` | array of objects | नहीं | क्रॉस-सत्र IP/डिवाइस मिलान। प्रत्येक आइटम: `{ session_id, session_number, vendor_data, verification_date, match_type, match_source, matched_value, status, is_blocklisted, api_service, source, device_info, location_info, confidence, match_mode }`। `match_type` `ip_address` या `device_fingerprint` है; `match_source` `ip_address`, `persistent_id`, `legacy_fp`, या `recovered_high` है (पुनर्प्राप्त मिलानों में `recovery_similarity`, `tls_ja4_corroborated`, `recovery_gate_reason` भी होते हैं)। 5 IP + 5 डिवाइस मिलान तक सीमित। | `[]` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |
| `browser_version`, `os_version` | string | हाँ | यूज़र एजेंट से ब्राउज़र और OS के संस्करण। | `"17.4"` |
| `user_agent`, `accept_language` | string | हाँ | ब्राउज़र द्वारा भेजी गई यूज़र एजेंट स्ट्रिंग और `Accept-Language` हेडर। | `"en-US,en;q=0.9"` |
| `session_identifier`, `session_age_ms` | string, integer | हाँ | वह ब्राउज़िंग सत्र जिसमें चरण चला, और उसकी आयु मिलीसेकंड में। | `48210` |
| `coords_accuracy` | float | हाँ | डिवाइस द्वारा रिपोर्ट किए गए निर्देशांकों की सटीकता त्रिज्या, मीटर में। | `35.0` |
| `raw_device_data` | object | हाँ | चरण के लिए एकत्र किए गए कच्चे डिवाइस सिग्नल। | `{}` |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_ip_analysis",
  "device_brand": "Apple",
  "device_model": "iPhone",
  "browser_family": "Mobile Safari",
  "os_family": "iOS",
  "platform": "mobile",
  "device_fingerprint": "f2a3c1de8b994a3f9e4cdf3a02b1a7c9",
  "ip_country": "Spain",
  "ip_country_code": "ES",
  "ip_state": "Comunidad de Madrid",
  "ip_city": "Madrid",
  "latitude": 40.4168,
  "longitude": -3.7038,
  "ip_address": "203.0.113.42",
  "isp": "Telefonica de Espana",
  "organization": "Telefonica de Espana",
  "is_vpn_or_tor": false,
  "is_data_center": false,
  "time_zone": "Europe/Madrid",
  "time_zone_offset": "+02:00",
  "ip": {
    "location": { "latitude": 40.4168, "longitude": -3.7038 },
    "distance_from_id_document": 3.4,
    "distance_from_poa_document": 1.1
  },
  "id_document": {
    "location": { "latitude": 40.4165, "longitude": -3.7026 },
    "distance_from_ip": 3.4,
    "distance_from_poa_document": 4.0
  },
  "poa_document": {
    "location": { "latitude": 40.4170, "longitude": -3.7040 },
    "distance_from_ip": 1.1,
    "distance_from_id_document": 4.0
  },
  "matches": [],
  "warnings": []
}
```

### स्थान सत्यापन

प्रत्येक [स्थान सत्यापन](https://docs.didit.me/hi/core-technology/location-verification/overview.md) चरण के लिए लौटाया जाता है। `GET /v3/session/{sessionId}/decision/` में `geolocation_checks[]` के रूप में दिखता है: प्रत्येक चरण का एक आइटम, यानी उसका स्वीकृत प्रयास। `geolocation_attempts[]` हर चरण के हर प्रयास को सबसे पुराने से पहले सूचीबद्ध करता है। ऐसे वर्कफ़्लो के लिए, जिसमें यह चरण नहीं है, दोनों `null` होते हैं। स्रोत: `GeolocationDecisionSerializer`।

| फ़ील्ड | प्रकार | शून्य-योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `node_id` | string | हाँ | वह वर्कफ़्लो नोड जिसने परिणाम दिया। | `"geolocation_1"` |
| `status` | string | नहीं | [Status enum](#स्टेटस-एनम-संदर्भ) देखें। | `"Declined"` |
| `outcome` | string | हाँ | प्रयास में क्या हुआ: `verified`, `low_accuracy`, `accuracy_undetermined`, `stale`, `approximate`, `denied`, `restricted`, `unavailable`, `timeout`, `mock_detected`, `outside_geofence`, `in_blocked_area`, `anonymizer_detected`, `skipped`, `replay_rejected` या `unsupported_client`। | `"outside_geofence"` |
| `permission` | string | हाँ | सिस्टम ने क्या अनुमति दी: `granted_precise`, `granted_approximate`, `denied`, `restricted`, `unavailable`, `timeout`, `dismissed` या `not_requested`। | `"granted_precise"` |
| `latitude`, `longitude` | float | हाँ | WGS84 स्थान। स्थान न होने पर `null`। | `48.8566` |
| `accuracy_m` | float | हाँ | मीटर में अनिश्चितता की त्रिज्या। | `35.0` |
| `accuracy_confidence` | string | हाँ | `p95`, `p68` या `unspecified`। | `"p95"` |
| `measured_at`, `age_seconds` | datetime, integer | हाँ | डिवाइस ने स्थान कब लिया, और Didit को उसके प्राप्त होने तक कितने सेकंड लगे। | `2` |
| `source`, `platform`, `sdk_version` | string | हाँ | स्थान कहाँ से आया, उसे तैयार करने वाला क्लाइंट और उसका SDK संस्करण। | `"browser"` |
| `is_mock`, `produced_by_accessory` | boolean | हाँ | प्लेटफ़ॉर्म द्वारा रिपोर्ट किए गए स्पूफिंग साक्ष्य। `null` का अर्थ है कि प्लेटफ़ॉर्म इसे रिपोर्ट नहीं करता। | `null` |
| `integrity` | string | नहीं | `attested`, `not_attested`, `failed`, `unsupported` (web) या `not_determined`। | `"unsupported"` |
| `country_code`, `region_code`, `city` | string | हाँ | वह स्थान जिस पर स्थान-निर्धारण का परिणाम आता है। | `"FR"` |
| `geofence`, `inside_geofence`, `geofence_basis`, `inside_areas`, `blocked_areas` | object, boolean, string, arrays | हाँ | देश और क्षेत्र का परिणाम। | `{ "enabled": true, "result": "outside" }` |
| `position_source`, `anonymizers` | string, object | हाँ | वह स्रोत जहाँ से इस चरण के लिए स्थान लिया जाता है, और VPN, proxy, Tor, स्पूफिंग तथा एमुलेटर के संकेत। | `"device_and_ip"` |
| `ip_distance_km`, `ip_distance_uncertainty_km`, `ip_consistent`, `document_distance_km`, `travel_excused`, `consecutive_mismatches` | number, boolean, integer | हाँ | IP स्थान और रिकॉर्ड में दर्ज पते के साथ तुलना। | `12.4` |
| `attempts` | integer | नहीं | चरण के भीतर इस प्रयास का क्रम संख्या। | `3` |
| `consent` | object | हाँ | उस सूचना का `accepted_at`, `version` और `locale`, जिसे व्यक्ति ने स्वीकार किया। | |
| `warnings` | array of [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट) | नहीं | चरण की `LOCATION_*` चेतावनियाँ। ये `geolocation_attempts[]` में मौजूद नहीं होतीं, जिसमें `received_at` और `created_at` जुड़े होते हैं। | `[]` |

हर फ़ील्ड और उदाहरण [स्थान सत्यापन रिपोर्ट](https://docs.didit.me/hi/core-technology/location-verification/report-location-verification.md) में हैं।

### पते का प्रमाण

हर प्रस्तुत पते के दस्तावेज़ के लिए लौटाया जाता है। यह `GET /v3/session/{sessionId}/decision/` में `poa_verifications[]` के रूप में दिखता है। स्रोत: `poa/serializers/poa.py:212-227` (`POAV3Serializer`, जो `poa/serializers/poa.py:173-209` पर `POAV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | शून्य मान | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | [Status enum](#स्टेटस-एनम-संदर्भ) देखें। | `"Approved"` |
| `issuing_state` | string (ISO 3166-1 alpha-3) | हाँ | जारीकर्ता देश का कोड। | `"ESP"` |
| `document_type` | string | नहीं | `PoaDocumentTypeChoices` (`common/config/choices.py:868-873`) से उच्च-स्तरीय प्रकार: `UTILITY_BILL`, `BANK_STATEMENT`, `GOVERNMENT_ISSUED_DOCUMENT`, `OTHER_POA_DOCUMENT`। फ़ॉलबैक के रूप में `UNKNOWN` होता है, कभी `null` नहीं। | `"UTILITY_BILL"` |
| `document_subtype` | string | नहीं | `PoaDocumentSubtypeChoices` से उप-प्रकार कोड (जैसे `ELECTRICITY_BILL`, `WATER_BILL`, `ACCOUNT_STATEMENT`)। फ़ॉलबैक के रूप में `UNKNOWN` होता है, कभी `null` नहीं। | `"ELECTRICITY_BILL"` |
| `issuer` | string | हाँ | जारी करने वाली संस्था का नाम। | `"Iberdrola"` |
| `issue_date` | string (YYYY-MM-DD) | हाँ | दस्तावेज़ की जारी होने की तिथि। | `"2026-04-15"` |
| `expiration_date` | string (YYYY-MM-DD) | हाँ | दस्तावेज़ पर छपी समाप्ति तिथि, जब वह मौजूद हो। | `null` |
| `poa_address` | string | हाँ | OCR द्वारा निकाला गया कच्चा पता। | `"Calle Mayor 1, 28001 Madrid"` |
| `poa_formatted_address` | string | हाँ | जियोकोड किया गया और फ़ॉर्मैट किया गया पता। | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `poa_parsed_address` | object | हाँ | संरचित पता (`street_1`, `street_2`, `city`, `region`, `postal_code`, `country` (alpha-2), `address_type`, `document_location`, …)। | `{ "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001" }` |
| `document_file` | string (URL) | हाँ | अपलोड किए गए दस्तावेज़ का प्री-साइन्ड URL। | `"https://<media-host>/.../poa.pdf?..."` |
| `document_language` | string | हाँ | दस्तावेज़ की पहचानी गई भाषा (ISO 639-1)। | `"es"` |
| `document_metadata` | object | हाँ | फ़िल्टर किया गया मेटाडेटा: `file_size`, `content_type`, `creation_date`, `modified_date`, `creator`, `producer`, `software`, `encryption`, `is_signed`, `is_tampered`, `signature_info`, `exif_original_date`, `exif_digitized_date`, `processed_by_known_editor`, `has_different_creation_mod_date`, `overlay_manipulation`। | `{ "file_size": 184221, "content_type": "application/pdf", "is_tampered": false }` |
| `extra_fields` | object | नहीं | बैंक-खाता फ़ील्ड (`bank_account_number`, `bank_iban`, `bank_sort_code`, `bank_routing_number`, `bank_swift_bic`, `bank_branch_name`, `bank_branch_address`), `document_phone_number`, `additional_names`, और रिकॉर्ड पर सहेजी गई कोई भी कस्टम कुंजी। | `{ "bank_iban": null, "additional_names": [] }` |
| `name_on_document` | string | हाँ | POA पर जैसा दिखता है वैसा नाम। | `"María García López"` |
| `expected_details_address` | string | हाँ | वह पता जो ग्राहक ने साइनअप के दौरान शब्दशः टाइप किया। | `"Calle Mayor 1, Madrid"` |
| `expected_details_formatted_address` | string | हाँ | जियोकोड किया गया अपेक्षित पता। | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `expected_details_parsed_address` | object | हाँ | संरचित अपेक्षित पता। | `{ "city": "Madrid", "postal_code": "28001" }` |
| `name_match_score_expected_details` | float (0-100) | हाँ | `name_on_document` और सत्र बनाते समय दिए गए नाम के बीच फ़ज़ी मिलान। | `94.0` |
| `name_match_score_id_verification` | float (0-100) | हाँ | `name_on_document` और सत्यापित ID के `full_name` के बीच फ़ज़ी मिलान। | `100.0` |
| `extra_files` | array of strings (URL) | नहीं | अतिरिक्त अपलोड की गई फ़ाइलों के प्रीसाइन किए गए URL। | `[]` |
| `detected_codes` | array of objects | नहीं | दस्तावेज़ के हर प्रोसेस किए गए पेज पर मिले QR कोड और बारकोड: `type`, `page_number` (1 से शुरू), `position` (पॉलीगन), `x`/`y`/`width`/`height` (बाउंडिंग बॉक्स), `page_width`/`page_height`, `raw_payload` (base64), `parsed_payload` (डिकोड किया गया मान, `null` जब कोई कोड मिला हो पर डिकोड न हो सका हो)। जब डिटेक्शन कुछ न पाए, तो खाली array। | `[{ "type": "QR_CODE", "page_number": 1, "parsed_payload": "https://issuer.example/inv/9981" }]` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_poa"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "ESP",
  "document_type": "UTILITY_BILL",
  "document_subtype": "ELECTRICITY_BILL",
  "issuer": "Iberdrola",
  "issue_date": "2026-04-15",
  "expiration_date": null,
  "poa_address": "Calle Mayor 1, 28001 Madrid",
  "poa_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "poa_parsed_address": { "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" },
  "document_file": "https://<media-host>/.../poa.pdf?signature=...",
  "document_language": "es",
  "document_metadata": {
    "file_size": 184221,
    "content_type": "application/pdf",
    "creation_date": "2026-04-15T08:11:32Z",
    "modified_date": "2026-04-15T08:11:32Z",
    "creator": "Iberdrola Billing",
    "producer": "Adobe PDF Library 15.0",
    "software": null,
    "encryption": null,
    "is_signed": true,
    "is_tampered": false,
    "signature_info": { "signer_name": "Iberdrola Clientes", "date": "2026-04-15T08:11:32Z" },
    "exif_original_date": null,
    "exif_digitized_date": null,
    "processed_by_known_editor": false,
    "has_different_creation_mod_date": false,
    "overlay_manipulation": null
  },
  "extra_fields": {
    "bank_account_number": null,
    "bank_iban": null,
    "bank_sort_code": null,
    "bank_routing_number": null,
    "bank_swift_bic": null,
    "bank_branch_name": null,
    "bank_branch_address": null,
    "document_phone_number": null,
    "additional_names": []
  },
  "name_on_document": "María García López",
  "expected_details_address": "Calle Mayor 1, Madrid",
  "expected_details_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "expected_details_parsed_address": { "city": "Madrid", "postal_code": "28001", "country": "ES" },
  "name_match_score_expected_details": 94.0,
  "name_match_score_id_verification": 100.0,
  "extra_files": [],
  "detected_codes": [
    {
      "type": "QR_CODE",
      "page_number": 1,
      "position": [[820, 1120], [1002, 1120], [1002, 1302], [820, 1302]],
      "x": 820,
      "y": 1120,
      "width": 182,
      "height": 182,
      "page_width": 1190,
      "page_height": 1684,
      "raw_payload": "aHR0cHM6Ly9pYmVyZHJvbGEuZXMvZmFjdHVyYS85OTgx",
      "parsed_payload": "https://iberdrola.es/factura/9981"
    },
    {
      "type": "CODE_128",
      "page_number": 1,
      "position": [[112, 1480], [560, 1480], [560, 1540], [112, 1540]],
      "x": 112,
      "y": 1480,
      "width": 448,
      "height": 60,
      "page_width": 1190,
      "page_height": 1684,
      "raw_payload": "MDA5OTgxMDAwNDI=",
      "parsed_payload": "0099810042"
    }
  ],
  "node_id": "first_poa",
  "warnings": []
}
```

### फ़ोन सत्यापन

हर फ़ोन-सत्यापन प्रयास के लिए लौटाया जाता है। यह KYC और KYB दोनों सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `phone_verifications[]` के रूप में दिखता है। स्रोत: `phone/serializers/phone.py:251-266` (`PhoneV3Serializer`, जो `phone/serializers/phone.py:103-248` पर `PhoneV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | नल योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [Status enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `phone_number_prefix` | string | नहीं | E.164 देश उपसर्ग (`+` सहित)। | `"+34"` |
| `phone_number` | string | नहीं | बिना उपसर्ग का सब्सक्राइबर नंबर। | `"612345678"` |
| `full_number` | string | नहीं | पूरा E.164 नंबर (`phone_number_prefix + phone_number`)। | `"+34612345678"` |
| `country_code` | string (ISO 3166-1 alpha-2) | हाँ | नंबर का देश। | `"ES"` |
| `country_name` | string | हाँ | स्थानीयकृत देश का नाम। | `"Spain"` |
| `carrier` | object | नहीं | `{ name, type }`, जहाँ `type` एक `LineTypeChoices` मान है (`common/config/choices.py:648-667`): `mobile`, `fixed_line`, `voip`, `isp`, `vpn`, `toll_free`, `premium_rate`, `satellite`, `pager`, `payphone`, `voice_mail`, `unknown`, और अन्य लाइन प्रकार। | `{ "name": "Movistar", "type": "mobile" }` |
| `is_disposable` | boolean | नहीं | `true`, जब कैरियर नंबर को अस्थायी/डिस्पोज़ेबल चिह्नित करे। | `false` |
| `is_virtual` | boolean | नहीं | `true`, जब `carrier.type` इनमें से कोई हो: `voip`, `isp`, `vpn`। | `false` |
| `verification_method` | string | नहीं | OTP भेजने का चैनल (`whatsapp`, `sms`, …)। यह आखिरी भेजने के प्रयास के `actual_channel` से पढ़ा जाता है (न मिलने पर अनुरोधित `channel`, फिर `sms` पर फ़ॉलबैक करता है)। | `"whatsapp"` |
| `verification_attempts` | integer | नहीं | OTP भेजने के कुल प्रयास (पहला भेजना और दोबारा भेजना)। | `1` |
| `verified_at` | string (ISO 8601) | हाँ | वह समय-चिह्न जब OTP सफलतापूर्वक दर्ज किया गया। | `"2026-05-17T10:14:02Z"` |
| `lifecycle` | array of objects | नहीं | कालक्रम के अनुसार घटनाएँ: भेजने के प्रयास, डिलीवरी कॉलबैक, कोड जाँच, और अंतिम स्थिति घटना। हर घटना `{ type, timestamp, details, fee }` है। घटना के प्रकार `PhoneEventChoices` से आते हैं। | `[…]` |
| `matches` | array of objects | नहीं | सत्रों के बीच फ़ोन नंबर मिलान। हर आइटम: `{ session_id, session_number, vendor_data, verification_date, phone_number, status, is_blocklisted, api_service, source }`। `source` `session` या `list_entry` होता है। | `[]` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_phone"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |
| `phone_intelligence` | object | हाँ | फ़ोन इंटेलिजेंस संकेत। केवल तब मौजूद, जब इस नंबर के लिए इंटेलिजेंस ऐड-ऑन चला हो। | |
| `phone_social` | object | हाँ | नंबर का सोशल फ़ुटप्रिंट। केवल तब मौजूद, जब सोशल फ़ुटप्रिंट ऐड-ऑन चला हो। | |

```json theme={null}
{
  "status": "Approved",
  "phone_number_prefix": "+34",
  "phone_number": "612345678",
  "full_number": "+34612345678",
  "country_code": "ES",
  "country_name": "Spain",
  "carrier": { "name": "Movistar", "type": "mobile" },
  "is_disposable": false,
  "is_virtual": false,
  "verification_method": "whatsapp",
  "verification_attempts": 1,
  "verified_at": "2026-05-17T10:14:02Z",
  "lifecycle": [
    {
      "type": "PHONE_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2026-05-17T10:13:51Z",
      "details": { "status": "Success", "reason": null, "channel": "whatsapp", "actual_channel": "whatsapp" },
      "fee": 0.02
    },
    {
      "type": "PHONE_DELIVERY_DELIVERED",
      "timestamp": "2026-05-17T10:13:52Z",
      "details": { "channel": "whatsapp", "status": "delivered" },
      "fee": 0
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2026-05-17T10:14:02Z",
      "details": { "code_tried": "482917", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "PHONE_VERIFICATION_APPROVED",
      "timestamp": "2026-05-17T10:14:02Z",
      "details": null,
      "fee": 0
    }
  ],
  "matches": [],
  "node_id": "first_phone",
  "warnings": []
}
```

### ईमेल सत्यापन

हर ईमेल-सत्यापन प्रयास के लिए लौटाया जाता है। यह KYC और KYB दोनों सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `email_verifications[]` के रूप में दिखता है। स्रोत: `email_verification/serializers/email.py:149-164` (`EmailV3Serializer`, जो `email_verification/serializers/email.py:38-146` पर `EmailV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | नल योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [Status enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `email` | string | नहीं | सबमिट किया गया ईमेल पता। | `"maria.garcia@example.com"` |
| `is_breached` | boolean | नहीं | `true`, जब ईमेल किसी ज्ञात डेटा उल्लंघन में दिखे। | `false` |
| `breaches` | array of objects | नहीं | `is_breached` `true` होने पर हर उल्लंघन का विवरण: `{ name, domain, logo_path, breach_date, description, is_verified, data_classes, breach_emails_count }`। | `[]` |
| `is_disposable` | boolean | नहीं | `true`, जब ईमेल किसी डिस्पोज़ेबल-मेल प्रदाता का हो। | `false` |
| `is_undeliverable` | boolean | नहीं | `true`, जब SMTP डिलीवरी जाँच दिखाए कि इनबॉक्स मेल स्वीकार नहीं करता। | `false` |
| `verification_attempts` | integer | नहीं | OTP जाँच के कुल प्रयास। | `1` |
| `verified_at` | string (ISO 8601) | हाँ | वह समय-चिह्न जब OTP सफलतापूर्वक दर्ज किया गया। | `"2026-05-17T10:15:22Z"` |
| `lifecycle` | array of objects | नहीं | कालक्रम के अनुसार घटनाएँ: भेजने के प्रयास, कोड जाँच, और अंतिम स्थिति घटना। हर घटना `{ type, timestamp, details, fee }` है। घटना के प्रकार `EmailEventChoices` से आते हैं। | `[…]` |
| `matches` | array of objects | नहीं | सत्रों के बीच ईमेल मिलान। हर आइटम: `{ session_id, session_number, vendor_data, verification_date, email, status, is_blocklisted, api_service, source }`। `source` `session` या `list_entry` होता है। | `[]` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_email"` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |
| `email_intelligence` | object | हाँ | ईमेल इंटेलिजेंस संकेत। केवल तब मौजूद, जब इस पते के लिए इंटेलिजेंस ऐड-ऑन चला हो। | |
| `email_social` | object | हाँ | पते का सोशल फ़ुटप्रिंट। केवल तब मौजूद, जब सोशल फ़ुटप्रिंट ऐड-ऑन चला हो। | |

```json theme={null}
{
  "status": "Approved",
  "email": "maria.garcia@example.com",
  "is_breached": false,
  "breaches": [],
  "is_disposable": false,
  "is_undeliverable": false,
  "verification_attempts": 1,
  "verified_at": "2026-05-17T10:15:22Z",
  "lifecycle": [
    {
      "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2026-05-17T10:15:11Z",
      "details": { "status": "Success", "reason": null },
      "fee": 0.02
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2026-05-17T10:15:22Z",
      "details": { "code_tried": "739204", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "EMAIL_VERIFICATION_APPROVED",
      "timestamp": "2026-05-17T10:15:22Z",
      "details": null,
      "fee": 0
    }
  ],
  "matches": [],
  "node_id": "first_email",
  "warnings": []
}
```

### डेटाबेस सत्यापन

हर डेटाबेस लुकअप के लिए लौटाया जाता है, जो उपयोगकर्ता के सबमिट किए गए डेटा पर चलाया गया हो। `GET /v3/session/{sessionId}/decision/` में `database_validations[]` के रूप में दिखता है। स्रोत: `database_validation/serializers/database_validation.py:21-142` (`DatabaseValidationV3Serializer`, जो `DatabaseValidationV2Serializer` को विस्तारित करता है)।

| फ़ील्ड | प्रकार | नल हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `issuing_state` | स्ट्रिंग (ISO 3166-1 alpha-3) | हाँ | वह देश जिसकी रजिस्ट्री से पूछताछ की गई थी। | `"ESP"` |
| `validation_type` | स्ट्रिंग (enum) | नहीं | परिणाम की पुष्टि किस तरह हुई: `one_by_one` (एक ही सेवा का परिणाम), `two_by_two` (दो या अधिक अलग-अलग सेवाओं ने पहचान संख्या का स्वतंत्र रूप से पूर्ण मिलान किया), या `not_enabled` (वैलिडेटर छोड़ा गया या किसी प्रदाता ने जवाब नहीं दिया; निश्चित `no_match` फिर भी `one_by_one` देता है)। कभी `null` नहीं होता। स्रोत: `DatabaseValidationChoices` (`common/config/choices.py:1097-1100`)। | `"one_by_one"` |
| `screened_data` | ऑब्जेक्ट | नहीं | रजिस्ट्री को भेजा गया डेटा। फ़ाइल फ़ील्ड (`selfie`, `cnh_qr_code_image`, `document_image`) पढ़ने के समय प्रीसाइन्ड किए जाते हैं। | `{ "document_number": "99999999R", "date_of_birth": "1990-05-12" }` |
| `validations` | ऑब्जेक्ट की सरणी | नहीं | हर उस कैटलॉग सेवा के लिए एक प्रविष्टि जिसने मिलान उत्पन्न किया। हर प्रविष्टि में `service_id`, `service_name`, `validation` (प्रदाता का निर्णय ऑब्जेक्ट), `outcome_code`, `outcome_detail`, और `source_data` (साफ़ की गई नागरिक प्रोफ़ाइल: `full_name`, `gender`, `date_of_birth`, `photo` (प्रीसाइन्ड URL), `signature` (प्रीसाइन्ड URL), …) शामिल हो सकते हैं। | `[…]` |
| `errors` | ऑब्जेक्ट की सरणी | हाँ | लुकअप विफल होने पर हर सेवा की त्रुटियाँ; खाली होने पर कुंजी पूरी तरह छोड़ दी जाती है। हर प्रविष्टि अपस्ट्रीम सेवा का त्रुटि ऑब्जेक्ट है, साथ में वह `service_id` जिसने इसे उत्पन्न किया। | `[]` |
| `match_type` | स्ट्रिंग (enum) | हाँ | क्वेरी की गई सेवाओं का समग्र मिलान निर्णय: `full_match`, `partial_match`, या `no_match` (`DatabaseValidationMatchTypeChoices`, `common/config/choices.py:1103-1106`)। मूल्यांकन होने तक `null` रहता है। | `"full_match"` |
| `status` | स्ट्रिंग | नहीं | देखें [Status enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `node_id` | स्ट्रिंग \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_db_validation"` |
| `warnings` | ऐरे | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "issuing_state": "ESP",
  "validation_type": "one_by_one",
  "screened_data": {
    "document_number": "99999999R",
    "date_of_birth": "1990-05-12",
    "first_name": "María",
    "last_name": "García López"
  },
  "validations": [
    {
      "service_id": "esp_dni",
      "service_name": "Spain - DNI/NIE verification",
      "validation": { "is_valid": true, "match_score": 100 },
      "outcome_code": "MATCH",
      "outcome_detail": "All identifiers match the registry record.",
      "source_data": {
        "full_name": "María García López",
        "gender": "F",
        "date_of_birth": "1990-05-12",
        "photo": "https://<media-host>/.../registry_photo.jpg?signature=...",
        "signature": null
      }
    }
  ],
  "match_type": "full_match",
  "status": "Approved",
  "node_id": "first_db_validation",
  "warnings": []
}
```

### प्रश्नावली प्रतिक्रिया

हर प्रश्नावली सबमिशन के लिए लौटाई जाती है। KYC और KYB दोनों सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `questionnaire_responses[]` के रूप में दिखती है। स्रोत: `questionnaires/serializers/questionnaire.py:591-597` (`QuestionnaireResponseV3Serializer`, जो `questionnaires/serializers/questionnaire.py:520-588` पर `QuestionnaireResponseSerializer` का विस्तार है)।

| फ़ील्ड | प्रकार | नल हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `questionnaire_id` | स्ट्रिंग (UUID) | नहीं | उत्तर दिए गए प्रश्नावली संस्करण का पहचानकर्ता। | `"6a0f1c2c-…"` |
| `title` | स्ट्रिंग | नहीं | प्रश्नावली का नाम, जैसा कंसोल में सेट किया गया। | `"Customer risk profile"` |
| `description` | स्ट्रिंग | हाँ | प्रश्नावली का विवरण। | `"Short risk-profile questions."` |
| `languages` | स्ट्रिंग की सरणी | नहीं | वे भाषा कोड जिनमें प्रश्नावली प्रकाशित है। | `["en", "es"]` |
| `default_language` | स्ट्रिंग | नहीं | बैकअप भाषा कोड। | `"en"` |
| `is_active` | बूलियन | नहीं | क्या यह प्रश्नावली संस्करण सक्रिय है। | `true` |
| `is_simple_questionnaire` | बूलियन | नहीं | `true` तब जब प्रश्नावली में कोई शाखा नहीं है (सपाट सूची)। | `true` |
| `questionnaire_group_id` | स्ट्रिंग (UUID) | नहीं | एक ही प्रश्नावली के सभी संस्करणों में साझा पहचानकर्ता। | `"a7c2c2c2-…"` |
| `version` | पूर्णांक | नहीं | सक्रिय टेम्पलेट का संस्करण संख्या। | `3` |
| `status` | स्ट्रिंग | नहीं | इनमें से एक: `Approved`, `In Review`, `Not Finished` (प्रश्नावली-स्तर की अस्वीकृति `In Review` में मैप होती है)। | `"Approved"` |
| `published_at` | स्ट्रिंग (ISO 8601) | हाँ | टेम्पलेट कब प्रकाशित हुआ था। | `"2026-01-12T11:00:00Z"` |
| `sections` | ऑब्जेक्ट की सरणी | नहीं | ग्राफ़ ट्रैवर्सल और दृश्यता फ़िल्टर लागू करने के बाद क्रमबद्ध अनुभाग। हर अनुभाग `{ title, description, items[] }` है (title और description शुरुआती `SECTION_HEADER` से आते हैं, जो पहले से अनुवादित हैं)। हर आइटम एक फ़ॉर्म तत्व है (`uuid`, `value` (नोड पहचानकर्ता), `element_type`, `is_required`, `title`, `description`, `placeholder`, `choices`, `max_files`, `required_if`, `repeatable_config`, साथ में `answer` फ़ील्ड, जो उत्तर न दिए जाने पर `null` होता है और `HEADING`/`PARAGRAPH`/`SEPARATOR` लेआउट आइटम पर छोड़ दिया जाता है)। फ़ाइल उत्तरों में `{ files: [<presigned URL>, …] }` होता है। | `[…]` |
| `node_id` | स्ट्रिंग \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_questionnaire"` |

```json theme={null}
{
  "questionnaire_id": "6a0f1c2c-3b7d-4d2c-9eb6-fdc6c7c92ef9",
  "title": "Customer risk profile",
  "description": "Short risk-profile questions.",
  "languages": ["en", "es"],
  "default_language": "en",
  "is_active": true,
  "is_simple_questionnaire": true,
  "questionnaire_group_id": "a7c2c2c2-1111-4d2c-9eb6-fdc6c7c92ef9",
  "version": 3,
  "status": "Approved",
  "published_at": "2026-01-12T11:00:00Z",
  "sections": [
    {
      "title": "Source of funds",
      "description": null,
      "items": [
        {
          "uuid": "4f1d5e2c-aaaa-4d2c-9eb6-fdc6c7c92ef9",
          "value": "q_source_of_funds",
          "element_type": "SINGLE_CHOICE",
          "is_required": true,
          "title": "What is your main source of funds?",
          "description": null,
          "placeholder": null,
          "choices": [
            { "label": "Salary", "value": "salary" },
            { "label": "Business income", "value": "business" },
            { "label": "Investments", "value": "investments" }
          ],
          "max_files": 1,
          "required_if": null,
          "repeatable_config": null,
          "answer": { "value": "salary" }
        }
      ]
    }
  ],
  "node_id": "first_questionnaire"
}
```

### ई-हस्ताक्षर

हर [ई-हस्ताक्षर](https://docs.didit.me/hi/core-technology/electronic-signature/overview.md) चरण के हर हस्ताक्षरकर्ता के लिए लौटाया जाता है। KYC और KYB दोनों सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `signatures[]` के रूप में दिखता है, और केवल तब जब वर्कफ़्लो में यह चरण हो। अन्य रिपोर्ट ऑब्जेक्ट के विपरीत, इसका `status` हस्ताक्षर का चरण है और परिणाम `verdict` में है। इसके `warnings[]` आइटम `{ code, node_id }` हैं, न कि [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)।

| फ़ील्ड | प्रकार | नल हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `id` | स्ट्रिंग (UUID) | नहीं | हस्ताक्षरकर्ता का हस्ताक्षर। इसे evidence और validate रूट्स के लिए `signature_id` के रूप में उपयोग करें। | `"0e6c2a8e-…"` |
| `node_id` | स्ट्रिंग | नहीं | वर्कफ़्लो नोड पहचानकर्ता। | `"feature_signature"` |
| `status` | स्ट्रिंग | नहीं | हस्ताक्षर चरण: `intro`, `review`, `code`, `signing`, `signed` या `declined`। केवल `signed` का अर्थ है कि दस्तावेज़ पर हस्ताक्षर हो चुके हैं। | `"signed"` |
| `verdict` | स्ट्रिंग | नहीं | `Not Finished`, `Approved`, `In Review` या `Declined`। | `"Approved"` |
| `level` | स्ट्रिंग | नहीं | `simple` (डिफ़ॉल्ट) या `aes`। `qes` एक ऐड-ऑन है जो अभी उपलब्ध नहीं है। | `"aes"` |
| `format` | स्ट्रिंग | नहीं | सरल हस्ताक्षर के लिए `pdf`, उन्नत (AES) के लिए `pades`। | `"pades"` |
| `profile` | स्ट्रिंग | हाँ | उन्नत (AES) के हस्ताक्षरित होने पर `PAdES-B-LT`, अन्यथा null। | `"PAdES-B-LT"` |
| `signer` | ऑब्जेक्ट | नहीं | `{ name, capacity, company, role, roles, identity_session_id }`। `capacity` `self` (KYC) या `company` (KYB) होता है। | `{ "name": "Jane Doe", "capacity": "self", … }` |
| `identity_used` | ऑब्जेक्ट | नहीं | `{ session_id, kyc_id, verified, expected_name }`: वह सत्यापित पहचान जिस पर हस्ताक्षर निर्भर है। बिना सत्यापित पहचान वाले सरल हस्ताक्षर के लिए खाली। | `{ "verified": true, … }` |
| `certificate` | ऑब्जेक्ट | हाँ | `{ issuer, issued_to, serial, valid_from, valid_until }`। हस्ताक्षर होने तक `null`, और सरल हस्ताक्षर के लिए हमेशा `null`। | `{ "serial": "5A3F9C21", … }` |
| `confirmation` | ऑब्जेक्ट | नहीं | `{ channel, destination, confirmed_at, attempts }`। `destination` मास्क किया गया होता है; `attempts` दर्ज किए गए कोड की गिनती है, जिसमें सही कोड भी शामिल है। सरल हस्ताक्षर में कोई कोड नहीं होता, इसलिए `channel` और `destination` `null` होते हैं। | `{ "channel": "email", … }` |
| `timestamp` | ऑब्जेक्ट | हाँ | `{ time, qualified, valid }`। AES के लिए `qualified` हमेशा `false` होता है। हस्ताक्षर होने तक `null` रहता है, और सरल हस्ताक्षर के लिए हमेशा `null` होता है। | `{ "qualified": false, … }` |
| `documents` | ऑब्जेक्ट की ऐरे | नहीं | `{ id, uuid, title, file_name, pages, size_bytes, sha256_original, sha256_signed, status, opened_at, read_at, read_to_end, consented_at, consent, signed_file, mode, source_format, conversion, fields }`। `status` `signed`, `declined`, `not_signed` या `not_reached` होता है। `mode` `fields` या `read_and_agree` होता है। `source_format` `pdf` या `docx` होता है; `conversion` मूल Word फ़ाइल का विवरण देता है, या PDF के लिए `null` होता है। | `[…]` |
| `documents[].fields` | ऑब्जेक्ट की ऐरे | नहीं | दस्तावेज़ के हर फ़ील्ड के लिए `{ key, type, role, label, page, x, y, width, height, required, value, display_value, value_source, filled_at, image_url, value_unavailable_reason }`। `value` एक स्ट्रिंग है, चेकबॉक्स के लिए बूलियन है, या लागू किए गए हस्ताक्षर या आद्याक्षर के लिए `true` है। जिस दस्तावेज़ में फ़ील्ड नहीं हैं, उसके लिए खाली। | `[…]` |
| `adopted_signature` | ऑब्जेक्ट | हाँ | `{ method, font, adopted_at }`: वे हस्ताक्षर और आद्याक्षर जिन्हें हस्ताक्षरकर्ता ने अपनाया। `method` `typed` या `drawn` होता है; `font` टाइप किए गए हस्ताक्षर की हस्तलेखन शैली है। अपनाए जाने तक `null`। | `{ "method": "drawn", … }` |
| `electronic_signature_consent_at` | स्ट्रिंग (ISO 8601) | हाँ | जब हस्ताक्षरकर्ता ने दस्तावेज़ों पर इलेक्ट्रॉनिक रूप से हस्ताक्षर करने की सहमति दी। जब किसी दस्तावेज़ में फ़ील्ड हों, तब सेट होता है। | `"2026-11-03T10:41:40Z"` |
| `evidence_file` | स्ट्रिंग | हाँ | हस्ताक्षर होने के बाद साक्ष्य PDF का पथ। | `"/v3/session/…/evidence/?signature_id=…"` |
| `warnings` | ऑब्जेक्ट की ऐरे | नहीं | `{ code, node_id }`, जिसमें `code` इनमें से एक होता है: `SIGNATURE_DECLINED`, `SIGNATURE_OTP_FAILED`, `SIGNATURE_NAME_MISMATCH`, `SIGNATURE_IDENTITY_NOT_VERIFIED`, `SIGNATURE_DOCUMENT_CHANGED`। | `[]` |
| `validation` | ऑब्जेक्ट | हाँ | `{ valid, checked_at, documents[] }`: हस्ताक्षरित दस्तावेज़ों की अंतिम क्रिप्टोग्राफ़िक जाँच। हस्ताक्षर होने तक `null`। जब हस्ताक्षर की परिणति की पुष्टि नहीं हो सकी, तब `{ valid: null, reason: "signature_provider_outcome_unknown", checked_at }`। | `{ "valid": true, … }` |
| `declined_at` | स्ट्रिंग (ISO 8601) | हाँ | जब हस्ताक्षरकर्ता ने अस्वीकार किया। | `null` |
| `declined_action` | स्ट्रिंग | नहीं | चरण की `signature_declined_action` सेटिंग। | `"REVIEW"` |
| `signed_at` | स्ट्रिंग (ISO 8601) | हाँ | जब दस्तावेज़ों पर हस्ताक्षर हुए। | `"2026-11-03T10:42:24Z"` |
| `expires_at` | स्ट्रिंग (ISO 8601) | नहीं | जब हस्ताक्षर लिंक काम करना बंद करता है। | `"2026-11-10T10:30:00Z"` |
| `email_sent_at` | स्ट्रिंग (ISO 8601) | हाँ | जब हस्ताक्षरकर्ता को हस्ताक्षरित प्रति ईमेल की गई। | `"2026-11-03T10:42:30Z"` |
| `email_unavailable_reason` | स्ट्रिंग | हाँ | जब प्रति का अनुरोध किया गया था, तब कोई प्रति ईमेल क्यों नहीं की गई। | `null` |
| `ip_address` | स्ट्रिंग | हाँ | जब हस्ताक्षरकर्ता ने अपना कोड माँगा, तब उसका IP पता। | `"203.0.113.10"` |
| `place` | स्ट्रिंग | हाँ | एकत्र नहीं किया जाता: हमेशा `null`। | `null` |
| `place_unavailable_reason` | स्ट्रिंग | हाँ | `not_collected`। | `"not_collected"` |

[ई-हस्ताक्षर रिपोर्ट](https://docs.didit.me/hi/core-technology/electronic-signature/report-electronic-signature.md) में पूरा उदाहरण और हर नेस्टेड फ़ील्ड दिया गया है।

### आयु अनुमान

यह स्टैंडअलोन आयु अनुमान API (`POST /v3/age-estimation/`) से लौटाया जाता है। रिस्पॉन्स में [`Liveness check`](#लाइवनेस-जाँच) के आकार का एक उपसमुच्चय `age_estimation` एनवेलप के अंतर्गत होता है: `status`, `method`, `score`, `age_estimation`, `warnings`। साथ ही केवल स्टैंडअलोन के लिए `user_image` फ़ेस-डिटेक्शन ब्लॉक भी होता है। इसमें **नहीं** होते `reference_image`, `video_url`, `matches`, `face_quality` या `face_luminance`। वर्कफ़्लो सत्रों में अलग ऐरे नहीं होती: अनुमानित आयु `GET /v3/session/{sessionId}/decision/` में `liveness_checks[].age_estimation` के रूप में दिखती है। स्रोत: `apis/serializers/age_estimation.py:50-55` (`AgeEstimationResponseSerializer`), एनवेलप `apis/views/age_estimation.py:138-174` में बनाया जाता है।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `request_id` | स्ट्रिंग (UUID) | नहीं | जब `save_api_request=true` हो (डिफ़ॉल्ट), तब सहेजा गया सत्र ID; अन्यथा एक अस्थायी सहसंबंध UUID। | `"3b1f1e2c-…"` |
| `age_estimation` | ऑब्जेक्ट | नहीं | परिणाम एनवेलप: `status` (`Approved` / `Declined`), `method` (हमेशा `PASSIVE`), `score` (लाइवनेस 0-100, null हो सकता है), `age_estimation` (सबसे बड़े चेहरे की अनुमानित आयु वर्षों में, null हो सकती है), `user_image` (`entities[]` जिसमें हर चेहरे के लिए `age`, `bbox` `[x_min, y_min, x_max, y_max]`, `confidence`, `gender`; साथ में `best_angle`), `warnings[]`। | `{ … }` |
| `vendor_data` | स्ट्रिंग | हाँ | अनुरोध से लौटाया गया `vendor_data`। | `null` |
| `metadata` | ऑब्जेक्ट | हाँ | अनुरोध से लौटाया गया `metadata`। | `null` |
| `created_at` | स्ट्रिंग (ISO 8601) | नहीं | सर्वर-साइड अनुरोध टाइमस्टैम्प। | `"2026-05-17T10:22:13.512941+00:00"` |

```json theme={null}
{
  "request_id": "3b1f1e2c-7777-4d2c-9eb6-fdc6c7c92ef9",
  "age_estimation": {
    "status": "Approved",
    "method": "PASSIVE",
    "score": 94.10,
    "age_estimation": 28.7,
    "user_image": {
      "entities": [
        { "age": 28.7, "bbox": [40, 40, 100, 100], "confidence": 0.72, "gender": "male" }
      ],
      "best_angle": 0
    },
    "warnings": []
  },
  "vendor_data": null,
  "metadata": null,
  "created_at": "2026-05-17T10:22:13.512941+00:00"
}
```

### बायोमेट्रिक प्रमाणीकरण

बायोमेट्रिक प्रमाणीकरण वही लाइवनेस डिटेक्शन + चेहरा मिलान पाइपलाइन चलाता है जो स्टैंडर्ड KYC में इस्तेमाल होती है, लेकिन इसे कैप्चर किए गए चेहरे की तुलना हाल ही में OCR किए गए दस्तावेज़ के पोर्ट्रेट के बजाय मौजूदा उपयोगकर्ता की संदर्भ छवि से करने के लिए कॉन्फ़िगर किया गया है। इसके लिए कोई अलग सीरियलाइज़र नहीं है: `GET /v3/session/{sessionId}/decision/` `liveness_checks[]` और `face_matches[]` के अंतर्गत स्टैंडर्ड [लाइवनेस जाँच](#लाइवनेस-जाँच) और [चेहरा मिलान](#चेहरा-मिलान) ऑब्जेक्ट लौटाता है। सत्र का वर्कफ़्लो `workflow_type = "biometric_authentication"` (`WorkflowTypeChoices`, `common/config/choices.py:636`) पर कॉन्फ़िगर किया जाता है।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `liveness_checks` | [लाइवनेस जाँच](#लाइवनेस-जाँच) की ऐरे | नहीं | प्रमाणीकरण प्रयास के लिए लाइवनेस परिणाम। | `[ { "status": "Approved", … } ]` |
| `face_matches` | [चेहरा मिलान](#चेहरा-मिलान) की ऐरे | नहीं | दर्ज संदर्भ के विरुद्ध मिलान परिणाम। `source_image_session_id` सत्र के अपने `session_id` पर सेट होता है: संदर्भ चेहरा (दिया गया `portrait_image`, या `portrait_image` छोड़े जाने पर `vendor_data` के ज़रिए पुनः उपयोग किया गया संग्रहीत चेहरा) प्रमाणीकरण सत्र के अंतर्गत ही दर्ज होता है (`face/views/face.py:656-659`)। | `[ { "status": "Approved", "source_image_session_id": "…", … } ]` |
| `status` | string | नहीं | ऊपरी स्तर की सत्र स्थिति (देखें [स्टेटस enum](#स्टेटस-एनम-संदर्भ))। | `"Approved"` |

```json theme={null}
{
  "session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
  "status": "Approved",
  "liveness_checks": [
    {
      "status": "Approved",
      "method": "PASSIVE",
      "score": 95.10,
      "reference_image": "https://<media-host>/.../reference.jpg?signature=...",
      "video_url": null,
      "age_estimation": null,
      "matches": [],
      "face_quality": 91.20,
      "face_luminance": 53.10,
      "node_id": "biometric_auth_liveness",
      "warnings": []
    }
  ],
  "face_matches": [
    {
      "status": "Approved",
      "score": 98.42,
      "source_image_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
      "source_image": "https://<media-host>/.../source.jpg?signature=...",
      "target_image": "https://<media-host>/.../target.jpg?signature=...",
      "node_id": "biometric_auth_face_match",
      "warnings": []
    }
  ]
}
```

### KYB रजिस्ट्री

KYB वर्कफ़्लो में रजिस्ट्री से पुष्ट हर कंपनी के लिए लौटाया जाता है। व्यावसायिक सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `registry_checks[]` के रूप में दिखता है। स्रोत: `kyb/serializers/kyb.py:939-964` (`RegistryCheckV3Serializer`)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्टेटस enum](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_registry"` |
| `data_resolved` | boolean | नहीं | `true` जब रजिस्ट्री से डेटा लाना पूरा हो चुका हो (या `is_from_registry` `false` हो, यानी डेटा मैन्युअल रूप से दर्ज किया गया हो)। | `true` |
| `company` | object | नहीं | पूरा कंपनी payload: नीचे [कंपनी ऑब्जेक्ट](#कंपनी-ऑब्जेक्ट) देखें। | `{ … }` |
| `ownership_structure` | object | हाँ | रजिस्ट्री द्वारा सिद्ध कैप टेबल: `shareholders[]` और `beneficial_owners[]`, हर स्वामी के रजिस्ट्री पहचान, हिस्सेदारी और मानक `shareholding` के साथ। | `{ "shareholders": [...], "beneficial_owners": [] }` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

#### कंपनी ऑब्जेक्ट

स्रोत: `kyb/serializers/kyb.py:220-321` (`KYBCompanyResponseSerializer`)।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण |
| - | - | - | - |
| `uuid` | string (UUID) | नहीं | आंतरिक कंपनी पहचानकर्ता। |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता। |
| `status` | string | नहीं | फ़ीचर स्थिति (`FeatureStatusChoices`)। |
| `registry_status` | string | हाँ | रजिस्ट्री से मिली कंपनी की स्थिति (`active`, `dissolved`, …)। |
| `data_resolved` | boolean | नहीं | मूल ऑब्जेक्ट में दी गई परिभाषा के समान। |
| `company_name` | string | हाँ | पंजीकृत कंपनी का नाम। |
| `registration_number` | string | हाँ | रजिस्ट्री पहचानकर्ता। |
| `country_code` | string (ISO 3166-1 alpha-2) | हाँ | निगमन देश। |
| `region` | string | हाँ | जहाँ लागू हो, ISO 3166-2 उप-क्षेत्र (जैसे `US-CA`)। |
| `company_type` | string | हाँ | कानूनी स्वरूप (`LLC`, `SL`, …)। |
| `incorporation_date` | string (YYYY-MM-DD) | हाँ | निगमन की तिथि। |
| `registered_address` | string | हाँ | पंजीकृत कानूनी पता। |
| `tax_number` | string | हाँ | कर / VAT पहचानकर्ता। |
| `risk_level` | string | हाँ | प्रदाता द्वारा दी गई जोखिम रेटिंग। |
| `verification_status` | string | हाँ | आंतरिक सत्यापन स्थिति enum। |
| `is_from_registry` | boolean | नहीं | `true` जब डेटा रजिस्ट्री से लिया गया हो (मैन्युअल प्रविष्टि के विपरीत)। |
| `fetch_status` | string | हाँ | `pending`, `resolved`, `failed`। |
| `alternative_names` | string | हाँ | कॉमा से अलग किए गए वैकल्पिक व्यापारिक नाम। |
| `nature_of_business` | string | हाँ | व्यावसायिक गतिविधि का मुक्त-पाठ विवरण। |
| `registered_capital` | string | हाँ | पंजीकृत पूँजी, मानव-पठनीय स्ट्रिंग के रूप में। |
| `registered_capital_amount` | string (decimal) | हाँ | विश्लेषित पंजीकृत पूँजी राशि। |
| `registered_capital_currency` | string (ISO 4217) | हाँ | मुद्रा कोड। |
| `website` | string (URL) | हाँ | कंपनी की वेबसाइट। |
| `email` | string | हाँ | सार्वजनिक संपर्क ईमेल। |
| `phone` | string | हाँ | सार्वजनिक संपर्क फ़ोन। |
| `legal_entity_identifier` | string | हाँ | उपलब्ध होने पर LEI। |
| `location_of_registration` | string | हाँ | रजिस्ट्री कार्यालय / क्षेत्र। |
| `vat_number` | string | हाँ | कंपनी के लिए जमा किया गया VAT नंबर। |
| `vat_validation_status` | string | नहीं | VAT नंबर के सत्यापन का परिणाम, या कोई न होने पर `tax_number` का: `valid`, `invalid`, `format_valid`, `invalid_format`, `could_not_validate`, या `not_applicable`। देखें [VAT और कर पहचान सत्यापन](https://docs.didit.me/hi/business-verification/company-data.md#vat-और-टैक्स-id-सत्यापन)। |
| `vat_validated_number` | string | हाँ | जाँची गई संख्या, जैसी स्रोत उसे जानता है। |
| `vat_validation_source` | string | हाँ | वह स्रोत जिसने स्थिति तय की: `eu_vies`, `pl_vat_white_list`, `no_brreg`, `ch_uid_register`, `br_receita_federal`, `co_rues`, `cr_hacienda`, `ec_sri`, `py_dnit`, या `format_rules`। |
| `vat_validated_name` | string | हाँ | स्रोत के साथ पंजीकृत नाम (यदि स्रोत कोई नाम नहीं बताता तो खाली)। |
| `vat_validated_address` | string | हाँ | स्रोत के साथ पंजीकृत पता (प्रकट न किए जाने पर खाली)। |
| `vat_checked_at` | string (ISO 8601) | हाँ | जाँच का टाइमस्टैम्प; कोई जाँच न चलने पर `null`। |
| `financial_summary` | object | हाँ | रजिस्ट्री द्वारा दिए जाने पर नवीनतम वित्तीय मुख्य बिंदुओं का स्नैपशॉट। |
| `officers` | array of objects | नहीं | B2C-सुरक्षित अधिकारी सूची: `{ uuid, name, designation, role, nationality, is_active, kyc_status, kyc_session_url }`। |
| `beneficial_owners` | array of objects | नहीं | B2C-सुरक्षित UBO सूची: `{ uuid, name, first_name, last_name, entity_type, roles, ownership_min_shares, ownership_max_shares, is_active, kyc_status, kyc_session_url, effective_ownership_percent }`। |
| `addresses` | array of objects | हाँ | रजिस्ट्री से हर पते का विवरण। |
| `industries` | array of objects | हाँ | SIC/NAICS-शैली के वर्गीकरण। |
| `accounts` | array of objects | हाँ | दाखिल किए गए खातों का मेटाडेटा। |
| `registry_data` | object | हाँ | Didit का सामान्यीकृत रजिस्ट्री विवरण (स्वामित्व परिणाम, कंसोल सुधार, ऐसे रजिस्ट्री तथ्य जिनका अपना फ़ील्ड नहीं है)। यह स्थिर अनुबंध नहीं है। |
| `user_provided_data` | object | हाँ | उपयोगकर्ता द्वारा संपादित फ़ील्ड का स्नैपशॉट। |
| `confirmed_by_user_at` | string (ISO 8601) | हाँ | वह टाइमस्टैम्प जब उपयोगकर्ता ने निकाले गए डेटा की पुष्टि की। |
| `last_console_edit_at` | string (ISO 8601) | हाँ | अंतिम कंसोल संपादन का टाइमस्टैम्प। |
| `is_editable` | boolean | नहीं | `true` जब तक रजिस्ट्री-स्रोत डेटा को अंतिम उपयोगकर्ता द्वारा संपादित किया जा सकता है। |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_registry",
  "data_resolved": true,
  "company": {
    "uuid": "b1f1e2c2-9999-4d2c-9eb6-fdc6c7c92ef9",
    "node_id": "first_registry",
    "status": "Approved",
    "registry_status": "active",
    "data_resolved": true,
    "company_name": "Sante Clinics SL",
    "registration_number": "B12345678",
    "country_code": "ES",
    "region": null,
    "company_type": "SL",
    "incorporation_date": "2018-03-22",
    "registered_address": "Calle Mayor 1, 28001 Madrid, Spain",
    "tax_number": "B12345678",
    "risk_level": "low",
    "verification_status": "verified",
    "is_from_registry": true,
    "fetch_status": "resolved",
    "alternative_names": "Sante Clinics",
    "nature_of_business": "Medical clinic operations",
    "registered_capital": "EUR 50,000",
    "registered_capital_amount": "50000.00",
    "registered_capital_currency": "EUR",
    "website": "https://santeclinics.com",
    "email": "info@santeclinics.com",
    "phone": "+34911223344",
    "legal_entity_identifier": null,
    "location_of_registration": "Registro Mercantil de Madrid",
    "vat_number": "ESB12345678",
    "vat_validation_status": "valid",
    "vat_validated_name": "SANTE CLINICS SL",
    "vat_validated_address": "CALLE MAYOR 1, 28001 MADRID",
    "vat_checked_at": "2026-05-17T10:11:05Z",
    "financial_summary": null,
    "officers": [
      {
        "uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "designation": "Administrador único",
        "role": "Director",
        "nationality": "ESP",
        "is_active": true,
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…"
      }
    ],
    "beneficial_owners": [
      {
        "uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "first_name": "María",
        "last_name": "García López",
        "entity_type": "person",
        "roles": ["UBO"],
        "ownership_min_shares": "75.00",
        "ownership_max_shares": "75.00",
        "is_active": true,
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "effective_ownership_percent": 75.0
      }
    ],
    "addresses": [],
    "industries": [],
    "accounts": [],
    "registry_data": {},
    "user_provided_data": {},
    "confirmed_by_user_at": "2026-05-17T10:11:02Z",
    "last_console_edit_at": null,
    "is_editable": false
  },
  "ownership_structure": null,
  "warnings": []
}
```

### KYB दस्तावेज़

हर उस नोड के लिए लौटाया जाता है जो KYB सहायक दस्तावेज़ एकत्र करता है। व्यावसायिक सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में `document_verifications[]` के रूप में दिखता है: हर `node_id` के लिए एक प्रविष्टि, जिसमें `items[]` में अपलोड किया गया हर दस्तावेज़ सूचीबद्ध होता है। स्रोत: `kyb/serializers/kyb.py:1053-1068` (`DocumentVerificationV3Serializer`); हर आइटम `kyb/serializers/kyb.py:811-851` (`KYBDocumentResponseSerializer`) का अनुसरण करता है।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | इस नोड के दस्तावेज़ों की कुल स्थिति: `Approved` तभी जब हर पाइपलाइन दस्तावेज़ स्वीकृत हो; `Declined` यदि कोई भी दस्तावेज़ अस्वीकृत हो; अन्यथा `In Review`; लंबित होने पर `Not Finished`। देखें [स्टेटस एनम](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_kyb_documents"` |
| `items` | [KYB दस्तावेज़ आइटम ऑब्जेक्ट](#kyb-दस्तावेज़-आइटम-ऑब्जेक्ट) की ऐरे | नहीं | हर अपलोड किए गए या माँगे गए दस्तावेज़ के लिए एक प्रविष्टि। | `[…]` |
| `groups` | object | नहीं | प्रति-दस्तावेज़-समूह गिनती: `{ <group_name>: { total, approved, pending, declined, in_review, other, missing } }`। | `{ "incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 } }` |
| `required_groups` | स्ट्रिंग की ऐरे | नहीं | वर्कफ़्लो कॉन्फ़िगरेशन द्वारा आवश्यक दस्तावेज़ समूह। | `["incorporation_certificate", "shareholder_register"]` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

#### KYB दस्तावेज़ आइटम ऑब्जेक्ट

| फ़ील्ड | प्रकार | नल योग्य | विवरण |
| - | - | - | - |
| `uuid` | string (UUID) | नहीं | आंतरिक दस्तावेज़ पहचानकर्ता। |
| `document_type` | string | हाँ | उच्च-स्तरीय समूह (`incorporation_certificate`, `shareholder_register`, …)। |
| `document_subtype` | string | हाँ | प्रदाता-विशिष्ट उप-प्रकार। |
| `document_group` | string | हाँ | `document_type` का प्रतिबिंब (स्पष्टता के लिए उपनाम रखा गया)। |
| `file_url` | string (URL) | हाँ | साफ़ की गई फ़ाइल का प्रीसाइंड URL। |
| `original_filename` | string | हाँ | अपलोड के समय की फ़ाइल का नाम। |
| `file_size` | integer | हाँ | फ़ाइल का आकार बाइट में। |
| `status` | string | नहीं | प्रति-दस्तावेज़ स्थिति (`FeatureStatusChoices`)। |
| `created_at` | string (ISO 8601) | नहीं | अपलोड का टाइमस्टैम्प। |
| `cross_check_result` | object | हाँ | रजिस्ट्री / अन्य दस्तावेज़ों के साथ क्रॉस-चेक का निर्णय। |
| `document_metadata` | object | हाँ | POA के `document_metadata` जैसा ही फ़िल्टर किया गया मेटाडेटा ढाँचा। |
| `description` | string | हाँ | समीक्षक या सिस्टम द्वारा दिया गया विवरण। |
| `is_requested` | boolean | नहीं | जब वर्कफ़्लो को यह दस्तावेज़ अपेक्षित था तो `true`। |
| `ocr_data` | object | हाँ | उपलब्ध होने पर OCR से निकाले गए फ़ील्ड। |
| `is_console_upload` | boolean | नहीं | जब दस्तावेज़ कंसोल समीक्षक द्वारा अपलोड किया गया हो तो `true` (कुल निर्णय से बाहर रखा जाता है)। |
| `is_confirmed` | boolean | नहीं | जब समीक्षक ने दस्तावेज़ की स्पष्ट पुष्टि की हो तो `true`। |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_kyb_documents",
  "items": [
    {
      "uuid": "e1f1e2c2-cccc-4d2c-9eb6-fdc6c7c92ef9",
      "document_type": "incorporation_certificate",
      "document_subtype": "registro_mercantil_extract",
      "document_group": "incorporation_certificate",
      "file_url": "https://<media-host>/.../incorporation.pdf?signature=...",
      "original_filename": "incorporation_certificate.pdf",
      "file_size": 256412,
      "status": "Approved",
      "created_at": "2026-05-17T10:08:00Z",
      "cross_check_result": { "matches_registry_name": true, "matches_registration_number": true },
      "document_metadata": {
        "file_size": 256412,
        "content_type": "application/pdf",
        "is_signed": true,
        "is_tampered": false
      },
      "description": null,
      "is_requested": true,
      "ocr_data": { "company_name": "Sante Clinics SL", "registration_number": "B12345678" },
      "is_console_upload": false,
      "is_confirmed": true
    }
  ],
  "groups": {
    "incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 }
  },
  "required_groups": ["incorporation_certificate", "shareholder_register"],
  "warnings": []
}
```

### KYB प्रमुख व्यक्ति

यह KYB वर्कफ़्लो के हर प्रमुख व्यक्ति नोड के लिए लौटाया जाता है। व्यावसायिक सत्रों के लिए `GET /v3/session/{sessionId}/decision/` में यह `key_people_checks[]` के रूप में दिखता है। स्रोत: `kyb/serializers/kyb.py:967-1050` (`KeyPeopleCheckV3Serializer`)।

| फ़ील्ड | प्रकार | नल योग्य | विवरण | उदाहरण |
| - | - | - | - | - |
| `status` | string | नहीं | देखें [स्टेटस एनम](#स्टेटस-एनम-संदर्भ)। | `"Approved"` |
| `node_id` | string \| null | हाँ | वर्कफ़्लो नोड पहचानकर्ता (V3)। | `"first_key_people"` |
| `registry` | object | नहीं | रजिस्ट्री से निकाला गया `{ officers[], beneficial_owners[] }`। अधिकारी `KYBPersonResponseSerializer` (`kyb/serializers/kyb.py:533-645`) का पालन करते हैं; वास्तविक स्वामी `KYBBeneficialOwnerResponseSerializer` (`kyb/serializers/kyb.py:648-788`) का पालन करते हैं, जिसमें `date_of_birth`, `country_of_birth`, `email`, `company_name`, `registration_number`, `entity_type`, `roles`, `ownership_min_shares`, `ownership_max_shares`, `child_beneficial_owners`, `effective_ownership_percent` जुड़े होते हैं। दोनों में प्रति-पक्ष AML + KYC एनरिचमेंट शामिल है (`aml_status`, `kyc_status`, `kyc_session_url`, `kyc_session_id`, `verification_workflow_type`, `verification_workflow_id`, `verification_workflow_label`, `verification_workflow_features`, `didit_internal_id`, `kyc_document_type`, `kyc_nationality`, `kyc_liveness_passed`, `kyc_verified_at`, `kyc_aml_categories`, `kyc_notification_sent_at`)। | `{ "officers": [...], "beneficial_owners": [...] }` |
| `submitted` | object | नहीं | `{ parties[] }` - व्यवसाय द्वारा प्रमुख-व्यक्ति फ़्लो के माध्यम से पुष्टि या सबमिट की गई प्रविष्टियाँ (`source=USER` वाली `BusinessParty` पंक्तियाँ)। हर पक्ष `BusinessPartySubmissionResponseSerializer` (`kyb/serializers/party.py:146-194`) का पालन करता है: `uuid`, `entity_type`, `source`, `name`, `first_name`, `last_name`, `company_name`, `registration_number`, `email`, `nationality`, `phone_number`, `date_of_birth`, `position`, `custom_fields`, `is_active`, `is_skipped`, `requires_verification`, `roles[]` (`{ role, ownership_percent, voting_percent }`), `kyc_session_id`, `kyc_session_status`, `kyc_session_url`, `kyc_session_deleted`, `kyb_sub_session_id`, `kyb_sub_session_status`, `kyb_sub_session_url`, `kyb_sub_session_deleted`, `verification_workflow_type`, `verification_workflow_id`, `verification_workflow_label`, `verification_workflow_features`, `didit_internal_id`। `kyc_session_deleted` / `kyb_sub_session_deleted` उस चाइल्ड सत्र को चिह्नित करते हैं जो हटा दिया गया है: उसकी स्थिति जैसी थी वैसी ही जमी रहती है, संबंधित `*_session_url` `null` लौटता है क्योंकि लिंक अब हल नहीं होता, और वह पक्ष मूल सत्र को रोकना बंद कर देता है (इसके बजाय जाँच `In Review` पर आ जाती है)। इसे साफ़ करने के लिए [`PATCH /v3/session/{id}/kyb/parties/{party_uuid}/`](https://docs.didit.me/hi/sessions-api/update-data#प्रमुख-व्यक्ति-पक्ष-को-छोड़ें) का उपयोग करें। | `{ "parties": [...] }` |
| `ubo_kyc_summary` | object | हाँ | लिंक्ड KYC वाले सक्रिय UBO की गिनती: `{ total, approved, flagged, pending }`। जब किसी भी सक्रिय UBO से KYC लिंक न हो तो `null`। | `{ "total": 2, "approved": 2, "flagged": 0, "pending": 0 }` |
| `warnings` | array | नहीं | देखें [चेतावनी ऑब्जेक्ट](#चेतावनी-ऑब्जेक्ट)। | `[]` |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_key_people",
  "registry": {
    "officers": [
      {
        "uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "designation": "Administrador único",
        "role": "Director",
        "nationality": "ESP",
        "appointment_date": "2018-03-22",
        "termination_date": null,
        "is_active": true,
        "address": "Calle Mayor 1, 28001 Madrid",
        "aml_status": "Approved",
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
        "verification_workflow_type": "kyc",
        "verification_workflow_id": "11111111-1111-1111-1111-111111111111",
        "verification_workflow_label": "KYB officer KYC",
        "verification_workflow_features": [
          { "feature": "ID_VERIFICATION", "status": "Approved" },
          { "feature": "LIVENESS", "status": "Approved" },
          { "feature": "FACE_MATCH", "status": "Approved" }
        ],
        "didit_internal_id": "user-12345",
        "kyc_document_type": "Passport",
        "kyc_nationality": "ESP",
        "kyc_liveness_passed": true,
        "kyc_verified_at": "2026-05-17T10:10:11Z",
        "kyc_aml_categories": [],
        "kyc_notification_sent_at": "2026-05-15T08:00:00Z"
      }
    ],
    "beneficial_owners": []
  },
  "submitted": {
    "parties": [
      {
        "uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
        "entity_type": "person",
        "source": "USER",
        "name": "María García López",
        "first_name": "María",
        "last_name": "García López",
        "company_name": null,
        "registration_number": null,
        "email": "maria.garcia@example.com",
        "nationality": "ESP",
        "phone_number": null,
        "date_of_birth": "1990-05-12",
        "position": "Administrador único",
        "custom_fields": {},
        "is_active": true,
        "is_skipped": false,
        "requires_verification": true,
        "roles": [
          { "role": "UBO", "ownership_percent": 75.0, "voting_percent": null }
        ],
        "kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
        "kyc_session_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "kyb_sub_session_id": null,
        "kyb_sub_session_status": null,
        "kyb_sub_session_url": null,
        "verification_workflow_type": "kyc",
        "verification_workflow_id": "11111111-1111-1111-1111-111111111111",
        "verification_workflow_label": "KYB officer KYC",
        "verification_workflow_features": [
          { "feature": "ID_VERIFICATION", "status": "Approved" },
          { "feature": "LIVENESS", "status": "Approved" }
        ],
        "didit_internal_id": "user-12345"
      }
    ]
  },
  "ubo_kyc_summary": { "total": 1, "approved": 1, "flagged": 0, "pending": 0 },
  "warnings": []
}
```

## निर्णय-स्तर के फ़ील्ड

ये कुंजियाँ `GET /v3/session/{sessionId}/decision/` पर सुविधा ऐरे के साथ और webhook के `decision` के भीतर होती हैं।

| फ़ील्ड | प्रकार | शून्य हो सकता है | विवरण |
| - | - | - | - |
| `status_override` | object | हाँ | किसी समीक्षक द्वारा `status` को हाथ से सेट किए जाने के बाद `{ overridden_at, automatic_status }`; जब स्थिति स्वचालित होती है तब `null`। |
| `decision_trace` | object | नहीं | स्थिति तक कैसे पहुँचा गया: `status`, `decided_by` (`manual`, `automatic` या `investigator`), `decided_at`, `automatic_status`, `terminal_node_id`, `actor`, `warning_counts` और `status_warnings`। |
| `linked_records` | object | हाँ | `same_face`, `earlier_verifications` और `networks` के सारांश; दिखाने के लिए कुछ न हो तो `null`। |
| `biometric_retention` | object | नहीं | `{ jurisdictions, deletes_at }`। `deletes_at` वह तिथि है जब सत्र का लाइव बायोमेट्रिक डेटा हटाया जाता है, और जब अभी कोई तिथि लागू नहीं होती तब `null`। |
| `database_validation_not_performed_reason` | object | हाँ | `{ code, message }`, जो बताता है कि कॉन्फ़िगर किए गए डेटाबेस सत्यापन से कोई परिणाम क्यों नहीं मिला। |
| `assignee`, `waiting_since`, `sla_due_at` | object, datetime | हाँ | वह Console समीक्षक जिसके पास सत्र है और उसकी समीक्षा घड़ी; सत्र `In Review` न हो तब तक घड़ी `null` रहती है। |
| `shared_from_session`, `shared_from_session_number` | UUID, integer | हाँ | आयातित सत्र का स्रोत सत्र। |
| `sandbox_scenario` | string | हाँ | वह परिदृश्य जिसके साथ सैंडबॉक्स सत्र बनाया गया था। |
| `fraud_check` | object | हाँ | Fraud Check API का परिणाम; अन्य हर सत्र के लिए `null`। |
| `full_session_video`, `full_session_video_recorded_at` | URL, datetime | हाँ | रिकॉर्डिंग और वह कब बनाई गई। ये केवल तब लौटाए जाते हैं जब आपका संगठन पूरे सत्र का वीडियो रिकॉर्ड करता है। |

इन्हें कैसे पढ़ें, इसके लिए [सत्र प्राप्त करें](https://docs.didit.me/hi/sessions-api/retrieve-session.md#स्थिति-निर्णय-ट्रेस-और-समीक्षा-फ़ील्ड) देखें।

## बायोमेट्रिक सहमति

हर उपयोगकर्ता सत्यापन निर्णय और सत्र webhook में एक ही `biometric_consent` ऑब्जेक्ट होता है (ऐरे नहीं). इसमें लिखा होता है कि सत्र को स्पष्ट बायोमेट्रिक सहमति चाहिए थी या नहीं, क्यों चाहिए थी, और उत्तर का साक्ष्य क्या है. जब सत्र का मूल्यांकन कभी नहीं हुआ, उदाहरण के लिए चेहरा कैप्चर के बिना वर्कफ़्लो, तब यह `null` होता है. स्रोत: `BiometricConsentDecisionSerializer` (`sessions/serializers/biometric_consent.py`). किन परिस्थितियों में यह चरण दिखता है और हर मामले का क्या अर्थ है, यह [बायोमेट्रिक सहमति](https://docs.didit.me/hi/getting-started/biometric-consent.md) में समझाया गया है.

जिन फ़ील्ड का कोई दर्ज मान नहीं है, वे `null` होते हैं, कभी खाली स्ट्रिंग नहीं.

| फ़ील्ड | प्रकार | विवरण |
| - | - | - |
| `required` | boolean | क्या सत्र को स्पष्ट बायोमेट्रिक सहमति लेनी होगी. यह कभी वापस `false` पर नहीं जाता. |
| `trigger` | string (enum) \| null | सहमति क्यों आवश्यक है, या यह कैसे पूरी हुई: `declared_state`, `ip_state`, `ip_unknown`, `document_issuer`, `forced` (एप्लिकेशन का मोड Always है), `customer_collected` (आपने सत्र बनाते समय `biometric_consent` भेजा था). सहमति आवश्यक न होने पर `null`. |
| `status` | string (enum) | `not_required`, `pending` (आवश्यक, दी नहीं गई), `given`, `declined` (अस्वीकृति दर्ज की गई; आज कोई Didit स्क्रीन अस्वीकृति का विकल्प नहीं देती). |
| `given_at` | string (ISO 8601) \| null | सहमति कब दी गई. `customer_collected` के लिए, वह `given_at` जो आपने भेजा. |
| `declined_at` | string (ISO 8601) \| null | अस्वीकृति कब दर्ज की गई. |
| `text_version` | string \| null | उस सहमति पाठ का संस्करण आईडी जिसका व्यक्ति ने उत्तर दिया, या जो आपने भेजा. |
| `text_hash` | string \| null | दिखाए गए सटीक पाठ का SHA-256 (hex), उसी भाषा में जिसमें वह दिखाया गया. |
| `locale` | string \| null | वह भाषा जिसमें पाठ दिखाया गया. |
| `policy_url` | string \| null | वह बायोमेट्रिक डेटा नीति जिससे चरण ने लिंक किया था. |
| `step` | string \| null | व्यक्ति के उत्तर देते समय सत्र जिस वर्कफ़्लो चरण पर था (उदाहरण के लिए `LIVENESS`). |
| `node_id` | string \| null | उत्तर के समय सत्र जिस वर्कफ़्लो ग्राफ़ नोड पर था. |
| `ip_address` | string \| null | वह IP पता जहाँ से उत्तर आया. |
| `ip_country_code` | string \| null | उत्तर के IP पते का ISO 3166-1 alpha-2 देश. |
| `ip_state` | string \| null | उत्तर के IP पते का ISO 3166-2 उपविभाग (उदाहरण के लिए `US-IL`). |
| `ip_city` | string \| null | उत्तर के IP का शहर. |
| `user_agent` | string \| null | उत्तर के अनुरोध का उपयोगकर्ता एजेंट. |
| `detected_ip_address` | string \| null | व्यक्ति का वह IP पता जिससे आवश्यकता अंतिम बार जाँची गई थी. जब व्यक्ति ने किसी दूसरे डिवाइस पर उत्तर दिया हो, तब यह `ip_address` से अलग हो सकता है. |
| `detected_country_code` | string \| null | पहचाने गए IP का ISO 3166-1 alpha-2 देश. |
| `detected_state` | string \| null | पहचाने गए IP का ISO 3166-2 उपविभाग. |
| `detected_city` | string \| null | पहचाने गए IP का शहर. |
| `declared_state` | string \| null | ISO 3166-2 उपविभाग जो आपने घोषित किया: `user_state`, या `expected_details` में US पते का राज्य. |
| `document_state` | string \| null | ISO 3166-2 उपविभाग जिसने पहचान दस्तावेज़ जारी किया, जो ID कैप्चर के समय पढ़ा गया. |
| `jurisdictions` | array of string | US राज्य (USPS कोड, उदाहरण के लिए `IL`) जिनके बायोमेट्रिक कानून के दायरे में व्यक्ति आता है. जब साक्ष्य व्यक्ति को US में रखता है पर राज्य ज्ञात नहीं है, तब `US`. कोई लागू न हो तो खाली. |
| `retention_months` | integer \| null | `jurisdictions` में से सबसे छोटी बायोमेट्रिक प्रतिधारण सीमा, महीनों में. कोई लागू न हो तो `null`. |
| `reason` | string (enum) \| null | `BIOMETRIC_CONSENT_UNSUPPORTED_SDK`: सहमति आवश्यक थी और 4.10.0 से कम संस्करण का नेटिव SDK, या ऐसा SDK जिसने अपना संस्करण नहीं बताया, चरण के बिना चेहरा कैप्चर कर चुका था; `status` `pending` रहता है, या `given` हो जाता है यदि व्यक्ति ने बाद में होस्टेड फ़्लो में सहमति दे दी. `BIOMETRIC_CONSENT_DECLINED`: अस्वीकृति दर्ज की गई (यह SDK कारण की जगह लेता है). अन्यथा `null`, और जब सत्र को सहमति की आवश्यकता नहीं थी, तब हमेशा `null`. |
| `decline_reason` | string \| null | `BIOMETRIC_CONSENT_DECLINED`, जब दर्ज की गई अस्वीकृति ने सत्र समाप्त किया. अन्यथा `null`. |
| `face_data_deleted_at` | string (ISO 8601) \| null | अस्वीकृति के कारण सत्र की चेहरे की छवियाँ, वीडियो और बायोमेट्रिक टेम्पलेट कब हटाए गए. केवल तब जब अस्वीकृति दर्ज हुई हो, अन्यथा `null`. |

Illinois का एक सत्र, जिसे 4.10.0 से कम संस्करण के नेटिव SDK ने चलाया और जिसने चरण के बिना सेल्फ़ी कैप्चर की:

```json theme={null}
{
  "required": true,
  "trigger": "ip_state",
  "status": "pending",
  "given_at": null,
  "declined_at": null,
  "text_version": null,
  "text_hash": null,
  "locale": null,
  "policy_url": null,
  "step": null,
  "node_id": null,
  "ip_address": null,
  "ip_country_code": null,
  "ip_state": null,
  "ip_city": null,
  "user_agent": null,
  "detected_ip_address": "203.0.113.42",
  "detected_country_code": "US",
  "detected_state": "US-IL",
  "detected_city": "Chicago",
  "declared_state": null,
  "document_state": null,
  "jurisdictions": ["IL"],
  "retention_months": 36,
  "reason": "BIOMETRIC_CONSENT_UNSUPPORTED_SDK",
  "decline_reason": null,
  "face_data_deleted_at": null
}
```

एक व्यक्ति जिसका VPN एग्ज़िट US के बाहर था, और जिसने होस्टेड फ़्लो में सहमति दी:

```json theme={null}
{
  "required": true,
  "trigger": "declared_state",
  "status": "given",
  "given_at": "2026-10-13T18:31:07.412000Z",
  "declined_at": null,
  "text_version": "bio-consent-2026-10-12",
  "text_hash": "9b2f0c5e4d8a7f61c3e2b4a5d6f7081923a4b5c6d7e8f90a1b2c3d4e5f6a7b8c",
  "locale": "en",
  "policy_url": "https://didit.me/legal/biometric-data-policy",
  "step": "LIVENESS",
  "node_id": "feature_liveness_1",
  "ip_address": "198.51.100.23",
  "ip_country_code": "ES",
  "ip_state": "ES-M",
  "ip_city": "Madrid",
  "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1",
  "detected_ip_address": "198.51.100.23",
  "detected_country_code": "ES",
  "detected_state": "ES-M",
  "detected_city": "Madrid",
  "declared_state": null,
  "document_state": null,
  "jurisdictions": ["IL"],
  "retention_months": 36,
  "reason": null,
  "decline_reason": null,
  "face_data_deleted_at": null
}
```

## स्टेटस एनम संदर्भ

दो संबंधित मान-समूह `status` फ़ील्ड का नाम साझा करते हैं। इस पेज की हर सुविधा-स्तरीय रिपोर्ट ऑब्जेक्ट सुविधा-स्तरीय एनम इस्तेमाल करता है, जबकि पैरेंट सत्र का टॉप-लेवल `status` व्यापक सत्र एनम इस्तेमाल करता है।

### सुविधा-स्तरीय स्टेटस

हर रिपोर्ट ऑब्जेक्ट के `status` फ़ील्ड में इस्तेमाल होता है। स्रोत: `common/config/choices.py:343-348` (`FeatureStatusChoices`)।

| मान | अर्थ |
| - | - |
| `Not Finished` | सुविधा का प्रावधान किया जा चुका है, लेकिन उपयोगकर्ता ने इसे अभी पूरा नहीं किया है। |
| `Approved` | सुविधा ने सभी जाँचें पास कर ली हैं। |
| `Declined` | सुविधा कम से कम एक कठोर जाँच में विफल रही (देखें `warnings[]` जिसमें `log_type: "error"` हो)। |
| `In Review` | सुविधा ने सॉफ़्ट-फ़ेल संकेत दिए हैं और वह मैन्युअल समीक्षा का इंतज़ार कर रही है (देखें `warnings[]` जिसमें `log_type: "warning"` हो)। |
| `Resub Requested` | समीक्षक ने उपयोगकर्ता से इस सुविधा को फिर से जमा करने का अनुरोध किया है। |

फ़ोन, ईमेल और पहचान सत्यापन में, जब उनका चरण समय-सीमा समाप्त होने पर टाइम आउट हो जाए, तो अतिरिक्त रूप से `Expired` भी दिखाई दे सकता है (`PhoneStatusChoices` `common/config/choices.py:377-382` पर, और `EmailStatusChoices` `common/config/choices.py:434-439` पर)।

### सत्र-स्तरीय स्टेटस

पैरेंट सत्र के टॉप-लेवल `status` में इस्तेमाल होता है। स्रोत: `common/config/choices.py:106-117` (`StatusChoices`)।

| मान | अर्थ |
| - | - |
| `Not Started` | सत्र बनाया जा चुका है, लेकिन उपयोगकर्ता ने इसे शुरू नहीं किया है। |
| `In Progress` | उपयोगकर्ता ने फ़्लो शुरू कर दिया है; परिणाम अभी अंतिम नहीं हुआ है। |
| `Approved` | सत्र ने सभी जाँचें पास कर ली हैं। |
| `Declined` | सत्र कम से कम एक कठोर जाँच में विफल रहा। |
| `In Review` | सत्र मैन्युअल समीक्षा का इंतज़ार कर रहा है। |
| `Expired` | सत्र पूरा होने से पहले उसकी समय-सीमा समाप्त हो गई। |
| `Abandoned` | उपयोगकर्ता पूरा किए बिना फ़्लो से बाहर चला गया। |
| `Kyc Expired` | KYC की वैधता अवधि समाप्त हो गई (पुनः सत्यापन फ़्लो में इस्तेमाल होता है)। |
| `Resubmitted` | उपयोगकर्ता ने पिछली अस्वीकृति के बाद फिर से जमा किया; यह सत्र किसी नए सत्र द्वारा प्रतिस्थापित हो गया है। |
| `Awaiting User` | सिस्टम उपयोगकर्ता की ओर से किसी कार्रवाई का इंतज़ार कर रहा है (जैसे OTP दर्ज करना)। |

> [!TIP]
>
> अंतिम सत्र मान `Approved`, `Declined`, `In Review`, `Expired`, `Kyc Expired` और `Abandoned` हैं। कोई सत्र तब भी अपने समग्र निर्णय तक पहुँच सकता है जब कोई व्यक्तिगत सुविधा `In Review` पर बनी रहे।


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