> ## 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: प्रोग्रामेटिक एप्लिकेशन

> Didit में प्रति ग्राहक, ब्रांड, एनवायरनमेंट या व्यवसाय इकाई एक एप्लिकेशन बनाएँ: POST /organizations/me/{org_id}/applications/। client_id और api_key लौटाता है।



एप्लिकेशन बनाने का प्रॉम्प्ट
        प्रॉम्प्ट को क्लिपबोर्ड पर कॉपी करें



      
      

\<pre>

\`Create a new Didit application inside one of your organizations — each application has its own client_id and api_key, isolating sessions, webhooks, branding, and billing from sibling applications.

Endpoint:
POST https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/

Authentication:
Authorization: Bearer <access_token>
The access token must belong to an OWNER or ADMIN of the target organization. Get one via POST /programmatic/login/ or POST /programmatic/verify-email/.

Path parameter:
\- org_id (UUID, required) — Organization that will own the new application. Discover yours via GET /organizations/me/.

Request body (ALL fields optional — omit the body to get a default-named app):
\- name (string, optional) — Display name. Defaults to "<organization name> App".
\- website_url (string, URL, optional) — Public homepage shown in the verification flow.
\- redirect_uris (array of strings, optional) — Allowlisted OAuth-style redirect URIs.
\- terms_url (string, URL, optional) — Terms-of-service link shown in the verification UI.
\- privacy_url (string, URL, optional) — Privacy policy link shown in the verification UI.
\- description (string, optional) — Internal note. Not shown to end users.
\- data_location (string, optional) — Where the application's verification data is stored and processed: "eu" (European Union, Ireland), the default. "au" (Australia, Sydney) and "mx" (Mexico) are coming soon and answer 400 today. Chosen once: it can't be changed after the application is created.

When to call:
\- Resellers — one application per end customer to fully isolate credentials, branding, webhooks, and billing.
\- Multi-brand / multi-product — one application per brand, product, region, or environment (dev / staging / prod).
\- Use-case separation — e.g. one application for ID + selfie KYC, another for AML screening only.

curl example:
curl -X POST "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Customer App",
"website_url": "https://acme.example",
"redirect_uris": ["https://acme.example/callback"],
"terms_url": "https://acme.example/terms",
"privacy_url": "https://acme.example/privacy",
"data_location": "eu"
}'

Response (201 Created):
\{
"uuid": "b2c3d4e5-6789-...",
"name": "Acme Customer App",
"client_id": "S9LIYGSoWNuGMLHsvEt9dQ",
"api_key": "sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"website_url": "https://acme.example",
"redirect_uris": ["https://acme.example/callback"],
"terms_url": "https://acme.example/terms",
"privacy_url": "https://acme.example/privacy",
"description": null,
"created_at": "2025-06-01T10:00:00Z",
"data_location": "eu",
"products": [
\{ "product": "identity", "status": "enabled", "modules": { "user_verification": true, "business_verification": true, "case_management": true } },
\{ "product": "transactions", "status": "disabled", "modules": { "travel_rule": true, "case_management": true } },
\{ "product": "authentication", "status": "disabled", "modules": {} }
]
}

What to do with the response:
\- PERSIST api_key SECURELY — use it as the x-api-key header on every https://verification.didit.me/v3/... call (sessions, workflows, billing).
\- Persist uuid (app_id) — required for /organizations/me/{org_id}/applications/{app_id}/ reads and updates.
\- If you lose the api_key, recover it later via GET /organizations/me/{org_id}/applications/{app_id}/ — see /auth-api/get-credentials.
\- products is read-only and always lists identity, transactions and authentication in that order. A new application has identity enabled with every module on, and transactions and authentication disabled. A products key in the request body is ignored.

Failure modes:
\- 400 — { "<field>": ["Enter a valid URL."] } for malformed website_url / redirect_uris / terms_url / privacy_url.
\- 400 — { "data_location": ["This data location is not available yet."] } for "au" or "mx", and { "data_location": ["\\"us\\" is not a valid choice."] } for a location that does not exist. Nothing is created.
\- 401: { "detail": "Invalid access token" } or { "detail": "Expired access token" } when the token is malformed or expired.
\- 403: { "detail": "Only organization owners and admins can manage applications." } when you are a member of the organization but not an owner or admin.
\- 403: { "detail": "Your access to this organization is suspended." } when your membership in the organization is suspended.
\- 403: { "detail": "You do not have permission to perform this action." } when the request has no Authorization header.
\- 404: { "detail": "Organization not found." } when the organization does not exist or you are not a member of it.

Next steps:
\- Configure a workflow inside the new application via POST /v3/workflows/ — see /management-api/workflows/create.
\- Update application metadata later via PATCH /organizations/me/{org_id}/applications/{app_id}/ — see /auth-api/update-application.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

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

इस endpoint का उपयोग तब करें जब आपको एक ही संगठन के भीतर सत्यापन ट्रैफ़िक, क्रेडेंशियल, ब्रांडिंग या रिपोर्टिंग को अलग रखना हो।यह खास तौर पर उन **रीसेलर** के लिए उपयोगी है जो हर ग्राहक के लिए एक एप्लिकेशन बनाते हैं। यह तब भी अच्छी तरह काम करता है जब आपकी अपनी कंपनी के कई प्रोडक्ट, ब्रांड, क्षेत्र, स्टेजिंग/प्रोडक्शन एनवायरनमेंट या उपयोग के मामले हों, जिन्हें एक ही API कुंजी और एप्लिकेशन-स्तर की सेटिंग्स साझा नहीं करनी चाहिए।> [!NOTE]
>
> सभी Auth API endpoints `https://apx.didit.me/auth/v2` का उपयोग करते हैं। `https://verification.didit.me/v3/...` endpoints (जैसे सत्र और वर्कफ़्लो) को कॉल करते समय लौटाई गई `api_key` को `x-api-key` के रूप में उपयोग करें।## डेटा स्थानहर एप्लिकेशन अपना सत्यापन डेटा एक ही जगह संग्रहीत और संसाधित करता है, यानी उसका डेटा स्थान, जिसे आप एप्लिकेशन बनाते समय `data_location` के साथ चुनते हैं।
अभी केवल एक स्थान उपलब्ध है: `eu`, यानी यूरोपीय संघ (आयरलैंड)। यह तब भी डिफ़ॉल्ट होता है जब आप यह फ़ील्ड छोड़ देते हैं।
ऑस्ट्रेलिया (सिडनी, `au`) और मेक्सिको (`mx`) जल्द आ रहे हैं। जो अनुरोध इनमें से किसी का नाम लेता है, उसका जवाब 400 `This data location is not available yet.` होता है और कुछ भी नहीं बनता।
एप्लिकेशन को पढ़ने पर हर बार उसका `data_location` लौटता है, और एप्लिकेशन बन जाने के बाद इसे बदला नहीं जा सकता।
देखें: [डेटा स्थान](https://docs.didit.me/hi/console/applications.md#डेटा-स्थान)।


## OpenAPI

````yaml hi/openapi-auth.json POST /organizations/me/{org_id}/applications/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    डेवलपर्स और AI एजेंट्स के लिए प्रोग्रामेटिक रजिस्ट्रेशन और प्रमाणीकरण API। 2
    API कॉल्स में रजिस्टर करें -- किसी ब्राउज़र की आवश्यकता नहीं। सबसे अधिक
    एजेंट-अनुकूल पहचान सत्यापन प्लेटफ़ॉर्म।


    ## बेस URL


    इस विनिर्देश के सभी endpoints `https://apx.didit.me/auth/v2` पर होस्ट किए गए
    हैं। यह सत्यापन API (`https://verification.didit.me/v3`) से एक अलग होस्ट है।
    इनका अंतर स्पष्ट रखें: यह ऑथ होस्ट आपके **JWT access tokens** जारी करता है
    और आपको अपने **संगठनों** और **एप्लिकेशन्स** को सूचीबद्ध और प्रबंधित करने की
    अनुमति देता है। सत्यापन होस्ट वह जगह है जहां आप इस API द्वारा लौटाए गए
    **`api_key`** के साथ प्रमाणित होकर सत्रों, वर्कफ़्लो, AML आदि को कॉल करते
    हैं।


    ## ऑथ फ़्लो कैसे काम करता है


    1. `POST /programmatic/register/` — ईमेल + पासवर्ड सबमिट करें।

    2. ईमेल द्वारा 6-वर्णों का अल्फ़ान्यूमेरिक कोड प्राप्त करें।

    3. `POST /programmatic/verify-email/` — कोड सबमिट करें। आपको एक JWT
    `access_token`, एक `refresh_token`, एक संगठन और `client_id` + `api_key` के
    साथ एक डिफ़ॉल्ट एप्लिकेशन वापस मिलता है।

    4. `api_key` को सहेजें। `https://verification.didit.me/v3/...` पर प्रत्येक
    कॉल के लिए इसे `x-api-key` के रूप में उपयोग करें।

    5. भविष्य में किसी भी मशीन से, `POST /programmatic/login/` आपके ईमेल +
    पासवर्ड के बदले एक नया JWT प्राप्त करता है, फिर क्रेडेंशियल्स को रिकवर या
    रोटेट करने के लिए `GET /organizations/me/` और एप्लिकेशन endpoints को कॉल
    करें।


    JWT केवल इस विनिर्देश में **Account Management** endpoints के लिए आवश्यक है;
    सत्यापन API ट्रैफ़िक लंबी अवधि वाले `api_key` का उपयोग करता है, न कि JWT का।


    ## कन्वेंशन


    - सभी अनुरोध और रिस्पॉन्स बॉडी JSON (`Content-Type: application/json`) हैं।

    - **`POST /programmatic/register/` का परीक्षण करते समय वास्तविक, डिलीवर होने
    योग्य ईमेल पते का उपयोग करें।** endpoint सत्यापन कोड को सिंक्रोनस रूप से
    भेजता है, इसलिए आरक्षित परीक्षण डोमेन (`@example.com`, `@example.org`,
    `@*.test`, `@*.example`, `@*.invalid`) पर पतों को मेल डिलीवरी द्वारा
    अस्वीकार कर दिया जाता है और अनुरोध `500` लौटाता है। नमूनों में दिए गए
    `you@yourdomain.com` प्लेसहोल्डर को ऐसे इनबॉक्स से बदलें जिसे आप वास्तव में
    पढ़ सकते हैं।

    - सत्यापन त्रुटियां दो में से किसी एक एन्वेलप के साथ HTTP `400` लौटाती हैं:
    फ़ील्ड-स्तरीय समस्याओं के लिए `{"field": ["message", ...]}` या
    व्यावसायिक-नियम त्रुटियों के लिए `{"detail": "message"}`। कुछ वैलिडेटर
    (रजिस्टर पर पासवर्ड की मजबूती, verify-email पर कोड की समय-सीमा समाप्ति)
    वर्तमान में फ़ील्ड-की वाले फ़ॉर्म के बजाय केवल एक ऐरे `["message"]` के साथ
    रिस्पॉन्स देते हैं -- यह एक ज्ञात सर्वर-साइड विसंगति है, इसलिए क्लाइंट कोड
    को दोनों प्रारूपों को स्वीकार करना चाहिए।

    - प्रमाणीकरण त्रुटियां HTTP `401` (अमान्य bearer token) या `403` (अनुपलब्ध
    bearer token / अपर्याप्त विशेषाधिकार) के साथ `{"detail": "..."}` के रूप में
    वापस आती हैं।

    - रेट लिमिट रिस्पॉन्स में सेकंड में कूलडाउन के साथ एक `wait` फ़ील्ड शामिल
    होता है।
servers:
  - url: https://apx.didit.me/auth/v2
    description: प्रोडक्शन ऑथ सर्वर
security: []
tags:
  - name: Programmatic Auth
    description: >-
      ईमेल-और-पासवर्ड खाता जीवनचक्र: रजिस्टर करें, सत्यापित करें, लॉगिन करें। यह
      JWT `access_token` लौटाता है जिसका उपयोग आप खाता प्रबंधन endpoints के लिए
      करते हैं, साथ ही (सत्यापन पर) आपके पहले एप्लिकेशन की `client_id` और
      `api_key` भी।
  - name: Account Management
    description: >-
      प्रमाणित endpoints (JWT bearer) जो संगठनों को सूचीबद्ध करते हैं और
      एप्लिकेशन बनाते, प्राप्त करते या अपडेट करते हैं। इनका उपयोग उस `api_key`
      को पुनर्प्राप्त या रोटेट करने के लिए करें जिसके साथ आप सत्यापन API कॉल को
      प्रमाणित करते हैं।
paths:
  /organizations/me/{org_id}/applications/:
    post:
      tags:
        - Account Management
      summary: एप्लिकेशन बनाएं
      description: >-
        अपने चुने हुए डेटा स्थान (`data_location`, डिफ़ॉल्ट रूप से यूरोपीय संघ;
        इसे बाद में बदला नहीं जा सकता) में एक संगठन के भीतर एक एप्लिकेशन बनाएँ।
        रिस्पॉन्स में `api_key` शामिल होता है; इसे अभी सहेज लें (GET के माध्यम
        से पुनर्प्राप्त करने योग्य)। स्वामी/व्यवस्थापक JWT की आवश्यकता होती है।
      operationId: create_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: संगठन का UUID। इसे `GET /organizations/me/` से देखें।
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
      requestBody:
        required: false
        description: >-
          सभी फ़ील्ड वैकल्पिक हैं। बॉडी को छोड़ने पर डिफ़ॉल्ट नाम
          `"<organization name> App"` वाला ऐसा एप्लिकेशन बनता है जिसमें कोई
          सार्वजनिक URL कॉन्फ़िगर नहीं है।
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationCreateRequest'
            examples:
              ResellerCustomer:
                summary: ग्राहक-स्कोप वाला एप्लिकेशन शुरू करने वाला रीसेलर
                value:
                  name: Acme Customer App
                  website_url: https://acme.example
                  redirect_uris:
                    - https://acme.example/callback
                  terms_url: https://acme.example/terms
                  privacy_url: https://acme.example/privacy
                  data_location: eu
              Minimal:
                summary: न्यूनतम निर्माण -- सभी डिफ़ॉल्ट स्वीकार करें
                value:
                  name: Sandbox App
              Empty:
                summary: कोई बॉडी नहीं -- डिफ़ॉल्ट रूप से <org name> App
                value: {}
      responses:
        '201':
          description: >-
            एप्लिकेशन बनाया गया। रिस्पॉन्स में दीर्घकालिक `api_key` शामिल होती
            है; इसे अभी सहेजें और प्रत्येक
            `https://verification.didit.me/v3/...` कॉल पर `x-api-key` हेडर के
            रूप में उपयोग करें।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: Acme Customer App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://acme.example
                    redirect_uris:
                      - https://acme.example/callback
                    terms_url: https://acme.example/terms
                    privacy_url: https://acme.example/privacy
                    description: null
                    created_at: '2025-06-01T10:00:00Z'
                    data_location: eu
                    products:
                      - product: identity
                        status: enabled
                        modules:
                          user_verification: true
                          business_verification: true
                          case_management: true
                      - product: transactions
                        status: disabled
                        modules:
                          travel_rule: true
                          case_management: true
                      - product: authentication
                        status: disabled
                        modules: {}
        '400':
          description: >-
            अनुरोध बॉडी में सत्यापन त्रुटि: उदाहरण के लिए एक विकृत रीडायरेक्ट
            URI, एक `data_location` जो अभी उपलब्ध नहीं है (`au`, `mx`) या ऐसा जो
            मौजूद नहीं है। कुछ भी नहीं बनाया गया है।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationNotAvailable:
                  summary: एक डेटा स्थान जो जल्द ही आ रहा है
                  value:
                    data_location:
                      - This data location is not available yet.
                UnknownDataLocation:
                  summary: एक डेटा स्थान जो मौजूद नहीं है
                  value:
                    data_location:
                      - '"us" is not a valid choice.'
        '401':
          description: >-
            एक्सेस token विकृत, अमान्य या समय-सीमा समाप्त है। `POST
            /programmatic/login/` के साथ एक नया प्राप्त करें।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                InvalidToken:
                  value:
                    detail: Invalid access token
                ExpiredToken:
                  value:
                    detail: Expired access token
        '403':
          description: >-
            आप इस संगठन में एप्लिकेशन नहीं बना सकते। संगठन का एक सदस्य जो स्वामी
            या व्यवस्थापक नहीं है, उसे `Only organization owners and admins can
            manage applications.` प्राप्त होता है। एक स्वामी या व्यवस्थापक जिसकी
            संगठन तक पहुँच निलंबित है, उसे `Your access to this organization is
            suspended.` प्राप्त होता है। बिना `Authorization` हेडर वाले अनुरोध
            को `You do not have permission to perform this action.` प्राप्त होता
            है। आपके द्वारा अपना खाता पुनर्प्राप्त करने के 72 घंटे बाद तक,
            अनुरोध को `code` `recovery_hold` और `until` (होल्ड समाप्त होने का
            समय) के साथ अस्वीकार कर दिया जाता है।
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/AuthError'
                  - $ref: '#/components/schemas/RecoveryHoldError'
              examples:
                NotOwnerOrAdmin:
                  summary: सदस्य जो स्वामी या व्यवस्थापक नहीं है
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: सदस्यता निलंबित
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: कोई Authorization हेडर नहीं
                  value:
                    detail: You do not have permission to perform this action.
                RecoveryHold:
                  summary: खाता 72 घंटे से भी कम समय पहले पुनर्प्राप्त किया गया
                  value:
                    detail: This action is on hold because you recovered your account.
                    code: recovery_hold
                    until: '2026-11-04T10:15:00+00:00'
        '404':
          description: संगठन मौजूद नहीं है या आप इसके सदस्य नहीं हैं।
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: संगठन नहीं मिला, या आप सदस्य नहीं हैं
                  value:
                    detail: Organization not found.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X POST
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Customer App",
                "website_url": "https://acme.example",
                "redirect_uris": ["https://acme.example/callback"],
                "data_location": "eu"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Use the access token that account.login returns.
            client = Didit(account_token="YOUR_ACCESS_TOKEN")

            result = client.account.applications.create(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                name="Acme Customer App",
                website_url="https://acme.example",
                redirect_uris=["https://acme.example/callback"],
                terms_url="https://acme.example/terms",
                privacy_url="https://acme.example/privacy",
                data_location="eu",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Use the access token that account.login returns.

            const didit = new Didit({ accountToken: "YOUR_ACCESS_TOKEN" });


            const result = await
            didit.account.applications.create("a1b2c3d4-5678-90ab-cdef-111111111111",
            {
              name: "Acme Customer App",
              website_url: "https://acme.example",
              redirect_uris: ["https://acme.example/callback"],
              terms_url: "https://acme.example/terms",
              privacy_url: "https://acme.example/privacy",
              data_location: "eu",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Create(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", didit.ApplicationCreateRequest{\n\tName:         didit.String(\"Acme Customer App\"),\n\tWebsiteURL:   didit.String(\"https://acme.example\"),\n\tRedirectURIs: didit.Some([]string{\"https://acme.example/callback\"}),\n\tTermsURL:     didit.String(\"https://acme.example/terms\"),\n\tPrivacyURL:   didit.String(\"https://acme.example/privacy\"),\n\tDataLocation: didit.Some(didit.ApplicationDataLocation(\"eu\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.ApplicationCreateRequest;

            import me.didit.types.ApplicationDataLocation;


            // Use the access token that account.login returns.

            Didit client =
            Didit.builder().accountToken("YOUR_ACCESS_TOKEN").build();


            var result =
            client.account().applications().create("a1b2c3d4-5678-90ab-cdef-111111111111",
            ApplicationCreateRequest.builder()
                    .name("Acme Customer App")
                    .websiteUrl("https://acme.example")
                    .redirectUris(List.of("https://acme.example/callback"))
                    .termsUrl("https://acme.example/terms")
                    .privacyUrl("https://acme.example/privacy")
                    .dataLocation(ApplicationDataLocation.of("eu"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Use the access token that account.login returns.

            $didit = new DiditClient(accountToken: 'YOUR_ACCESS_TOKEN');


            $result =
            $didit->account->applications->create('a1b2c3d4-5678-90ab-cdef-111111111111',
            [
                'name' => 'Acme Customer App',
                'website_url' => 'https://acme.example',
                'redirect_uris' => ['https://acme.example/callback'],
                'terms_url' => 'https://acme.example/terms',
                'privacy_url' => 'https://acme.example/privacy',
                'data_location' => 'eu',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Use the access token that account.login returns.
            didit = Didit::Client.new(account_token: "YOUR_ACCESS_TOKEN")

            result = didit.account.applications.create(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              name: "Acme Customer App",
              website_url: "https://acme.example",
              redirect_uris: ["https://acme.example/callback"],
              terms_url: "https://acme.example/terms",
              privacy_url: "https://acme.example/privacy",
              data_location: "eu"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Use the access token that account.login returns.

            using var client = new DiditClient(new DiditClientOptions {
            AccountToken = "YOUR_ACCESS_TOKEN" });


            var result = await
            client.Account.Applications.CreateAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            new ApplicationCreateRequest

            {
                Name = "Acme Customer App",
                WebsiteUrl = "https://acme.example",
                RedirectUris = new string[] { "https://acme.example/callback" },
                TermsUrl = "https://acme.example/terms",
                PrivacyUrl = "https://acme.example/privacy",
                DataLocation = new ApplicationDataLocation("eu"),
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    ApplicationCreateRequest:
      type: object
      description: >-
        सभी फ़ील्ड वैकल्पिक हैं। एक खाली बॉडी भेजने से यूरोपीय संघ में डिफ़ॉल्ट
        नाम वाला एक एप्लिकेशन बनता है।
      properties:
        name:
          type: string
          description: एप्लिकेशन प्रदर्शन नाम। डिफ़ॉल्ट `"<organization name> App"` है।
          example: Acme Customer App
        website_url:
          type: string
          description: इस एप्लिकेशन से संबद्ध वेबसाइट या ऐप URL।
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            OAuth-शैली और सत्यापन रीडायरेक्ट फ़्लो के लिए स्वीकृत रीडायरेक्ट
            URI।
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: सत्यापन फ़्लो में दिखाया गया सेवा की शर्तों का URL।
          example: https://acme.example/terms
        privacy_url:
          type: string
          description: सत्यापन फ़्लो में दिखाया गया गोपनीयता नीति URL।
          example: https://acme.example/privacy
        description:
          type: string
          description: >-
            एप्लिकेशन के लिए आंतरिक विवरण (अंतिम उपयोगकर्ताओं को नहीं दिखाया
            जाता)।
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    Application:
      type: object
      description: >-
        पूर्ण एप्लिकेशन रिकॉर्ड। निर्माण के बाद `uuid`, `client_id`, और
        `api_key` कभी नहीं बदलते। `data_location` भी नहीं बदलता, सिवाय आपके
        संगठन के साथ बनाए गए लाइव एप्लिकेशन पर उपयोग किए जाने से पहले एक बार
        (अपडेट अनुरोध देखें)।
      properties:
        uuid:
          type: string
          format: uuid
          description: एप्लिकेशन UUID। बाद के कॉलों में `{app_id}` के रूप में उपयोग करें।
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Didit कंसोल में दिखाया जाने वाला एप्लिकेशन प्रदर्शन नाम।
          example: Acme Production App
        client_id:
          type: string
          description: >-
            सार्वजनिक क्लाइंट पहचानकर्ता, OAuth-शैली फ़्लो में एम्बेड करने के
            लिए सुरक्षित।
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            दीर्घकालिक सीक्रेट (जिसे `client_secret` भी कहा जाता है)।
            `https://verification.didit.me/v3/...` (सत्र, वर्कफ़्लो, AML, आदि)
            के प्रत्येक कॉल के लिए `x-api-key` हेडर के रूप में उपयोग करें। इसे
            क्रेडेंशियल की तरह रखें; क्लाइंट-साइड पर कभी भी उजागर न करें। नई
            कुंजियाँ `sk_live_` (लाइव एप्लिकेशन) या `sk_test_` (सैंडबॉक्स
            एप्लिकेशन) से शुरू होती हैं, जिसके बाद 43 URL-सुरक्षित वर्ण (अक्षर,
            अंक, `-` और `_`) होते हैं। इस प्रारूप से पहले बनाई गई कुंजियों में
            कोई उपसर्ग नहीं होता है और वे बिना किसी बदलाव के काम करती रहती हैं।
            आपके द्वारा अपना खाता पुनर्प्राप्त करने के 72 घंटों तक, सूचीबद्ध
            करना, प्राप्त करना और अपडेट करना कुंजी के स्थान पर यहाँ एक खाली
            स्ट्रिंग लौटाते हैं।
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: इस एप्लिकेशन से संबद्ध वेबसाइट या ऐप URL।
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            OAuth-शैली और सत्यापन रीडायरेक्ट फ़्लो के लिए स्वीकृत रीडायरेक्ट
            URI।
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: सत्यापन फ़्लो में दिखाया गया सेवा की शर्तों का URL।
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: सत्यापन फ़्लो में दिखाया गया गोपनीयता नीति URL।
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            एप्लिकेशन के लिए आंतरिक विवरण (अंतिम उपयोगकर्ताओं को नहीं दिखाया
            जाता)।
        created_at:
          type: string
          format: date-time
          example: '2025-06-01T10:00:00Z'
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
        products:
          type: array
          readOnly: true
          description: >-
            एप्लिकेशन के उत्पाद। हमेशा तीनों, इसी क्रम में: `identity`,
            `transactions`, `authentication`। एक नए एप्लिकेशन में प्रत्येक
            मॉड्यूल चालू होने के साथ `identity` सक्षम होती है, और `transactions`
            व `authentication` अक्षम होते हैं। केवल-पढ़ने योग्य: निर्माण या
            अपडेट बॉडी में `products` कुंजी को अनदेखा कर दिया जाता है।
          items:
            $ref: '#/components/schemas/ApplicationProduct'
          example:
            - product: identity
              status: enabled
              modules:
                user_verification: true
                business_verification: true
                case_management: true
            - product: transactions
              status: disabled
              modules:
                travel_rule: true
                case_management: true
            - product: authentication
              status: disabled
              modules: {}
    ValidationError:
      description: >-
        सत्यापन त्रुटि बॉडी। अभीष्ट एनवलप फ़ील्ड-स्तरीय त्रुटियों के लिए
        `{field: ["message", ...]}` मैप या व्यावसायिक-नियम त्रुटियों के लिए
        `{detail: "..."}` सिंगल-की एनवलप है। मुट्ठी भर सत्यापनकर्ता (register पर
        पासवर्ड स्ट्रेंथ, verify-email पर कोड वैधता) वर्तमान में एक बेयर ऐरे
        `["message"]` के साथ रिस्पॉन्स देते हैं -- ज्ञात सर्वर-साइड विसंगति।
        नीचे दिया गया स्कीमा उस बेयर-ऐरे शाखा को बनाए रखता है ताकि इस विनिर्देश
        से उत्पन्न क्लाइंट कोड आज के रिस्पॉन्स को डिसेरिएलाइज़ कर सके, लेकिन नए
        क्लाइंट कोड को इसे प्रासंगिक फ़ील्ड-की वाले रूप (`{password: [...]}` या
        `{code: [...]}`) के रूप में मानना चाहिए और सर्वर अनुबंध उस आकार पर
        अभिसरित होगा।
      oneOf:
        - type: object
          additionalProperties:
            type: array
            items:
              type: string
          example:
            email:
              - Enter a valid email address.
        - type: object
          properties:
            detail:
              type: string
          example:
            detail: An account with this email already exists.
        - type: array
          items:
            type: string
          example:
            - Invalid or expired verification code.
    AuthError:
      type: object
      description: प्रमाणीकरण / प्राधिकरण / नहीं-मिला त्रुटि एनवलप।
      properties:
        detail:
          type: string
          example: Invalid access token
    RecoveryHoldError:
      type: object
      description: >-
        खाता रिकवर होने (खोए हुए साइन-इन तरीके रीसेट किए जाने) के बाद 72 घंटे तक
        लौटाया जाता है। संगठन, एप्लिकेशन या सीक्रेट बनाने वाली कार्रवाइयों को
        `until` तक अस्वीकार कर दिया जाता है; पढ़ने की क्रियाएं काम करती रहती
        हैं।
      required:
        - detail
        - code
        - until
      properties:
        detail:
          type: string
          example: This action is on hold because you recovered your account.
        code:
          type: string
          enum:
            - recovery_hold
          example: recovery_hold
        until:
          type: string
          format: date-time
          description: >-
            जब होल्ड समाप्त होता है (ISO 8601)। इस समय के बाद अनुरोध का पुनः
            प्रयास करें।
          example: '2026-11-04T10:15:00+00:00'
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        एप्लिकेशन का सत्यापन डेटा कहाँ संग्रहीत और संसाधित किया जाता है, जिसे
        एप्लिकेशन बनाते समय चुना जाता है। `eu` यूरोपीय संघ (आयरलैंड) है, जो
        डिफ़ॉल्ट है। `au` (ऑस्ट्रेलिया, सिडनी) और `mx` (मेक्सिको) जल्द ही आ रहे
        हैं: उनका नाम देने वाला अनुरोध 400 `This data location is not available
        yet.` उत्तर देता है। किसी संगठन का सैंडबॉक्स एप्लिकेशन हमेशा यूरोपीय संघ
        में होता है।
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        किसी एप्लिकेशन का एक उत्पाद और उसकी स्थिति। केवल-पठन: एप्लिकेशन endpoint
        इसे लौटाते हैं और अनुरोध बॉडी में इसे अनदेखा करते हैं।
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (पहचान सत्यापन), `transactions` (लेन-देन निगरानी) या
            `authentication` (प्रमाणीकरण)।
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            क्या इस एप्लिकेशन के लिए प्रोडक्ट चालू है। `early_access` केवल
            `authentication` पर लागू होता है, जिसे Didit आपके लिए चालू करता है।
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            उत्पाद के मॉड्यूल स्विच, प्रत्येक `true` या `false`। `identity` में
            `user_verification`, `business_verification` और `case_management`
            हैं। `transactions` में `travel_rule` और `case_management` हैं।
            `authentication` में कोई नहीं है (`{}`)। `case_management` एक सेटिंग
            है जो `identity` और `transactions` दोनों के अंतर्गत दिखाई जाती है,
            इसलिए दोनों पर इसका मान समान होता है।
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        `POST /programmatic/login/` या `POST /programmatic/verify-email/` द्वारा
        लौटाया गया RS256-हस्ताक्षरित JWT `access_token`। `Authorization: Bearer
        <access_token>` के रूप में भेजें। डिफ़ॉल्ट जीवनकाल 86400 सेकंड (24 घंटे)
        है। यह token केवल `apx.didit.me/auth/v2` पर खाता प्रबंधन endpoints के
        लिए मान्य है। सत्यापन API (`verification.didit.me/v3`) इसके बजाय
        `x-api-key` के रूप में दीर्घकालिक `api_key` का उपयोग करता है।

````

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