> ## 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 API: ईमेल सत्यापन कोड भेजें

> Didit का POST /v3/email/send/ वन-टाइम ईमेल कोड भेजता है। अवितरणीय पर स्वतः पुनः प्रयास, 5 मिनट वैधता, प्रति उपयोग भुगतान, कोई मासिक न्यूनतम नहीं।



## OpenAPI

````yaml hi/openapi-25.json POST /v3/email/send/
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/email/send/:
    post:
      tags:
        - Standalone APIs
      summary: ईमेल कोड भेजें
      description: >-
        किसी ईमेल पते पर वन-टाइम पासकोड (OTP) भेजें, फिर [`POST
        /v3/email/check/`](/hi/standalone-apis/email-check) के साथ इसे सत्यापित
        करें।


        **सेंड और चेक कैसे एक साथ काम करते हैं।** सत्यापन स्थिति आपके एप्लिकेशन
        और `email` पते द्वारा कुंजीबद्ध की जाती है — चेक कॉल में `request_id`
        नहीं लिया जाता है। प्रत्येक नया सेंड एक लंबित सत्यापन बनाता है जो **5
        मिनट** तक सक्रिय रहता है: विंडो बंद होने से पहले उसी पते और उपयोगकर्ता
        द्वारा प्राप्त कोड के साथ चेक को कॉल करें। जब सत्यापन लंबित हो, उसी पते
        के लिए दोबारा सेंड कॉल करने पर उसी सत्यापन के लिए एक नया कोड जनरेट होता
        है (`status: "Retry"`, वही `request_id`); पिछला कोड काम करना बंद कर देता
        है। इस तरह अधिकतम एक पुनः प्रयास संलग्न किया जाता है (कुल दो सेंड); अगला
        सेंड एक नए `request_id` के साथ एक नया सत्यापन शुरू करता है। 5 मिनट की
        विंडो को पहले सेंड से मापा जाता है और पुनः प्रयासों द्वारा इसे बढ़ाया
        नहीं जाता है।


        **डिलीवरेबिलिटी प्री-चेक।** कुछ भी भेजे जाने से पहले, पता सिंटैक्स और
        DNS/MX सत्यापन से गुजरता है। जो पते मेल प्राप्त नहीं कर सकते वे `status:
        "Undeliverable"` और `reason: "email_can_not_be_delivered"` के साथ `200`
        लौटाते हैं — कोई ईमेल नहीं भेजा जाता है, कोई बिलिंग नहीं होती है, और
        सत्यापन तुरंत `Declined` के रूप में अंतिम रूप ले लेता है (एक अनुवर्ती
        चेक `Expired or Not Found` लौटाता है)। ऐसा सेंड जो पते के अलावा किसी
        अन्य कारण से विफल होता है (ईमेल को डिलीवरी के लिए नहीं सौंपा जा सका)
        इसके बजाय `503` लौटाता है: कोई कोड नहीं भेजा जाता है, कोई बिलिंग नहीं
        होती है, सत्यापन खुला रहता है और वही अनुरोध दोहराया जा सकता है।


        **कोड फ़ॉर्मेट और ब्रांडिंग।** कोड 4–8 वर्णों के होते हैं
        (`options.code_size`, डिफ़ॉल्ट 6), डिफ़ॉल्ट रूप से संख्यात्मक; बड़े
        अक्षरों और अंकों के लिए `options.alphanumeric_code: true` सेट करें (चेक
        तुलना केस-इनसेंसिटिव होती है)। ईमेल टेम्पलेट को `options.locale` (54
        समर्थित भाषाएँ) के माध्यम से स्थानीयकृत किया जाता है और यह
        `options.use_white_label_customization` के माध्यम से आपके एप्लिकेशन की
        व्हाइट लेबल ब्रांडिंग का उपयोग कर सकता है।


        **बिलिंग।** प्रति सफल सेंड (`status: "Success"`) पर एक ईमेल सत्यापन API
        क्रेडिट, जो सेंड के समय चार्ज किया जाता है। `Retry` और `Undeliverable`
        सेंड निःशुल्क हैं, और चेक भी निःशुल्क हैं।


        **सत्र निरंतरता।** प्रत्येक नया सत्यापन एक API-प्रकार के सत्र के रूप में
        सुरक्षित किया जाता है: `request_id` एक वास्तविक सत्र आईडी है जिसे आप
        `GET /v3/session/{sessionId}/decision/` को पास कर सकते हैं, सत्यापन
        Business Console में दिखाई देता है, और इसके आगे बढ़ने पर
        `status.updated` webhook ट्रिगर होते हैं।


        **सैंडबॉक्स।** सैंडबॉक्स API कुंजियाँ डिलीवरी और बिलिंग को छोड़ देती
        हैं: अनुरोध सत्यापन के बाद (गलत फ़ॉर्मेट वाला इनपुट अभी भी `400` लौटाता
        है), endpoint एक यादृच्छिक `request_id` के साथ एक स्थिर `Success`
        payload लौटाता है; कोई ईमेल नहीं भेजा जाता है और कुछ भी सुरक्षित नहीं
        किया जाता है। सैंडबॉक्स चेक पर कोड `123456` का उपयोग करें।


        **प्रमाणीकरण।** अपने एप्लिकेशन की API कुंजी को `x-api-key` हेडर में
        भेजें। अनुपलब्ध या अमान्य क्रेडेंशियल `403` (`{"detail": "You do not
        have permission to perform this action."}`) लौटाते हैं — यह API कभी भी
        `401` नहीं लौटाती है।


        **रेट लिमिट।** सभी POST/PATCH/DELETE endpoints पर प्रति API कुंजी 300
        अनुरोध/मिनट का साझा राइट बजट; इससे अधिक होने पर `429` लौटता है।
      operationId: post_v3email_send
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    प्राप्तकर्ता का ईमेल पता। विकृत पते `400` लौटाते हैं;
                    सिंटैक्स की दृष्टि से मान्य पते जो मेल प्राप्त नहीं कर सकते
                    (विफल DNS/MX सत्यापन) `status: "Undeliverable"` के साथ `200`
                    लौटाते हैं।
                  example: alice@example.com
                options:
                  type: object
                  description: >-
                    OTP प्रारूप, स्थानीयकरण और ब्रांडिंग विकल्प। सभी फ़ील्ड
                    वैकल्पिक हैं।
                  properties:
                    code_size:
                      type: integer
                      minimum: 4
                      maximum: 8
                      default: 6
                      description: >-
                        OTP में वर्णों की संख्या (डिफ़ॉल्ट रूप से अंक; बड़े
                        अक्षर और अंक जब `alphanumeric_code` का मान `true` हो)।
                    alphanumeric_code:
                      type: boolean
                      default: false
                      description: >-
                        जब `true` होता है, तो OTP केवल अंकों के बजाय बड़े
                        अक्षरों `A–Z` और अंकों `0–9` से बना होता है।
                        `/v3/email/check/` तुलना केस-असंवेदनशील होती है।
                    locale:
                      type: string
                      maxLength: 5
                      enum:
                        - en
                        - ar
                        - bn
                        - bg
                        - bs
                        - ca
                        - cs
                        - da
                        - de
                        - el
                        - es
                        - et
                        - fa
                        - fi
                        - fr
                        - he
                        - hi
                        - hr
                        - hu
                        - hy
                        - id
                        - it
                        - ja
                        - ka
                        - kk
                        - ko
                        - ky
                        - lt
                        - lv
                        - cnr
                        - mk
                        - mn
                        - ms
                        - nl
                        - 'no'
                        - pl
                        - pt-BR
                        - pt
                        - ro
                        - ru
                        - sk
                        - sl
                        - so
                        - sq
                        - sr
                        - sv
                        - th
                        - tr
                        - uk
                        - uz
                        - vi
                        - zh-CN
                        - zh-TW
                        - zh
                      description: >-
                        OTP ईमेल टेम्पलेट की भाषा। डिफ़ॉल्ट रूप से `en`।
                        असमर्थित मान सभी समर्थित लोकेल सूचीबद्ध करते हुए `400`
                        लौटाते हैं।
                      example: en
                    use_white_label_customization:
                      type: boolean
                      default: false
                      description: >-
                        जब `true` होता है, तो OTP ईमेल डिफ़ॉल्ट Didit टेम्पलेट
                        के बजाय आपके एप्लिकेशन के व्हाइट लेबल अनुकूलन (लोगो,
                        रंग, प्रेषक ब्रांडिंग) का उपयोग करता है।
                signals:
                  type: object
                  description: >-
                    अंतिम उपयोगकर्ता के बारे में वैकल्पिक डिवाइस और नेटवर्क
                    सिग्नल, जो धोखाधड़ी-रोधी परत को अग्रेषित किए जाते हैं ताकि
                    दुरुपयोगी या स्वचालित ट्रैफ़िक का बेहतर पता लगाया जा सके।
                    सभी फ़ील्ड वैकल्पिक हैं।
                  properties:
                    ip:
                      type: string
                      description: अंतिम उपयोगकर्ता के डिवाइस का IP पता। IPv4 या IPv6।
                      example: 192.0.2.1
                    device_id:
                      type: string
                      maxLength: 255
                      description: >-
                        अंतिम उपयोगकर्ता के डिवाइस का विशिष्ट पहचानकर्ता।
                        Android: `ANDROID_ID`; iOS: `identifierForVendor`।
                      example: 8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2
                    device_platform:
                      type: string
                      enum:
                        - android
                        - ios
                        - ipados
                        - tvos
                        - web
                      description: अंतिम उपयोगकर्ता के डिवाइस का प्लेटफ़ॉर्म।
                    device_model:
                      type: string
                      maxLength: 255
                      description: अंतिम उपयोगकर्ता के डिवाइस का मॉडल।
                      example: iPhone17,2
                    os_version:
                      type: string
                      maxLength: 64
                      description: अंतिम उपयोगकर्ता के डिवाइस का ऑपरेटिंग-सिस्टम संस्करण।
                      example: 18.0.1
                    app_version:
                      type: string
                      maxLength: 64
                      description: आपके एप्लिकेशन का संस्करण।
                      example: 1.2.34
                    user_agent:
                      type: string
                      maxLength: 512
                      description: अंतिम उपयोगकर्ता के ब्राउज़र या ऐप का यूज़र एजेंट।
                      example: >-
                        Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X)
                        AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3
                        Mobile/15E148 Safari/604.1
                vendor_data:
                  type: string
                  description: >-
                    वैकल्पिक कॉलर-नियंत्रित पहचानकर्ता (आपकी आंतरिक उपयोगकर्ता
                    id, एक ईमेल, एक UUID, आदि) जो सत्र में सुरक्षित रहता है और
                    भेजने के रिस्पॉन्स, मिलान जांच रिस्पॉन्स, webhook और
                    Business Console में वापस लौटाया जाता है। Didit के
                    `request_id` को अपने उपयोगकर्ता रिकॉर्ड के साथ सहसंबंधित
                    करने के लिए इसका उपयोग करें।
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    वैकल्पिक फ़्री-फ़ॉर्म JSON ऑब्जेक्ट जो सत्र पर बना रहता है
                    और सेंड रिस्पॉन्स, मिलान जांच रिस्पॉन्स, webhooks और
                    Business Console में वापस प्रदर्शित होता है।
              required:
                - email
            examples:
              Numeric 6-digit code:
                summary: डिफ़ॉल्ट — अंग्रेज़ी में 6 अंकों का संख्यात्मक कोड
                value:
                  email: alice@example.com
                  options:
                    locale: en
                  vendor_data: user-1234
              Alphanumeric 8-character code:
                summary: अपरकेस अक्षर + अंक, स्पैनिश टेम्पलेट
                value:
                  email: bob@example.com
                  options:
                    code_size: 8
                    alphanumeric_code: true
                    locale: es
              White-label branding:
                summary: अपने एप्लिकेशन के व्हाइट लेबल अनुकूलन के साथ OTP ईमेल भेजें
                value:
                  email: carol@example.com
                  options:
                    locale: en
                    use_white_label_customization: true
                  vendor_data: user-5678
      responses:
        '200':
          description: >-
            भेजने की पुष्टि की गई। `status` की जाँच करें: `Success` और `Retry`
            का अर्थ है कि एक कोड रास्ते में है; `Undeliverable` का अर्थ है कि
            पता मेल प्राप्त नहीं कर सकता है और सत्यापन पहले ही `Declined` के रूप
            में अंतिम रूप ले चुका है। `request_id` संग्रहीत सत्र आईडी है
            (`Retry` पर वही आईडी)।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationSendResponse'
              examples:
                Success:
                  summary: एक नए सत्यापन के लिए ईमेल किया गया OTP (बिल किया गया)
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Success
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Retry:
                  summary: >-
                    5 मिनट की समय-सीमा के भीतर दूसरा प्रेषण — नया कोड, समान
                    request_id, निःशुल्क
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Retry
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Undeliverable:
                  summary: >-
                    पता DNS/MX सत्यापन में विफल रहा — सत्यापन अस्वीकृत के रूप
                    में अंतिम रूप दिया गया, कोई बिलिंग नहीं हुई
                  value:
                    request_id: cb1a5011-344d-444d-bdce-218904745d7f
                    status: Undeliverable
                    reason: email_can_not_be_delivered
                    vendor_data: user-1234
                    metadata: null
        '400':
          description: >-
            सत्यापन त्रुटि — DRF का फ़ील्ड-त्रुटि एनवलप: प्रति त्रुटियुक्त
            फ़ील्ड संदेशों का एक ऐरे, विकल्प त्रुटियों के लिए `options` के
            अंतर्गत नेस्टेड।
          content:
            application/json:
              examples:
                Invalid email:
                  summary: गलत स्वरूपित ईमेल पता
                  value:
                    email:
                      - Enter a valid email address.
                Unsupported locale:
                  summary: '`options.locale` समर्थित सेट से बाहर है'
                  value:
                    options:
                      locale:
                        - >-
                          Invalid locale. Supported locales are en, ar, bn, bg,
                          bs, ca, cs, da, de, el, es, et, fa, fi, fr, he, hi,
                          hr, hu, hy, id, it, ja, ka, kk, ko, ky, lt, lv, cnr,
                          mk, mn, ms, nl, no, pl, pt-BR, pt, ro, ru, sk, sl, so,
                          sq, sr, sv, th, tr, uk, uz, vi, zh-CN, zh-TW, zh.
                Code size out of range:
                  summary: '`options.code_size` 4–8 से बाहर है'
                  value:
                    options:
                      code_size:
                        - Ensure this value is less than or equal to 8.
        '403':
          description: >-
            अनुमति अस्वीकृत। तब लौटाया जाता है जब `x-api-key` हेडर अनुपलब्ध हो
            (`{"detail": ...}`); गलत, निरस्त या समय-सीमा समाप्त कुंजी `401`
            लौटाती है। किसी भी सेंड से पहले तब भी लौटाया जाता है जब संगठन का
            बैलेंस एक ईमेल सत्यापन API क्रेडिट को कवर नहीं कर सकता (`{"error":
            ...}`).
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: कोई `x-api-key` हेडर नहीं, या कुंजी अमान्य/निरस्त है
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: संगठन का बैलेंस भेजने की कीमत को कवर नहीं कर सकता
                  value:
                    error: You don't have enough credits to perform this request.
        '429':
          description: >-
            रेट लिमिट पार हो गई। POST/PATCH/DELETE endpoints प्रति मिनट प्रति
            API कुंजी 300 राइट अनुरोधों का बजट साझा करते हैं (लेन-देन निर्माण और
            इवेंट इनजेशन का 600 का एक अलग बजट है)। रिस्पॉन्स में
            `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` और
            `Retry-After` हेडर होते हैं।
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: वर्तमान मिनट में 300 से अधिक राइट अनुरोध
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '503':
          description: >-
            पते से असंबंधित किसी कारण से ईमेल नहीं भेजा जा सका (ईमेल प्रदाता से
            संपर्क नहीं हो सका, टाइम आउट हो गया या उसने स्वयं भेजने से मना कर
            दिया), इसलिए कोई कोड नहीं भेजा गया और न ही कुछ बिल किया गया या भेजने
            के प्रयास के रूप में गिना गया। वही अनुरोध दोहराएं।
          content:
            application/json:
              examples:
                Email delivery unavailable:
                  summary: एक स्वचालित पुनः प्रयास के बाद ईमेल प्रदाता विफल रहा
                  value:
                    detail: >-
                      Email delivery is temporarily unavailable. Please try
                      again.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/email/send/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "email": "alice@example.com",
                "options": { "code_size": 6, "locale": "en" },
                "vendor_data": "user-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.email.send_code(
                email="alice@example.com",
                options={
                    "locale": "en",
                },
                vendor_data="user-1234",
            )
            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.email.sendCode({
              email: "alice@example.com",
              options: {
                locale: "en",
              },
              vendor_data: "user-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.SendCode(ctx, didit.EmailSendCodeParams{\n\tEmail: \"alice@example.com\",\n\tOptions: didit.Some(didit.EmailSendCodeParamsOptions{\n\t\tLocale: didit.Some(didit.EmailSendCodeParamsOptionsLocale(\"en\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.EmailSendCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.email().sendCode(EmailSendCodeParams.builder()
                    .email("alice@example.com")
                    .options(EmailSendCodeParams.Options.builder()
                            .locale(EmailSendCodeParams.Options.Locale.of("en"))
                            .build())
                    .vendorData("user-1234")
                    .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->email->sendCode([
                'email' => 'alice@example.com',
                'options' => [
                    'locale' => 'en',
                ],
                'vendor_data' => 'user-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.email.send_code(
              email: "alice@example.com",
              options: {
                locale: "en",
              },
              vendor_data: "user-1234"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Email.SendCodeAsync(new
            EmailSendCodeParams

            {
                Email = "alice@example.com",
                Options = new EmailSendCodeParamsOptions
                {
                    Locale = new EmailSendCodeParamsOptionsLocale("en"),
                },
                VendorData = "user-1234",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    EmailVerificationSendResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            सत्यापन का सत्र id। `Retry` भेजने पर मूल भेजने के समान `request_id`
            लौटता है। यह id Business Console में दिखाई देता है, फ़ाइनलाइज़ किए
            गए `POST /v3/email/check/` द्वारा फिर से लौटाया जाता है, और इसे `GET
            /v3/session/{sessionId}/decision/` पर पास किया जा सकता है।
        status:
          type: string
          enum:
            - Success
            - Retry
            - Undeliverable
          description: >-
            `Success` — OTP को एक नए सत्यापन पर ईमेल किया गया (बिल किया गया)।
            `Retry` — पिछले प्रेषण द्वारा बनाए गए लंबित सत्यापन के लिए नया OTP
            ईमेल किया गया (निःशुल्क)। `Undeliverable` — पता डिलीवरी सत्यापन में
            विफल रहा या संदेश नहीं भेजा जा सका; सत्यापन को तुरंत `Declined` के
            रूप में फ़ाइनलाइज़ कर दिया जाता है और कुछ भी बिल नहीं किया जाता है।
        reason:
          type: string
          nullable: true
          enum:
            - email_can_not_be_delivered
            - null
          description: >-
            `status` के `Undeliverable` होने पर `email_can_not_be_delivered`;
            अन्यथा `null`।
        vendor_data:
          type: string
          nullable: true
          description: सत्र पर संग्रहीत `vendor_data` का इको (पहली बार भेजे गए डेटा से)।
        metadata:
          type: object
          nullable: true
          description: सत्र पर संग्रहीत `metadata` का इको (पहली बार भेजे गए डेटा से)।
  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.