Travel Rule

The Travel Rule is a regulation that requires crypto-asset service providers, including Confirmo, to share basic information about the sender and the recipient of every crypto transfer.

Receiving payments: what counts as complete

A payment has complete Travel Rule data when your customer's details match one full set below, together with the wallet they pay from (we take the wallet address from the transaction itself).

Individual customers — any one of two sets

Birth details setDocument details set
First name and last nameFirst name and last name
Date of birthFull residential address, including country
Place of birthID document number
  • A set only counts in full. Fields can't be mixed between sets. For example, name + date of birth + address, without place of birth, is not complete.
  • Middle name is optional in both sets but should be provided if it applies.
  • The document details set can only come from you through the API. The Confirmo checkout only ever asks individuals for the birth details set.
  • Sending more is fine. If you send both sets or extra fields, we store and use all of it.

Company customers — one set

RequiredOptional
Registered company nameLEI (Legal Entity Identifier)
Registered office address, including country
Company registration number

LEI: it is optional in the API because not every company has one, send it if it applies.

The customer ID (profileId)

profileId is the ID you use for this customer in your own system. It lets us recognise the customer across payments and reuse their verified details.

  • It's required in every customerProfile you send through the API.
  • It must be permanent and unique per customer, such as your internal user ID or account number. Don't use an invoice, order or session ID. Using the customer's email address is fine, as long as it's the key you always use for that customer.

When details are missing

If your customerProfile doesn't contain one complete set, the Confirmo checkout asks your customer to fill in the full birth details set. For company payers, the checkout asks for the full company set in the same way.

If the payment has already arrived at that point, the invoice waits in the pending_verification state:

  • If you provided customerEmail, we email the customer a link to complete their details.
  • Once the details are submitted, the invoice moves to paid automatically.
  • The customer has 24 hours. If the details aren't provided in time, the invoice moves to expired and is handled like any other invoice exception.
  • You receive webhooks for every state change, as usual. See Invoice Lifecycle.

Deposit accounts and subscriptions don't include a checkout step where we can ask your customer, so always send a complete set when you create them.

Sending payouts

On payouts, Confirmo sends the Travel Rule message to the recipient's provider. It contains:

  • You, as the sender: your details from your Confirmo onboarding, added automatically.
  • Your recipient: the details below, from your API request or from the recipient on the Confirmo payout page.
Individual recipientCompany recipient
First name and last nameRegistered company name
Company registration number

Payout pending_verification

The payout moves to pending_verification when recipient details are missing. While the payout is in pending_verification, the API response includes a url to the Confirmo payout page, where the recipient completes these steps.

🚧

Direct your recipient to the payout page

If you provide customerEmail, we email the recipient the link. If you don't, we can't reach them, so your integration must send them to the url itself.

The recipient has 24 hours to complete the page. After that, the payout moves to expired and the reserved amount is released. See Payout Lifecycle.

customerProfile field reference

customerProfile is accepted on Create invoice, Create payout, Create deposit account and Create subscription.

  • Invoices and payouts: customerProfile is optional, but without it your customer or recipient provides their details on the Confirmo page instead.
  • Deposit accounts and subscriptions: customerProfile is required.
FieldApplies toDescription
profileIdAllYour permanent, unique ID for this customer. Always required. See The customer ID.
typeAllindividual or company. Set it whenever you send details. It can't be changed once set.
firstName, lastNameIndividualLegal first and last name.
middleNameIndividualOptional.
dateOfBirthIndividualYYYY-MM-DD. Birth details set.
placeOfBirthIndividualCity and country of birth, e.g. Munich, Germany. Birth details set.
nationalIdNumberIndividualNumber of the customer's passport or national ID card. Document details set.
registeredNameCompanyLegal company name.
registrationNumberCompanyCompany registration number. Always required for companies.
leiCompany20-character Legal Entity Identifier. Send it whenever the company has one.
streetAddress, city, postalCode, countryBothResidential address (individuals, document details set) or registered office address (companies). country is an ISO 3166-1 alpha-2 country code, e.g. DE.

customerEmail

We strongly recommend sending your customer's email address (on deposit accounts the field is customerEmailAddress; on subscriptions, subscriber.email). We use it to contact them about their payment or payout, to request missing information and to process refunds. We never use it for marketing and never share it with third parties.

Updating customer details

If you send a new request for an existing profileId with different details or a different customerEmail, the new values replace the stored ones. The type can't be changed.

Examples

Individual — birth details set

{
  "customerEmail": "[email protected]",
  "customerProfile": {
    "profileId": "user-8421",
    "type": "individual",
    "firstName": "Jane",
    "lastName": "Doe",
    "dateOfBirth": "1990-04-21",
    "placeOfBirth": "Munich, Germany"
  }
}

Individual — document details set

{
  "customerEmail": "[email protected]",
  "customerProfile": {
    "profileId": "user-8421",
    "type": "individual",
    "firstName": "Jane",
    "lastName": "Doe",
    "streetAddress": "Musterstrasse 12",
    "city": "Mannheim",
    "postalCode": "68159",
    "country": "DE",
    "nationalIdNumber": "C01X00T47"
  }
}

Company

{
  "customerEmail": "[email protected]",
  "customerProfile": {
    "profileId": "company-456",
    "type": "company",
    "registeredName": "ACME GmbH",
    "streetAddress": "Hauptstrasse 1",
    "city": "Berlin",
    "postalCode": "10115",
    "country": "DE",
    "registrationNumber": "HRB 123456",
    "lei": "5299001EXAMPLE000023"
  }
}

Payout to an individual recipient

{
  "currencyFrom": "EUR",
  "amountFrom": "100",
  "address": "0x...",
  "paymentMethodId": "ETHEREUM-BLOCKCHAIN-MAINNET-ETH-CURRENCY",
  "customerEmail": "[email protected]",
  "customerProfile": {
    "profileId": "user-8421",
    "type": "individual",
    "firstName": "Jane",
    "lastName": "Doe"
  }
}

Payout to a company recipient

{
  "currencyFrom": "EUR",
  "amountFrom": "5000",
  "address": "0x...",
  "paymentMethodId": "ETHEREUM-BLOCKCHAIN-MAINNET-ETH-CURRENCY",
  "customerEmail": "[email protected]",
  "customerProfile": {
    "profileId": "company-456",
    "type": "company",
    "registeredName": "ACME GmbH",
    "registrationNumber": "HRB 123456"
  }
}

Plugins and no-code integrations

  • WooCommerce: keep the plugin on the latest version. It shares your customer's email with Confirmo automatically; the checkout collects the remaining details. If you also send payouts, use the customer's email as their profileId.
  • Email invoices and payment buttons: these don't carry customer details, so the checkout always asks your customer for the birth details set.

Did this page help you?