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

# Enable Outbound Billing

> Turns outbound Travel Rule billing on for the workspace. Receiving stays free. This cannot be turned back off through the API: contact Didit support.



Enable Outbound Billing API Prompt
        Copy prompt to clipboard



      
      

\<pre>

\``Turns outbound Travel Rule billing on for the workspace. Receiving stays free. This cannot be turned back off through the API: contact Didit support.

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

Authentication:
Use the x-api-key header with the API key returned when the account was created.

Request body (application/json):
\{"enabled": true}

Failure modes:
\- 400 - `enabled` was false.
\- 404 - This application did not join free, so it has no free workspace.

Guide: /transaction-monitoring/travel-rule-interoperability#email-pickup.``

\</pre>



      
      

Paste into



## OpenAPI

````yaml POST /v3/travel-rule/workspace/billing/
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/workspace/billing/:
    post:
      tags:
        - Travel Rule
      summary: Enable outbound billing
      description: >-
        Turns outbound Travel Rule billing on for the workspace. Receiving stays
        free. This cannot be turned back off through the API: contact Didit
        support.
      operationId: enableTravelRuleWorkspaceBilling
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWorkspaceBillingRequest'
            example:
              enabled: true
      responses:
        '200':
          description: The workspace with `billing_enabled` true.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWorkspace'
        '400':
          description: '`enabled` was false.'
        '404':
          description: This application did not join free, so it has no free workspace.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/workspace/billing/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"enabled": true}'
components:
  schemas:
    TravelRuleWorkspaceBillingRequest:
      type: object
      properties:
        enabled:
          type: boolean
          default: true
          description: >-
            Only `true` is accepted: outbound billing cannot be turned back off
            through the API.
    TravelRuleWorkspace:
      type: object
      description: The free Travel Rule workspace of an application that joined free.
      properties:
        joined_free:
          type: boolean
        work_email:
          type: string
          format: email
        joined_at:
          type: string
          format: date-time
          nullable: true
        claim:
          type: object
          properties:
            status:
              type: string
              enum:
                - unclaimed
                - pending_review
                - claimed
                - rejected
            proved_by_domain:
              type: boolean
            claimed_at:
              type: string
              format: date-time
              nullable: true
            reviewed_at:
              type: string
              format: date-time
              nullable: true
            review_note:
              type: string
            vasp_id:
              type: string
              format: uuid
              nullable: true
            vasp_name:
              type: string
        prefill:
          type: object
          description: >-
            Profile values taken from the directory entry: `vasp_id`,
            `legal_name`, `lei`, `jurisdiction`, `compliance_email`, `domains`.
            Nothing is written until the claim is made.
        domain:
          type: object
          properties:
            domain:
              type: string
            status:
              type: string
              enum:
                - unverified
                - code_sent
                - verified
            verified_at:
              type: string
              format: date-time
              nullable: true
            txt:
              $ref: '#/components/schemas/TravelRuleWorkspaceTxtRecord'
        billing_enabled:
          type: boolean
          description: >-
            Receiving Travel Rule data is free. Sending is billed only after
            billing is enabled.
        billing_enabled_at:
          type: string
          format: date-time
          nullable: true
        didit_network:
          type: object
          description: >-
            Whether the Didit network lists this VASP and, when not, each
            condition it still misses.
        settings:
          $ref: '#/components/schemas/TravelRuleSettingsDetail'
    TravelRuleWorkspaceTxtRecord:
      type: object
      description: >-
        The TXT record to publish for the DNS proof. Empty until a proof has
        been started.
      properties:
        host:
          type: string
          example: didit-tr-verify.example.com
        value:
          type: string
    TravelRuleSettingsDetail:
      type: object
      properties:
        is_enabled:
          type: boolean
          description: >-
            Whether the managed Travel Rule negotiation flow is active for
            outbound `travelRule` transactions on this application.
        jurisdiction:
          type: string
          maxLength: 8
          description: >-
            Your VASP's operating jurisdiction code. Default `"EU"`. Didit maps
            it to the regime it stamps on your Travel Rule transactions as
            `travel_rule_regime` (for example `EU` or an EU member code becomes
            `eu`), which transaction rules can key on. Other Didit customers see
            it as your jurisdiction in the VASP directory once the Didit network
            lists your profile.
        name_matching_strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
          description: >-
            How strictly beneficiary names must match before a transfer can
            reach COMPLETED. `CONTAINS` accepts one name whose words all appear
            in the other.
        confirmation_timeout_hours:
          type: integer
          minimum: 1
          description: >-
            Hours an AWAITING_COUNTERPARTY transfer may remain unconfirmed
            before the periodic sweeper expires it. Default 48.
        timeout_outcome:
          type: string
          enum:
            - HOLD
            - REJECT
            - PROCEED
          description: >-
            What happens to the underlying transaction when a transfer expires.
            Default HOLD. sunrise_policy and non_responsive_policy take
            precedence when they apply and are set.
        threshold_amount:
          type: string
          description: >-
            Decimal string, in your application's default currency. Minimum
            transfer amount that triggers a managed exchange; transfers below it
            resolve straight to NOT_APPLICABLE. Didit compares the transaction
            amount converted to your default currency, or the
            `amount_in_default_currency` you send; when no converted amount is
            available, the threshold does not apply. Defaults to "0.00" (EU TFR
            applies no minimum amount).
        ownership_validation_mode:
          type: string
          enum:
            - FULL
            - SIMPLIFIED
            - AUTOMATED
          description: >-
            How much proof a wallet's ownership takes. `FULL` always needs a
            proof (signed message, test deposit or reviewed screenshot), never
            the end user's word. `SIMPLIFIED` accepts a self-declaration below
            `simplified_validation_threshold` and a proof above it. `AUTOMATED`
            lets the address book and earlier proofs answer on their own,
            self-declarations included while `allow_self_declaration` is true.
            Default `AUTOMATED`.
        simplified_validation_threshold:
          type: string
          description: >-
            Decimal string, default "0.00". In `SIMPLIFIED` mode a transfer
            below this amount (in the threshold currency) accepts a
            self-declaration. A transfer with no amount in that currency counts
            as above it.
        data_sharing_fields:
          $ref: '#/components/schemas/TravelRuleDataSharingFields'
        matching_rules:
          $ref: '#/components/schemas/TravelRuleMatchingRules'
        legal_name:
          type: string
          description: >-
            Your VASP's legal name. Required (non-blank) to set is_enabled to
            true.
        lei:
          type: string
          description: Your Legal Entity Identifier, surfaced in the VASP directory.
        compliance_email:
          type: string
          format: email
          description: >-
            Compliance contact email for your VASP profile. The Didit network
            lists your profile only once this address is confirmed through an
            emailed link (POST
            /v3/travel-rule/settings/compliance-email/confirmation/); changing
            it needs a new confirmation.
        is_discoverable:
          type: boolean
          description: >-
            Whether your VASP profile can be listed in the Didit network: found
            in GET /v3/travel-rule/vasps/ by other Didit customers and reached
            on the INTERNAL rail. Listing also needs a live application, Travel
            Rule on, a legal name and a confirmed compliance email;
            didit_network says which are missing. Default true.
        inbound_auto_accept:
          type: boolean
          description: >-
            When true, an inbound TRP inquiry whose beneficiary wallet is a
            verified address-book entry with a matching name is approved
            automatically. When false, that inquiry waits in ON_HOLD for you to
            approve or deny it with the ownership endpoint. INTERNAL-rail and
            after-deposit transfers are not affected. Default true.
        allow_self_declaration:
          type: boolean
          description: >-
            When true, the wallet-ownership widget offers self-declaration as a
            fallback proof method. Default true.
        allow_screenshot_proof:
          type: boolean
          description: >-
            When true, the wallet-ownership widget offers screenshot upload as
            an ownership evidence method. Default true.
        auto_wallet_verification:
          type: boolean
          description: >-
            When true, submitting an outbound Travel Rule transfer that needs
            end-user proof of wallet control auto-mints a wallet-ownership
            widget session bound to the transaction and exposes it in the
            transaction's action_required block. Default true.
        vasp_attribution_enabled:
          type: boolean
          description: >-
            When true, an outbound Travel Rule transfer that no rail can route
            is attributed through blockchain analytics: the destination wallet
            is resolved to its owning VASP, the entity is recorded on the
            transfer and in the VASP directory, and the rails are re-run once
            with the attributed name. Default true.
        counterparty_screening_enabled:
          type: boolean
          description: >-
            Opt-in sanctions and adverse-media screening of counterparty VASPs,
            billed per screening at the Company AML Screening price. When on,
            Didit screens the counterparty an outbound exchange reaches (reusing
            a screening younger than 30 days) and you can screen one with POST
            /v3/travel-rule/vasps/{vasp_id}/screening/. Default false: nothing
            is screened or billed.
        sunrise_policy:
          type: string
          enum:
            - ''
            - HOLD
            - REJECT
            - PROCEED
          description: >-
            What an expired transfer does to its transaction when the
            counterparty is a directory entry in a jurisdiction on
            sunrise_jurisdictions, which does not enforce the Travel Rule yet:
            HOLD moves it to review, REJECT declines it, PROCEED leaves its
            status untouched. Empty (the default) follows timeout_outcome.
            Applies before non_responsive_policy.
        sunrise_jurisdictions:
          type: array
          items:
            type: string
          readOnly: true
          description: >-
            Read-only. The countries (ISO 3166 alpha-2) Didit treats as in a
            Travel Rule sunrise period, where sunrise_policy applies. Currently
            CO, KH and VN. Any other jurisdiction, and an empty or unknown one,
            follows timeout_outcome.
        non_responsive_policy:
          type: string
          enum:
            - ''
            - HOLD
            - REJECT
            - PROCEED
          description: >-
            What an expired transfer does to its transaction when the
            counterparty is a directory entry whose responsiveness is
            UNRESPONSIVE: HOLD, REJECT or PROCEED, as for timeout_outcome. Empty
            (the default) follows timeout_outcome. sunrise_policy applies first
            when both fit.
        travel_address:
          type: string
          description: >-
            Read-only. Your VASP's own travel address - the encoded inbound TRP
            inquiry endpoint other VASPs use to reach you. Empty while
            `is_enabled` is false.
        disabled_networks:
          type: array
          items:
            type: string
            enum:
              - GTR
              - TRUST
              - VERIFYVASP
              - SYGNA
          description: >-
            Networks opted out of platform membership. Does not disable your
            connected own memberships or provision unavailable networks.
          default: []
        networks:
          type: object
          readOnly: true
          description: >-
            Effective membership configuration for each network. No network,
            including GTR, is included by default. This is not a live health or
            delivery check.
          properties:
            gtr:
              type: object
              properties:
                rail:
                  type: string
                  enum:
                    - GTR
                mode:
                  type: string
                  enum:
                    - own
                    - didit
                    - 'off'
                    - unavailable
                  description: >-
                    own: connected customer membership takes precedence; didit:
                    configured platform membership allowed; off: platform
                    routing disabled with no own membership; unavailable:
                    neither membership available.
                platform_available:
                  type: boolean
                  description: >-
                    Whether platform membership is configured; not a live health
                    check.
                connected:
                  type: boolean
                  description: >-
                    Whether a connected customer membership exists. Credentials
                    are validated locally; network validation occurs on a live
                    exchange.
            trust:
              type: object
              properties:
                rail:
                  type: string
                  enum:
                    - TRUST
                mode:
                  type: string
                  enum:
                    - own
                    - didit
                    - 'off'
                    - unavailable
                  description: >-
                    own: connected customer membership takes precedence; didit:
                    configured platform membership allowed; off: platform
                    routing disabled with no own membership; unavailable:
                    neither membership available.
                platform_available:
                  type: boolean
                  description: >-
                    Whether platform membership is configured; not a live health
                    check.
                connected:
                  type: boolean
                  description: >-
                    Whether a connected customer membership exists. Credentials
                    are validated locally; network validation occurs on a live
                    exchange.
            verifyvasp:
              type: object
              properties:
                rail:
                  type: string
                  enum:
                    - VERIFYVASP
                mode:
                  type: string
                  enum:
                    - own
                    - didit
                    - 'off'
                    - unavailable
                  description: >-
                    own: connected customer membership takes precedence; didit:
                    configured platform membership allowed; off: platform
                    routing disabled with no own membership; unavailable:
                    neither membership available.
                platform_available:
                  type: boolean
                  description: >-
                    Whether platform membership is configured; not a live health
                    check.
                connected:
                  type: boolean
                  description: >-
                    Whether a connected customer membership exists. Credentials
                    are validated locally; network validation occurs on a live
                    exchange.
            sygna:
              type: object
              properties:
                rail:
                  type: string
                  enum:
                    - SYGNA
                mode:
                  type: string
                  enum:
                    - own
                    - didit
                    - 'off'
                    - unavailable
                  description: >-
                    own: connected customer membership takes precedence; didit:
                    configured platform membership allowed; off: platform
                    routing disabled with no own membership; unavailable:
                    neither membership available.
                platform_available:
                  type: boolean
                  description: >-
                    Whether platform membership is configured; not a live health
                    check.
                connected:
                  type: boolean
                  description: >-
                    Whether a connected customer membership exists. Credentials
                    are validated locally; network validation occurs on a live
                    exchange.
        didit_network:
          type: object
          readOnly: true
          description: >-
            Whether the Didit network lists your VASP profile, so other Didit
            customers find it in the directory and reach it on the INTERNAL
            rail, and each condition it still misses.
          properties:
            listed:
              type: boolean
            missing:
              type: array
              items:
                type: string
                enum:
                  - travel_rule_off
                  - sandbox_application
                  - not_discoverable
                  - legal_name_missing
                  - compliance_email_missing
                  - compliance_email_unconfirmed
                  - excluded_by_staff
                  - internal_organization
              description: >-
                Empty when listed. compliance_email_unconfirmed: send the
                confirmation with POST
                /v3/travel-rule/settings/compliance-email/confirmation/ and open
                the emailed link. excluded_by_staff: Didit marked the
                application as a test, demo or internal one.
            compliance_email_confirmed:
              type: boolean
              description: >-
                Whether the current compliance_email was confirmed through the
                emailed link.
    TravelRuleDataSharingFields:
      type: object
      description: >-
        The fields Didit sends to the counterparty VASP about your own users,
        per entity type. The `name` and the `wallet_address` are always sent,
        whatever the list says. An entity type you never chose shares every
        field. An empty list is a choice too: it shares the name and the wallet
        only.
      properties:
        individual:
          type: array
          items:
            type: string
            enum:
              - name
              - wallet_address
              - address
              - national_id
              - customer_identification
              - date_of_birth
              - place_of_birth
          description: Fields shared about a natural person.
        company:
          type: array
          items:
            type: string
            enum:
              - name
              - wallet_address
              - address
              - national_id
              - customer_identification
          description: Fields shared about a legal person.
    TravelRuleMatchingRules:
      type: object
      description: >-
        How strictly each field of the counterparty's data is compared with what
        you hold, per entity type. A field you leave out keeps its default.
        `NONE` skips the comparison, `STRICT` needs exactly the same words,
        `CONTAINS` accepts one value whose words all appear in the other,
        `DEFAULT` is the standard subset match, and `FUZZY` accepts close
        spellings (and, for dates of birth, a swapped day and month).
      properties:
        individual:
          type: object
          description: Rules for a natural person.
          properties:
            name:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: 'Default: follows `name_matching_strictness`.'
            date_of_birth:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: Default `NONE`.
            address:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: Default `NONE`.
            account:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: The wallet the exchange was routed by. Default `STRICT`.
        company:
          type: object
          description: Rules for a legal person.
          properties:
            name:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: 'Default: follows `name_matching_strictness`.'
            address:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: Default `NONE`.
            account:
              type: string
              enum:
                - NONE
                - STRICT
                - CONTAINS
                - DEFAULT
                - FUZZY
              description: The wallet the exchange was routed by. Default `STRICT`.
  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.