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

# List Unmatched Travel Rule Deposits API

> List the inbound deposits still waiting for the originating VASP's Travel Rule data, so you can pair each one with the message the counterparty sent.



List Unmatched Travel Rule Deposits API Prompt
        Copy prompt to clipboard



      
      

\<pre>

\`List the inbound deposits of my application that still wait for the originating VASP's Travel Rule data.

Endpoint:
GET https://verification.didit.me/v3/travel-rule/unmatched/

Authentication:
Use the x-api-key header with my Didit API key. A scoped API key needs the transactions privilege.

Which deposits it returns:
\- Inbound transfers whose status is AWAITING_COUNTERPARTY, NOT_ENOUGH_COUNTERPARTY_DATA or COUNTERPARTY_VASP_NOT_FOUND.
\- Only deposits with no received Travel Rule message paired to them and nobody matched by hand.

Query parameters (all optional): the same filters as GET /v3/travel-rule/transfers/ (direction, status, rail, kind, currency, start_date, end_date, counterparty), plus limit (default 50) and offset.

What to read from each row:
\- The same fields as a row of GET /v3/travel-rule/transfers/: id, transaction_id, txn_id, kind, direction, status, rail, asset, amount, originator_vasp, beneficiary_vasp, wallets, memos, matched_transaction_id, deadline_at, created_at.
\- transaction_id is the deposit to pass as {transaction_uuid} to POST /v3/travel-rule/unmatched/{transaction_uuid}/match/.

Failure modes:
\- 400 - a filter value is not valid, for example {"status": ["Unknown value(s): awaiting."]}.
\- 401 - invalid API key.
\- 403 - the key lacks the transactions privilege.

Full guide: /transaction-monitoring/travel-rule.`

\</pre>



      
      

Paste into

## When to use itAn inbound deposit can reach your wallet before the originating VASP's Travel Rule data reaches Didit.
Until it does, the deposit waits.
List the waiting deposits to find the ones you need to resolve.When the data has arrived as a separate received message, pair the two with [Match an unmatched deposit](https://docs.didit.me/management-api/travel-rule/match-unmatched-deposit.md).## Request```bash theme={null}
curl "https://verification.didit.me/v3/travel-rule/unmatched/" \
  -H "x-api-key: YOUR_API_KEY"
```## Notes- Rows and filters are the same as in [List Travel Rule transfers](https://docs.didit.me/management-api/travel-rule/list-transfers.md), newest first.
- A deposit leaves the list when a received message is paired with it, when you match it by hand, or when its status moves on.
- The list is empty for applications without Travel Rule transfers.## Related- [Match an unmatched deposit](https://docs.didit.me/management-api/travel-rule/match-unmatched-deposit.md)
- [Travel Rule](https://docs.didit.me/transaction-monitoring/travel-rule.md)


## OpenAPI

````yaml GET /v3/travel-rule/unmatched/
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/unmatched/:
    get:
      tags:
        - Travel Rule
      summary: List unmatched Travel Rule deposits
      description: >-
        Inbound deposits that are still waiting for the originating VASP's
        Travel Rule data: their transfer is `AWAITING_COUNTERPARTY`,
        `NOT_ENOUGH_COUNTERPARTY_DATA` or `COUNTERPARTY_VASP_NOT_FOUND`, no
        received message is paired with them, and nobody matched them by hand.
        The rows and the filters are the same as in `GET
        /v3/travel-rule/transfers/`, newest first, paginated with `limit`
        (default 50) and `offset`. Pair a deposit with the message the
        originating VASP sent with `POST
        /v3/travel-rule/unmatched/{transaction_uuid}/match/`.
      operationId: listUnmatchedTravelRuleDeposits
      parameters:
        - name: direction
          in: query
          required: false
          schema:
            type: string
          description: INBOUND, OUTBOUND, or both comma-separated. Case-sensitive.
        - name: status
          in: query
          required: false
          schema:
            type: string
          description: One or more transfer statuses, comma-separated.
        - name: rail
          in: query
          required: false
          schema:
            type: string
          description: >-
            One or more of INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL,
            TEST_VASP, comma-separated.
        - name: kind
          in: query
          required: false
          schema:
            type: string
          description: withdrawal, deposit or message, comma-separated.
        - name: currency
          in: query
          required: false
          schema:
            type: string
          description: The transaction's currency, case-insensitive.
        - name: start_date
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Transfers created on or after this day (UTC), YYYY-MM-DD.
        - name: end_date
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Transfers created on or before this day (UTC), YYYY-MM-DD.
        - name: counterparty
          in: query
          required: false
          schema:
            type: string
            format: uuid
          description: >-
            The `id` of a directory entry or Didit network member from GET
            /v3/travel-rule/vasps/: your transfers with that counterparty. A
            value that is not a valid id answers 400.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 1000000
          description: Page size, default 50.
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            maximum: 1000000
          description: Rows to skip.
      responses:
        '200':
          description: A page of unmatched deposits.
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/TravelRuleTransferRow'
              example:
                count: 1
                next: null
                previous: null
                results:
                  - id: 7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08
                    transaction_id: c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91
                    txn_id: dep-2026-10-20-0007
                    txn_date: '2026-10-19T08:41:12Z'
                    kind: deposit
                    direction: INBOUND
                    status: AWAITING_COUNTERPARTY
                    rail: TRP
                    asset: ETH
                    amount: '1.25'
                    originator_vasp: ''
                    beneficiary_vasp: Example Counterparty VASP
                    originator_wallet: '0x77ccff0cc624a53cd8b8d8703ced826710211ec7'
                    beneficiary_wallet: '0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb'
                    originator_memo: ''
                    beneficiary_memo: ''
                    originator_wallet_type: vasp
                    beneficiary_wallet_type: vasp
                    matched_transaction_id: null
                    deadline_at: null
                    created_at: '2026-10-19T08:41:13Z'
        '400':
          description: A filter value is not valid.
          content:
            application/json:
              example:
                start_date:
                  - Use the YYYY-MM-DD format.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            for item in client.travel_rule.unmatched_deposits.list():
                print(item)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            for await (const item of didit.travelRule.unmatchedDeposits.list())
            {
              console.log(item);
            }
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.UnmatchedDeposits.ListAutoPaging(ctx, didit.TravelRuleUnmatchedDepositsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;

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

            for (var item : client.travelRule().unmatchedDeposits().list()) {
                System.out.println(item);
            }
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            foreach ($didit->travelRule->unmatchedDeposits->list() as $item) {
                print_r($item->toArray());
            }
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            didit.travel_rule.unmatched_deposits.list.auto_paging_each do |item|
              puts item.to_h
            end
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            await foreach (var item in await
            client.TravelRule.UnmatchedDeposits.ListAsync())

            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }
components:
  schemas:
    TravelRuleTransferRow:
      type: object
      description: >-
        One Travel Rule transfer as the transfers list shows it: VASP names,
        wallets and memos only, never the originator or beneficiary person data.
      properties:
        id:
          type: string
          format: uuid
          description: The transfer's id.
        transaction_id:
          type: string
          format: uuid
          description: The Didit transaction the transfer belongs to.
        txn_id:
          type: string
          nullable: true
          description: >-
            Your own id for the transaction. Transfers Didit books for you, such
            as a Didit Test VASP inbound transfer, carry a generated one.
        txn_date:
          type: string
          format: date-time
        kind:
          type: string
          enum:
            - withdrawal
            - deposit
            - message
          description: >-
            withdrawal: outbound. message: an inbound transfer a rail created
            from a counterparty's message (a TRP inquiry, the INTERNAL inbound
            leg, or a GTR, VerifyVASP or Sygna Bridge message). deposit: any
            other inbound transfer.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        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
        reason:
          type: string
          description: >-
            Why a `COUNTERPARTY_VASP_NOT_FOUND` or
            `COUNTERPARTY_VASP_NOT_REACHABLE` transfer is stuck, the same value
            as the transfer's own `reason`, so the list tells a bounced
            compliance email from a counterparty with no route without opening
            each transfer. `""` for any other status. See [Why a transfer is
            stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck).
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
        asset:
          type: string
          description: The transaction's currency.
        amount:
          type: string
          description: The amount as a plain decimal, for example "1.25".
        originator_vasp:
          type: string
          description: >-
            Outbound: your VASP's legal name. Inbound: the counterparty's name,
            from its directory entry, the Didit network member, the TRP sender,
            the Didit Test VASP, or the name the transfer declared. Empty when
            none is known.
        beneficiary_vasp:
          type: string
          description: >-
            Outbound: the counterparty's name, worked out the same way. Inbound:
            your VASP's legal name.
        originator_wallet:
          type: string
        beneficiary_wallet:
          type: string
        originator_memo:
          type: string
          description: Memo or destination tag, empty on chains without one.
        beneficiary_memo:
          type: string
        originator_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
          description: >-
            vasp, self_hosted (declared unhosted) or own (a wallet your address
            book records as yours). Your own side is always vasp.
        beneficiary_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
        matched_transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            The other side of a deposit you matched to an announced transfer by
            hand.
        deadline_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the transfer expires if it is still waiting on its
            counterparty. Set on every transfer you create with `POST
            /v3/transactions/` that needs an exchange, outbound or inbound. Null
            below the threshold, on a Lightning payment the Travel Rule does not
            apply to, and on inbound transfers Didit creates when a counterparty
            reaches you (an inbound TRP inquiry, a network message or the
            INTERNAL inbound leg).
        created_at:
          type: string
          format: date-time
  responses:
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          examples:
            Invalid API Key:
              summary: Invalid API Key
              value:
                detail: Invalid API Key.
    Forbidden:
      description: Forbidden
      content:
        application/json:
          examples:
            No Permission:
              summary: No Permission
              value:
                detail: You do not have permission to perform this action.
            Not Enough Credits:
              summary: Not Enough Credits
              value:
                error: >-
                  You don't have enough credits to perform this request. Please
                  top up at https://business.didit.me
  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 wrong, revoked or expired; 403 means no key was sent,
        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.