laso

← All agent guides

How do I send dollars to a bank account from an AI agent?

Last reviewed: August 2026

The short answer

Register the person or company once with createBankingRecipient and addBankingDestination, which returns a destination_id. Then call GET /send-bank-payment with an amount and that destination_id, and pay for the call in USDC over x402. The recipient gets dollars by ACH, normally in 1 to 2 business days.

Why this is usually hard

Most outbound payment APIs assume a business with a funded account at the provider. Your agent would need that account, API credentials, and a USD balance before it could send anything. If the agent holds USDC, you also need an off-ramp step to turn it into dollars. Laso collapses the funding and the conversion into the one paid call, so the agent only needs USDC and a registered recipient.

Step 1: open the banking profile (once)

Sending requires a banking profile on the paying account. Opening one needs identity verification by the human who owns the account, and an agent cannot complete it for them. createBankingProfile returns a kycUrl when verification is outstanding: hand that link to your human and retry once they finish. Check progress with getBankingProfileStatus. After that, everything below is agent-drivable.

Step 2: register who gets paid (free)

The banking calls are Firebase callables: the body is wrapped in {"data": ...} and the Bearer token is the id_token from /auth. The recipient needs the payee’s postal address before a U.S. bank account can be attached. Use only the details your human gave you.

# 1. The person or company being paid
curl "$CALLABLE_BASE_URL/createBankingRecipient" \
  -H "Authorization: Bearer $LASO_ID_TOKEN" -H "Content-Type: application/json" \
  -d '{"data":{"userId":"usr_...","name":"Jane Doe","address":{"street1":"1 Main St","city":"Austin","region":"TX","postal_code":"78701","country":"US"}}}'

# 2. Their bank account. The reply carries the destinationId.
curl "$CALLABLE_BASE_URL/addBankingDestination" \
  -H "Authorization: Bearer $LASO_ID_TOKEN" -H "Content-Type: application/json" \
  -d '{"data":{"userId":"usr_...","recipientId":"<recipient id from step 1>","nickname":"Rent account","destination":{"destination_type":"fiat_us","name":"Jane checking","aba_routing_number":"021000021","account_number":"123456789","account_type":"checking","account_holder_name":"Jane Doe","bank_name":"Chase"}}}'

To look up a destination_id you already registered, call GET /bank-recipients with your Bearer token. It is free, and account numbers come back masked to their last four digits.

Step 3: send the payment

The amount is the dollars the recipient receives, from 10 to 50,000. The USDC price is that amount plus a 0.25% fee with a $1.50 minimum. An x402 client library builds the payment header for you; without one, the first call returns a 402 with the exact price.

curl "https://laso.finance/send-bank-payment?amount=250&destination_id=dest_123" \
  -H "X-Payment: <x402-payment-header>"
# {
#   "success": true,
#   "message": "Bank payment is being processed. It settles by ACH, ...",
#   "bank_payment": {
#     "payout_id": "abc123",
#     "amount": 250,
#     "fee_amount": 1.5,
#     "charged_amount": 251.5,
#     "destination_id": "dest_123",
#     "state": "in-process",
#     "destination": { "name": "Jane checking", "bank_name": "Chase", "account_number_last4": "6789" }
#   }
# }

Check the destination block in the reply before you treat the send as done. A destination_id is an opaque string, and this is where a wrong one becomes visible.

Step 4: follow the money

Call getBankingTransaction with the payout_id as the transactionId, or listBankingTransactions for the whole account. A transaction reports a status of pending, then completed, failed, or cancelled. To stop polling, register a webhook with POST /register-webhook.

What it costs and how long it takes

Bank payment terms from GET /get-pricing.
ItemValue
Amount$10 to $50,000
Fee0.25%, minimum $1.50, added on top of the amount
Paid inUSDC on Base or Solana over x402
SettlementACH, normally 1 to 2 business days
DestinationsU.S. bank accounts by routing and account number

If it fails

Nothing is stranded. The USDC you paid has already credited your Laso account balance, so a payout that cannot be fulfilled leaves the funds recoverable. Fix the cause (no approved banking profile, a destination that belongs to another account, an amount out of range) and retry, or send the credited USDC back to your wallet with POST /withdraw.

Pick the right route

ACH is the cheapest route here but the slowest, and it needs a one-time identity check by the account owner. If the recipient is on Venmo or PayPal, GET /send-payment is faster to set up but costs 4.9%. If they would rather enter their own debit card, use GET /get-push-to-card. Wire transfers are not part of this endpoint. A payments provider with a direct payout API gives you per-transfer control if you pay many recipients every day. For one-off and low-volume payments from an agent, registering a recipient and making one call is less to build.

Full reference: send a bank payment, bank accounts, and the API reference. Related guides: send money to a debit card and give an agent a bank account.

Frequently asked questions

Can an AI agent pay a bank account on its own?

Yes, after the account owner completes identity verification once to open the banking profile. From then on the agent registers recipients and sends payments with API calls alone.

How do I pay a contractor or landlord by ACH from code?

Register them with createBankingRecipient and addBankingDestination, then call GET /send-bank-payment with the amount and the returned destination_id. The payment is funded in USDC and delivered as dollars by ACH.

How long does an ACH payment from an agent take?

ACH normally settles in 1 to 2 business days. The payout shows as pending until then, and you can read it with getBankingTransaction.

What is the maximum I can send to a bank account?

The amount must be between $10 and $50,000 per call. The fee is 0.25% with a $1.50 minimum, included in the single USDC price.

What happens if a bank payment fails?

The USDC you paid has already credited your Laso account balance. Fix the problem and retry, or return the funds to your wallet with POST /withdraw.

More guides

Try it: connect a wallet at laso.finance and you'll have a card, gift card, or payout in minutes.

Building an agent? Point it at laso.finance/SKILL.md — it can set itself up.