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

# Virtual Account Numbers

> Give each spend account a real routing and account number so external senders can push funds in over RTP, FedNow, Wire, or ACH.

A **virtual account number (VAN)** is a real, bank-issued routing number and account number that points at one of a user's [spend accounts](/features/spend-accounts). Anyone outside Fluz — an employer, a bank, a customer, a marketplace — can send money to that routing and account pair, and the funds land in the spend account as a deposit.

The VAN does not hold money. The **spend account holds the balance.** A VAN is simply another address that routes into it.

<Note>
  **One balance, many addresses.**

  A spend account can have more than one active virtual account number, and exactly one of them is marked **primary**. Every VAN on the account credits the same balance — they exist so you can separate senders, such as payroll versus a specific customer, without splitting the funds.
</Note>

***

## How It Fits Together

```mermaid theme={null}
flowchart LR
    subgraph EXT["External Senders"]
        E1[Employer payroll]
        E2[User's outside bank]
        E3[Customer or partner]
    end

    subgraph VANS["Virtual Account Numbers"]
        V1["VAN — primary\nrouting + account"]
        V2["VAN — secondary\nrouting + account"]
    end

    SA[("Spend Account\nUserCashBalance\nholds the balance")]

    OUT["Gift cards · Virtual cards\nInternal transfers · Withdrawals"]

    E1 -->|ACH credit| V1
    E2 -->|RTP / FedNow| V1
    E3 -->|Wire| V2

    V1 --> SA
    V2 --> SA
    SA --> OUT
```

Money in arrives through a VAN. Money out still leaves the spend account the same way it always has — gift card and virtual card funding, internal transfers, and withdrawals to a linked external account.

***

## Supported Rails

Credits sent to a virtual account number are accepted over four rails:

| Rail       | Direction   | Typical availability | Notes                                                     |
| ---------- | ----------- | -------------------- | --------------------------------------------------------- |
| **RTP**    | Credit (in) | Near-instant, 24/7   | Sender's bank must participate in The Clearing House RTP. |
| **FedNow** | Credit (in) | Near-instant, 24/7   | Sender's bank must be a FedNow participant.               |
| **Wire**   | Credit (in) | Same business day    | Domestic wires. Sending bank fees are set by the sender.  |
| **ACH**    | Credit (in) | 1–2 business days    | Standard ACH credit, including payroll direct deposit.    |

<Warning>
  **ACH debit (pull) is not supported yet.**

  A virtual account number can currently only **receive** funds. You cannot use the VAN's routing and account number to originate an ACH debit — a third party cannot pull money out of a spend account using these credentials. Support for ACH debit is **coming soon**.

  To move money out today, use [Withdraw Funds to an External Account](/features/withdraw-funds) or an [internal transfer](/features/transfer-between-spend-accounts).
</Warning>

***

## What a Credit Looks Like

When funds arrive at a virtual account number, Fluz records a standard **deposit** against the destination spend account. The deposit's **funding source is the virtual account** — not a bank card, bank account, or PayPal — because the money originated outside Fluz and was pushed in rather than pulled from a linked payment method.

This means:

* The credit appears in the same transaction and deposit history as any other deposit.
* There is no linked funding source object to reconcile against, and no backup card hold, because nothing was debited from the user.
* The deposit is attributable to the specific VAN that received it, so you can distinguish a payroll credit from a customer payment when a spend account has multiple VANs.

```mermaid theme={null}
sequenceDiagram
    participant S as External sender
    participant B as Receiving bank
    participant F as Fluz
    participant SA as Spend account

    S->>B: Push funds to VAN routing + account
    B->>F: Credit received (RTP / FedNow / Wire / ACH)
    F->>F: Match VAN to spend account
    F->>SA: Post deposit (funding source: virtual account)
    F-->>S: Funds available to spend
```

***

## Retrieve a User's Virtual Account Numbers

Use `getSpendAccountVirtualAccountNumbers` to list the active VANs on a spend account. It returns every active VAN, one of which is flagged as primary.

**Scope required:** `LIST_PAYMENT`

```graphql theme={null}
query getSpendAccountVirtualAccountNumbers($userCashBalanceId: UUID!) {
  getSpendAccountVirtualAccountNumbers(userCashBalanceId: $userCashBalanceId) {
    virtualAccountNumberId
    routingNumber
    accountNumber
    accountType
    bankName
    isPrimary
    status
    createdAt
  }
}
```

```json Variables theme={null}
{
  "userCashBalanceId": "9c1f6b2e-4d7a-4c3b-9f11-2a5e8b0d6c74"
}
```

| Argument            | Type    | Required | Description                                               |
| ------------------- | ------- | -------- | --------------------------------------------------------- |
| `userCashBalanceId` | `UUID!` | Yes      | The spend account whose virtual account numbers you want. |

Returns `[SpendAccountVirtualAccountNumber!]!`. See the [type reference](/api-reference/types/spend-account-virtual-account-number) for the full field list.

<Note>
  **Displaying account numbers.**

  A VAN's full account number is sensitive. Mask it in list views and reveal the full value only on an explicit user action, the same way you would treat a card PAN. When a user needs to hand the details to a third party, prefer the generated PDF artifacts described in [Virtual Account Documents](/features/virtual-account-documents) over free-form copy.
</Note>

***

## Handing the Details to a Third Party

Rather than asking a user to transcribe a routing and account number into a payroll portal or send it to a counterparty by email, Fluz generates PDF artifacts on demand:

| Document                  | Query                                | Use case                                                                    |
| ------------------------- | ------------------------------------ | --------------------------------------------------------------------------- |
| **Payment instructions**  | `getSpendAccountPaymentInstructions` | Give a customer or partner the details needed to send a wire or ACH credit. |
| **Paycheck deposit form** | `getSpendAccountPaycheckDepositForm` | Pre-filled direct deposit form for an employer's payroll department.        |
| **Account status letter** | `getSpendAccountStatusLetter`        | Proof of account, optionally showing the current balance.                   |

All three default to the spend account's **primary** VAN when `virtualAccountNumberId` is omitted, and all three require the `LIST_PAYMENT` scope.

See [Virtual Account Documents](/features/virtual-account-documents) for the full reference.

***

## Requirements

* The user must have at least one **active spend account**.
* Reading virtual account numbers and generating documents both require the `LIST_PAYMENT` scope on the user access token.
* Virtual account numbers are provisioned by Fluz. They are not created through the API.

***

## Related

<CardGroup cols={2}>
  <Card title="Spend Accounts" icon="wallet" href="/features/spend-accounts">
    The account that actually holds the balance.
  </Card>

  <Card title="Virtual Account Documents" icon="file-pdf" href="/features/virtual-account-documents">
    Payment instructions, deposit forms, and status letters.
  </Card>

  <Card title="Deposit Funds" icon="arrow-down-to-line" href="/features/deposit-from-external-accounts">
    Pull funds in from a linked bank account or card.
  </Card>

  <Card title="Funding Sources" icon="credit-card" href="/features/funding-sources">
    How Fluz classifies the money moving in.
  </Card>
</CardGroup>

***

**Want to learn more?** Speak with our experts for more info or to request a demo.
