What happened
Your payout required a Travel Rule message to the receiving institution, but the institution rejected it before the on-chain broadcast. No funds were moved. The payout is in a terminal failed state withfailureCode: travel_rule_rejected.
Common causes
- Attestation conflict — the payout sent
attestation.custody: "self", but the destination address belongs to a custodian, such as an exchange. A customer’s account at a custodian is not a self-hosted wallet. See Send to or fund from an account at a custodian - Unrecognized beneficiary — the receiving institution could not match the destination address or account to a known entity
- Policy mismatch — the originating or beneficiary information did not meet the receiving institution’s compliance requirements
- Unsupported corridor — the receiving institution does not accept Travel Rule messages for the requested corridor
Before the failure: the payout can be held
When the Travel Rule check rejects the payout’s own data, for example on an attestation conflict, the payout is held for review before anything is signed or broadcast. It readsstatus: "processing" and its amount stays reserved. The review either sends the payout or ends it as failed with this code, and then the reserved amount is released. Do not send a replacement payout while the first one is held: it would reserve the funds a second time. In sandbox, a held payout fails at once. A rejection by the receiving institution before the payout is broadcast is not held: the payout fails as soon as it arrives.
Recovery
1. Ask for the rejection detailfailureMessage is Conduit’s fixed text for travel_rule_rejected. It does not carry the institution’s reason. Contact your account manager for the rejection detail.
2. Investigate the destination
Verify the destination address is associated with a regulated custodian that participates in Travel Rule messaging. Unhosted wallets or unsupported custodians cannot be matched during the Travel Rule exchange. If the address is the customer’s own account at a custodian, send the new payout with attestation.custody: "third_party" and the account holder’s identity, as the custodian routes describe.
3. Submit a new payout to a different destination
Once the issue is resolved, submit a new payout with a corrected or alternative destination:
Prevention
- Attest custody correctly — send
custody: "self"only for a self-hosted wallet the customer controls, never for an account at an exchange or custodian - Verify destination eligibility — confirm the destination address belongs to a custodian that supports Travel Rule before submitting high-value transfers
- Handle
transaction.failedwith this code — usefailureCode === 'travel_rule_rejected'to branch on this specific terminal state
Related webhooks
Thetransaction.failed event fires when the payout terminates:
failureMessage is always the catalog text for travel_rule_rejected, never the institution’s own reason.
Related endpoints
- GET /v2/payouts/:id — read payout state and failure details
- POST /v2/payouts — submit a new payout
- POST /v2/sandbox/payouts/:id/simulate/counterparty-webhook — simulate a counterparty rejection in sandbox