Skip to main content

What happened

You submitted a payout with purpose: intercompany but the destination has no whitelist proof for this customer. This returns HTTP 422 with error code RECIPIENT_NOT_WHITELISTED. Which proof the payout needs depends on the destination: The two crypto rows are not interchangeable. attestation.custody names who owns the destination, so "self" against a group-entity whitelist entry is refused, and "third_party" against a self_custody registered address is refused.

Common causes

  • No registration submitted — the destination has never been registered for this customer
  • Registration still in review — a registration exists but its status is pending_review, not registered
  • Registration rejected or revoked — the entry was declined or cancelled and no active replacement exists
  • Wrong attestation.custody on a crypto payout — a registration exists, but the payout declares the other owner. Send "self" against a self_custody registered address and "third_party" against a group_entity whitelist recipient

Recovery

1. Check existing registrations for the customer
Look for an entry with status: registered whose coordinates match the destination — accountNumber and routingNumber on a us entry, iban or bic + accountNumber on a swift entry, iban on a sepa entry, chain + address on a crypto entry. For the customer’s own wallet, check GET /v2/customers/:id/wallets/registered-addresses instead. 2. If no registration exists, submit one Upload evidence documents first (ownership chart, inter-company agreement, or bank statement):
Then register the recipient:
Same endpoint, same evidence documents, same review. The crypto rail identifies the wallet by chain plus address, and relationship must be group_entityself is rejected, because your customer’s own wallet belongs in the registered addresses register.
3. Wait for compliance review The registration starts in pending_review. Conduit will notify you via webhook when the review is complete:
Do not poll for status. Listen for the whitelist_recipient.registered or whitelist_recipient.rejected webhook events.
4. Once registered, resubmit the payout
The whitelist entry gates the destination; the payout still carries the full recipient inline. attestation.custody must be third_party, and a third_party crypto recipient carries the identity fields for its type (legalName + countryOfRegistration for a business, firstName + lastName + countryOfCitizenship for an individual).
Resubmit under the same Idempotency-Key as the rejected attempt. The 422 is returned before any payout is created, so the key is safe to reuse — and reusing it is what prevents a duplicate: if a later response is lost, replaying the same key returns the one accepted payout instead of creating a second one. Rotating to a new key on resubmit risks a double payout.

Prevention

  • Register recipients ahead of time — whitelist registration requires compliance review; submit the registration well before you intend to send funds
  • Listen for whitelist_recipient.registered — trigger your payout flow from the webhook, not from a timer or poll
  • Track registration state in your system — maintain a local map of the destination coordinates ((customerId, accountNumber) for a bank account, (customerId, chain, address) for a wallet) → whitelistRecipientId and its status, so you can gate payout submission on registered
  • Pin attestation.custody to the register you used"self" for a self_custody registered address, "third_party" for a group_entity crypto whitelist recipient