---
url: /docs/fiat/wallets.md
description: >-
  Create a BlindPay-managed wallet that holds a customer's balance, check the
  balance, and use it to receive payins and fund payouts.
---

A managed wallet (`bl_...`) is a balance BlindPay creates and manages for a customer. You interact with it in three ways: create it once, check its balance, and reference it on payins and payouts. The settlement machinery behind it is BlindPay's problem, not yours.

Managed wallets are in beta.

## Prerequisites

A customer must exist and have `kyc_status: "approved"` before you can create a wallet for them. A customer can hold up to 10 wallets.

## Create a managed wallet

```bash [cURL]
curl --request POST \
  --url https://api.blindpay.com/v1/instances/in_000000000000/customers/re_000000000000/wallets \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "network": "base",
    "name": "Customer Balance"
  }'
```

`network` is the settlement rail BlindPay uses under the hood. Use `base` in production and `base_sepolia` on development instances unless you have a reason to pick another; the full list lives in the [stablecoin flavor's managed wallet page](/stablecoin/wallets).

Save two things from the response: the `id` (`bl_...`), which payin quotes reference, and the `address`, which funds payouts.

```json
{
  "id": "bl_000000000000",
  "network": "base",
  "address": "0x1234567890abcdef1234567890abcdef12345678",
  "name": "Customer Balance",
  "created_at": "2026-01-01T00:00:00.000Z"
}
```

## Check the balance

```bash [cURL]
curl --request GET \
  --url https://api.blindpay.com/v1/instances/in_000000000000/customers/re_000000000000/wallets/bl_000000000000/balance \
  --header 'Authorization: Bearer YOUR_API_KEY'
```

## Receive payments into it

Pass the wallet's `id` as `wallet_id` on a [payin quote](/fiat/payin-quotes) and the deposit settles into the wallet once the payin completes. Two webhooks confirm it: `payin.complete` and `wallet.inbound`. [Virtual account](/fiat/virtual-accounts) deposits settle into their linked wallet the same way.

## Pay out from it

Pass the wallet's `address` as `sender_wallet_address` when you [execute a payout](/fiat/payouts). Because BlindPay manages the wallet, the payout is a single call, no extra authorization step.

## Related

* [Store](/fiat/store): how the wallet fits between payins and payouts
* [Payins](/fiat/receive): accept a bank transfer and credit the wallet
* [Payouts](/fiat/send): pay out from the wallet to a bank account
* [Webhooks](/learn/webhooks): `wallet.inbound` and the payment lifecycle events
