GuidesRecipesAPI ReferenceChangelog
Guides

Book Transfers

How do I execute a book transfer?

Learn how to execute fiat and crypto book transfers

Book transfers provide a zero-cost method to move funds between accounts on the Cybrid Platform. The following transfer directions are supported:

  • bank -> customer
  • customer -> bank
  • customer -> customer

All transfers must be like for like. You can transfer:

  • fiat -> fiat
  • crypto -> crypto

The source and destination accounts must share the same asset type (e.g., USD -> USD, USDC -> USDC).

ℹ️

Pre-funded bank accounts

Book transfers can move funds between a partner's pre-funded bank accounts and customer accounts. For more information about pre-funding, contact partner support.

ℹ️

Side display

Book transfers are always recorded as deposit at the API and raw data level. In the Cybrid portal or custom UIs, the transaction side may appear as withdrawal or deposit depending on the viewer's perspective (e.g., customer vs. bank). This is a display convention, not a data inconsistency. To always show deposit, display the API's side value directly in your frontend logic.

Fiat book transfer

This example transfers $1 USD from a fiat funding bank account to a fiat funding customer account.

  1. Create a quote using POST /api/quotes:
    • Set product_type to "book_transfer"
    • Set asset to "USD"
    • Omit side -- all book transfers default to "deposit"
    • Set deliver_amount to 100 (amount in cents)
{
  "product_type": "book_transfer",
  "asset": "USD",
  "deliver_amount": 100
}
ℹ️

deliver_amount vs receive_amount

deliver_amount fixes what you send; fees come out of what the recipient gets. receive_amount fixes what the recipient gets; you pay fees on top. See Create and execute a trade for the canonical explanation.

  1. Create a transfer using POST /api/transfers:
    • Set transfer_type to "book"
    • Set quote_guid to the quote GUID from step 1
    • Set source_account_guid to the bank account and destination_account_guid to the customer account
    • Provide source_participants and destination_participants
{
  "transfer_type": "book",
  "quote_guid": "<quote_guid>",
  "source_account_guid": "<bank account_guid>",
  "destination_account_guid": "<customer account_guid>",
  "source_participants": [
    {
      "type": "bank",
      "amount": 100,
      "guid": "<bank_guid>"
    }
  ],
  "destination_participants": [
    {
      "type": "customer",
      "amount": 100,
      "guid": "<customer_guid>"
    }
  ]
}
  1. Once the transfer executes, the transferred amount is immediately reflected in the platform_available balance of both the bank and customer accounts.

Crypto book transfer

This example transfers 1 USDC (Ethereum) from a crypto trading bank account to a crypto trading customer account.

  1. Create a quote using POST /api/quotes:
    • Set product_type to "book_transfer"
    • Set asset to "USDC"
    • Omit side -- all book transfers default to "deposit"
    • Set deliver_amount to 1000000 (1 USDC in base units)
{
  "product_type": "book_transfer",
  "asset": "USDC",
  "deliver_amount": 1000000
}
  1. Create a transfer using POST /api/transfers:
    • Set transfer_type to "book"
    • Set quote_guid to the quote GUID from step 1
    • Set source_account_guid to the bank account and destination_account_guid to the customer account
    • Provide source_participants and destination_participants
{
  "transfer_type": "book",
  "quote_guid": "<quote_guid>",
  "source_account_guid": "<bank account_guid>",
  "destination_account_guid": "<customer account_guid>",
  "source_participants": [
    {
      "type": "bank",
      "amount": 1000000,
      "guid": "<bank_guid>"
    }
  ],
  "destination_participants": [
    {
      "type": "customer",
      "amount": 1000000,
      "guid": "<customer_guid>"
    }
  ]
}
  1. Once the transfer executes, the transferred amount is immediately reflected in the platform_available balance of both the bank and customer accounts.

Monitor the transfer

Book transfers settle almost instantly, but all transfers are asynchronous. Confirm the transfer reaches completed before relying on the funds.

Poll GET /api/transfers/{transfer_guid} to check the state, or register for webhooks to receive automatic notifications on state changes.

ℹ️

Sandbox state testing

The expected_state field is available only in sandbox to force specific transfer outcomes. Add "expected_state": "pending" to the transfer request body to exercise state handling. See Sandbox transfers for more.