> ## Documentation Index
> Fetch the complete documentation index at: https://agents.laso.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Send dollars to a bank account

> Pay USDC to send dollars to a bank account by ACH. The x402 USDC price is the requested amount plus a 0.25% transfer fee (with a \$1.50 minimum fee). On-chain payment credits the calling wallet's Laso account balance via the standard deposit webhook; the callable then debits the gross amount and queues the transfer.

**A bank destination is required first.** `destination_id` comes from the banking callables: create the banking profile with `createBankingProfile`, register who is being paid with `createBankingRecipient`, and attach their bank account with `addBankingDestination`, which returns the id. List what you already have at `GET /bank-recipients` (free). See the [bank accounts guide](/guides/agent-bank-accounts) for the full setup.

**Identity verification is required** on the account that owns the banking profile, and only the human owner can complete it. `createBankingProfile` hands back a `kycUrl` when it is outstanding.

**If the payout cannot be fulfilled** (no approved banking profile, a destination that is not yours, an amount out of range), nothing is stranded: the USDC you paid has already credited your account balance. Fix the problem and retry, or recover it with `POST /withdraw`.

**Settlement:** ACH, normally 1-2 business days. Follow it with `listBankingTransactions` / `getBankingTransaction`.

**Fee:** 0.25% with a \$1.50 minimum (included in the USDC price).



## OpenAPI

````yaml /api-reference/openapi.json get /send-bank-payment
openapi: 3.1.0
info:
  title: Laso Finance x402 API
  version: 1.0.0
  x-docs-revision: aef3ed27a551
  x-docs-manifest: https://laso.finance/.well-known/docs-version.json
  contact:
    email: agents+support@laso.finance
  x-guidance: >-
    Laso Finance is a payment-gated (x402) API that lets an AI agent spend USDC
    on real-world financial products: prepaid cards (U.S. and international),
    gift cards, push-to-card transfers to USD/EUR/GBP debit cards, and
    Venmo/PayPal payouts.


    Payment: every paid route is an x402 v2 endpoint. Call it with no payment
    header to receive a 402 challenge listing the accepted networks, then replay
    with a signed USDC payment. Both Base (eip155:8453) and Solana
    (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) are accepted on every paid route;
    the caller picks either chain.


    Identity: `GET /auth` is free and identity-only. Prove wallet ownership with
    a `SIGN-IN-WITH-X` (CAIP-122) header to receive a Firebase id_token, then
    send that token as a Bearer credential to the authenticated read routes
    (`get-card-data`, `get-account-balance`, `get-kyc-status`, etc.). Paid
    routes also return fresh auth credentials in their response, so a payment is
    never required just to obtain a token.


    Recommended flow: (1) `GET /auth` to establish identity, (2) call a paid
    route (e.g. `GET /get-card`) to purchase a product, paying USDC on Base or
    Solana, (3) poll the authenticated read routes with the returned Bearer
    token to fetch the resulting card/transfer details. Full machine-readable
    instructions live at https://laso.finance/SKILL.md.
  description: >-
    Payment-gated API for Laso Finance. All paywalled routes use the x402
    protocol — the caller includes a USDC payment header on Base (eip155:8453)
    or Solana (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) and the server verifies
    payment before processing. Free routes require no payment header.


    ## Getting started


    To set up a wallet for making x402 payments, choose a provider:


    - **Locus** (default): https://paywithlocus.com/SKILL.md

    - **Sponge**: https://wallet.paysponge.com/skill.md — automatic x402 service
    discovery

    - **Ampersend**: https://www.ampersend.ai/getting-started.md — self-custody
    on Base or Solana with dual-approval spending limits. Laso Finance is a
    default skill, so no manual endpoint registration is needed.


    ## How x402 works


    1. Call a paywalled endpoint without a payment header → receive a `402
    Payment Required` response containing payment details (price, recipient
    address, network).

    2. Construct an x402 payment header using the details from the 402 response.

    3. Replay the request with the payment header → the server verifies payment
    and processes the request.


    ## Authentication flow


    `GET /auth` is free: callers prove wallet ownership by sending a
    `SIGN-IN-WITH-X` header (CAIP-122 wallet signature). Paywalled routes
    (`/get-card`, `/order-gift-card`, `/get-push-to-card`, `/order-intl-card`)
    also return fresh auth credentials in their responses, so a payment is never
    required just to obtain a token.


    Most routes return auth credentials (`id_token`, `refresh_token`,
    `expires_in`). Use the `id_token` as a Bearer token to call authenticated
    Laso Finance endpoints like `/get-card-data`. When the `id_token` expires,
    use `POST /auth` with `grant_type: refresh_token` to get a new one.


    ## Important notes


    The `/get-card` USA prepaid card endpoint is U.S. only — issued in USD,
    usable at U.S.-based merchants only, and physical goods must ship to a U.S.
    address. For non-U.S. merchants or non-USD currencies, use `GET
    /order-intl-card` instead (international prepaid card, admin-fulfilled
    within 24 hours). All cards are intended for the caller's own use.


    For step-by-step instructions, read https://laso.finance/SKILL.md
servers:
  - url: https://laso.finance
    description: Production
security: []
paths:
  /send-bank-payment:
    get:
      summary: Send dollars to a bank account
      description: >-
        Pay USDC to send dollars to a bank account by ACH. The x402 USDC price
        is the requested amount plus a 0.25% transfer fee (with a \$1.50 minimum
        fee). On-chain payment credits the calling wallet's Laso account balance
        via the standard deposit webhook; the callable then debits the gross
        amount and queues the transfer.


        **A bank destination is required first.** `destination_id` comes from
        the banking callables: create the banking profile with
        `createBankingProfile`, register who is being paid with
        `createBankingRecipient`, and attach their bank account with
        `addBankingDestination`, which returns the id. List what you already
        have at `GET /bank-recipients` (free). See the [bank accounts
        guide](/guides/agent-bank-accounts) for the full setup.


        **Identity verification is required** on the account that owns the
        banking profile, and only the human owner can complete it.
        `createBankingProfile` hands back a `kycUrl` when it is outstanding.


        **If the payout cannot be fulfilled** (no approved banking profile, a
        destination that is not yours, an amount out of range), nothing is
        stranded: the USDC you paid has already credited your account balance.
        Fix the problem and retry, or recover it with `POST /withdraw`.


        **Settlement:** ACH, normally 1-2 business days. Follow it with
        `listBankingTransactions` / `getBankingTransaction`.


        **Fee:** 0.25% with a \$1.50 minimum (included in the USDC price).
      operationId: sendBankPayment
      parameters:
        - name: amount
          in: query
          required: true
          description: >-
            USD delivered to the recipient's bank account (min \$10, max
            \$10,000). The x402 payment price is this amount plus a 0.25% fee
            (with a \$1.50 minimum).
          schema:
            type: number
            minimum: 10
            maximum: 10000
        - name: destination_id
          in: query
          required: true
          description: >-
            Bank destination to pay out to. Returned by `addBankingDestination`,
            and listed by `GET /bank-recipients`.
          schema:
            type: string
      responses:
        '200':
          description: Bank payment queued.
          content:
            application/json:
              schema:
                type: object
                properties:
                  auth:
                    $ref: '#/components/schemas/AuthCredentials'
                  callable_base_url:
                    type: string
                  user_id:
                    type: string
                  success:
                    type: boolean
                  message:
                    type: string
                  bank_payment:
                    type: object
                    properties:
                      payout_id:
                        type: string
                      amount:
                        type: number
                        description: USD delivered to the bank account.
                      fee_amount:
                        type: number
                        description: Transfer fee charged on top of the amount.
                      charged_amount:
                        type: number
                        description: amount + fee_amount, the total debited.
                      destination_id:
                        type: string
                      state:
                        type: string
                        example: in-process
                      timestamp:
                        type: number
                      destination:
                        type: object
                        description: >-
                          The bank account being paid, summarized. The account
                          number is masked to its last four digits.
                        properties:
                          name:
                            type: string
                          bank_name:
                            type: string
                          account_holder_name:
                            type: string
                          account_number_last4:
                            type: string
        '400':
          description: Missing or out-of-range `amount`, or a missing `destination_id`.
        '402':
          description: >-
            Payment required. Includes the x402 payment challenge. A **second**
            402 on the paid retry means something different: the payment header
            verified but the transfer could not be settled on-chain. That
            response body is not empty and carries no `accepts` — it is the x402
            settlement-failure shape `{"success": false, "errorReason": "...",
            "errorMessage": "..."}`, plus `x_laso_guidance` when a concrete next
            step applies. Distinguish the two by body: a challenge has
            `accepts`, a failure has `success: false`. The usual cause is an
            underfunded wallet, and the usual cause of that is the fee being
            charged **on top of** `amount` (a wallet holding exactly \$2,000
            cannot send a \$2,000 payment). Nothing is charged for a failed
            settlement, so retrying with a smaller amount is safe.
        '403':
          description: Account is frozen.
        '412':
          description: >-
            No approved banking profile, or the destination is not one of yours.
            The USDC paid is credited to your account balance and recoverable
            with `POST /withdraw`.
components:
  schemas:
    AuthCredentials:
      type: object
      properties:
        id_token:
          type: string
          description: ID token — use as Bearer token for Laso Finance APIs
        refresh_token:
          type: string
          description: >-
            Use with POST /auth (grant_type=refresh_token) to get a new id_token
            when it expires
        expires_in:
          type: string
          description: Token lifetime in seconds

````