Travel Rule — Post 1 July 2026
How the Travel Rule operates once enforcement begins on 1 July 2026 — what's required and how to keep payments flowing.
Enforced from 1 July 2026From this date, Travel Rule is enforceable across the BEEM Portal and API. Channels, Payment Links In, and Payment Links Out must carry a linked Contact (in the Portal) or a populated
complianceDetailsobject (on the API). Payments without the required information are blocked at create time, or held against an RFI until a Contact is assigned.
What's changing now
BEEM now enforces the data model put in place during the Pre period:
| Area | Status from 1 July |
|---|---|
| Channels (Portal) | Creating a Channel requires linking a Contact. |
| Payment Link In / Receive Crypto (Portal) | Creating an inbound link requires linking a Contact. |
| Send Crypto / Payment Link Out (Portal) | Creating an outbound payment requires linking a Contact. |
| Missing Contact (Portal) | New page surfacing payments awaiting a Contact assignment. Acts as the operations queue for Travel Rule RFIs. |
complianceDetails (API) | Required on Create Channel and Create Payment Link requests. Missing → 400 Bad Request. |
| Travel Rule RFIs | Raised by BEEM against payments where the existing data doesn't fully satisfy the requirement — most commonly an unknown originator on a channel deposit. |
In the Portal
Creating a Channel
The Channel creation form now requires a linked Contact. Pick from the saved Contact list or create a new Contact in line. The Contact stays associated with the Channel for Travel Rule purposes.
Payment Link In / Receive Crypto
Creating an inbound Payment Link now requires you to select the Contact representing the customer who will pay (the originator). If you haven't saved the customer as a Contact yet, create one first.
Send Crypto / Payment Link Out
Creating an outbound payment requires you to select the Contact representing the recipient (the beneficiary). The Send Crypto and Payment Link Out flows both enforce this.
Missing Contact page
A new top-level Missing Contact page in the Portal sidebar surfaces every payment waiting on Contact assignment. Typical entries:
- A Channel deposit arrived from a sender BEEM doesn't have Contact details for — link a Contact representing the originator.
- A payment created with partial
complianceDetailsneeds additional verification — update or replace the linked Contact.
From the Missing Contact page:
- Open the pending item.
- Select an existing Contact, or create a new one in line.
- Submit. The payment proceeds and the item leaves the queue.
The Missing Contact page is the operations equivalent of the API's Travel Rule RFI flow — both surface the same set of payments awaiting resolution.
Via the API
complianceDetails is required
complianceDetails is requiredOn Create Channel and Create Payment Link requests, complianceDetails is now mandatory:
POST /api/v2/channel—CreateChannelRequest.complianceDetailsPOST /api/v1/pay/summary—PayRequestDto.complianceDetails
Two ways to populate it. Either is acceptable.
Option 1 — contactId (recommended)
{
"complianceDetails": {
"contactId": "1b083898-73ca-42ba-b433-7dc20ea67667"
}
}Option 2 — partyDetails[] inline
{
"complianceDetails": {
"partyDetails": [
{
"type": "BENEFICIARY",
"entityType": "COMPANY",
"legalName": "Acme Corp",
"registrationNumber": "12345678",
"relationshipType": "THIRD_PARTY",
"address": {
"addressLine1": "1 High Street",
"city": "London",
"country": "GB",
"postCode": "EC1A 1BB"
}
}
]
}
}If complianceDetails is missing — or doesn't meet the requirements — the request returns 400 Bad Request with a description of what's missing. Fix and resend.
Handling Travel Rule RFIs
Even with complianceDetails provided at create time, BEEM may raise a Travel Rule RFI (Request for Information) against a payment when extra information is needed — for example, a channel deposit from a sender you haven't yet linked to a Contact. Until the RFI is resolved, the payment is held against the RFI.
BEEM does not emit a dedicated "RFI raised" event. Detection runs through the existing transaction-held webhooks; resolution runs through the Travel Rule RFI endpoints.
Step 1 — Detect via transaction-held webhooks
The signal that an RFI may exist is the standard hold event firing on the affected payment:
| Payment type | Event code |
|---|---|
| Channel deposit | layer1:payment:channel:transaction-held |
| Payment Link (In or Out) | layer1:payment:checkout:transaction-held |
The payload structure is unchanged from its existing meaning — there is no Travel Rule flag on the event itself.
These events are shared with KYTA
transaction-helddelivery may indicate either an open Travel Rule RFI or a KYT (Chainalysis) screening flag. The payload does not say which. You must use Step 2 to determine the hold reason before reacting.
Step 2 — Confirm by listing RFIs
On every transaction-held delivery, call:
GET /platform/v1/travel-rule-rfis
If an open RFI exists for the held payment, the hold is a Travel Rule matter — proceed to Step 3. If no RFI is returned, the hold is being driven by KYT or another compliance process — route it to your existing remediation workflow and do not call assign-contact.
Step 3 — Resolve via assign-contact
PATCH /platform/v1/travel-rule-rfis/{externalId}/assign-contact
Submit contact details to satisfy the RFI. The endpoint accepts three request body shapes — pick whichever matches your situation:
- An existing
contactId(from your Contacts store) — recommended. - Inline Individual details — for natural-person counterparties, creates the Contact in the same call.
- Inline Company details — for legal-entity counterparties, creates the Contact in the same call.
BEEM validates the data against the requirement and resolves the RFI. The held payment proceeds.
See Building a Travel Rule Integration for the three request body shapes in detail and the recommended cross-API system design.
Webhooks
There is no dedicated "RFI raised" webhook event. Subscribe to the existing transaction-held events — layer1:payment:channel:transaction-held and layer1:payment:checkout:transaction-held — via your Hook configuration. These events also fire for KYT screening holds, so your handler must call GET /platform/v1/travel-rule-rfis on every delivery to determine whether the hold is a Travel Rule matter. See Events for the event payload shapes.
Held payments are recoverableA payment held against an RFI is not lost. The funds stay safe until you assign a Contact — at which point processing resumes from where it paused. Treat RFI resolution as routine ops, not as a failed payment.
How to be ready
- Confirm every Create Channel and Create Payment Link call now includes
complianceDetails. Catch any code path that doesn't before 1 July. - Subscribe to the
transaction-heldwebhooks (layer1:payment:channel:transaction-heldandlayer1:payment:checkout:transaction-held) so your system reacts in real time rather than polling. On every delivery, callGET /platform/v1/travel-rule-rfisto determine whether the hold is a Travel Rule RFI or a KYT flag. - Train your operations team on the Missing Contact page. This is the human fallback when programmatic resolution isn't possible.
- Use the Contacts-first pattern wherever you can — repeat counterparties saved once, reused on every payment, edited in one place.
- Read Building a Travel Rule Integration for the recommended cross-API system design.
What's next
The cross-API model that ties Channels, Payment Links, Contacts, and Travel Rule RFIs together.
Reference for the optional period before enforcement.
Back to the concept page — what the Travel Rule is and why it applies.
Manage the saved counterparties that satisfy Travel Rule requirements.

