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, andtransfers:readscopes. - A destination Address for the minted stablecoins, and a stablecoin
value_typesupported on itstransfer_type. See Transfer types. - A webhook subscription for
transfer.*andpayment.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_typemust be a network that supports the destinationvalue_type. Use lowercase network identifiers, such assolanaorbase.
How it works
- You create an Automation with
source.value_type: "USD"and a stablecoin destination. - Brale provisions a virtual account. When the Automation is
active,source.funding_instructionsholds the bank coordinates. - You share those coordinates with the payer.
- The payer sends a FedNow credit from their bank.
- Brale receives the payment, creates a Transfer with
source.transfer_type: "fednow_credit"and yourautomation_id, and mints stablecoins to the destination.
Step 1: Create an Automation or reuse an existing one
If you already have anactive 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:
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 aspending. Poll GET /accounts/{account_id}/automations/{automation_id} until status is active.
Step 3: Retrieve the funding instructions
Theactive response includes source.funding_instructions:
Response
routing_number and account_number as strings so leading zeros are preserved.
Step 4: The payer sends a FedNow credit
Give the payer therouting_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 wheresource.transfer_type is fednow_credit. The transfer_type query parameter filters by blockchain only, so do not pass fednow_credit to it.
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:writeandnetwork:testnetscopes. See Sandbox and testnet. - An
activeAutomation that belongs to the account in the path. - A testnet destination, such as
solana_devnetorbase_sepolia.
- The simulator input is
fednow. The resulting Transfer hassource.transfer_type: "fednow_credit". Do not sendfednow_creditto the simulator. - Brale returns
202 Acceptedwith the Transfer, includingautomation_id.202means the simulated deposit was accepted, not that the mint is complete. - Retrying with the same
Idempotency-Keyand body returns the original response without creating another deposit. Use a new key for each new simulated deposit. - Brale emits the normal
payment.completedandtransfer.*events. - Fetch the Transfer with
GET /accounts/{account_id}/transfers/{transfer_id}. Whenstatusiscomplete, look updestination.transaction_idon the testnet explorer to verify the mint.