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

# वर्कफ़्लो बनाने का API: KYC फ़्लो बनाएँ

> Didit का सत्यापन वर्कफ़्लो API से बनाएँ, जिसमें क्रमबद्ध सुविधाएँ हों: KYC, KYB, AML, बायोमेट्रिक्स। प्रति कॉल भुगतान, कोई अनुबंध नहीं।



वर्कफ़्लो बनाने का API प्रॉम्प्ट
        प्रॉम्प्ट को क्लिपबोर्ड पर कॉपी करें



      
      

\<pre>

\`Create a simple Didit workflow through the Management API.

Endpoint:
POST https://verification.didit.me/v3/workflows/

Authentication:
Use the x-api-key header with my Didit API key.

Requirements:
\- Use the simple v3 API shape with features.
\- Send features in the exact order users should complete them.
\- Do not send workflow_graph, branches, actions, webhooks, or conditional logic.
\- Didit will convert the features array into a linear node-based workflow and add the final status step automatically.
\- Use uppercase feature values such as OCR, LIVENESS, FACE_MATCH, AML, QUESTIONNAIRE, EMAIL_VERIFICATION, PHONE_VERIFICATION, or PROOF_OF_ADDRESS.
\- Configure each feature with the fields from /management-api/workflows/feature-configs.
\- For an OCR feature, omit config.documents_allowed or send an empty object to allow every supported document type. Send config.documents_allowed only to restrict the allowed documents.
\- Put dependency features first. For example, put OCR before FACE_MATCH, NFC, DATABASE_VALIDATION, or user AML checks that depend on document data.
\- For a QUESTIONNAIRE feature, first create the questionnaire with POST /v3/questionnaires/ and use the returned questionnaire_id as config.questionnaire_uuid.
\- Store the workflow uuid returned by the response. Use it as workflow_id when creating sessions and as settings_uuid when updating this workflow.

Example KYC request body:
\{
"workflow_label": "Standard KYC",
"features": [
\{
  "feature": "OCR",
  "config": {
    "documents_allowed": {
      "USA": {
        "DL": {
          "enabled": 1,
          "sides": 2
        }
      }
    },
    "duplicated_user_action": "REVIEW"
  }
},
\{
  "feature": "LIVENESS",
  "config": {
    "face_liveness_method": "PASSIVE"
  }
},
\{
  "feature": "FACE_MATCH"
}
]
}

Example questionnaire workflow body:
\{
"workflow_label": "Source of Funds",
"features": [
\{
  "feature": "QUESTIONNAIRE",
  "config": {
    "questionnaire_uuid": "11111111-2222-3333-4444-555555555555",
    "review_questionnaire_manually": true
  }
}
]
}

Build the API call, handle validation errors, and return the workflow uuid from the response.`

\</pre>



      
      

यहाँ पेस्ट करें

इस endpoint से आप नोड ग्राफ़ खुद बनाए बिना API के ज़रिए वर्कफ़्लो बना सकते हैं। `features` ऐरे भेजें, जिसमें सुविधाएँ उसी क्रम में हों जिसमें उपयोगकर्ता जाँच पूरी करें। Didit इसे अंदरूनी तौर पर नोड-आधारित वर्कफ़्लो में बदल देता है और अंतिम स्थिति चरण अपने-आप जोड़ देता है।यह `POST /v3/workflows/` endpoint केवल **सरल, रैखिक** वर्कफ़्लो बनाता है, यानी `features` की एक सपाट सूची। **ब्रांचिंग, शर्त-आधारित रूटिंग, Document AI, और अस्वीकृति/निर्णय नोड** के लिए नीचे वर्णित [नोड ग्राफ़ प्रारूप](#शाखाएँ-और-नोड-आधारित-वर्कफ़्लो-ग्राफ़) का उपयोग करें। यह कंसोल के विज़ुअल बिल्डर और [Didit MCP](https://docs.didit.me/hi/integration/mcp/overview.md) के वर्कफ़्लो टूल को संचालित करता है।हर सुविधा द्वारा स्वीकार किए गए `config` फ़ील्ड के लिए [वर्कफ़्लो सुविधा कॉन्फ़िग](https://docs.didit.me/hi/management-api/workflows/feature-configs.md) देखें।## बुनियादी KYC वर्कफ़्लो```json theme={null}
{
  "workflow_label": "Standard KYC",
  "features": [
    {
      "feature": "OCR",
      "config": {
        "documents_allowed": {
          "USA": {
            "DL": {
              "enabled": 1,
              "sides": 2
            }
          }
        },
        "duplicated_user_action": "REVIEW"
      }
    },
    {
      "feature": "LIVENESS",
      "config": {
        "face_liveness_method": "PASSIVE"
      }
    },
    {
      "feature": "FACE_MATCH"
    }
  ]
}
```## प्रश्नावली वर्कफ़्लोपहले `POST /v3/questionnaires/` से प्रश्नावली बनाएँ। फिर लौटाए गए `questionnaire_id` को `questionnaire_uuid` के रूप में उपयोग करें।```json theme={null}
{
  "workflow_label": "Source of Funds",
  "features": [
    {
      "feature": "QUESTIONNAIRE",
      "config": {
        "questionnaire_uuid": "11111111-2222-3333-4444-555555555555",
        "review_questionnaire_manually": true
      }
    }
  ]
}
```सुविधाओं का क्रम मायने रखता है। उदाहरण के लिए, `OCR` को `FACE_MATCH`, `NFC`, `DATABASE_VALIDATION` या उन उपयोगकर्ता AML जाँचों से पहले रखें जो दस्तावेज़ के डेटा पर निर्भर करती हैं।## सुविधा कॉन्फ़िग संदर्भहर `features[]` आइटम की संरचना इस प्रकार है:```json theme={null}
{
  "feature": "OCR",
  "label": "ID Verification",
  "config": {}
}
```सटीक `config` ऑब्जेक्ट सुविधा पर निर्भर करता है। पूरी फ़ील्ड सूची, डिफ़ॉल्ट, आवश्यक सेटिंग्स, मान सीमाएँ और उदाहरणों के लिए [वर्कफ़्लो सुविधा कॉन्फ़िग](https://docs.didit.me/hi/management-api/workflows/feature-configs.md) देखें।`OCR` के लिए `config.documents_allowed` छोड़ दें, `null` भेजें, या `{}` भेजें, ताकि हर समर्थित दस्तावेज़ प्रकार की अनुमति मिले। इसे केवल तब शामिल करें जब आप वर्कफ़्लो को कुछ विशेष देशों या दस्तावेज़ प्रकारों तक सीमित करना चाहते हों। `QUESTIONNAIRE` के लिए `config.questionnaire_uuid` आवश्यक है।## वैकल्पिक वर्कफ़्लो सेटिंग्सवर्कफ़्लो बनाते समय आप सत्र के व्यवहार को नियंत्रित करने के लिए इनमें से कोई भी शीर्ष-स्तरीय फ़ील्ड शामिल कर सकते हैं। ये सभी वैकल्पिक हैं, और छोड़ने पर वर्कफ़्लो के डिफ़ॉल्ट लागू होते हैं।| फ़ील्ड | प्रकार | विवरण |
| - | - | - |
| `is_white_label_enabled` | boolean | इस वर्कफ़्लो से बने सत्रों के लिए व्हाइट लेबल कस्टमाइज़ेशन सक्षम करें। डिफ़ॉल्ट `false`। |
| `is_desktop_allowed` | boolean | सत्यापन फ़्लो को डेस्कटॉप ब्राउज़र पर चलने दें। डिफ़ॉल्ट `false`। |
| `max_retry_attempts` | पूर्णांक (0–10) | अस्वीकृत सत्यापन के बाद अनुमत अधिकतम पुनः प्रयासों की संख्या। `0` पहली अस्वीकृति के बाद उपयोगकर्ता को ब्लॉक कर देता है। डिफ़ॉल्ट `3`। |
| `retry_window_days` | पूर्णांक (1–365) या `null` | पुनः प्रयासों की गिनती के लिए दिनों में चलती अवधि (`null` = सर्वकालिक सीमा)। डिफ़ॉल्ट `7`। |
| `session_expiration_time` | पूर्णांक (3600–2419200) | अधूरा सत्र समाप्त होने से पहले का समय, सेकंड में। न्यूनतम 1 घंटा, अधिकतम 4 सप्ताह। डिफ़ॉल्ट `604800` (7 दिन)। |
| `response_attributes` | ऑब्जेक्ट या `null` | हर सुविधा के लिए लौटाए जाने वाले फ़ील्ड सीमित करता है, उदाहरण के लिए `{"id_verifications": ["full_name", "document_number"], "face_matches": null}`। `null` या कुंजी न होने पर सभी फ़ील्ड लौटाए जाते हैं। खाली सूची केवल `status`, `warnings`, `node_id`, `is_nfc_skipped` और `skip_reason` लौटाती है और अन्य फ़ील्ड `null` लौटाए जाते हैं। |```json theme={null}
{
  "workflow_label": "Standard KYC",
  "is_white_label_enabled": true,
  "is_desktop_allowed": true,
  "max_retry_attempts": 5,
  "retry_window_days": 14,
  "session_expiration_time": 86400,
  "features": [
    { "feature": "OCR" },
    { "feature": "LIVENESS" },
    { "feature": "FACE_MATCH" }
  ]
}
```## शाखाएँ और नोड-आधारित वर्कफ़्लो (ग्राफ़)एक रैखिक `features` सूची "यदि X, तो Y" व्यक्त नहीं कर सकती। **सशर्त शाखाकरण** (किसी स्थिति पर अस्वीकार करना, निकाले गए फ़ील्ड के आधार पर रूट करना, किसी मिलान पर किसी चरण को शर्त से जोड़ना), एक **Document AI** अनुरोध चरण, या अंतिम **अस्वीकृति/निर्णय** नोड के लिए Didit वर्कफ़्लो **नोड ग्राफ़** का उपयोग करते हैं। यह वही संरचना है जो कंसोल का विज़ुअल बिल्डर बनाता है।> [!NOTE]
>
> ग्राफ़ वाला वर्कफ़्लो बनाने का सबसे सरल तरीका **[Didit MCP](https://docs.didit.me/hi/integration/mcp/overview.md)** है: किसी एजेंट से सादी भाषा में कहें ("पहचान सत्यापन के बाद, यदि पेशा ≈ 'Software Engineer' है, तो धन का प्रमाण वाला चरण जोड़ें") और वह आपके लिए ग्राफ़ बनाएगा, उसकी जाँच करेगा और उसे सहेजेगा। नीचे दी गई संरचना वही है जो ये टूल (और कंसोल) बनाते हैं।### ग्राफ़ की संरचनाएक ग्राफ़ `{ start_node, nodes }` होता है। `nodes` नोड id से नोड तक का मैप है। एजेज़ निहित होती हैं: हर नोड `next` (बिना शर्त) और/या `branches[].goto` (शर्तीय) के माध्यम से आगे की ओर इंगित करता है।| नोड प्रकार | संरचना |
| - | - |
| `feature` | `{ "node_type": "feature", "feature": "OCR", "config": {…}, "next": "<id>", "branches": [] }` |
| `branch` | `{ "node_type": "branch", "branches": [ { "id", "logic": "and"\|"or", "rules": [<rule>], "goto": "<id>" } ], "next": "<fallback id>" }` |
| `status` (अंतिम) | `{ "node_type": "status", "session_status": "Approved"\|"Declined"\|"In Review"\|"Determine" }` |
| `action` | `{ "node_type": "action", "actions": [ { "type": "add_tag"\|"add_review"\|… } ], "next": "<id>" }` |
| `webhook` | `{ "node_type": "webhook", "config": { "url", "method" }, "branches": [], "next": "<id>" }` |`start_node` को सुविधा नोड होना चाहिए। शाखाएँ क्रम से मूल्यांकित होती हैं, **पहला मिलान जीतता है**। खाली `rules: []` सभी स्थितियों को पकड़ने वाला "else" है, और उसे सूची के अंत में रखें। `session_status: "Determine"` संयुक्त सुविधा परिणामों से अपने आप निर्णय लेता है।> [!WARNING]
>
> **हर शाखा नोड में एक स्पष्ट else शाखा होनी चाहिए**: ऐसी शाखा जिसमें `rules: []` हो और जो उन सत्रों को रूट करे जो किसी भी शर्त से मेल नहीं खाते। शाखा नोड के `next` को fallback मानकर न चलें। अकेला `next` बिल्डर में एक अस्पष्ट एज के रूप में दिखता है और उसे छोड़ना आसान है। जब आप `next` वाला शाखा नोड भेजते हैं और उसमें else शाखा नहीं होती, तो API उस `next` को आपके लिए एक स्पष्ट else शाखा में **बदल देता है** (यानी `{ …, "branches": [<conditions>], "next": "liveness" }` को `branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]` के रूप में सहेजा जाता है)। else को स्वयं बनाएँ ताकि वह स्पष्ट रहे। यह रूपांतरण एक सुरक्षा जाल है, इसका विकल्प नहीं।### शाखा नियम और ऑपरेटरहर नियम एक **ऑपरेटर** के माध्यम से एक **फ़ील्ड** की तुलना एक **मान** से करता है:```json theme={null}
{ "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 }
```- **फ़ील्ड**: किसी सुविधा परिणाम का नाम (`kyc.status`, `aml.status`, `document_ai.status`, `face_match.score`, …) या निकाले गए मान का नाम (`kyc.full_name`, `kyc.age`, `kyc.nationality`, `kyc.extra_fields.profession`, Document AI का फ़ील्ड `document_ai.<key>`, `expected_details.*`)। कोई शाखा केवल उस फ़ील्ड को पढ़ सकती है जिसकी सुविधा उन सभी रास्तों पर चली हो जो उस शाखा तक पहुँचते हैं।
- **ऑपरेटर:** `equals`, `not_equals`, `greater_than(_or_equals)`, `less_than(_or_equals)`, `contains`, `not_contains`, `in`, `not_in`, `is_empty`, `is_not_empty`, `regex` और **`fuzzy_match`** (केवल स्ट्रिंग फ़ील्ड; इसके लिए 0 से 100 तक का `score` चाहिए, जो एक समानता सीमा है, उदाहरण के लिए, पेशा "Software Engineer" से ≥ 80% समान हो)।### जानें कि NFC क्यों नहीं चला, उसके आधार पर शाखाकरण`NFC` नोड के बाद, चिप न पढ़े जाने के कारण के आधार पर सत्रों को रूट करने के लिए `nfc.skip_reason` को `equals` या `in` के साथ उपयोग करें। इस फ़ील्ड के सात स्थिर मान हैं:- `USER_SKIPPED`
- `DOCUMENT_WITHOUT_CHIP`
- `CHIP_CERTIFICATE_UNAVAILABLE`
- `DEVICE_WITHOUT_NFC`
- `INTEGRATION_WITHOUT_NFC_ACCESS`
- `MRZ_KEY_UNAVAILABLE`
- `JPKI_UNAVAILABLE`हर मान का अर्थ जानने के लिए [NFC छोड़ने के कारण](https://docs.didit.me/hi/core-technology/nfc-verification/warnings-nfc-verification.md#स्किप-के-कारण) देखें। जब NFC सफल होता है, तो `nfc.skip_reason` `null` होता है, इसलिए छोड़ने के किसी कारण के लिए न तो `equals` नियम और न ही `in` नियम मेल खाता है।यह फ़ील्ड गेट द्वारा छोड़े गए NFC नोड्स के लिए भी रिज़ॉल्व होता है। इसमें वे मामले शामिल हैं जहाँ कोई NFC रिपोर्ट या चेतावनी मौजूद नहीं है, और वे मामले भी जहाँ `allow_nfc_skip` `false` है, लेकिन दस्तावेज़ या डिवाइस का गेट NFC को चलने नहीं देता। इसलिए आप इन सत्रों को `nfc_verifications[]` की किसी प्रविष्टि पर निर्भर हुए बिना रूट कर सकते हैं।> [!NOTE]
>
> जो सत्र NFC क्षमता के तीन-स्थितीय होने से पहले सहेजे गए थे, उनमें `has_device_nfc_support: false` हो सकता है। इसलिए कोई पुराना वेब सत्र `INTEGRATION_WITHOUT_NFC_ACCESS` के बजाय `DEVICE_WITHOUT_NFC` के रूप में रिज़ॉल्व हो सकता है।यह ग्राफ़ उपयोगकर्ता द्वारा छोड़ने के लिए `equals`, गेट या क्षमता के कारण छोड़ने के लिए `in`, और सफल NFC के लिए एक स्पष्ट else शाखा उपयोग करता है। शाखा `NFC` नोड के बाद आती है, और हर गंतव्य एक अंतिम नोड की ओर आगे इंगित करता है:```json theme={null}
{
  "start_node": "ocr",
  "nodes": {
    "ocr": {
      "node_type": "feature",
      "feature": "OCR",
      "next": "nfc"
    },
    "nfc": {
      "node_type": "feature",
      "feature": "NFC",
      "config": { "allow_nfc_skip": false },
      "next": "route_nfc"
    },
    "route_nfc": {
      "node_type": "branch",
      "branches": [
        {
          "id": "user_skipped",
          "logic": "and",
          "rules": [
            { "field": "nfc.skip_reason", "operator": "equals", "value": "USER_SKIPPED" }
          ],
          "goto": "manual_review"
        },
        {
          "id": "nfc_unavailable",
          "logic": "and",
          "rules": [
            {
              "field": "nfc.skip_reason",
              "operator": "in",
              "value": [
                "DOCUMENT_WITHOUT_CHIP",
                "CHIP_CERTIFICATE_UNAVAILABLE",
                "DEVICE_WITHOUT_NFC",
                "INTEGRATION_WITHOUT_NFC_ACCESS",
                "MRZ_KEY_UNAVAILABLE",
                "JPKI_UNAVAILABLE"
              ]
            }
          ],
          "goto": "manual_review"
        },
        {
          "id": "else",
          "logic": "and",
          "rules": [],
          "goto": "approved"
        }
      ]
    },
    "manual_review": { "node_type": "status", "session_status": "In Review" },
    "approved": { "node_type": "status", "session_status": "Approved" }
  }
}
```"NFC किसी ज्ञात कारण से नहीं किया गया" को व्यक्त करने के लिए `in` के साथ **सभी सात** मान उपयोग करें। सफल NFC (`nfc.skip_reason: null`) के लिए एक स्पष्ट else शाखा रखें, और किसी भी भविष्य के ऐसे मान के लिए भी जिसे आपका ग्राफ़ अभी नहीं पहचानता।### Document AI (उदाहरण के लिए, धन का प्रमाण)एक `DOCUMENT_AI` सुविधा नोड एक या अधिक दस्तावेज़ों का अनुरोध करता है और नामित फ़ील्ड निकालता है:```json theme={null}
{
  "node_type": "feature",
  "feature": "DOCUMENT_AI",
  "label": "Proof of Funds",
  "config": {
    "document_ai_documents": [
      {
        "document_key": "proof_of_funds",
        "title": "Proof of Funds",
        "description": "Upload a recent bank statement.",
        "fields": [
          {
            "key": "account_holder",
            "name": "Account holder",
            "instruction": "The full name of the account holder as printed on the statement.",
            "type": "text",
            "required": true,
            "is_full_name": true
          },
          {
            "key": "closing_balance",
            "name": "Closing balance",
            "instruction": "The closing balance amount.",
            "type": "number",
            "required": true
          }
        ]
      }
    ],
    "document_ai_missing_required_fields_action": "REVIEW",
    "document_ai_name_mismatch_action": "REVIEW"
  },
  "next": "final_decision"
}
```हर कॉन्फ़िगर किया गया फ़ील्ड एक शाखा-योग्य मान `document_ai.<key>` बन जाता है, और इस चरण का परिणाम `document_ai.status` है।दस्तावेज़ धारक का पूरा नाम जिस फ़ील्ड में हो, उस पर `"is_full_name": true` सेट करें। उसका निकाला गया मान सत्यापित पहचान के पूरे नाम (OCR या पहचान सत्यापन का नाम, या सत्र के अपेक्षित विवरण) से तुलना किया जाता है। `document_ai_name_mismatch_action` तय करता है कि जब नाम-मिलान स्कोर `document_ai_name_match_score_threshold` से कम हो, तब क्या होगा। यह चिह्न **वैकल्पिक** है: किसी दस्तावेज़ में कोई फ़ील्ड चिह्नित न किया जाना संभव है, और **प्रति दस्तावेज़ अधिकतम एक फ़ील्ड** यह चिह्न रख सकता है। Document AI के हर कॉन्फ़िगरेशन फ़ील्ड के लिए [वर्कफ़्लो फ़ीचर कॉन्फ़िग → Document AI](https://docs.didit.me/hi/management-api/workflows/feature-configs.md#document-ai) देखें।### endpoint और ड्राफ़्ट का जीवनचक्रग्राफ़ का संपादन हर एप्लिकेशन के लिए होता है और इसके लिए कंसोल/प्रबंधन endpoint का उपयोग होता है (उपयोगकर्ता Bearer + `read:workflows`/`write:workflows`)। ग्राफ़ केवल **ड्राफ़्ट** संस्करण पर संपादित किया जा सकता है, इसलिए जीवनचक्र है **ड्राफ़्ट बनाएँ → ग्राफ़ सेट करें → प्रकाशित करें**:| विधि | पथ | उद्देश्य |
| - | - | - |
| `GET` | `…/verification-settings/{settings_uuid}/workflow-graph/` | वर्तमान ग्राफ़ + `status`/`is_editable` |
| `POST` | `…/application/{app}/workflow-graph/validate/` (body `{ "graph": … }`) | ड्राई-रन सत्यापन |
| `GET` | `…/application/{app}/workflow-graph/field-definitions/` | शाखा-योग्य फ़ील्ड और मान्य ऑपरेटर |
| `POST` | `…/verification-settings/{settings_uuid}/create-draft/` | प्रकाशित संस्करण से संपादन-योग्य ड्राफ़्ट |
| `PUT` | `…/verification-settings/{settings_uuid}/workflow-graph/` (body `{ "graph": … }`) | ग्राफ़ सहेजें |
| `PATCH` | `…/verification-settings/{settings_uuid}/` (body `{ "status": "published" }`) | ड्राफ़्ट प्रकाशित करें |#### सत्यापन चेतावनियाँसत्यापन endpoint `{ "is_valid": true, "graph": …, "warnings": [] }` लौटाता है। चेतावनी **सलाह के रूप में** होती है: ग्राफ़ मान्य है, वह सहेजा जाता है और चेतावनियों के मौजूद होने पर भी प्रकाशित होता है। हर प्रविष्टि में वह शाखा नोड और आर्म दर्ज होता है जिससे वह संबंधित है, ताकि बिल्डर ठीक उस शर्त की ओर इंगित कर सके:```json theme={null}
{
  "type": "branch_outcome_contradiction",
  "node_id": "after_ocr",
  "branch_id": "b1",
  "severity": "warning",
  "message": "Branch 1 only matches sessions where ID Verification Status is Approved or In Review, but every path from it ends in the session outcome \"Declined\". Check the condition or the outcome.",
  "params": { "branchNumber": 1, "field": "ID Verification Status", "allowed": "Approved or In Review", "outcome": "Declined" }
}
```| `type` | इसका अर्थ |
| - | - |
| `branch_outcome_contradiction` | आर्म की शर्त और वह परिणाम जिस तक उससे निकलने वाला हर पथ पहुँचता है, एक-दूसरे के विपरीत हैं - उदाहरण के लिए, `kyc.status NOT EQUALS Declined` को `Declined` परिणाम की ओर भेजा गया। परिणाम पथ में कई चरण आगे हो सकता है। |
| `branch_condition_unreachable` | आर्म कभी मेल नहीं खा सकता, क्योंकि इस शाखा तक पहुँचने वाला हर पथ उस स्थिति फ़ील्ड को पहले से ही ऐसे मानों तक सीमित कर चुका है जिन्हें शर्त बाहर रखती है। |
| `else_branch_unreachable` | else आर्म कभी नहीं चल सकता: बाकी आर्म पहले ही वे सभी मान कवर कर चुके हैं जो यह फ़ील्ड यहाँ रख सकता है। |अमान्य ग्राफ़ `400` के साथ `errors` **और** सर्वोत्तम प्रयास वाली `warnings` सूची लौटाता है। केवल `errors` सहेजने को रोकते हैं।### कार्य उदाहरण: सॉफ़्टवेयर इंजीनियरों को धन के प्रमाण की ओर भेजें> पहचान सत्यापन के बाद: यदि पहचान सत्यापन **अस्वीकृत हुआ**, तो सत्र अस्वीकार करें; यदि धारक का **पेशा ≈ "Software Engineer"** है (≥80% समान), तो **धन के प्रमाण के दस्तावेज़** का अनुरोध करें; फिर अंतिम निर्णय लें।```json theme={null}
{
  "start_node": "ocr_1",
  "nodes": {
    "ocr_1": { "node_type": "feature", "feature": "OCR", "label": "ID Verification", "next": "after_ocr" },
    "after_ocr": {
      "node_type": "branch",
      "label": "Route after ID verification",
      "branches": [
        { "id": "declined", "logic": "or", "rules": [ { "field": "kyc.status", "operator": "equals", "value": "Declined" } ], "goto": "decline" },
        { "id": "software_engineer", "logic": "and", "rules": [ { "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 } ], "goto": "proof_of_funds" },
        { "id": "else", "logic": "and", "rules": [], "goto": "final_decision" }
      ]
    },
    "proof_of_funds": {
      "node_type": "feature",
      "feature": "DOCUMENT_AI",
      "label": "Proof of Funds",
      "config": {
        "document_ai_documents": [
          { "document_key": "proof_of_funds", "title": "Proof of Funds", "description": "Upload a recent bank statement.",
            "fields": [
              { "key": "account_holder", "name": "Account holder", "type": "text", "required": true },
              { "key": "closing_balance", "name": "Closing balance", "type": "number", "required": true }
            ] }
        ],
        "document_ai_missing_required_fields_action": "REVIEW"
      },
      "next": "final_decision"
    },
    "final_decision": { "node_type": "status", "session_status": "Determine", "label": "Final decision" },
    "decline": { "node_type": "status", "session_status": "Declined", "label": "Declined" }
  }
}
```अंतिम नोड `session_status: "Determine"` का उपयोग करता है, जो **स्वतः निर्णय लेता है** (स्वीकृत / अस्वीकृत / समीक्षाधीन), उन सुविधाओं के आधार पर जो सत्र पर वास्तव में चली हैं। इसलिए धन के प्रमाण वाला पथ और else पथ दोनों सही तरीके से हल होते हैं, और किसी भी शाखा को `document_ai.status` पढ़ने की ज़रूरत नहीं पड़ती (जो उस पथ पर मौजूद नहीं होता जो Document AI को छोड़ता है)। याद रखें: कोई शाखा केवल ऐसे फ़ील्ड को पढ़ सकती है जिसकी सुविधा उस तक पहुँचने वाले *हर* पथ पर चली हो।इसे `{ "graph": <above> }` के रूप में `…/workflow-graph/` endpoint पर भेजें (पहले सत्यापित करें)। शून्य से **नया** वर्कफ़्लो बनाने के लिए MCP का `didit_workflow_set_graph` उपयोग करें; किसी **मौजूदा** वर्कफ़्लो को संशोधित करने के लिए `didit_workflow_edit_graph` उपयोग करें (छोटे ऑपरेशन, मौजूदा नोड और अनुमति-सूचियाँ सुरक्षित रहती हैं)। [Didit MCP](https://docs.didit.me/hi/integration/mcp/tools.md) देखें।


## OpenAPI

````yaml hi/openapi-25.json POST /v3/workflows/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: पहचान सत्यापन API। x-api-key हेडर के साथ प्रमाणीकृत करें।
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/workflows/:
    post:
      tags:
        - Workflows
      summary: वर्कफ़्लो बनाएं
      description: >-
        एक सरल वर्कफ़्लो बनाएँ। `features` को निष्पादन क्रम में भेजें (क्रम
        निर्धारण नियम लागू होते हैं); डिफ़ॉल्ट रूप से `published` v1 पर सेट होता
        है। बॉडी केवल `SimpleWorkflowRequest` में सूचीबद्ध फ़ील्ड्स को स्वीकार
        करती है — किसी भी अन्य कुंजी (जिसमें `workflow_type` भी शामिल है) को 400
        के साथ अस्वीकृत कर दिया जाता है। आइडेम्पोटेंट नहीं है — प्रत्येक कॉल एक
        नया वर्कफ़्लो बनाती है। प्रति एप्लिकेशन अधिकतम 50 वर्कफ़्लो।
      operationId: create_workflow
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleWorkflowRequest'
            examples:
              Simple KYC:
                summary: ID, लाइवनेस और चेहरा मिलान का रैखिक वर्कफ़्लो
                value:
                  workflow_label: Standard KYC
                  features:
                    - feature: OCR
                      config:
                        duplicated_user_action: review
                    - feature: LIVENESS
                      config:
                        face_liveness_method: passive
                    - feature: FACE_MATCH
                      config:
                        face_match_score_decline_threshold: 40
                        face_match_score_review_threshold: 60
              KYC + AML:
                summary: पहचान सत्यापन के बाद AML स्क्रीनिंग चलाएं
                value:
                  workflow_label: KYC with AML
                  features:
                    - feature: OCR
                    - feature: AML
                      config:
                        aml_score_review_threshold: 70
                        aml_score_approve_threshold: 30
              Questionnaire workflow:
                summary: POST /v3/questionnaires/ के साथ बनाई गई प्रश्नावली चलाएं
                value:
                  workflow_label: Source of Funds
                  features:
                    - feature: QUESTIONNAIRE
                      config:
                        questionnaire_uuid: 11111111-2222-3333-4444-555555555555
                        review_questionnaire_manually: true
      responses:
        '201':
          description: >-
            वर्कफ़्लो बनाया गया। रिस्पॉन्स बॉडी पूर्ण वर्कफ़्लो कॉन्फ़िगरेशन है
            — वही रॉ `VerificationSettings` सीरियलाइज़ेशन जो `GET
            /v3/workflows/{settings_uuid}/` द्वारा लौटाया जाता है (~190 फ़ील्ड:
            प्रत्येक सुविधा टॉगल, थ्रेशोल्ड, कार्रवाई और जनरेट किया गया
            `workflow_graph`), संक्षिप्त सूची आइटम नहीं। `uuid` (जो
            `workflow_id` के रूप में भी प्रदर्शित है) को संग्रहीत करें ताकि आप
            बाद के सत्र-निर्माण कॉलों में इसका संदर्भ दे सकें। ध्यान दें:
            `features` एक `" + "`-जुड़ी हुई स्ट्रिंग है और कीमतें JSON नंबर हैं।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowDetail'
              examples:
                Created (abbreviated):
                  summary: पूर्ण कॉन्फ़िगरेशन ऑब्जेक्ट के प्रमुख फ़ील्ड
                  value:
                    uuid: c3d4e5f6-7890-12cd-ef34-333333333333
                    workflow_id: c3d4e5f6-7890-12cd-ef34-333333333333
                    workflow_label: Standard KYC
                    workflow_type: null
                    is_default: false
                    is_archived: false
                    total_price: 0.15
                    min_price: 0.15
                    max_price: 0.15
                    features: OCR + LIVENESS + FACE_MATCH
                    is_simple_workflow: false
                    is_editable: false
                    workflow_url: https://verify.didit.me/u/w9TkPOx8RWG3UAz5ZRQGVQ
                    workflow_graph:
                      start_node: ocr
                      nodes: ... one node per feature plus a final status node ...
                    max_retry_attempts: 3
                    retry_window_days: 7
                    session_expiration_time: 604800
                    version: 1
                    status: published
                    published_at: '2026-05-17T10:30:00Z'
                    created_at: '2026-05-17T10:30:00Z'
                    updated_at: '2026-05-17T10:30:00Z'
        '400':
          description: >-
            सत्यापन त्रुटि। सामान्य कारण: स्वीकृत व्हाइटलिस्ट के बाहर एक
            शीर्ष-स्तरीय कुंजी (उदा. `workflow_type`), एक अज्ञात `feature` मान,
            किसी सुविधा को उसकी निर्भरता से पहले रखा जाना (उदा. `OCR` से पहले
            `FACE_MATCH`), पहले चरण के रूप में एक पैसिव सुविधा (`AML`,
            `IP_ANALYSIS`, `DATABASE_VALIDATION`, `KYB_KEY_PEOPLE`) का उपयोग, एक
            `QUESTIONNAIRE` सुविधा जिसका `config.questionnaire_uuid` इस
            एप्लिकेशन के लिए मौजूद नहीं है, एक `SIGNATURE` सुविधा जो बिना किसी
            हस्ताक्षर योग्य दस्तावेज़ के लाइव हो जाएगी, `signature_level: "aes"`
            पर एक `SIGNATURE` सुविधा जबकि Advanced (AES) उपलब्ध नहीं है
            (`aes_not_available`, वर्कफ़्लो पर `signature_availability` देखें),
            या सीमा से बाहर का थ्रेशोल्ड। बॉडी एक DRF सत्यापन त्रुटि ऑब्जेक्ट है
            — कुंजियाँ फ़ील्ड नाम हैं और मान मानव-पठनीय संदेशों के ऐरे हैं।
          content:
            application/json:
              examples:
                Advanced (AES) not available:
                  value:
                    features:
                      signature_level:
                        - >-
                          Node 'signature': Advanced (AES) is not available yet
                          (aes_not_available).
                Signature step with no document:
                  value:
                    features:
                      non_field_errors:
                        - >-
                          Node 'signature': Add a document to sign, or let each
                          session bring its own.
                Missing feature:
                  value:
                    features:
                      - At least one feature is required.
                Unknown top-level field:
                  value:
                    workflow_type:
                      - >-
                        The v3 workflow API only accepts `workflow_label`,
                        `is_default`, `status`, `features`,
                        `is_white_label_enabled`, `is_desktop_allowed`,
                        `max_retry_attempts`, `retry_window_days`,
                        `session_expiration_time`, `face_liveness_max_attempts`,
                        `face_match_max_attempts`.
                Unknown feature:
                  value:
                    features:
                      - >-
                        Invalid feature 'FOO'. Allowed values: AGE_ESTIMATION,
                        AML, DATABASE_VALIDATION, EMAIL_VERIFICATION,
                        FACE_MATCH, IP_ANALYSIS, KYB_DOCUMENTS, KYB_KEY_PEOPLE,
                        KYB_REGISTRY, LIVENESS, NFC, OCR, PHONE_VERIFICATION,
                        PROOF_OF_ADDRESS, QUESTIONNAIRE.
                Ordering:
                  value:
                    features:
                      - 'Feature ''FACE_MATCH'' must appear after one of: OCR.'
                Questionnaire not found:
                  value:
                    features: >-
                      Questionnaire '11111111-2222-3333-4444-555555555555' was
                      not found for this application. Create the questionnaire
                      first, then use its questionnaire_id.
        '403':
          description: >-
            API कुंजी अनुपलब्ध, विकृत, समय-सीमा समाप्त हो चुकी है, या किसी भिन्न
            एप्लिकेशन के लिए स्कोप्ड है। [Auth
            API](/hi/auth-api/get-credentials) के माध्यम से रीफ्रेश करें और पुनः
            प्रयास करें।
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: You do not have permission to perform this action.
        '415':
          description: >-
            असमर्थित मीडिया प्रकार। `Content-Type: application/json` सेट करें और
            JSON बॉडी भेजें।
        '429':
          description: रेट लिमिट पार हो गई। घातीय बैकऑफ़ के साथ पुनः प्रयास करें।
        '500':
          description: >-
            वर्कफ़्लो बनाते समय अप्रत्याशित सर्वर त्रुटि। पुनः प्रयास करना
            सुरक्षित है।
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/workflows/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "workflow_label": "Standard KYC",
                "features": [
                  {"feature": "OCR"},
                  {"feature": "LIVENESS", "config": {"face_liveness_method": "passive"}},
                  {"feature": "FACE_MATCH", "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}}
                ]
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.workflows.create(
                workflow_label="Standard KYC",
                features=[{
                    "feature": "OCR",
                    "config": {"duplicated_user_action": "review"},
                }, {
                    "feature": "LIVENESS",
                    "config": {"face_liveness_method": "passive"},
                }, {
                    "feature": "FACE_MATCH",
                    "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60},
                }],
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

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

            const result = await didit.workflows.create({
              workflow_label: "Standard KYC",
              features: [{
                feature: "OCR",
                config: { duplicated_user_action: "review" },
              }, {
                feature: "LIVENESS",
                config: { face_liveness_method: "passive" },
              }, {
                feature: "FACE_MATCH",
                config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
              }],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Create(ctx, didit.SimpleWorkflowRequest{\n\tWorkflowLabel: didit.String(\"Standard KYC\"),\n\tFeatures: []didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t\tConfig:  didit.Some(map[string]any{\"duplicated_user_action\": \"review\"}),\n\t}, {\n\t\tFeature: \"LIVENESS\",\n\t\tConfig:  didit.Some(map[string]any{\"face_liveness_method\": \"passive\"}),\n\t}, {\n\t\tFeature: \"FACE_MATCH\",\n\t\tConfig:  didit.Some(map[string]any{\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.SimpleWorkflowFeature;

            import me.didit.types.SimpleWorkflowRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.workflows().create(SimpleWorkflowRequest.builder()
                    .workflowLabel("Standard KYC")
                    .features(List.of(
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("OCR"))
                                    .config(Map.of("duplicated_user_action", "review"))
                                    .build(),
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("LIVENESS"))
                                    .config(Map.of("face_liveness_method", "passive"))
                                    .build(),
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("FACE_MATCH"))
                                    .config(Map.of("face_match_score_decline_threshold", 40, "face_match_score_review_threshold", 60))
                                    .build()))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

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

            $result = $didit->workflows->create([
                'workflow_label' => 'Standard KYC',
                'features' => [[
                    'feature' => 'OCR',
                    'config' => ['duplicated_user_action' => 'review'],
                ], [
                    'feature' => 'LIVENESS',
                    'config' => ['face_liveness_method' => 'passive'],
                ], [
                    'feature' => 'FACE_MATCH',
                    'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],
                ]],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.workflows.create(
              workflow_label: "Standard KYC",
              features: [{
                feature: "OCR",
                config: { duplicated_user_action: "review" },
              }, {
                feature: "LIVENESS",
                config: { face_liveness_method: "passive" },
              }, {
                feature: "FACE_MATCH",
                config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
              }]
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Workflows.CreateAsync(new
            SimpleWorkflowRequest

            {
                WorkflowLabel = "Standard KYC",
                Features = new SimpleWorkflowFeature[]
                {
                    new()
                    {
                        Feature = "OCR",
                        Config = new Dictionary<string, object> { ["duplicated_user_action"] = "review" },
                    },
                    new()
                    {
                        Feature = "LIVENESS",
                        Config = new Dictionary<string, object> { ["face_liveness_method"] = "passive" },
                    },
                    new()
                    {
                        Feature = "FACE_MATCH",
                        Config = new Dictionary<string, object> { ["face_match_score_decline_threshold"] = 40, ["face_match_score_review_threshold"] = 60 },
                    },
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SimpleWorkflowRequest:
      type: object
      description: >-
        एक सरल रैखिक वर्कफ़्लो बनाएँ। API आंतरिक रूप से इस सुविधा सूची को एक
        नोड-आधारित वर्कफ़्लो ग्राफ़ में बदल देता है। सख्त फ़ील्ड व्हाइटलिस्ट:
        यहाँ सूचीबद्ध नहीं की गई किसी भी कुंजी (जिसमें `workflow_type` भी शामिल
        है) को 400 के साथ अस्वीकृत कर दिया जाता है।
      required:
        - features
      properties:
        workflow_label:
          type: string
          maxLength: 50
          default: ID Verification
          description: >-
            वर्कफ़्लो के लिए डिस्प्ले नाम (अधिकतम 50 वर्ण)। छोड़े जाने पर
            डिफ़ॉल्ट रूप से `"ID Verification"` होता है — इसे हमेशा सेट करें
            ताकि वर्कफ़्लो अलग पहचाने जा सकें।
          example: Standard KYC
        is_default:
          type: boolean
          description: इस वर्कफ़्लो को नए सत्रों के लिए डिफ़ॉल्ट के रूप में सेट करें।
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            सत्रों के लिए तैयार एक प्रकाशित वर्कफ़्लो बनाने के लिए इस फ़ील्ड को
            छोड़ दें। `draft` का उपयोग केवल तभी करें जब आप बिना प्रकाशित किए
            सहेजना चाहते हों।
        features:
          type: array
          minItems: 1
          description: >-
            निष्पादन क्रम में सत्यापन सुविधाएं। API प्रत्येक आइटम को अगले से
            लिंक करता है और स्वचालित रूप से एक अंतिम स्थिति नोड जोड़ता है।
          items:
            $ref: '#/components/schemas/SimpleWorkflowFeature'
        is_white_label_enabled:
          type: boolean
          description: >-
            इस वर्कफ़्लो के साथ बनाए गए सत्रों के लिए व्हाइट लेबल कस्टमाइज़ेशन
            सक्षम करें।
          default: false
        is_desktop_allowed:
          type: boolean
          description: सत्यापन फ़्लो को डेस्कटॉप ब्राउज़र पर चलने की अनुमति दें।
          default: false
        max_retry_attempts:
          type: integer
          minimum: 0
          maximum: 10
          default: 3
          description: >-
            अस्वीकृत सत्यापन के बाद अनुमत अधिकतम पुनः प्रयास। `0` पहले अस्वीकार
            के बाद उपयोगकर्ता को ब्लॉक कर देता है।
        retry_window_days:
          type: integer
          minimum: 1
          maximum: 365
          nullable: true
          default: 7
          description: >-
            पुनः प्रयासों की गणना के लिए दिनों में रोलिंग विंडो। `null`
            सर्वकालिक सीमा लागू करता है।
        face_liveness_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          default: 3
          description: >-
            प्रति सत्र अधिकतम लाइवनेस सबमिशन। डिफ़ॉल्ट 3: एक प्रारंभिक प्रयास और
            दो पुनः प्रयास। यह मान जनरेट किए गए लाइवनेस और आयु अनुमान वर्कफ़्लो
            नोड्स में भी कॉपी किया जाता है, जब तक कि सुविधा-स्तरीय कॉन्फ़िगरेशन
            इसे ओवरराइड न करे।
        face_match_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          default: 3
          description: >-
            प्रति सत्र अधिकतम चेहरा मिलान सबमिशन। डिफ़ॉल्ट 3: एक प्रारंभिक
            प्रयास और दो पुनः प्रयास। यह मान जनरेट किए गए चेहरा मिलान वर्कफ़्लो
            नोड्स में भी कॉपी किया जाता है, जब तक कि सुविधा-स्तरीय कॉन्फ़िगरेशन
            इसे ओवरराइड न करे।
        session_expiration_time:
          type: integer
          minimum: 3600
          maximum: 2419200
          default: 604800
          description: >-
            किसी अधूरे सत्र की समय-सीमा समाप्त होने से पहले के सेकंड। न्यूनतम 1
            घंटा (3600), अधिकतम 4 सप्ताह (2419200)।
    WorkflowDetail:
      type: object
      description: >-
        नीचे दिए गए फ़ील्ड टाइप किए गए हैं; ऑब्जेक्ट अतिरिक्त विशेषताओं के रूप
        में वर्कफ़्लो कॉन्फ़िगरेशन के हर दूसरे कॉलम (सुविधा टॉगल, थ्रेशोल्ड,
        चेतावनी कार्रवाइयाँ, अनुमत दस्तावेज़, कॉलबैक) को भी ले जाता है। वे
        फ़ील्ड जो `workflow_type` पर लागू नहीं होते हैं, वे `null` हैं।
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            प्रति-संस्करण पहचानकर्ता (`settings_uuid`)। वर्कफ़्लो के प्रत्येक
            संस्करण का अपना पहचानकर्ता होता है।
        workflow_id:
          type: string
          format: uuid
          description: >-
            वर्कफ़्लो के प्रत्येक संस्करण द्वारा साझा किया गया स्थिर पहचानकर्ता।
            इसके साथ बनाए गए सत्र नवीनतम प्रकाशित संस्करण का उपयोग करते हैं।
        workflow_label:
          type: string
          description: वर्कफ़्लो का डिस्प्ले नाम।
        workflow_type:
          type: string
          nullable: true
          enum:
            - kyc
            - kyb
            - adaptive_age_verification
            - biometric_authentication
            - address_verification
            - questionnaire_verification
            - email_verification
            - phone_verification
            - null
          description: >-
            वर्कफ़्लो टेम्पलेट। बिना टेम्पलेट के बनाए गए ग्राफ़ वर्कफ़्लो के लिए
            `null`।
        is_default:
          type: boolean
          description: क्या यह एप्लिकेशन का डिफ़ॉल्ट वर्कफ़्लो है।
        is_archived:
          type: boolean
          description: संग्रहीत वर्कफ़्लो नए सत्र शुरू नहीं कर सकते।
        version:
          type: integer
          description: वर्कफ़्लो के भीतर संस्करण संख्या।
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            ड्राफ़्ट वर्ज़न संपादन योग्य होते हैं; प्रकाशित वर्ज़न अपरिवर्तनीय
            होते हैं और नए सत्रों के लिए उपयोग किए जाते हैं।
        published_at:
          type: string
          format: date-time
          nullable: true
          description: यह संस्करण कब प्रकाशित हुआ था। ड्राफ़्ट के लिए `null`।
        is_simple_workflow:
          type: boolean
          description: '`true` जब वर्कफ़्लो में कोई कस्टम `workflow_graph` न हो।'
        is_editable:
          type: boolean
          description: केवल `draft` संस्करणों के लिए `true`।
        workflow_url:
          type: string
          format: uri
          description: सार्वजनिक URL जो इस वर्कफ़्लो के साथ एक सत्र शुरू करता है।
        workflow_graph:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            वर्कफ़्लो की ग्राफ़ संरचना (नोड्स और एजेस)। सरल वर्कफ़्लो के लिए
            `null`।
        features:
          type: string
          description: >-
            सक्षम सुविधाएँ `" + "` से जुड़ी हुई हैं, उदाहरण के लिए `"OCR +
            LIVENESS"`।
        total_price:
          type: number
          nullable: true
          description: प्रति सत्र कीमत; ग्राफ़ वर्कफ़्लो के लिए सबसे महंगा पथ।
        min_price:
          type: number
          nullable: true
          description: वर्कफ़्लो के माध्यम से सबसे सस्ते पथ की कीमत।
        max_price:
          type: number
          nullable: true
          description: वर्कफ़्लो के माध्यम से सबसे महंगे पथ की कीमत।
        special_add_on_prices:
          type: object
          nullable: true
          additionalProperties: true
          description: संगठन-विशिष्ट ऐड-ऑन कीमतें, या कोई सेट न होने पर `null`।
        max_retry_attempts:
          type: integer
          description: अस्वीकृत सत्यापन के बाद अनुमत पुनः प्रयास।
        retry_window_days:
          type: integer
          nullable: true
          description: वे दिन जिनके दौरान पुनः प्रयास करने की अनुमति है।
        session_expiration_time:
          type: integer
          description: किसी अधूरे सत्र की समय-सीमा समाप्त होने से पहले के सेकंड।
        questionnaire:
          type: object
          nullable: true
          additionalProperties: true
          description: वर्कफ़्लो से जुड़ी प्रश्नावली, या `null`।
        kyb_role_settings:
          type: array
          items:
            type: object
            additionalProperties: true
          description: KYB प्रमुख व्यक्तियों के लिए प्रति-भूमिका सत्यापन सेटिंग्स।
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        signature_availability:
          type: object
          description: >-
            कौन से ई-हस्ताक्षर स्तर अभी हस्ताक्षर कर सकते हैं। `signature_level`
            सेट करने से पहले इसे जांचें। `kyc`, `kyb` और ग्राफ़ वर्कफ़्लो पर
            लौटाया जाता है।
          properties:
            simple:
              type: boolean
              description: Simple हमेशा उपलब्ध रहता है।
            aes:
              type: boolean
              description: >-
                क्या Advanced (AES) अब हस्ताक्षर कर सकता है। जब तक यह `false`
                है, `signature_level: "aes"` पर एक नया चरण सहेजना
                `aes_not_available` के साथ अस्वीकृत कर दिया जाता है।
            qes:
              type: boolean
              description: >-
                क्या Qualified (QES) अब हस्ताक्षर कर सकता है। जब तक कोई योग्य
                प्रदाता कनेक्ट नहीं हो जाता, यह `false` रहता है।
        is_bank_verification_enabled:
          type: boolean
          description: >-
            क्या एक सरल KYC या KYB वर्कफ़्लो बैंक सत्यापन चलाता है। यह संपर्क
            चरणों (और स्थान सत्यापन) के बाद और डेटाबेस सत्यापन, AML और IP
            विश्लेषण से पहले चलता है। बैंक सत्यापन अभी सामान्य रूप से उपलब्ध
            नहीं है: जहां भी यह सक्षम नहीं है, इसे चालू करना अस्वीकृत कर दिया
            जाता है।
        bank_verification_config:
          type: object
          additionalProperties: true
          description: >-
            एक सरल वर्कफ़्लो की बैंक सत्यापन सेटिंग्स, उन्हीं कुंजियों के साथ जो
            एक `BANK_VERIFICATION` नोड लेता है (उदाहरण के लिए `bank_countries`
            और `bank_method_order`)। अज्ञात कुंजियाँ छोड़ दी जाती हैं। प्रत्येक
            कुंजी वैकल्पिक है और एक अनुपस्थित कुंजी अपने डिफ़ॉल्ट को बनाए रखती
            है, इसलिए `{}` का अर्थ सभी डिफ़ॉल्ट हैं। देखें [बैंक सत्यापन
            सेटिंग्स](/hi/management-api/workflows/feature-configs#बैंक-सत्यापन)।
          example: {}
        is_geolocation_enabled:
          type: boolean
          description: >-
            क्या एक सरल KYC वर्कफ़्लो स्थान सत्यापन चलाता है। यह संपर्क चरणों के
            बाद और बैंक सत्यापन तथा डेटाबेस सत्यापन से पहले चलता है। व्यवसाय
            (KYB) वर्कफ़्लो इसे नहीं चला सकते।
        geolocation_config:
          type: object
          additionalProperties: true
          description: >-
            एक साधारण वर्कफ़्लो की स्थान सत्यापन सेटिंग्स, जिनमें वही कुंजियाँ
            होती हैं जो एक `GEOLOCATION` नोड लेता है (उदाहरण के लिए
            `is_geolocation_geofencing_enabled` और `geolocation_max_attempts`)।
            अज्ञात कुंजियों को छोड़ दिया जाता है। प्रत्येक कुंजी वैकल्पिक है और
            अनुपस्थित कुंजी अपना डिफ़ॉल्ट मान बनाए रखती है, इसलिए `{}` का अर्थ
            सभी डिफ़ॉल्ट मान हैं।
          example: {}
      additionalProperties: true
    SimpleWorkflowFeature:
      type: object
      required:
        - feature
      properties:
        feature:
          type: string
          description: >-
            चलाने के लिए सुविधा। यहाँ दिखाए गए बड़े अक्षरों वाले मानों का उपयोग
            करें।
          enum:
            - OCR
            - NFC
            - LIVENESS
            - FACE_MATCH
            - PROOF_OF_ADDRESS
            - QUESTIONNAIRE
            - DOCUMENT_AI
            - PHONE_VERIFICATION
            - EMAIL_VERIFICATION
            - DATABASE_VALIDATION
            - AML
            - IP_ANALYSIS
            - AGE_ESTIMATION
            - KYB_REGISTRY
            - KYB_DOCUMENTS
            - KYB_KEY_PEOPLE
            - SIGNATURE
        config:
          type: object
          description: >-
            सुविधा-विशिष्ट सेटिंग्स। `QUESTIONNAIRE` के लिए, प्रश्नावली निर्माण
            endpoint द्वारा लौटाए गए `questionnaire_id` के साथ
            `questionnaire_uuid` शामिल करें। `SIGNATURE` के लिए, लाइव होने वाले
            वर्कफ़्लो को हस्ताक्षर करने के लिए एक दस्तावेज़ की आवश्यकता होती है:
            `signature_documents_source` को `session` या `both` पर सेट करें ताकि
            प्रत्येक सत्र अपना दस्तावेज़ ला सके, या `status: "draft"` भेजें और
            प्रकाशित करने से पहले दस्तावेज़ जोड़ें। जब वर्कफ़्लो पर
            `signature_availability.aes`, `false` होता है, तो `signature_level:
            "aes"` को `aes_not_available` के साथ अस्वीकार कर दिया जाता है। `OCR`
            के लिए, `methods` यह चुनता है कि प्रत्येक देश कौन से पहचान सत्यापन
            तरीकों का उपयोग कर सकता है (दस्तावेज़ कैप्चर, किसी सरकारी या अन्य
            आधिकारिक स्रोत से गैर-दस्तावेज़ लुकअप, और डिजिटल पहचान वॉलेट); इसे
            छोड़ दें तो प्रत्येक देश केवल दस्तावेज़ कैप्चर पर रहेगा। `SIGNATURE`
            के लिए, [ई-हस्ताक्षर
            सेटिंग्स](/hi/management-api/workflows/feature-configs#ई-हस्ताक्षर)
            देखें: `signature_level` फ़िलहाल `simple` (डिफ़ॉल्ट, किसी पहचान
            सत्यापन, ईमेल या फ़ोन की आवश्यकता नहीं है) और `aes` स्वीकार करता है,
            और वर्कफ़्लो दस्तावेज़ों और उनके फ़ील्ड्स को कंसोल में प्रबंधित किया
            जाता है, इसलिए API के माध्यम से `signature_documents_source:
            "session"` के साथ प्रति सत्र दस्तावेज़ और फ़ील्ड भेजें।
          additionalProperties: true
        label:
          type: string
          description: इस वर्कफ़्लो नोड के लिए वैकल्पिक आंतरिक लेबल।
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        आपकी एप्लिकेशन की API कुंजी, Business Console में Developers -> API keys
        से। प्राथमिक कुंजी के पास पूर्ण एक्सेस होता है। एक नामित कुंजी को स्कोप
        किया जा सकता है: प्रति संसाधन none, read या write, कुछ वर्कफ़्लो या
        स्वीकृत सत्रों तक सीमित, IP पतों की सूची तक सीमित, और समाप्ति तिथि तक
        सीमित। 401 का अर्थ है कि कुंजी गलत है, निरस्त कर दी गई है या उसकी
        समय-सीमा समाप्त हो गई है; 403 का अर्थ है कि कोई कुंजी नहीं भेजी गई थी,
        कुंजी के पास इस संसाधन या कार्रवाई का एक्सेस नहीं है, या अनुरोध उसकी IP
        सूची से बाहर के पते से आया था; सत्र रूट पर 404 का अर्थ है कि सत्र कुंजी
        के वर्कफ़्लो या स्थितियों से बाहर है। मीडिया एक्सेस के बिना एक कुंजी को
        छवि, वीडियो और PDF URL null के रूप में प्राप्त होते हैं, और सत्र write
        के बिना एक कुंजी को सत्र लिंक और token null के रूप में प्राप्त होते हैं।
        देखें https://docs.didit.me/console/api-keys।

````

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