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

# Travel Rule API: Sunrise-Transfer eingehend registrieren

> Mit Didit registrieren Sie Travel-Rule-Daten für bereits On-Chain eingegangene Krypto-Einzahlungen vor dem VASP-Austausch – der Sunrise-Ablauf.



Prompt für die API zum Registrieren eingehender Sunrise-Transfers
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Register Travel Rule data for a crypto deposit that settled on-chain BEFORE any exchange took place - because the sending VASP was unreachable at the time (the sunrise problem), or when backfilling historical deposits.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/inbound/

Authentication:
Use the x-api-key header with my Didit API key. You are the beneficiary VASP.

Request body (application/json):
\{
"chain": "ETH",                        // required; stored lowercased and matched case-insensitively against your address-book entries' chain
"txid": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",   // dedupe key: same txid + wallet_address returns the existing transfer
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // an XRP X-address is split into its classic address and tag
"memo": "",                              // optional destination tag or memo: on a shared deposit address it names your customer
"amount": "500.00",
"currency": "USDC",
"originator_data": { "name": "Origin CASP SL" },      // flat originator details from the sender, if known (name or full_name, first_name, last_name, vendor_data)
"beneficiary_data": { "name": "Ana Diaz" },           // flat beneficiary details (your customer); name is matched against the entry's holder_name
"originating_vasp": { "name": "Origin CASP SL", "lei": "984500ABCDEF12345634", "travel_address": "taHg7hkTmJ4mTpdQxn61H9cyx6RreB2jrDHeB3pkioRRBgKQaSAGUzp73FVsmEXXJVxdAuCCWiBEFMkcB4MCtcyjnpbyEbTeSHwym394NMS7ev" },  // optional sender identity
"utxo": { "inputs": [ { "address": "bc1q...", "amount": "0.5" } ], "outputs": [ { "address": "bc1q...", "amount": "0.25" } ] }  // optional, BTC/LTC/BCH/DOGE only
}

Behavior:
\- Creates an inbound travelRule transaction (or reuses an unclaimed recorded deposit) and resolves it against your wallet address book, by the address and its memo (an entry with exactly that memo first, else one for the whole address; a deposit without a memo never reaches an entry that has one):
\- no matching entry -> ON_HOLD
\- entry exists, ownership unproven -> UNCONFIRMED_OWNERSHIP
\- name does not match the entry's holder_name -> COUNTERPARTY_MISMATCHED_DATA
\- verified entry + name match -> COMPLETED then immediately FINISHED (the deposit already settled).
\- The address-book match is chain-scoped: an entry matches when its chain equals the request chain (case-insensitive) or the entry's chain is blank, and "ethereum" does not match "ETH".
\- Resolve ON_HOLD (and UNCONFIRMED_OWNERSHIP) with POST /v3/transactions/{transaction_id}/travel-rule/ownership/.
\{"confirmed": true} registers or verifies the wallet entry and runs the name match; {"confirmed": false} declines the transfer.
ON_HOLD does not change the transaction status by itself; only a rule that acts on the Travel Rule status changes it (for example the opt-in library preset travel-rule-pending-action sets AWAITING_USER).
\- Naming originating_vasp keeps the sender's identity on this transfer (metadata.originating_vasp, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never creates or changes a shared VASP directory entry.
originating_vasp.lei must be a valid 20-character LEI (ISO 17442) or blank, and originating_vasp.travel_address must be a valid travel address or blank.
An inbound TRP inquiry does not create or change its sender's directory entry either.
\- Webhooks: when a new transaction was created, transaction.created is sent first and travel_rule.status.updated follows for each status transition.
Each webhook is delivered and retried on its own, so do not rely on arrival order; key on transaction_id.
\- Billing: there is no base fee.
A newly created deposit is screened and charged the Wallet Verification & Screening rate only when crypto monitoring is enabled and chain is one Didit can screen (btc, eth, sol, trx, matic, bnb, ltc, xrp, bch, doge, or their full names such as bitcoin or ethereum).
Sandbox applications are never charged.
\- utxo: the sender's wallet is originator_data.wallet_address when you declare it, else the input address that contributed the most. The result is on travel_rule.chain_details.

What to read from the response:
\- transaction_id - the Didit transaction uuid, used in /v3/transactions/{transaction_id}/ calls.
\- txn_id - tr-in-{first 80 characters of txid}-{12 hex characters} for a new transaction, or the existing txn_id of a reused recorded deposit.
\- created - true (201) when this call registered the deposit, false (200) when the same txid + wallet_address was already registered.
\- travel_rule - the full transfer object: uuid, status, direction, rail, protocol, ivms_version, required, ownership_confirmed, deadline_at, timeline, counterparty_vasp, originator_data, beneficiary_data, delivery, discovery, reason, next_actions, created_at.
beneficiary_data includes the wallet_address and the lowercased chain.
originator_data and beneficiary_data stay masked in the response (data_masked: true) until wallet ownership is confirmed.
\- travel_rule.status - the resolved state (see above).

Failure modes:
\- 400 - a missing required field (chain, txid, wallet_address, amount, currency), an invalid originating_vasp.lei, or an invalid travel address ("Invalid travel address.").
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#after-deposit-sunrise-registration.`

\</pre>



      
      

Einfügen in



## OpenAPI

````yaml de/openapi-25.json POST /v3/travel-rule/inbound/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Eingehenden Transfer nach Einzahlung (Sunrise) registrieren
      description: >-
        Travel Rule-Daten für eine Krypto-Einzahlung registrieren, die bereits
        vor einem Umtausch On-Chain abgewickelt wurde. Erstellt eine eingehende
        travelRule-Transaktion (oder verwendet eine nicht beanspruchte
        Einzahlung wieder) und gleicht den Transfer mit Ihrem Wallet-Adressbuch
        ab. Bei einer neu erstellten Transaktion sendet Didit zuerst den Webhook
        transaction.created und danach die travel_rule.status.updated-Webhooks.
      operationId: registerTravelRuleInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleInboundRequest'
            example:
              chain: ETH
              txid: 0xdeposit-hash
              wallet_address: 0xYourDepositWallet
              amount: '500.00'
              currency: USDC
              originator_data:
                name: Origin CASP SL
              beneficiary_data:
                name: Ana Diaz
              originating_vasp:
                name: Origin CASP SL
                lei: ''
                travel_address: >-
                  ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC
      responses:
        '200':
          description: >-
            Ein Transfer für diese txid und wallet_address war bereits
            registriert; der bestehende wird unverändert zurückgegeben (created
            ist false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            Ein neuer Travel Rule-Transfer wurde registriert, bei einer neuen
            eingehenden Transaktion oder bei einer bestehenden nicht
            beanspruchten Einzahlung (created ist true).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            Ein Pflichtfeld (`chain`, `txid`, `wallet_address`, `amount`,
            `currency`) fehlt, `originating_vasp.lei` ist kein gültiger LEI,
            `originating_vasp.travel_address` ist keine gültige Travel Address,
            ein Memo, eine X-Adresse oder ein `utxo`, die die Blockchain nicht
            übertragen kann, oder `originator_data` / `beneficiary_data`, das
            kein Objekt ist.
          content:
            application/json:
              examples:
                Missing field:
                  value:
                    txid:
                      - This field is required.
                Invalid LEI:
                  value:
                    originating_vasp:
                      lei:
                        - >-
                          Invalid LEI: expected 20 alphanumeric characters (ISO
                          17442).
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"chain":"ETH","txid":"0xdeposit-hash","wallet_address":"0xYourDepositWallet","amount":"500.00","currency":"USDC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.register_inbound(
                chain="ETH",
                txid="0xdeposit-hash",
                wallet_address="0xYourDepositWallet",
                amount="500.00",
                currency="USDC",
                originator_data={"name": "Origin CASP SL"},
                beneficiary_data={"name": "Ana Diaz"},
                originating_vasp={
                    "name": "Origin CASP SL",
                    "lei": "",
                    "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            )
            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.registerInbound({
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.TravelRuleInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().registerInbound(TravelRuleInboundRequest.builder()
                    .chain("ETH")
                    .txid("0xdeposit-hash")
                    .walletAddress("0xYourDepositWallet")
                    .amount("500.00")
                    .currency("USDC")
                    .originatorData(Map.of("name", "Origin CASP SL"))
                    .beneficiaryData(Map.of("name", "Ana Diaz"))
                    .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()
                            .name("Origin CASP SL")
                            .lei("")
                            .travelAddress("ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC")
                            .build())
                    .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->registerInbound([
                'chain' => 'ETH',
                'txid' => '0xdeposit-hash',
                'wallet_address' => '0xYourDepositWallet',
                'amount' => '500.00',
                'currency' => 'USDC',
                'originator_data' => ['name' => 'Origin CASP SL'],
                'beneficiary_data' => ['name' => 'Ana Diaz'],
                'originating_vasp' => [
                    'name' => 'Origin CASP SL',
                    'lei' => '',
                    'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.register_inbound(
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.TravelRule.RegisterInboundAsync(new
            TravelRuleInboundRequest

            {
                Chain = "ETH",
                Txid = "0xdeposit-hash",
                WalletAddress = "0xYourDepositWallet",
                Amount = "500.00",
                Currency = "USDC",
                OriginatorData = new Dictionary<string, object> { ["name"] = "Origin CASP SL" },
                BeneficiaryData = new Dictionary<string, object> { ["name"] = "Ana Diaz" },
                OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp
                {
                    Name = "Origin CASP SL",
                    Lei = "",
                    TravelAddress = "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleInboundRequest:
      type: object
      required:
        - chain
        - txid
        - wallet_address
        - amount
        - currency
      properties:
        chain:
          type: string
          description: >-
            Chain, auf der die Einzahlung abgewickelt wurde, zum Beispiel `ETH`.
            Wird in Kleinbuchstaben gespeichert und ohne Berücksichtigung von
            Groß-/Kleinschreibung mit den Einträgen Ihres Wallet-Adressbuchs
            verglichen; verwenden Sie dort denselben Chain-Token.
          maxLength: 32
        txid:
          type: string
          description: >-
            On-Chain-Transaktions-Hash. Zusammen mit wallet_address
            dedupliziert.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            Die Ziel-Wallet, auf der Sie die Einzahlung erhalten haben. Eine
            XRP-X-Adresse wird in ihre klassische Adresse und ihr Tag
            aufgeteilt.
          maxLength: 128
        amount:
          type: string
          description: >-
            Einzahlungsbetrag als Dezimalstring, null oder größer, mit bis zu 18
            Nachkommastellen.
        currency:
          type: string
          description: Einzahlungs-Asset, z. B. „USDC“.
          maxLength: 16
        originator_data:
          type: object
          description: >-
            Details zum Auftraggeber vom sendenden VASP, falls bekannt, als
            flaches Objekt wie `{"name": "..."}`. Didit liest daraus name (oder
            full_name), first_name, last_name und vendor_data.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            Angaben zum Begünstigten (Ihr Kunde) als flaches Objekt wie
            `{"name": "..."}`. Didit gleicht den Namen mit dem holder_name des
            passenden Adressbucheintrags ab und setzt wallet_address sowie chain
            aus der Anfrage.
          additionalProperties: true
        originating_vasp:
          type: object
          description: >-
            Optionale Beschreibung des sendenden VASP. Sie verbleibt nur bei
            diesem Transfer (`metadata.originating_vasp` und der
            Auftraggeber-VASP des Transfers in GET /v3/travel-rule/transfers/);
            sie erstellt, bearbeitet oder verknüpft niemals einen gemeinsamen
            VASP-Verzeichniseintrag.
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: Optional. Eine gültige 20-stellige ISO-17442-LEI oder leer.
            travel_address:
              type: string
              description: >-
                Die Travel Address des Auftraggebers, erfasst bei diesem
                Transfer.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            Optional. Das Destination-Tag oder Memo der Einzahlung in einem
            Memo-Netzwerk: Bei einer geteilten Einzahlungsadresse dient es dazu,
            Ihre Kunden voneinander zu unterscheiden, und der Adressbucheintrag
            für dieses Memo wird abgeglichen. XRP: ein Destination-Tag, eine
            Ganzzahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM:
            ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein
            32-Byte-Hash in Hex. EOS: bis zu 256 Bytes. ATOM: bis zu 256
            Zeichen. HBAR: bis zu 100 Bytes. Bitcoin-, EVM-, Solana-, Tron-,
            Litecoin-, Bitcoin Cash-, Dogecoin- und Lightning-Wallets
            unterstützen kein Memo: die Angabe eines Memos führt dort zu `400`.
            Alias: `destinationTag` oder `destination_tag`.
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: >-
            Optional, nur UTXO-Chains. Die Inputs und Outputs der
            Einzahlungstransaktion: Die Wallet des Senders ist die deklarierte
            `originator_data.wallet_address`, andernfalls der größte Input.
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: Didit-Transaktions-UUID für die eingehende Einzahlung.
        txn_id:
          type: string
          description: >-
            txn_id der eingehenden Transaktion: Von Didit generiert, wenn Didit
            die Transaktion erstellt hat, oder Ihre eigene, wenn eine nicht
            beanspruchte Einzahlung wiederverwendet wurde.
        created:
          type: boolean
          description: >-
            true, wenn dieser Aufruf den Transfer registriert hat (HTTP 201);
            false, wenn bereits ein Transfer für dieselbe txid und
            wallet_address existierte (HTTP 200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleUtxo:
      type: object
      description: >-
        Die Inputs und Outputs eines UTXO-Transfers (BTC, LTC, BCH, DOGE). Wird
        nur auf diesen Blockchains akzeptiert: Auf jeder anderen Blockchain
        führt dies zu einem `400`. Daraus leitet Didit die Wallet des
        Auftraggebers (die deklarierte, andernfalls die Input-Adresse mit dem
        größten Beitrag) und den Begünstigten-Output ab (den deklarierten,
        andernfalls den einzigen Output, der keine Input-Adresse als Wechselgeld
        auszahlt, andernfalls den einen Output, der den Transferbetrag zahlt).
        Das Ergebnis befindet sich in `chain_details` des Transfers.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Optional. Ohne Inputs wird kein Auftraggeber abgeleitet und kein
            Wechselgeld-Output (Change) erkannt.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TravelRuleTransferDetail:
      type: object
      description: >-
        Vollständiges Transfer-Objekt, das von den Endpoints zur
        Eigentümerbestätigung und zum Abschließen/Abbrechen zurückgegeben wird.
        Solange das Wallet-Eigentum eines eingehenden Transfers unbestätigt ist,
        werden `originator_data` und `beneficiary_data` der Gegenpartei maskiert
        zurückgegeben (der erste Buchstabe jedes Wortes bleibt erhalten; Wallet,
        Chain und VASP-Routing bleiben lesbar) und `data_masked` ist true.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - AWAITING_COUNTERPARTY
            - ON_HOLD
            - COMPLETED
            - FINISHED
            - CANCELLED
            - EXPIRED
            - COUNTERPARTY_MISMATCHED_DATA
            - COUNTERPARTY_VASP_NOT_FOUND
            - COUNTERPARTY_VASP_NOT_REACHABLE
            - UNCONFIRMED_OWNERSHIP
            - COUNTERPARTY_VASP_GENERAL_DECLINE
            - NOT_ENOUGH_COUNTERPARTY_DATA
            - NOT_APPLICABLE
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
          description: >-
            Die Schiene (Rail), über die der Transfer geroutet wurde, oder null,
            wenn keine Schiene ausgewählt wurde (z. B. unterhalb des
            Schwellenwerts, eine selbstverwahrte Gegenpartei-Wallet, eine
            Registrierung nach Einzahlung oder keine erreichbare Gegenpartei).
            INTERNAL bedeutet, dass beide Seiten Didit-Anwendungen sind; EMAIL
            bedeutet, dass die Gegenpartei über einen per E-Mail gesendeten
            Abhol-Link erreicht wurde. TEST_VASP bedeutet, dass der Didit Test
            VASP den Sandbox-Transfer beantwortet hat. Über GTR, VERIFYVASP und
            SYGNA liest Didit die Antwort der Gegenpartei aus der Antwort des
            Netzwerks oder durch Abrufen alle 5 Minuten. TRUST sendet nur,
            sodass ein TRUST-Transfer auf AWAITING_COUNTERPARTY bleibt, bis er
            abläuft. Eine Netzwerk-Schiene wird nur verwendet, wenn Sie Ihre
            eigene Mitgliedschaft für dieses Netzwerk verknüpft haben. Sie wird
            nach der Rückgabe der Antwort auf die Transaktionserstellung
            ausgewählt, weshalb sie in dieser Antwort null ist.
        protocol:
          type: string
          nullable: true
        ivms_version:
          type: string
          example: ivms101.2023
        required:
          type: boolean
        ownership_confirmed:
          type: boolean
          nullable: true
        deadline_at:
          type: string
          format: date-time
          nullable: true
        timeline:
          type: array
          items:
            type: object
            properties:
              status:
                type: string
              at:
                type: string
                format: date-time
              detail:
                type: string
              name_match:
                allOf:
                  - $ref: '#/components/schemas/TravelRuleNameMatch'
                nullable: true
                description: >-
                  Der Namensabgleich, über den dieser Eintrag entschieden hat,
                  neben `detail`. Fehlt bei Einträgen, bei denen kein Name
                  verglichen wurde.
              reason:
                type: string
                description: >-
                  Nur beim Eintrag eines Übergangs vorhanden, der durch eine
                  fehlgeschlagene Zustellung verursacht wurde:
                  `email_undeliverable` oder `delivery_failed`, der Wert, den
                  `reason` des Transfers meldet.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Due-Diligence-Score von 0 bis 100, wobei ein höherer Wert besser
                ist. Gleiche Skala wie im VASP-Verzeichnis.
            dd_score_breakdown:
              type: object
              description: >-
                Beiträge pro Komponente zu dd_score, ein Objekt pro Komponente
                wie im VASP-Verzeichnis (jurisdiction, verification, protocol,
                lei, history, essentials, responsiveness), jeweils {points, max,
                reason, detail}. {}, bis die Gegenpartei bewertet wurde.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Für diese Komponente vergebene Punkte.
                  max:
                    type: integer
                    description: Maximale Punktzahl, die diese Komponente vergeben kann.
                  reason:
                    type: string
                    description: Maschinenlesbarer Code der Entscheidung der Komponente.
                  detail:
                    type: string
                    description: Für Menschen lesbare Begründung für die vergebenen Punkte.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Wann die Due-Diligence-Bewertung zuletzt durchgeführt wurde.
                Null, bis die Gegenpartei bewertet wurde.
        originator_data:
          type: object
          description: >-
            Auftraggeber-Partei. Bei einer eingehenden Überweisung werden die
            Werte der Gegenpartei maskiert, bis die Eigentümerstruktur bestätigt
            ist.
        beneficiary_data:
          type: object
          description: >-
            Begünstigter. Bei eingehenden Übertragungen werden die Werte der
            Gegenpartei maskiert, bis die Eigentümerschaft bestätigt ist.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: >-
            Der Namensabgleich, der über die Überweisung entschieden hat, oder
            null, bis einer ausgeführt wurde. Solange die Parteien maskiert sind
            und auf der Kopie des anderen Kunden eines INTERNAL-Austauschs,
            werden `transfer_name`, `compared_name`, `matched_names` und
            `mismatched_names` ausgeblendet. `score` und `matched` können
            voneinander abweichen: `matched` richtet sich nach der Strenge,
            `score` ist die Ähnlichkeit der beiden vollständigen Namen.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Kürzel für `data_match.mismatched_fields`. Leer, wenn keine
            Unterschiede vorliegen.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            Wahr, solange die personenbezogenen Daten der Gegenpartei in dieser
            Antwort maskiert sind.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Status der neuesten Nachricht, die dieser Transfer der anderen Seite
            schuldet. Null, wenn der Transfer nie eine geschuldet hat (zum
            Beispiel bei einem Wert unter `threshold_amount`, bei einer
            deklarierten selbstverwahrten Wallet oder bei einer
            Sunrise-Registrierung).
        discovery:
          type: array
          description: >-
            Wie Didit nach der Gegenpartei gesucht hat, ein Eintrag pro
            ausgeführtem Schritt. Leer, wenn keine Ermittlung stattgefunden hat,
            beispielsweise bei einem eingehenden Transfer.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Warum ein Transfer mit `COUNTERPARTY_VASP_NOT_FOUND` oder
            `COUNTERPARTY_VASP_NOT_REACHABLE` feststeckt; `""` für jeden anderen
            Status. Eine fehlgeschlagene Zustellung bestimmt dies zuerst,
            ausschließlich bei `COUNTERPARTY_VASP_NOT_REACHABLE`:
            `email_undeliverable` (der E-Mail-Provider hat die Compliance-E-Mail
            abgelehnt und es bleibt keine Adresse mehr zum Ausprobieren: beim
            Senden, bei einer Erinnerung oder als später gemeldeter permanenter
            Bounce) oder `delivery_failed` (die zustellende Schiene ist
            endgültig fehlgeschlagen: eine Netzwerkschiene hat die Nachricht
            abgelehnt oder keine Wiederholungsversuche mehr übrig, ein
            `TRP`-Identitäts-Host hat nicht geantwortet oder der `TRP`-Host der
            Gegenpartei hat die Anfrage nicht akzeptiert). Andernfalls bestimmt
            es der `discovery`-Trace: `awaiting_end_user` (kein Schritt hat eine
            Gegenpartei benannt, die Didit erreichen kann),
            `directory_match_no_route` (ein Schritt hat einen Verzeichnis-VASP
            benannt, der keine Route hat), `picked_member_without_proven_wallet`
            (der Endbenutzer hat einen Didit-Kunden ausgewählt, der die
            Kontrolle über die Wallet nicht nachgewiesen hat) oder
            `no_directory_match`, wenn der Trace keinen anderen Grund liefert.
            Ein erneutes Senden bringt den Transfer voran, sodass der Grund
            zurückgesetzt wird. Siehe [Warum ein Transfer
            feststeckt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist).
        next_actions:
          type: array
          description: >-
            Was den Transfer voranbringt; `[]` für jeden Status außer
            `COUNTERPARTY_VASP_NOT_FOUND` oder
            `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` bietet
            `update_compliance_email`, dann `resend`. `delivery_failed` bietet
            `resend`. Ein Discovery-Grund bietet `select_counterparty_vasp`,
            `declare_self_hosted`, `add_vasp_hint` und `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Eine Eingabe oder Ausgabe einer UTXO-Transaktion, wie sie von der
        Blockchain erfasst wurde.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Dezimal-Zeichenkette in der Einheit des Coins selbst (BTC, nicht
            Satoshis). Optional.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Optional. Die Transaktion, deren Output ein Input ausgibt.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Optional. Der Index des Outputs, den ein Input ausgibt.
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: >-
        Der Namensabgleich, der über die Überweisung entschieden hat, oder null,
        bis einer ausgeführt wurde. Solange die Parteien maskiert sind und auf
        der Kopie des anderen Kunden eines INTERNAL-Austauschs, werden
        `transfer_name`, `compared_name`, `matched_names` und `mismatched_names`
        ausgeblendet. `score` und `matched` können voneinander abweichen:
        `matched` richtet sich nach der Strenge, `score` ist die Ähnlichkeit der
        beiden vollständigen Namen.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            Ähnlichkeit der beiden vollständigen Namen, 0 bis 100. 0, wenn einer
            der Namen leer ist.
        matched:
          type: boolean
          description: >-
            Gibt an, ob die Namen die Bedingung `strictness` erfüllen. Das
            Ergebnis des Transfers folgt `data_match`, das jedes Feld
            vergleicht, sodass ein Transfer COUNTERPARTY_MISMATCHED_DATA sein
            kann, während dies wahr ist.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            Wie über `matched` entschieden wurde: none (`NONE`), exact_token
            (`STRICT`), token_subset (`DEFAULT`), token_containment (`CONTAINS`)
            oder sequence_ratio (`FUZZY`).
        strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
        compared_with:
          type: string
          enum:
            - wallet_holder
            - counterparty_vasp
          description: >-
            wallet_holder: Der für die Wallet hinterlegte Inhaber.
            counterparty_vasp: Der Name, den die Gegenpartei auf der
            E-Mail-Antwortseite angegeben hat, oder die Antwort des
            Didit-Test-VASP in der Sandbox.
        transfer_name:
          type: string
          description: Der Name auf der Überweisung.
        compared_name:
          type: string
          description: Der Name, mit dem verglichen wurde.
        matched_names:
          type: array
          items:
            type: string
          description: Wörter aus `transfer_name`, die in `compared_name` gefunden wurden.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            Wörter aus `transfer_name`, die in `compared_name` fehlen, gefolgt
            von Wörtern aus `compared_name`, die in `transfer_name` fehlen.
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Feldweiser Abgleich der Daten der an der Übertragung beteiligten Partei
        mit den Informationen der Gegenseite über den Wallet-Inhaber. Nennt
        Felder und Ergebnisse, niemals Werte, damit die Lesbarkeit erhalten
        bleibt, während die Daten der Gegenpartei maskiert sind. Null, bis ein
        Abgleich ausgeführt wurde.
      properties:
        matched:
          type: boolean
          description: True, wenn kein verglichenes Feld abweicht.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Die Felder, die sich unterscheiden.
        fields:
          type: object
          description: >-
            Ein Eintrag pro verglichenem Feld für den Entitätstyp der Partei
            (`name`, `date_of_birth`, `address`, `account`; ein Unternehmen hat
            kein `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared`, wenn die Regel `NONE` ist oder eine der beiden
                  Seiten keinen Wert für das Feld aufweist.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Audit-Eintrag des Zeitpunkts, zu dem die Daten der Gegenpartei
        demaskiert wurden. Null, solange die Daten noch maskiert sind, sowie bei
        ausgehenden Überweisungen.
      properties:
        at:
          type: string
          format: date-time
        reason:
          type: string
          enum:
            - ownership_confirmed
            - wallet_proof
            - address_book_match
            - own_verified_wallet
            - inquiry_approved
            - known_payment_method
            - travel_address
          description: >-
            Was die Inhaberschaft bestätigt hat: ownership_confirmed (Ihre
            Bestätigung über die Konsole oder die API), wallet_proof (ein
            Wallet-Nachweis im Widget oder ein eingehender INTERNAL-Transfer,
            festgelegt bei der Erstellung), address_book_match (eine
            verifizierte Adressbuch-Wallet), own_verified_wallet (die eigene
            verifizierte Wallet Ihres Benutzers), inquiry_approved (Ihre
            Genehmigung einer eingehenden TRP-Anfrage oder einer GTR- oder
            Sygna-Nachricht), known_payment_method (eine Wallet, mit der Ihr
            Benutzer bereits bezahlt hat) oder travel_address (die pro Wallet
            angegebene Travel Address).
        actor:
          type: string
          description: >-
            Wer die Bestätigung vorgenommen hat: die E-Mail-Adresse des
            Konsolenbenutzers oder die Bezeichnung des API-Schlüssels. Leer bei
            einer automatischen Entscheidung.
    TravelRuleDelivery:
      type: object
      description: >-
        Status der neuesten Nachricht, die der Transfer der anderen Seite
        schuldet. Didit kontaktiert die Gegenpartei, nachdem die Anfrage
        zurückgegeben wurde, die den Transfer erstellt oder geändert hat. Dieses
        Objekt gibt daher an, ob diese Nachricht durchgegangen ist: in der
        Warteschlange, wird gesendet, wartet auf Wiederholungsversuch nach einem
        Fehler, zugestellt oder fehlgeschlagen. Bei einem Fehler, von dem sich
        das Netzwerk noch erholen kann (keine rechtzeitige Antwort,
        fehlgeschlagene Verbindung, HTTP `408`, `429` oder `5xx`), wird der
        Versuch nach 30 Sekunden, 2 Minuten, 10 Minuten, 30 Minuten und 1 Stunde
        wiederholt. Wenn eine erste Nachricht (`kind: SEND`) endgültig
        fehlschlägt, weil das Netzwerk sie abgelehnt hat oder auch der sechste
        Versuch fehlgeschlagen ist, wechselt der Transfer zu
        `COUNTERPARTY_VASP_NOT_REACHABLE` mit `last_error` in seiner `timeline`;
        jede andere Nachricht, die endgültig fehlschlägt, wird in der `timeline`
        vermerkt. Der `status` des Transfers bleibt die maßgebliche Quelle für
        den Austausch selbst.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Was die Nachricht übermittelt. `SEND`: die erste Nachricht des
            Transfers an die Gegenpartei (ausgehend; das Übertragungsnetzwerk
            wird beim Senden ausgewählt). `ANSWER`: Ihre Annahme oder Ablehnung
            gegenüber dem anfragenden Netzwerk (eingehend). `TXID`: der
            On-Chain-Transaktions-Hash, nachdem Sie den Transfer abgeschlossen
            haben. `CANCEL`: die Stornierung, nachdem Sie ihn abgebrochen haben.
            `POLL`: eine Statusabfrage an ein Netzwerk, das dies anbietet, die
            alle 5 Minuten wiederholt wird, während der Transfer auf die
            Gegenpartei wartet.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: Wartet auf den Versand. `SENDING`: Ein Versuch läuft.
            `RETRYING`: Ein Versuch ist fehlgeschlagen und der nächste erfolgt
            um `next_attempt_at`. `DELIVERED`: Die Gegenseite hat die Nachricht
            entgegengenommen. `FAILED`: Die Gegenseite hat sie abgelehnt oder
            der letzte Versuch ist fehlgeschlagen.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Die Schiene (Rail), die die Nachricht übermittelt. Leer, bis Didit
            eine für eine erste Nachricht ausgewählt hat.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Bisher durchgeführte Versuche für diese Nachricht. Für eine
            Nachricht, die keine Statusabfrage ist, werden maximal 6 Versuche
            unternommen.
        last_error:
          type: string
          description: >-
            Die Art des Fehlers, der beim letzten Versuch aufgetreten ist, `""`,
            wenn keiner aufgetreten ist: beispielsweise `email undeliverable`,
            `trp identity endpoint unreachable` oder `trp transfer inquiry
            delivery failed`. Sie enthält niemals die eigene Antwort der
            Gegenpartei, die in der `timeline` des Transfers verbleibt.

            Wenn GTR mit einem Fehler antwortet, sind dessen eigener Statuscode
            und dessen Nachricht enthalten. Antwortinhalte sind niemals
            enthalten.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Wann der nächste Versuch ausgeführt wird, während die Nachricht
            `QUEUED` oder `RETRYING` ist.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Wann die Gegenseite die Nachricht entgegengenommen hat.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Ein Schritt der Gegenpartei-Ermittlung, die Didit für einen ausgehenden
        Transfer durchgeführt hat, in der Reihenfolge der Ausführung. Der erste
        Schritt, der einen VASP mit einer Route benennt, beendet die Kette.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: ein anderer Didit-Kunde, der die Kontrolle
            über die Ziel-Wallet nachgewiesen hat. `wallet_attribution`: die
            Blockchain-Analyse-Zuordnung der Wallet. `network_lookup`: ein
            Netzwerk, das angeben kann, welcher VASP die Adresse hält.
            `customer_hint`: der VASP-Name, der LEI oder die Jurisdiktion, die
            Sie in `beneficiary_data` übermittelt haben. `end_user`: die
            Gegenpartei, die der Endbenutzer (oder Sie) ausgewählt hat, oder die
            Aufforderung, eine auszuwählen.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: Der Schritt hat eine Gegenpartei benannt. `miss`: Er wurde
            ausgeführt und hat keine gefunden. `skipped`: Er konnte nicht
            ausgeführt werden, und `reason` gibt den Grund an.
        reason:
          type: string
          description: >-
            Maschinenlesbarer Grund, `""` bei einer Übereinstimmung:
            `no_proven_internal_wallet`, `attribution_disabled`,
            `already_attributed`, `no_attributed_entity`,
            `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`,
            `no_membership`, `network_switched_off`,
            `no_network_address_lookup`, `no_directory_match`,
            `awaiting_end_user` oder `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: >-
            Der Verzeichnis-VASP, den der Schritt benannt hat, sofern einer
            benannt wurde.
        rail:
          type: string
          nullable: true
          description: >-
            Die Schiene (Rail), die diese Gegenpartei erreicht, sofern der
            Schritt eine gefunden hat.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Eine Maßnahme, die einen Transfer mit dem Status
        `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE`
        voranbringt. Siehe [Warum ein Transfer
        festhängt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: Der Endbenutzer wählt die Ziel-VASP im
            Widget zum Wallet-Eigentumsnachweis aus, oder Sie senden einen PATCH
            mit `action=beneficiary_vasp`. `declare_self_hosted`: Der
            Endbenutzer deklariert die Wallet im Widget als selbstverwahrt.
            `add_vasp_hint`: Teilen Sie Didit über einen VASP-Namen, LEI oder
            eine Travel Address (beispielsweise eine `travel_address` im
            Adressbucheintrag der Ziel-Wallet) mit, wer die Gegenpartei ist, und
            senden Sie die Anfrage erneut. `update_compliance_email` und
            `resend` sind `action`-Werte von `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`: Geben Sie die
            Compliance-E-Mail der Gegenpartei erneut an und führen Sie das
            Routing noch einmal durch.
        url:
          type: string
          format: uri
          description: >-
            Der Link zum Wallet-Ownership-Widget, bei `select_counterparty_vasp`
            und `declare_self_hosted`, solange der Transfer eine offene
            Widget-Sitzung hat.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Wie die Blockchain des Transfers ihre beiden Wallets benennt, wenn mehr
        als eine Adresse eine andere bezahlt. Leer (`{}`) bei einem
        Account-Chain-Transfer (EVM, Solana, Tron), bei dem die beiden Adressen
        die Wallets sind. Abgleich, Weiterleitung und das Adressbuch lesen die
        Wallets zuerst von hier aus.
      properties:
        chain:
          type: string
          description: >-
            Kanonische Chain, z. B. `BTC`, `XRP` oder `LIGHTNING` für einen
            Lightning-Transfer.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Bei einem UTXO-Transfer: die Inputs und Outputs wie gespeichert
            (Beträge als Dezimal-Strings) und welche Outputs Didit als was
            interpretiert hat.
          properties:
            inputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            outputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            change_output_indexes:
              type: array
              items:
                type: integer
              description: Ausgaben, die an eine Eingabeadresse zurückzahlen.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                Der Output, der den Begünstigten bezahlt; null, wenn keine
                unterschieden werden konnten.
        lightning:
          type: object
          description: >-
            Bei einem Lightning-Transfer: Inhalt der Zahlungsanforderung. Immer
            `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id`
            oder `unknown`); eine BOLT11-Rechnung ergänzt `network`,
            `payee_node_id`, `payment_hash`, `amount_msat`, `created_at` und
            `expires_at`; ein BOLT12-String ergänzt `blinded_paths` und
            `payee_node_id`; eine LNURL oder Lightning Address ihre `domain`. Es
            wird nichts über das Netzwerk aufgelöst: Die Anforderung wird
            lediglich decodiert.
          additionalProperties: true
        warnings:
          type: array
          items:
            type: string
            enum:
              - declared_originator_not_an_input
              - declared_beneficiary_not_an_output
              - beneficiary_output_ambiguous
              - beneficiary_output_amount_differs
          description: >-
            UTXO-Inkonsistenzen, die eine Überprüfung wert sind: Der angegebene
            Auftraggeber ist kein Input, der angegebene Begünstigte ist kein
            Output, es konnte kein einzelner Output des Begünstigten
            unterschieden werden oder der Begünstigten-Output zahlt einen
            anderen Betrag aus, als in der Transaktion angegeben ist.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Bei einem ausgehenden Lightning-Transfer, dessen Zahlungsanforderung
            keinen Begünstigten nennt: der Grund, warum der Transfer
            `NOT_APPLICABLE` ist. `LIGHTNING_NO_PAYEE_IDENTIFIER` (die
            Anforderung nennt keinen Knoten des Begünstigten oder konnte nicht
            decodiert werden), `LIGHTNING_BOLT12_BLINDED_PAYEE` (das Angebot
            verbirgt seinen Begünstigten hinter blinden Pfaden),
            `LIGHTNING_LNURL_NAMES_NO_PAYEE` (eine LNURL nennt einen Dienst,
            keinen Begünstigten). Derselbe Code leitet den letzten
            `timeline`-Eintrag des Transfers ein.
    TravelRuleChainSide:
      type: object
      description: Die Wallet einer Seite, wie von Didit aus den Chain-Daten aufgelöst.
      properties:
        address:
          type: string
          description: >-
            Die Wallet. Auf einem Memo-Netzwerk die klassische Adresse (eine
            XRP-X-Adresse wird in ihre klassische Adresse und ihr Tag
            aufgeteilt); auf Lightning die Knoten-ID des Zahlungsempfängers oder
            die Lightning-Adresse.
        memo:
          type: string
          description: >-
            Das Destination-Tag oder Memo, das Teil der Wallet ist; `""` für
            keines.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Woher die Wallet stammt: `declared` (Ihre Anfrage), `x_address` (aus
            einer XRP-X-Adresse aufgeteilt), `largest_input` (die
            UTXO-Input-Adresse mit dem größten Beitrag),
            `only_non_change_output` (der einzige UTXO-Output, der kein
            Wechselgeld ist), `amount_match` (der eine UTXO-Output, der den
            Überweisungsbetrag zahlt), `invoice_payee` (der Zahlungsempfänger,
            den eine Lightning-Zahlungsanforderung benennt), `updated`
            (nachträglich mit `action: update_originator_wallet` festgelegt).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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