Operate

Send wires and ACH

API Documentation

Catena allows your agents and admins to pay any US bank account by ACH or wires. When you send a bank payment, Catena draws USDC from the paying account and the counterparty receives USD in their bank account (an off-ramp). You can read more about how that conversion works in On- and off-ramp stablecoins.

Bank payments are only available to verified organizations. If your organization has not completed verification, ACH and wire sends will fail with kyb_verification_required.

Bank rails

A counterparty's bank rail stores the details of a US bank account. A single bank rail can receive both ACH and wire payments, so you don't need a separate rail for each method.

Field Format
Bank name Required.
Routing number 9 digits.
Account number 4 to 17 digits.
Account type Checking or savings. Defaults to checking.
Address The account holder's street address, including a street number, city, two-letter state, and ZIP code. P.O. boxes are not accepted.

Catena pays US bank accounts only (international wires are not supported).

You can enter the bank details yourself when you create the counterparty. If you do not have them, you can ask the counterparty to fill them in:

Shell
catena counterparties request-details cp_... --bank

We email the counterparty a secure form, so the counterparty must have an email address on file. Each request expires after 7 days, and a counterparty can only have one open request at a time.

Send a payment

To send a bank payment from the CLI, pass the counterparty's bank rail and choose ach or wire as the method:

Shell
catena send --rail cpr_... --amount 125.00 --method ach
catena send --rail cpr_... --amount 4800.00 --method wire --memo "Invoice 1042"

The ach and wire methods require a bank rail. If you pass a wallet rail instead, the send will fail with rail_method_mismatch.

Every send is an intent, which means your agent's policy applies to it like any other action. Depending on the policy, the payment may be blocked or held for an admin's approval.

Admins can also send bank payments from the console:

  1. Click Send, then choose the account and the counterparty.
  2. Enter the amount and choose ACH or Wire.
  3. Click Review and check the payment details.
  4. Hold Send to submit the payment.

Fees and timing

ACH and wires have the same minimum, but they differ in cost and speed:

ACH Wire
Minimum $1.00 $1.00
Fee None $25.00, added to the amount
Arrives 1 to 2 business days The same business day

For example, if your agent wires $4,800.00 to Bea's Beans, $4,825.00 leaves your account (the $4,800.00 payment plus the $25.00 wire fee). The same payment by ACH would cost nothing extra but would take longer to arrive.

Note that arrival times are estimates.

Memos

The --memo flag sets the payment reference that the counterparty sees (e.g., an invoice number). ACH and wires allow different lengths:

  • ACH: up to 10 letters, numbers, and spaces.
  • Wire: up to 280 characters.

If an admin has set a default ACH memo in Settings, your agent's ACH payments carry that memo instead of the --memo value. Wires always carry --memo. To keep an internal note for your own records, use --description (it stays in Catena).

Status and returns

You can follow a bank payment with catena intents get int_.... The intent's status moves from pending to processing, and then ends as completed, blocked, or failed.

If the receiving bank returns the payment, the intent will end as failed and the USDC will come back to the paying account. Catena does not show return reasons.

Limits and errors

We limit bank payments to 60 a minute per organization. The limit is shared by all of your organization's agents and members, so one busy agent can use it up for everyone.

Code Cause What to do
kyb_verification_required Your organization is not verified yet. Ask an admin to verify your organization.
rail_method_mismatch ach or wire was sent to a wallet rail. Use a bank rail, or send with --method on-chain.
rate_limited (429) Your organization sent more than 60 bank payments in a minute. Wait for the time in Retry-After, then send again.
temporarily_unavailable (503) Catena cannot accept bank payments right now. Try again later, and let the user know if the error persists.

Missing something you'd find helpful? Send us an email at support@catena.com.

Updated October 29, 2026 Applies to @catena/cli 0.19.0 View as Markdown