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

# استبيان العناية الواجبة لـ VASP: الإرسال عبر API

> يرسل Didit استبيان العناية الواجبة القياسي بالبريد الإلكتروني إلى عنوان الامتثال المسجل لدى VASP الطرف المقابل ضمن Travel Rule.



موجّه إرسال استبيان VASP عبر API
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Email Didit's standard due-diligence questionnaire to a Travel Rule counterparty VASP.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/

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

Example call:
curl -X POST "https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"sent_to": "travelrule@counterparty.example"}'

Body (optional):
\- sent_to - a compliance address on record for the counterparty: for a directory entry its compliance address or a contact my application sees (GET /v3/travel-rule/vasps/{vasp_id}/ lists contacts), for a Didit network member its confirmed compliance email. Default: the address a Travel Rule email to the counterparty goes to (my own contact first, then a platform contact, then the entry's compliance address). Any other address is refused.

What happens:
\- 202 with the questionnaire {id, status: "SENT", form_version, sent_to, sent_at, expires_at, ...}. The email carries a single-use link to a page where the counterparty answers every question of Didit's standard questionnaire.
\- The counterparty has 30 days (expires_at); after that the link stops working and the questionnaire is EXPIRED.
\- Once answered, the status is ANSWERED and the answers stay current for 365 days (valid_until). Read them with GET /v3/travel-rule/vasps/{vasp_id}/questionnaires/.
\- A new send replaces my earlier unanswered questionnaire to the same counterparty: that one becomes EXPIRED and its link stops working.
\- The questionnaire and its answers are private to my application.

Failure modes:
\- 400 - sent_to is not a valid email or not a compliance address on record, or the counterparty has no compliance address on record yet.
\- 404 - no directory entry or listed Didit network member has this id, or the id is my own VASP profile.
\- 429 - a questionnaire went to this address less than a minute ago.
\- 503 - the email could not be sent and no questionnaire was created; try again.

Full guide: /transaction-monitoring/travel-rule#due-diligence-questionnaire.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json POST /v3/travel-rule/vasps/{vasp_id}/questionnaires/
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/travel-rule/vasps/{vasp_id}/questionnaires/:
    post:
      tags:
        - Travel Rule
      summary: إرسال استبيان العناية الواجبة إلى VASP
      description: >-
        إرسال استبيان العناية الواجبة القياسي من Didit عبر البريد الإلكتروني إلى
        عنوان الامتثال المسجل للطرف المقابل، مع رابط إجابة للاستخدام مرة واحدة.
        لدى الطرف المقابل 30 يوماً للإجابة على كل سؤال؛ وتبقى الإجابات سارية
        لمدة 365 يوماً. يؤدي الإرسال الجديد إلى استبدال الاستبيان السابق غير
        المُجاب عنه والمُرسل إلى الطرف المقابل نفسه، ويتوقف رابطه عن العمل. بريد
        إلكتروني واحد في الدقيقة لكل عنوان.
      operationId: sendTravelRuleVaspQuestionnaire
      parameters:
        - name: vasp_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: >-
            معرّف صف في GET /v3/travel-rule/vasps/: مدخل في الدليل أو عضو في
            شبكة Didit.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleCounterpartyQuestionnaireRequest'
            example:
              sent_to: travelrule@counterparty.example
      responses:
        '202':
          description: تم إرسال الاستبيان عبر البريد الإلكتروني.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleCounterpartyQuestionnaire'
              example:
                id: 3f9e8d7c-6b5a-4c3d-9e2f-1a0b9c8d7e6f
                status: SENT
                form_version: '1'
                sent_to: travelrule@counterparty.example
                sent_at: '2026-10-14T10:00:00Z'
                expires_at: '2026-11-13T10:00:00Z'
                answered_at: null
                valid_until: null
                current: false
                answers: {}
        '400':
          description: >-
            sent_to ليس عنوان بريد إلكتروني صالحاً أو ليس عنوان امتثال مسجلاً
            للطرف المقابل، أو لا يوجد عنوان امتثال مسجل للطرف المقابل.
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: array
                  items:
                    type: string
              examples:
                Not on record:
                  value:
                    sent_to:
                      - >-
                        Send the questionnaire to a compliance address on record
                        for this counterparty.
                No address:
                  value:
                    sent_to:
                      - >-
                        No compliance address is on record for this
                        counterparty. Add a contact for it first.
        '404':
          description: >-
            لا يوجد إدخال في الدليل أو عضو مدرج في شبكة Didit بهذا المعرّف. ملف
            VASP التعريفي الخاص بك لا يكون أبداً طرفاً مقابلاً لك.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: No directory entry or Didit network member has this id.
        '429':
          description: تم إرسال استبيان إلى هذا العنوان منذ أقل من دقيقة.
        '503':
          description: >-
            تعذر إرسال البريد الإلكتروني ولم يتم إنشاء أي استبيان. أعد المحاولة
            بعد لحظات.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/
            \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"sent_to": "travelrule@counterparty.example"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.send_vasp_questionnaire(
                "11111111-2222-3333-4444-555555555555",
                sent_to="travelrule@counterparty.example",
            )
            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.travelRule.sendVaspQuestionnaire("11111111-2222-3333-4444-555555555555",
            {
              sent_to: "travelrule@counterparty.example",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.SendVASPQuestionnaire(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyQuestionnaireRequest{\n\tSentTo: didit.String(\"travelrule@counterparty.example\"),\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.TravelRuleCounterpartyQuestionnaireRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().sendVaspQuestionnaire("11111111-2222-3333-4444-555555555555",
            TravelRuleCounterpartyQuestionnaireRequest.builder()
                    .sentTo("travelrule@counterparty.example")
                    .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->travelRule->sendVaspQuestionnaire('11111111-2222-3333-4444-555555555555',
            [
                'sent_to' => 'travelrule@counterparty.example',
            ]);

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

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

            result = didit.travel_rule.send_vasp_questionnaire(
              "11111111-2222-3333-4444-555555555555",
              sent_to: "travelrule@counterparty.example"
            )
            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.TravelRule.SendVaspQuestionnaireAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleCounterpartyQuestionnaireRequest

            {
                SentTo = "travelrule@counterparty.example",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleCounterpartyQuestionnaireRequest:
      type: object
      properties:
        sent_to:
          type: string
          format: email
          description: >-
            اختياري. عنوان امتثال مسجل للطرف المقابل: بالنسبة لمدخل الدليل فهو
            عنوان الامتثال الخاص به أو جهة اتصال يراها تطبيقك، وبالنسبة لعضو في
            شبكة Didit فهو بريد الامتثال الإلكتروني المؤكد الخاص به. الافتراضي:
            العنوان الذي يُرسل إليه بريد Travel Rule الإلكتروني إلى الطرف
            المقابل (جهة الاتصال الخاصة بك أولاً، ثم جهة اتصال المنصة، ثم عنوان
            الامتثال للمدخل).
    TravelRuleCounterpartyQuestionnaire:
      type: object
      description: >-
        استبيان العناية الواجبة واحد أرسله تطبيقك إلى الطرف المقابل: استبيان
        Didit القياسي، المُرسل عبر البريد الإلكتروني إلى عنوان الامتثال المسجل
        مع رابط إجابة للاستخدام مرة واحدة. خاص بتطبيقك.
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - SENT
            - ANSWERED
            - EXPIRED
          description: >-
            SENT: في انتظار الإجابات. ANSWERED: أجاب الطرف المقابل على كل سؤال.
            EXPIRED: أُغلق رابط الإجابة دون إجابة (انقضى موعده النهائي، أو حل
            محله استبيان أحدث)، أو تجاوزت الإجابات تاريخ valid_until.
        form_version:
          type: string
          description: إصدار استبيان Didit القياسي الذي تنتمي إليه الإجابات. حالياً 1.
        sent_to:
          type: string
          format: email
        sent_at:
          type: string
          format: date-time
          nullable: true
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            الموعد النهائي للإجابة، 30 يوماً بعد الإرسال. يتوقف الرابط عن العمل
            بعده.
        answered_at:
          type: string
          format: date-time
          nullable: true
        valid_until:
          type: string
          format: date-time
          nullable: true
          description: >-
            المدة التي تظل فيها الإجابات سارية: 365 يوماً بعد الإجابة. تكون null
            حتى تتم الإجابة.
        current:
          type: boolean
          description: true طالما أن الاستبيان بحالة ANSWERED ولم يمر تاريخ valid_until.
        answers:
          type: object
          additionalProperties:
            type: string
          description: >-
            الإجابات مفهرسة بواسطة معرّف السؤال: legal_name، وlicensing،
            وjurisdictions، وaml_program، وcompliance_officer،
            وsanctions_screening، وtransaction_monitoring، وtravel_rule،
            وcustody، وownership، وrecord_keeping، وdata_protection. كل إجابة
            تصل إلى 2,000 حرف. تكون فارغة حتى يتم الرد.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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