---
updatedAt: 2026-10-02T12:52:06.000Z
agentTools:
  projectIndex: https://docs.confirmo.net/llms.txt
---

# Crypto Top-ups

Fund your Confirmo balance by sending crypto from your own wallets or exchange accounts.

A crypto top-up lets you add funds to your own Confirmo balance by sending crypto to a permanent top-up address. Merchants typically use this to pre-fund [payouts](payouts-overview) and refunds.

***

## Before you start

**Register the accounts you'll send from.** Add every wallet or exchange account you top up from to your [Crypto Address Book](crypto-address-book) with the `TOP_UP` designation, and wait until it is `ACTIVE`. This is how Confirmo knows the funds are yours. It replaces the Travel Rule information you'd otherwise have to give for each transfer.

***

## Creating your top-up account

```bash
curl -X POST https://confirmo.net/api/v3/topups/crypto/accounts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "balanceAsset": "USD",
    "notifyUrl": "https://merchant.example/hooks/topups",
    "reference": "treasury-topups"
  }'
```

| Field          | Required | Notes                                                                                                                                                                                                                                        |
| -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `balanceAsset` | No       | The balance to credit: `USD`, `EUR`, `GBP`, `CZK`, `PLN`, `USDC`, `USDT` or `USDG`. Incoming crypto is converted at the rate at the time of the top-up. If you leave it out, nothing is converted and you're credited in the asset you sent. |
| `notifyUrl`    | No       | Webhook URL for top-up and account events.                                                                                                                                                                                                   |
| `reference`    | No       | Your own reference, up to 512 characters. It is copied onto every top-up the account receives.                                                                                                                                               |

**Response** `201 Created`

```json
{
  "id": "dac1a2b3c4d5e7f8",
  "status": "ENABLED",
  "balanceAsset": "USD",
  "notifyUrl": "https://merchant.example/hooks/topups",
  "reference": "treasury-topups",
  "addresses": [
    {
      "address": "0xd46faFF817D27c8C10edC580eB573cd4E8fC424d",
      "paymentMethodIds": [
        "ETHEREUM-BLOCKCHAIN-MAINNET-ETH-CURRENCY",
        "ETHEREUM-BLOCKCHAIN-MAINNET-USDC-STANDARD",
        "ETHEREUM-BLOCKCHAIN-MAINNET-USDT-STANDARD"
      ]
    },
    {
      "address": "TJ9yD14Nj9j7xAB9kf14qMjdZR43bE1Z2L",
      "paymentMethodIds": ["TRON-BLOCKCHAIN-MAINNET-USDT-STANDARD"]
    }
  ],
  "createdAt": 1772539200,
  "updatedAt": 1772539200
}
```

One top-up account gives you an address on every supported network. The addresses are permanent and can be reused.&#x20;

**What you can send.** Each address lists in `paymentMethodIds` exactly which assets it accepts. Send only those assets, on that network.

<Callout icon="⚠️" theme="warn">
  **Bitcoin and Litecoin aren't supported for top-ups.** You can't top up with BTC or LTC (they are available for [Deposits](deposits-overview)).&#x20;
</Callout>

***

## Sending a top-up

1. Pick the address for the network you want to use, and make sure it accepts your asset.
2. Send the funds from an `ACTIVE`**&#x20;address-book entry**.
3. Confirmo detects the transaction and moves it through the statuses below. Your balance is credited when the top-up reaches `DONE`.

The sending wallet pays the blockchain network fee.

### Unregistered sources

If a top-up comes from a wallet or exchange account that isn't in your address book, or is still `PENDING`, Confirmo **holds it without crediting it**:

* Register and verify the source account. The held top-up is credited once the entry becomes `ACTIVE`.&#x20;
* If you don't register it, contact support to have the funds returned.&#x20;

***

## Top-up statuses

Top-ups use the same statuses as deposits. The full descriptions are in the [Deposit Lifecycle](deposit-lifecycle). Here's what each one means for a top-up:

| Status                 | For a top-up                                                                                                                                  |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `CONFIRMING`           | Seen on-chain and waiting for block confirmations.                                                                                            |
| `PENDING_VERIFICATION` | Confirmed on-chain and going through checks. This includes top-ups held because the sender isn't an `ACTIVE` address-book entry yet.          |
| `DONE`                 | Your balance has been credited. **Final.**                                                                                                    |
| `UNASSIGNED`           | Received but not credited, for example because the top-up account was `DISABLED` or top-ups aren't enabled for your account. Contact support. |
| `RETURNED`             | Sent back to the originating wallet. `refundDetail` contains the return transaction. **Final.**                                               |
| `BLOCKED`              | Frozen. **Final.**                                                                                                                            |
| `ABSORBED`             | Left unresolved past the period set in the Terms and Conditions. **Final.**                                                                   |
| `FAILED`               | The transaction failed on-chain and the funds never arrived. **Final.**                                                                       |

<Callout icon="✅" theme="okay">
  **Rely on your balance only once a top-up reaches&#x20;**`DONE`**.**
</Callout>

***

## Webhooks

If the account has a `notifyUrl`, Confirmo sends:

* **Top-up event (**`crypto.topup`**)** on every status change, with the same top-up object as `GET /v3/topups/crypto`.
* **Account event (**`crypto.topup.account`**)** when the account's status changes, for example when it is `BLOCKED`.

These work exactly like [Deposit Webhooks](deposit-webhooks), including signature validation. If no `notifyUrl` is set, status emails go to your account email instead.

***

## Listing top-ups

```bash
curl "https://confirmo.net/api/v3/topups/crypto?status=DONE&createdAtFrom=1772438400&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

You can filter by `accountId`, `address`, `chain`, `paymentAsset`, `balanceAsset`, `status`, `createdAtFrom` and `createdAtTo` (inclusive Unix seconds), and paginate with `limit` (max 100) and `offset`.

**Example item**

```json
{
  "id": "dep1a2b3c4d5e7f9",
  "accountId": "dac1a2b3c4d5e7f8",
  "address": "0xd46faFF817D27c8C10edC580eB573cd4E8fC424d",
  "chain": "ETHEREUM-BLOCKCHAIN-MAINNET",
  "paymentAsset": "USDC",
  "paymentAmount": 50000,
  "balanceAsset": "USD",
  "balanceAmount": 49985.00,
  "exchangeRate": 0.9997,
  "status": "DONE",
  "txHash": "0xc1069c068492e9fa6ea017f226a9c5949781eab340157a14556c5e1017a95070",
  "receivedAt": 1772539200,
  "reference": "treasury-topups",
  "notifyUrl": "https://merchant.example/hooks/topups"
}
```

`exchangeRate` is left out when nothing was converted.

***

## Managing your top-up account

| Action          | Request                                 |
| --------------- | --------------------------------------- |
| List accounts   | `GET /v3/topups/crypto/accounts`        |
| Get one account | `GET /v3/topups/crypto/accounts/{id}`   |
| Update          | `PATCH /v3/topups/crypto/accounts/{id}` |

`PATCH` accepts `status`, `balanceAsset`, `notifyUrl` and `reference`. Leave a field out to keep it as it is; send `null` to clear it. The rules are the same as in [Managing Deposit Accounts](managing-deposit-accounts#update-an-account):

* `status`: you can switch between `ENABLED` and `DISABLED`. A disabled account stops crediting new top-ups, and they end up `UNASSIGNED`.
* `BLOCKED` and `CLOSED` are set only by Confirmo. A blocked account can't be changed by you (`crypto_funding_account_status_not_changeable_by_merchant`), so contact support. An account is `CLOSED` permanently when it can no longer be used, for example after your account moves to a different Confirmo entity. Create a new top-up account in that case.