GuidesRecipesAPI ReferenceChangelog
Guides

Customer Deposit Bank Accounts

How do I provision a routable deposit bank account for a customer's fiat account?

Deposit bank accounts are routable bank accounts that allow third-party Wire, ACH push, or RTP/FedNow transfers on and off the platform. They include complete routing details and beneficial owner information.

Each deposit bank account links to a single customer platform fiat account. Funds deposited or withdrawn flow through the linked fiat account's platform_balance and platform_available. Deposit bank accounts do not hold funds directly.

Key points:

  • Currently, deposit bank accounts can only be created for US banks.
  • Only one deposit bank account can be created for each platform fiat account.
  • Transfers into a deposit bank account are never initiated by the Cybrid platform; they are always initiated externally.
  • Beneficiary information is automatically populated from the PII collected during KYC.
❗️

Required for all customer fiat accounts (effective 2026-06-17)

From 2026-06-17, every customer fiat account must have a main deposit bank account before any funding transfer can complete. Any deposit or withdrawal involving a customer fiat account without one is rejected with HTTP 422 no_deposit_bank_account. Provision the deposit bank account immediately after creating the customer's fiat account, then wait for state: created before initiating transfers.

ℹ️

Existing production banks

Banks already operating in production are unaffected at launch. Cybrid support will communicate a per-bank migration plan directly.

ℹ️

ACH push microdeposits

Externally initiated ACH push microdeposits (such as those sent from external banks for account verification) will appear in the customer's deposit account history. These transactions can be identified by their small amounts (typically less than $2) and will be reflected in the account's balance and transaction history.

Create a main deposit bank account

A main deposit bank account creates a unique account_number and can accept deposits and initiate withdrawals. Account opening and maintenance fees are outlined in your contract.

When processing a withdrawal, the recipient will see the customer's name and address on the transfer if send_as_deposit_bank_account_guid is set.

POST /api/deposit_bank_accounts

{
  "type": "main",
  "customer_guid": "customer_guid",
  "account_guid": "customer_fiat_account_guid"
}
{
  "created_at": "datetime",
  "updated_at": "datetime",
  "guid": "deposit_bank_account_guid",
  "type": "main",
  "bank_guid": "bank_guid",
  "customer_guid": "customer_guid",
  "account_guid": "customer_fiat_account_guid",
  "asset": "USD",
  "state": "created",
  "unique_memo_id": "unique_memo_id",
  "counterparty_name": "John Doe",
  "counterparty_address": {
    "street": "123 Main St",
    "street2": null,
    "city": "New York",
    "subdivision": "NY",
    "postal_code": "10001",
    "country_code": "US"
  },
  "account_details": [
    {
      "account_number": "111222333"
    }
  ],
  "routing_details": [
    {
      "routing_number": "021000021",
      "routing_number_type": "ABA"
    }
  ],
  "labels": null
}

Poll GET /api/deposit_bank_accounts/{deposit_bank_account_guid} until state: created before initiating transfers.

Handling no_deposit_bank_account errors

If a customer fiat account does not have a main deposit bank account, any funding transfer — whether a deposit or withdrawal — returns:

{
  "status": 422,
  "error_message": "Fiat account missing required deposit bank account",
  "message_code": "no_deposit_bank_account"
}

To resolve:

  1. Create the main deposit bank account (see above).
  2. Poll GET /api/deposit_bank_accounts/{deposit_bank_account_guid} until state: created.
  3. Retry the transfer.

Send as a deposit bank account

To set the customer's name and address as the sender information (instead of the partner's) on a withdrawal fiat transfer, the customer must have a main deposit bank account. Include that account's identifier in the send_as_deposit_bank_account_guid field:

⚠️

RTP sender name display

For RTP (Real Time Payment) withdrawals, even if you set send_as_deposit_bank_account_guid, most recipient banks will only display the originator (Cybrid) on the recipient's statement. This is due to industry specifications and recipient bank practices, and it is not possible to guarantee that your company name will appear in the transaction description for RTP withdrawals. This differs from ACH and Wire withdrawals, where the company name can typically be displayed as intended.

POST /api/transfers

{
  "quote_guid": "quote_guid",
  "transfer_type": "funding",
  "customer_guid": "customer_guid",
  "external_bank_account_guid": "customer_external_bank_account_guid",
  "payment_rail": "rtp",
  "source_participants": [
    {
      "type": "customer",
      "amount": 5000,
      "guid": "customer_guid"
    }
  ],
  "destination_participants": [
    {
      "type": "customer",
      "amount": 5000,
      "guid": "customer_guid"
    }
  ],
  "send_as_deposit_bank_account_guid": "customer_deposit_bank_account_guid"
}

Bank name in deposit bank account APIs (sandbox vs production)

When using GET /api/deposit_bank_accounts/{deposit_bank_account_guid}, the response includes a bank_guid but does not directly provide the bank's name. To retrieve the bank name, make a separate request to GET /api/banks/{bank_guid}.

Sandbox environment:

In the sandbox, the bank object represents a simulated or internal test bank. The name field is tied to your organization configuration and does not reflect the real-world bank associated with the routing number.

Production environment:

In production, the bank object and its name field may represent the actual financial institution, depending on your integration and configuration.

Keep this distinction in mind when testing integrations that display bank names.