Skip to main content
Inbound FedNow uses an Automation. The Automation provides a virtual account. When a payer sends a FedNow credit from their bank to that account, Brale creates a Transfer and mints stablecoins to the Automation’s destination. You do not call POST /transfers for each deposit. Brale does not pull or debit the payer’s bank, and the payer does not need a Plaid-linked account to send funds.
FedNow deposits are available on Brale accounts where FedNow has been enabled. Contact [email protected] to confirm enablement.

Prerequisites

  • A Brale Account with status: complete.
  • API credentials with the automations:write, automations:read, and transfers:read scopes.
  • A destination Address for the minted stablecoins, and a stablecoin value_type supported on its transfer_type. See Transfer types.
  • A webhook subscription for transfer.* and payment.completed (recommended).

Destination and account-type restrictions

  • Automations on a transactional account (account_type: transactional) may only target external destinations. Brale rejects a Brale-custodied destination on those accounts. See Account types.
  • The destination transfer_type must be a network that supports the destination value_type. Use lowercase network identifiers, such as solana or base.

How it works

  1. You create an Automation with source.value_type: "USD" and a stablecoin destination.
  2. Brale provisions a virtual account. When the Automation is active, source.funding_instructions holds the bank coordinates.
  3. You share those coordinates with the payer.
  4. The payer sends a FedNow credit from their bank.
  5. Brale receives the payment, creates a Transfer with source.transfer_type: "fednow_credit" and your automation_id, and mints stablecoins to the destination.

Step 1: Create an Automation or reuse an existing one

If you already have an active USD Automation for this destination, reuse it. Existing eligible virtual accounts are expected to accept FedNow without recreation, and you do not need a separate FedNow Automation. To create one, send POST /accounts/{account_id}/automations:
Do not set source.transfer_type. A USD Automation accepts the inbound rails enabled for its virtual account. Responses may show source.transfer_type: null. A null value does not mean FedNow is disabled. To show a managed account’s verified identity as the beneficiary on the funding instructions, add brand.account_id. See Branded Automations.

Step 2: Wait for the Automation to become active

Automations start as pending. Poll GET /accounts/{account_id}/automations/{automation_id} until status is active.

Step 3: Retrieve the funding instructions

The active response includes source.funding_instructions:
Response
Always share the values returned for your Automation. Do not hard-code bank coordinates from documentation or from another Automation. Treat routing_number and account_number as strings so leading zeros are preserved.

Step 4: The payer sends a FedNow credit

Give the payer the routing_number, account_number, and beneficiary_name. The payer initiates an instant payment from their bank. Their bank must support sending FedNow payments. If it does not, the payer can use another rail the virtual account accepts, such as wire or ACH.

Step 5: Track the deposit and the mint

Brale creates the Transfer automatically. Track it with webhooks, polling, or both.

Webhooks

Deliveries are at-least-once and can arrive in any order. Deduplicate on the envelope id (or the idempotency-key delivery header), and use data.account_id to attribute events to a managed account. Retrieve the Transfer for its current state instead of relying on event order. See Webhook events.

Find the Transfer

Payment IDs and Transfer IDs are different. To find the Transfer for a deposit, list Transfers for the Automation, then keep the ones where source.transfer_type is fednow_credit. The transfer_type query parameter filters by blockchain only, so do not pass fednow_credit to it.
Match a payment.completed event to a Transfer using the account (data.account_id), the amount, and the time received (source.payment_details.received_at on the Transfer).
Response (inbound FedNow Transfer)
payment_details fields are optional and vary by rail. Wire fields such as imad and ACH fields such as trace_number do not apply to FedNow. When status is complete, destination.transaction_id is the onchain mint transaction.

Test on testnet

Testnet Automations return placeholder bank coordinates that cannot receive real payments. Use Simulate an Automation deposit to run the FedNow onramp flow without moving real money. Requirements:
  • Testnet API credentials with the automations:write and network:testnet scopes. See Sandbox and testnet.
  • An active Automation that belongs to the account in the path.
  • A testnet destination, such as solana_devnet or base_sepolia.
  • The simulator input is fednow. The resulting Transfer has source.transfer_type: "fednow_credit". Do not send fednow_credit to the simulator.
  • Brale returns 202 Accepted with the Transfer, including automation_id. 202 means the simulated deposit was accepted, not that the mint is complete.
  • Retrying with the same Idempotency-Key and body returns the original response without creating another deposit. Use a new key for each new simulated deposit.
  • Brale emits the normal payment.completed and transfer.* events.
  • Fetch the Transfer with GET /accounts/{account_id}/transfers/{transfer_id}. When status is complete, look up destination.transaction_id on the testnet explorer to verify the mint.
Simulation creates simulated fiat funding only. It does not test the payer’s bank or the FedNow network.

Errors