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

# फ़ोन सत्यापन रिपोर्ट: OTP और कैरियर JSON

> Didit के फ़ोन सत्यापन रिस्पॉन्स पार्स करें: कैरियर डेटा, OTP लाइफ़साइकिल और जोखिम चेतावनियाँ। प्रति OTP $0.02 + कैरियर शुल्क से।

फ़ोन सत्यापन रिपोर्ट एक फ़ोन OTP चैलेंज के पूरे परिणाम को कैप्चर करती है: हमने कोड किसे भेजा, किस कैरियर और चैनल ने इसे हैंडल किया, इसमें कितने प्रयास लगे, क्या नंबर डिस्पोज़ेबल या VoIP है, और आपकी ब्लॉकलिस्ट या अन्य उपयोगकर्ताओं के सत्रों के साथ कोई क्रॉस-सत्र मिलान।

यह पेज निर्णय endpoint द्वारा लौटाई गई JSON संरचना का दस्तावेज़ीकरण करता है ताकि आप प्रत्येक सत्यापित नंबर के लिए OTP परिणामों, कैरियर मेटाडेटा और जोखिम फ़्लैग को पार्स कर सकें।

![OTP परिणाम, कैरियर मेटाडेटा और जोखिम फ़्लैग प्रदर्शित करने वाली Didit की फ़ोन सत्यापन रिपोर्ट](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/phone-verification-report.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=9b5c6c6112303ebc60c0f287aafdb996)

## अवलोकन

हर बार जब कोई वर्कफ़्लो नोड फ़ोन सत्यापन सुविधा चलाता है, तो एक फ़ोन रिपोर्ट तैयार की जाती है। प्रत्येक रिपोर्ट एक फ़ोन नंबर के विरुद्ध एक OTP चैलेंज का प्रतिनिधित्व करती है और इसमें शामिल हैं:

* प्रीफ़िक्स, राष्ट्रीय नंबर और पूर्ण E.164 प्रारूप में विभाजित फ़ोन नंबर, साथ ही ISO देश कोड और देश का नाम।
* गंतव्य नेटवर्क से रिज़ॉल्व किया गया कैरियर मेटाडेटा (`name`, `type`)।
* लाइन-प्रकार विश्लेषण से प्राप्त बूलियन जोखिम फ़्लैग (`is_disposable`, `is_virtual`)।
* उपयोग किया गया वास्तविक डिलीवरी चैनल (`verification_method`) और OTP भेजने के प्रयासों की संख्या।
* हर भेजने, पुनः प्रयास, डिलीवरी इवेंट और कोड-जाँच प्रयास का एक कालानुक्रमिक `lifecycle[]` लॉग।
* अन्य सत्रों में—चाहे उनकी स्थिति कुछ भी हो और वे KYC, KYB या स्टैंडअलोन API सत्यापनों से संबंधित हों—या आपकी ब्लॉकलिस्ट में उसी नंबर को दर्शाने वाला एक `matches[]` ऐरे।
* एक `warnings[]` ऐरे — सत्यापन के दौरान उत्सर्जित जोखिम इवेंट (देखें [फ़ोन सत्यापन चेतावनियाँ](https://docs.didit.me/hi/core-technology/phone-verification/warnings-phone-verification.md))।
* एक `node_id` जो यह पहचानता है कि किस वर्कफ़्लो ग्राफ़ नोड ने रिपोर्ट तैयार की (केवल V3 सत्र)।

होस्टेड सत्यापन फ़्लो में Didit आपके लिए OTP एक्सचेंज संचालित करता है। प्रत्यक्ष API इंटीग्रेशन के लिए इस फ़्लो में दो कॉल होती हैं — कोड डिलीवर करने के लिए [`POST /v3/phone/send/`](https://docs.didit.me/hi/standalone-apis/phone-send) और उपयोगकर्ता की प्रविष्टि को मान्य करने के लिए [`POST /v3/phone/check/`](https://docs.didit.me/hi/standalone-apis/phone-check)। एक लंबित OTP **पहले भेजने से 5 मिनट** के लिए वैध होता है (पुनः प्रयासों से यह विंडो नहीं बढ़ती)। वर्कफ़्लो सत्रों में उपयोगकर्ताओं को डिफ़ॉल्ट रूप से 2 OTP भेजने के प्रयास (`phone_max_retries`) और 2 कोड-प्रविष्टि प्रयास (`phone_max_check_attempts`) मिलते हैं — दोनों प्रति वर्कफ़्लो नोड ट्यून करने योग्य हैं; किसी भी सीमा के समाप्त होने पर चरण `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` के साथ `Declined` के रूप में फ़ाइनलाइज़ हो जाता है। स्टैंडअलोन फ़ोन API प्रति सत्यापन 3 कोड-प्रविष्टि प्रयासों की अनुमति देता है।

## API रिस्पॉन्स में यह कहाँ दिखाई देता है

निर्णय endpoint (`GET /v3/session/{sessionId}/decision/`) बहुवचन ऐरे कुंजी **`phone_verifications`** के तहत फ़ोन रिपोर्ट लौटाता है। ऐरे में वर्कफ़्लो ग्राफ़ में प्रत्येक फ़ोन सत्यापन नोड के लिए एक प्रविष्टि होती है — आम तौर पर एक, लेकिन स्टेप-अप फ़्लो कई प्रविष्टियाँ उत्पन्न कर सकते हैं।

```json theme={null}
{
  "session_id": "11111111-1111-1111-1111-111111111111",
  "status": "Approved",
  "phone_verifications": [
    { "status": "Approved", "node_id": "feature_phone_1", "...": "..." }
  ]
}
```

`null` मान का अर्थ है कि अभी तक कोई फ़ोन सत्यापन चरण नहीं चला है। जब आपका वर्कफ़्लो एक से अधिक फ़ोन नंबर एकत्र कर सकता है, तो ऐरे को इटरेट करें (केवल `phone_verifications[0]` को पढ़ने के बजाय)।

## स्कीमा

फ़ील्ड-दर-फ़ील्ड कैनोनिकल स्कीमा [डेटा मॉडल](https://docs.didit.me/hi/reference/data-models.md#फ़ोन-सत्यापन) पेज पर उपलब्ध है।

```typescript theme={null}
interface PhoneVerification {
  status: "Not Finished" | "Approved" | "Declined" | "In Review" | "Expired";
  phone_number_prefix: string;       // E.g. "+34"
  phone_number: string;              // National number, no prefix
  full_number: string;               // Full E.164, e.g. "+34600600600"
  country_code: string;              // ISO 3166-1 alpha-2, e.g. "ES"
  country_name: string;
  carrier: {
    name: string;
    type:                              // From LineTypeChoices
      | "mobile" | "fixed_line" | "voip" | "isp" | "vpn"
      | "toll_free" | "premium_rate" | "shared_cost" | "local_rate"
      | "satellite" | "pager" | "payphone" | "voice_mail"
      | "calling_cards" | "service" | "short_codes_commercial"
      | "universal_access" | "other" | "unknown";
  };
  is_disposable: boolean;            // Temporary / burner number
  is_virtual: boolean;               // true when carrier.type is voip, isp or vpn
  verification_method:               // Actual channel that delivered the OTP
    | "sms" | "whatsapp" | "telegram" | "voice" | "rcs" | "viber" | "zalo";
  verification_attempts: number;     // OTP send attempts (initial send + resends)
  verified_at: string | null;        // ISO 8601, set when a valid OTP was entered
  warnings: Warning[];               // Risk events emitted during verification
  lifecycle: PhoneLifecycleEvent[];  // OTP send/retry/delivery/check timeline
  matches: PhoneMatch[];             // Cross-session / blocklist matches (max 5)
  node_id: string;                   // Workflow graph node that produced this report
}
```

### स्टेटस मान

| स्टेटस | अर्थ |
| - | - |
| `Not Finished` | OTP भेजा जाना शुरू हो चुका है लेकिन सत्यापन अभी तक फ़ाइनलाइज़ नहीं हुआ है। |
| `Approved` | उपयोगकर्ता ने मान्य OTP दर्ज किया और कोई अस्वीकृत करने वाला जोखिम मेल नहीं खाया। |
| `Declined` | एक ऑटो-डिक्लाइन चेतावनी सक्रिय हुई (ब्लॉकलिस्ट, उच्च-जोखिम, प्रयासों की सीमा पार हो गई) या `DECLINE` पर कॉन्फ़िगर की गई जोखिम कार्रवाई मेल खा गई। |
| `In Review` | `REVIEW` पर कॉन्फ़िगर की गई जोखिम कार्रवाई ने इस चरण को मैन्युअल समीक्षा के लिए रूट कर दिया। |
| `Expired` | बिना किसी मान्य कोड के 5 मिनट की OTP विंडो समाप्त हो गई — यह स्टैंडअलोन फ़ोन API के माध्यम से बनाए गए सत्यापनों पर लागू होता है। |

### लाइफ़साइकिल इवेंट प्रकार

`lifecycle[]` कालानुक्रमिक रूप से व्यवस्थित है। प्रत्येक इवेंट में `type`, `timestamp`, `details`, और एक बिल करने योग्य `fee` (जब लागू हो) शामिल होता है:

| इवेंट प्रकार | तब जारी होता है |
| - | - |
| `PHONE_VERIFICATION_MESSAGE_SENT` | अनुरोधित चैनल पर पहला OTP भेजने का प्रयास। |
| `PHONE_VERIFICATION_RETRY_MESSAGE_SENT` | उपयोगकर्ता द्वारा पुनः भेजने का अनुरोध करने के बाद बाद का OTP भेजा जाना। |
| `PHONE_VERIFICATION_BLOCKED` | भेजा जाना ब्लॉक कर दिया गया था (स्पैम, संदिग्ध, बार-बार किए गए प्रयास, अमान्य नंबर)। |
| `PHONE_DELIVERY_DELIVERED` | कैरियर ने उपयोग किए गए वास्तविक चैनल पर डिलीवरी की पुष्टि की। |
| `PHONE_DELIVERY_UNDELIVERABLE` | कैरियर ने रिपोर्ट किया कि संदेश डिलीवर नहीं किया जा सका। |
| `VALID_CODE_ENTERED` | उपयोगकर्ता ने सही OTP कोड सबमिट किया। |
| `INVALID_CODE_ENTERED` | उपयोगकर्ता ने गलत OTP कोड सबमिट किया (कोड-प्रविष्टि सीमा में गिना जाता है)। |
| `PHONE_VERIFICATION_APPROVED` | सुविधा-स्तरीय स्टेटस को `Approved` पर सेट किया गया था। |
| `PHONE_VERIFICATION_DECLINED` | सुविधा-स्तरीय स्टेटस को `Declined` पर सेट किया गया था। |
| `PHONE_VERIFICATION_IN_REVIEW` | सुविधा-स्तरीय स्टेटस को `In Review` पर सेट किया गया था। |
| `PHONE_VERIFICATION_EXPIRED` | मान्य कोड के बिना OTP विंडो की समय-सीमा समाप्त हो गई। |

`details` payload इवेंट फ़ैमिली पर निर्भर करता है:

* **भेजने के इवेंट** (`PHONE_VERIFICATION_MESSAGE_SENT`, `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`, `PHONE_VERIFICATION_BLOCKED`) — `{ status, reason, channel, actual_channel }`। `status` `Success`, `Retry` या `Blocked` है; `reason` तब तक `null` है जब तक कि भेजा जाना ब्लॉक न किया गया हो (`invalid_phone_number`, `repeated_attempts`, `suspicious`, `spam`, `unknown`); `channel` अनुरोधित चैनल है और `actual_channel` वह चैनल है जिसने वास्तव में डिलीवरी की (उदा. WhatsApp संदेश जो SMS पर फ़ालबैक हो गया)।
* **डिलीवरी इवेंट** (`PHONE_DELIVERY_DELIVERED`, `PHONE_DELIVERY_UNDELIVERABLE`) — `{ channel, status }` जहां `status` `delivered` या `undeliverable` है।
* **जाँच इवेंट** (`VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`) — `{ code_tried, status }` जहां `status` `Approved`, `Declined`, `Failed` या `Expired or Not Found` है।
* **अंतिम स्टेटस इवेंट** — `null`, सिवाय `PHONE_VERIFICATION_DECLINED` / `PHONE_VERIFICATION_IN_REVIEW` के, जिनमें `{ "reason": "<risk code>" }` (उदा. `PHONE_NUMBER_IN_BLOCKLIST`) होता है।

भेजने के इवेंट पर `fee` उस भेजे जाने की कुल कीमत है: कैरियर या WhatsApp की कीमत के साथ $0.02 Didit शुल्क, या [आपके अपने WhatsApp Business नंबर](https://docs.didit.me/hi/core-technology/phone-verification/overview.md#अपने-स्वयं-के-नंबर-से-whatsapp-कोड-भेजें) से भेजे गए WhatsApp कोड के लिए केवल $0.02 Didit शुल्क। यह डिलीवरी की पुष्टि होने तक अनुमानित कीमत होती है, उसके बाद वास्तविक बिल की गई राशि होती है। केवल `Blocked` भेजे गए संदेशों के निःशुल्क होने की गारंटी है: किसी भी अन्य भेजे गए संदेश के लिए तब शुल्क लिया जाता है जब सत्यापन फ़ाइनलाइज़ होता है या समय-सीमा समाप्त हो जाती है, भले ही डिलीवरी की कभी पुष्टि न हुई हो या संदेश डिलीवर न हो सका हो। डिलीवरी, जाँच और स्टेटस इवेंट में हमेशा `fee: 0` होता है।

### क्रॉस-सत्र मिलान

`matches[]` उसी एप्लिकेशन में अन्य सत्रों को रिकॉर्ड करता है जहाँ वही नंबर देखा गया था — KYC, KYB और स्टैंडअलोन API सत्यापनों में, चाहे उनका स्टेटस कुछ भी हो — साथ ही [मैनेजमेंट API सूचियाँ](https://docs.didit.me/hi/management-api/lists/overview.md) में कॉन्फ़िगर किए गए ब्लॉकलिस्ट मिलान। वर्तमान सत्र के `vendor_data` को साझा करने वाले सत्रों को बाहर रखा गया है (एक ही अंतिम उपयोगकर्ता स्वयं से मेल नहीं खाता है), और ऐरे अधिकतम **5** प्रविष्टियों तक सीमित है। जब नंबर आपकी ब्लॉकलिस्ट में होता है लेकिन कोई भी मेल खाने वाला सत्र ब्लॉकलिस्टेड नहीं होता है, तो `source: "list_entry"` (सभी सत्र फ़ील्ड `null`) वाली एक सिंथेटिक प्रविष्टि ऐरे के आरंभ में जोड़ दी जाती है।

```typescript theme={null}
interface PhoneMatch {
  session_id: string | null;         // null when source = "list_entry"
  session_number: number | null;
  vendor_data: string | null;
  verification_date: string | null;  // ISO 8601, creation date of the matched session
  phone_number: string;
  status: string | null;             // Status of the matched session
  is_blocklisted: boolean;
  api_service: string | null;        // Set when the matched session came from a standalone API
  source: "session" | "list_entry";  // "list_entry" = manual blocklist hit
}
```

## उदाहरण

### स्वीकृत — WhatsApp OTP, मोबाइल कैरियर

```json theme={null}
{
  "status": "Approved",
  "phone_number_prefix": "+34",
  "phone_number": "600600600",
  "full_number": "+34600600600",
  "country_code": "ES",
  "country_name": "Spain",
  "carrier": { "name": "Orange", "type": "mobile" },
  "is_disposable": false,
  "is_virtual": false,
  "verification_method": "whatsapp",
  "verification_attempts": 1,
  "verified_at": "2025-08-24T09:12:39.684292Z",
  "warnings": [],
  "lifecycle": [
    {
      "type": "PHONE_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2025-08-24T09:12:30.580554Z",
      "details": { "status": "Success", "reason": null, "channel": "whatsapp", "actual_channel": "whatsapp" },
      "fee": 0.0509
    },
    {
      "type": "PHONE_DELIVERY_DELIVERED",
      "timestamp": "2025-08-24T09:12:31.000000Z",
      "details": { "channel": "whatsapp", "status": "delivered" },
      "fee": 0
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2025-08-24T09:12:39.662157Z",
      "details": { "code_tried": "123456", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "PHONE_VERIFICATION_APPROVED",
      "timestamp": "2025-08-24T09:12:39.684292Z",
      "details": null,
      "fee": 0
    }
  ],
  "matches": [],
  "node_id": "feature_phone_1"
}
```

### अस्वीकृत — ब्लॉकलिस्टेड VoIP नंबर

उपयोगकर्ता ने एक मान्य OTP दर्ज किया, लेकिन फ़ाइनलाइज़ेशन के दौरान एप्लिकेशन की ब्लॉकलिस्ट पर नंबर पाया गया (ऑटो-डिक्लाइन) और इसके VoIP लाइन प्रकार को फ़्लैग किया गया (`voip_number_action` को `NO_ACTION` पर छोड़ दिया गया, इसलिए यह `information` के रूप में लॉग होता है)। चूंकि कोई भी मेल खाने वाला सत्र ब्लॉकलिस्टेड नहीं है, ब्लॉकलिस्ट हिट एक सिंथेटिक `list_entry` मिलान के रूप में दिखाई देता है।

```json theme={null}
{
  "status": "Declined",
  "phone_number_prefix": "+1",
  "phone_number": "5551234567",
  "full_number": "+15551234567",
  "country_code": "US",
  "country_name": "United States",
  "carrier": { "name": "VoIP Carrier", "type": "voip" },
  "is_disposable": false,
  "is_virtual": true,
  "verification_method": "sms",
  "verification_attempts": 1,
  "verified_at": "2025-08-24T09:11:10.221340Z",
  "warnings": [
    {
      "feature": "PHONE",
      "risk": "PHONE_NUMBER_IN_BLOCKLIST",
      "additional_data": { "blocklisted_session_id": null, "blocklisted_session_number": null, "api_service": null },
      "log_type": "error",
      "short_description": "Phone number in blocklist",
      "long_description": "The system detected that the phone number is in the blocklist, which is not allowed.",
      "node_id": "feature_phone_1"
    },
    {
      "feature": "PHONE",
      "risk": "VOIP_NUMBER_DETECTED",
      "additional_data": null,
      "log_type": "information",
      "short_description": "VoIP number detected",
      "long_description": "The system detected that the phone number is a VoIP number, which is not allowed.",
      "node_id": "feature_phone_1"
    }
  ],
  "lifecycle": [
    {
      "type": "PHONE_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2025-08-24T09:11:00.000000Z",
      "details": { "status": "Success", "reason": null, "channel": "sms", "actual_channel": "sms" },
      "fee": 0.0509
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2025-08-24T09:11:10.221340Z",
      "details": { "code_tried": "482917", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "PHONE_VERIFICATION_DECLINED",
      "timestamp": "2025-08-24T09:11:10.350000Z",
      "details": { "reason": "PHONE_NUMBER_IN_BLOCKLIST" },
      "fee": 0
    }
  ],
  "matches": [
    {
      "session_id": null,
      "session_number": null,
      "vendor_data": null,
      "verification_date": null,
      "phone_number": "+15551234567",
      "status": null,
      "is_blocklisted": true,
      "api_service": null,
      "source": "list_entry"
    }
  ],
  "node_id": "feature_phone_1"
}
```

## संबंधित

* [फ़ोन सत्यापन अवलोकन](https://docs.didit.me/hi/core-technology/phone-verification/overview.md) — सुविधा का व्यवहार, मूल्य निर्धारण, समर्थित चैनल।
* [फ़ोन सत्यापन चेतावनियाँ](https://docs.didit.me/hi/core-technology/phone-verification/warnings-phone-verification.md) — प्रत्येक जोखिम कोड, अस्वीकृति ट्रिगर और कॉन्फ़िगर करने योग्य कार्रवाइयां।
* [डेटा मॉडल — फ़ोन सत्यापन](https://docs.didit.me/hi/reference/data-models.md#फ़ोन-सत्यापन) — फ़ील्ड-दर-फ़ील्ड कैनोनिकल स्कीमा।
* [स्टैंडअलोन फ़ोन API](https://docs.didit.me/hi/standalone-apis/phone-send.md) — `POST /v3/phone/send/` और [`POST /v3/phone/check/`](https://docs.didit.me/hi/standalone-apis/phone-check) endpoint।
* [मैनेजमेंट API — सूचियाँ](https://docs.didit.me/hi/management-api/lists/overview.md) — फ़ोन ब्लॉकलिस्ट प्रबंधित करें जो `source: list_entry` के साथ `matches[]` को फ़ीड करती है।


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