Skip to main content

Funding

Before funding, the customer needs a Go Account. For fiat funding, they also need a linked bank account. Two ways to add money: pull USD from their bank (ACH) or receive Bitcoin/stablecoins to a deposit address.


Connect the customer's bank account so they can deposit and withdraw USD.

  • POST /api/v2/bankaccounts
  • Requires routing number, account number, and owner details
  • The bank account is scoped to the enterprise via enterpriseId
Bank accounts are linked at the enterprise level

Once a bank account is linked and approved for an enterprise, it can be reused for ACH deposits and fiat withdrawals for that customer. It is not tied to a single funding attempt.

Bank-account approval can lag behind creation

Creating the bank account record does not make it immediately usable for ACH or wires. The bank account may remain pending for some time, and ACH should only be attempted once verificationState is approved or verified.

You'll need their account number, routing number, and account type (checking/savings).


Fiat Funding (ACH)

Pull USD from the customer's linked bank account into the Go Account. This is a two-step process: first the customer must agree to the ACH terms, then you initiate the debit.

Get ACH Agreement

Before initiating a deposit, you must retrieve and display the ACH agreement to the customer. This only needs to be done once per bank account — subsequent deposits to the same bank account don't require it again.

The response contains the full authorization language, including account information, authorization details, and the legal acknowledgment text. You must display this to the customer and collect their explicit consent before proceeding.

The ACH agreement is usually a one-time step per bank account

This is easy to miss in implementation. After a customer accepts the ACH agreement for a given bank account, you do not need to fetch and re-present it for every later deposit to that same bank account.

The agreement amount does not bind future deposits

It reflects the typical per-transaction size and is informational only. You can debit a different amount on the actual deposit call without re-fetching the agreement.

The API does not track prior agreement acceptance for you

The agreement request and ACH debit request are forwarded independently. If your product needs a stricter audit trail for whether the agreement has already been shown for a bank account, store that acceptance state on your side.

Initiate ACH Deposit

Once the customer has agreed to the ACH terms, initiate the debit to pull funds from their bank into the Go Account.

  • POST /api/fiat/v1/transaction/ach-debit
  • amount — the deposit amount in USD cents (e.g., "1000" = $10.00)
  • checkboxAgreement — must be true. Once the customer has accepted the agreement for a bank account, you can send true on every subsequent deposit for that same bank account without re-prompting
  • bankId — the ID of the linked bank account to debit from
  • goAccountId — the Go Account to deposit into
  • Returns a txId you can use to track the deposit
The API validates the required ACH fields before forwarding

ACH debit requests that omit amount, bankId, goAccountId, or checkboxAgreement: true are rejected before they are forwarded, so it is worth validating those fields in your own request builder as well.

Example payload:

{
"amount": "1000",
"checkboxAgreement": true,
"bankId": "<bankAccountId>",
"goAccountId": "<goAccountId>"
}
ACH amounts use USD cents and do not settle instantly

An amount of "1000" means $10.00, not $1,000. After the debit is initiated, funds typically settle in 1-3 business days, so you should not treat the deposit as immediately available.

Settlement takes 1-3 business days via partner banks.

Track the Deposit

The txId returned by the debit call identifies the transaction. Once settlement is in progress, the movement appears as a wallet transfer on the destination Go Account's wallet.

ACH transfers only appear after settlement begins

Because ACH settles in 1-3 business days, the corresponding transfer may not be visible immediately after initiating the debit.


Crypto Funding (Bitcoin & Stablecoins)

Generate a deposit address for the customer. They send crypto from any external wallet.

Do not credit a crypto deposit on first detection alone

An address receiving a transaction does not mean the funds are final yet. Wait for the confirmation threshold you require before marking the deposit as available to the customer.

Newly created Go Accounts can need a short initialization window

Address generation can briefly fail right after Go Account creation while the wallet finishes initializing. Retrying for a short period is expected behavior for a brand-new account.

We recommend waiting for at least 1 confirmation before crediting the user. Reach out for supported stablecoins and other assets.


Putting It Together


Next Steps