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

# Send a Due-Diligence Questionnaire to a VASP

> Email Didit's standard due-diligence questionnaire to a compliance address on record for a Travel Rule counterparty VASP.

export const AgentPromptAccordion = ({prompt, title = "AI Agent Integration Prompt"}) => {
  const [copied, setCopied] = React.useState(false);
  const handleCopy = e => {
    e.stopPropagation();
    if (!prompt) return;
    navigator.clipboard.writeText(prompt.trim()).then(() => {
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    });
  };
  const agents = ["Claude Code", "Codex", "Cursor", "Devin", "Windsurf", "GitHub Copilot"];
  return <div className="didit-agent-card">
      {}
      <div className="didit-agent-titlebar">
        <div className="didit-agent-dots" aria-hidden="true">
          <span className="didit-agent-dot didit-agent-dot-red"></span>
          <span className="didit-agent-dot didit-agent-dot-yellow"></span>
          <span className="didit-agent-dot didit-agent-dot-green"></span>
        </div>
        <span className="didit-agent-filename">{title}</span>
        <button type="button" className={`didit-agent-copy ${copied ? "didit-agent-copy-copied" : ""}`} onClick={handleCopy} title="Copy prompt to clipboard" aria-label={copied ? "Copied!" : "Copy prompt to clipboard"}>
          {copied ? <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <path d="M3 8.5l3.5 3.5L13 4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
              <span>Copied</span>
            </> : <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <rect x="5" y="5" width="9" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
                <path d="M11 5V3.5A1.5 1.5 0 0 0 9.5 2h-6A1.5 1.5 0 0 0 2 3.5v6A1.5 1.5 0 0 0 3.5 11H5" stroke="currentColor" strokeWidth="1.5" />
              </svg>
              <span>Copy</span>
            </>}
        </button>
      </div>

      {}
      <pre className="didit-agent-body"><code>{prompt.trim()}</code></pre>

      {}
      <div className="didit-agent-footer">
        <span className="didit-agent-footer-label">Paste into</span>
        <div className="didit-agent-chips">
          {agents.map(name => <span key={name} className="didit-agent-chip">{name}</span>)}
        </div>
      </div>
    </div>;
};

<AgentPromptAccordion
  title="Send a VASP Questionnaire API Prompt"
  prompt={`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.`}
/>


## OpenAPI

````yaml POST /v3/travel-rule/vasps/{vasp_id}/questionnaires/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: Identity verification API. Authenticate with x-api-key header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/vasps/{vasp_id}/questionnaires/:
    post:
      tags:
        - Travel Rule
      summary: Send a due-diligence questionnaire to a VASP
      description: >-
        Email Didit's standard due-diligence questionnaire to a compliance
        address on record for the counterparty, with a single-use answer link.
        The counterparty has 30 days to answer every question; the answers stay
        current for 365 days. A new send replaces your earlier unanswered
        questionnaire to the same counterparty, whose link stops working. One
        email per minute per address.
      operationId: sendTravelRuleVaspQuestionnaire
      parameters:
        - name: vasp_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: >-
            The id of a row of GET /v3/travel-rule/vasps/: a directory entry or
            a Didit network member.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleCounterpartyQuestionnaireRequest'
            example:
              sent_to: travelrule@counterparty.example
      responses:
        '202':
          description: The questionnaire was emailed.
          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 is not a valid email address or not a compliance address on
            record for the counterparty, or the counterparty has no compliance
            address on record.
          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: >-
            No directory entry or listed Didit network member has this id. Your
            own VASP profile is never a counterparty of yours.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: No directory entry or Didit network member has this id.
        '429':
          description: A questionnaire went to this address less than a minute ago.
        '503':
          description: >-
            The email could not be sent and no questionnaire was created. Try
            again in a moment.
      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"}'
components:
  schemas:
    TravelRuleCounterpartyQuestionnaireRequest:
      type: object
      properties:
        sent_to:
          type: string
          format: email
          description: >-
            Optional. A compliance address on record for the counterparty: for a
            directory entry its compliance address or a contact your application
            sees, for a Didit network member its confirmed compliance email.
            Default: the address a Travel Rule email to the counterparty goes to
            (your own contact first, then a platform contact, then the entry's
            compliance address).
    TravelRuleCounterpartyQuestionnaire:
      type: object
      description: >-
        One due-diligence questionnaire your application sent the counterparty:
        Didit's standard questionnaire, emailed to a compliance address on
        record with a single-use answer link. Private to your application.
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - SENT
            - ANSWERED
            - EXPIRED
          description: >-
            SENT: waiting for answers. ANSWERED: the counterparty answered every
            question. EXPIRED: the answer link closed unanswered (its deadline
            passed, or a newer questionnaire replaced it), or answers passed
            valid_until.
        form_version:
          type: string
          description: >-
            Version of Didit's standard questionnaire the answers belong to.
            Currently 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: >-
            The answer-by deadline, 30 days after sending. The link stops
            working after it.
        answered_at:
          type: string
          format: date-time
          nullable: true
        valid_until:
          type: string
          format: date-time
          nullable: true
          description: >-
            How long the answers stay current: 365 days after answering. Null
            until answered.
        current:
          type: boolean
          description: >-
            true while the questionnaire is ANSWERED and valid_until has not
            passed.
        answers:
          type: object
          additionalProperties:
            type: string
          description: >-
            The answers keyed by question id: legal_name, licensing,
            jurisdictions, aml_program, compliance_officer, sanctions_screening,
            transaction_monitoring, travel_rule, custody, ownership,
            record_keeping, data_protection. Each answer is up to 2,000
            characters. Empty until answered.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Your application's API key, from Developers -> API keys in the Business
        Console. The primary key has full access. A named key can be scoped:
        none, read or write per resource, limited to some workflows or to
        approved sessions, to a list of IP addresses, and to an expiry date. 401
        means the key is missing, wrong, revoked or expired; 403 means the key
        has no access to this resource or action, or the request came from an
        address outside its IP list; 404 on a session route means the session is
        outside the key's workflows or statuses. A key without media access
        receives image, video and PDF URLs as null, and a key without sessions
        write receives session links and tokens as null. See
        https://docs.didit.me/console/api-keys.

````

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