> For the complete documentation index, see [llms.txt](https://docs.j.tools/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.j.tools/tools/wallets/batch-collector.md).

# Batch Collector: Sweep Many Wallets Into One

[Batch Collector](https://j.tools/en/tools/batch-collector) sweeps SOL or an SPL token out of many source wallets and into one destination address in a single run. You import the source wallets by private key, pick how much to pull from each one, set the destination, and the tool signs every wallet locally and broadcasts the transfers in parallel with row-by-row live status.

## What it is

Batch Collector is a consolidation (sweep) tool. It reads a list of source wallets you provide, works out a collect amount per wallet from a mode you choose, and builds a transfer from each source into a single destination. SOL is the default. You can also collect any SPL token, including Token-2022, by mint.

Each source wallet signs its own transfer in your browser, so the destination does not need to be a wallet you control. You can paste any valid Solana address, or point everything at your connected wallet. The page shows live balances, a running summary of what will land, and a per-row status as the batch runs.

## Why use this tool

Consolidating funds by hand is tedious and easy to get wrong. You copy a key, paste it, send, wait, repeat, and one fat-fingered amount or skipped wallet leaves dust behind or strands a wallet below its rent minimum. Batch Collector takes the whole list in one pass. It de-duplicates the key list, loads every wallet's live balance so you commit to real numbers, and skips wallets that cannot cover the fee rather than charging them for a transaction that cannot land.

## How it works (under the hood)

You import source-wallet private keys into the page. The keys are parsed and signed locally in your browser tab. They are never stored and never sent to any server. Only the signed transaction bytes leave your browser, never the key material itself. Closing or refreshing the tab clears everything from memory.

For each source wallet, the tool builds a transfer instruction into the destination, based on the collect amount it resolved for that wallet. For SOL, that is a system transfer. For an SPL token, it transfers the token balance from the source's token account to the destination's token account, creating the destination account once on the first collection if it does not exist yet. Token-2022 mints are detected and routed to the correct token program automatically.

Emptying a token account moves the tokens but leaves the account's rent deposit behind. Batch Collector does not close token accounts. Once a sweep empties one, use [Close Account](/tools/utilities/close-account.md) to reclaim the deposit. The per-wallet platform fee is taken inside each source wallet's own transaction, so your connected wallet never approves or pays it.

Signing happens in parallel, and the signed transactions go to the server only to be broadcast, in chunks of 100 within a limit of 120 requests a minute per IP, so a long list is never rejected, it simply takes longer. Each row reports its own progress from preparing, to broadcasting, to confirming.

<figure><img src="/files/lCH1IpoR2xA7UVgIY4Xs" alt="How Batch Collector works"><figcaption></figcaption></figure>

## When to use it

* You are consolidating funds from many wallets into one for treasury cleanup, a campaign wrap-up, or general account consolidation.
* You have leftover SOL or token dust scattered across wallets after an airdrop, distributed buys, or multi-wallet testing.
* You would otherwise drain wallets one by one and would rather run a parallel, validated batch with row-by-row status.

If you want to send from one wallet to many, use [Multi Sender](/tools/wallets/multi-sender.md). For an any-to-any matrix of senders and recipients, use [Many to Many](/tools/wallets/many-to-many.md). Need source wallets first? Spin them up with the [Wallet Generator](/tools/wallets/wallet-generator.md).

## Before you start

* A list of source-wallet private keys. Paste them line by line, or upload a CSV through the Import Wallet terminal. The accepted format is `privateKey` or `privateKey,amount`. The page sets no cap on the number of wallets; the upload itself is limited to 4 MB.
* A destination. Paste a Solana address ("Enter address" mode) or switch to "Connected wallet" to send everything to your connected wallet's address. A connected wallet is **not** required when you paste a destination.
* For SPL, the token you want to collect, picked by mint through the token selector. SOL is the default. Classic SPL and Token-2022 are both handled, see [SPL vs Token-2022](/concepts/spl-vs-token2022.md) if you are unsure which one you hold.
* A little SOL in each source wallet to cover the per-transaction platform fee plus the network base fee. Wallets that cannot cover it are skipped and never charged.

{% hint style="info" %}
**Keys are handled in your browser.** Source keys are parsed and signed in the tab, never stored, and closing or refreshing clears them from memory. Use a clean profile and only keys you can rotate.
{% endhint %}

## Step by step

{% stepper %}
{% step %}

### Pick the token

Choose SOL (the default) or select an SPL token by mint with the token selector.
{% endstep %}

{% step %}

### Import your source wallets

Open the Import Wallet terminal and paste private keys, one per line, or upload a CSV. Invalid and duplicate rows are flagged before anything runs. The page shows Rows, Valid, and Invalid counts so you can fix the list first.
{% endstep %}

{% step %}

### Let balances load

Each row's SOL and selected-token balance loads in bulk, so you see live amounts before you commit to anything.
{% endstep %}

{% step %}

### Choose how much to collect

Pick a collection mode to auto-fill every row's Collect Amount: Max, Fixed, Keep, or Percent. You can override any single row by editing its amount directly, which takes priority over the mode for that wallet.
{% endstep %}

{% step %}

### Set the destination

Paste a destination address, or switch to "Connected wallet" to use your connected wallet's address.
{% endstep %}

{% step %}

### Review the summary

Check the KPI strip: Total Wallets, Total SOL, Net to destination, the platform fee total, and the estimated network fee. Wallets that cannot cover the fee are flagged "Needs SOL" and will be skipped.
{% endstep %}

{% step %}

### Run the batch

Click **Collect from N wallet(s)**. Balances re-load right before the run so any drain-to-zero amounts match the current on-chain state. Each wallet is signed locally, then broadcast through the server in parallel chunks, moving through preparing, broadcasting, and confirming.
{% endstep %}

{% step %}

### Watch the rows and review the result

Each row flips from pending to running, then to success, skipped, or failed, with signature links to Solscan. A result dialog shows the successful, failed, and skipped totals plus the total collected. Failed rows can be retried with "Keep Only Failed" and a fresh Collect.
{% endstep %}
{% endstepper %}

[**Open Batch Collector in the app →**](https://j.tools/en/tools/batch-collector)

{% hint style="info" %}
**No Phantom banner to worry about here.** The platform fee is paid by each source wallet inside its own transaction, so your connected wallet does not approve or pay it. That keeps Phantom out of the critical path for this tool.
{% endhint %}

## The options, explained

* **Token type:** Collect native SOL or an SPL token. SPL needs a valid mint.
* **Collect mode:** The per-wallet amount rule. **Max** collects the full balance minus the platform fee, the network fee, and a tiny reserve. **Fixed** pulls the same amount from every wallet. **Keep** leaves a set amount behind and collects the rest. **Percent** collects a share of each wallet's balance.
* **Collect Amount (per row):** Auto-filled from the chosen mode. Editing a row overrides the mode for that wallet only.
* **Destination mode:** Paste an address ("Enter address"), or send everything to the connected wallet's address.
* **Platform fee:** A flat platform fee charged per source wallet, taken inside that wallet's own collect transaction and shown before you run. See the in-app summary or the [Fee schedule](/reference/fee-schedule.md) for the current amount.
* **SOL reserve:** A tiny amount of SOL left in a wallet on a drain so the base network fee stays payable.

{% hint style="warning" %}
**Max mode drains to dust.** It pulls each wallet's balance minus the fee and a tiny reserve, on purpose. It does not leave a usable balance behind. If you want to leave something, use Keep or Percent instead.
{% endhint %}

## Fees and costs

{% hint style="warning" %}
**About fees.** Every action has two costs: the Solana **network fee** paid to validators, and the **J Tools platform fee**. The platform fee always shows in the app before you confirm, and nothing is charged until you sign. Fees can change over time, so trust the in-app summary rather than a number you saw once.
{% endhint %}

**Current platform fee: 0.001 SOL per source wallet.** The amount is pinned to the tool's own constant, so every run charges the same: each wallet's collect transaction carries exactly 0.001 SOL, and the broadcast endpoint rejects a transaction whose fee transfer does not match.

| Cost                 | Amount                                             |
| -------------------- | -------------------------------------------------- |
| J Tools platform fee | 0.001 SOL per source wallet                        |
| Solana network fee   | a small amount per transaction, paid to validators |

Example: 100 source wallets cost 0.1 SOL in platform fees, and 1000 wallets cost 1 SOL.

On top of the platform fee, each source wallet pays the standard Solana network base fee for its own transfer, which is a tiny fraction of a SOL. If a collection has to create the destination token account for an SPL token, that account's one-time rent deposit is paid once by a source wallet. Wallets that cannot cover the platform fee plus the network fee are skipped and never charged.

## Security and custody

This tool asks for private keys, which the rest of the platform never does. They are parsed and signed inside the tab and only the signed transaction bytes are sent out to be broadcast, but a pasted key is still an exposed key. Treat every wallet you import here as disposable and rotate it after the run. Run imports in a fresh browser profile with no extensions you do not trust, and close the tab when you are done. Keys you intend to keep long term belong offline, not in a browser field.

## Common mistakes and troubleshooting

* **Needs SOL.** The wallet cannot cover the per-wallet fee plus the network fee. It is skipped, not failed, and never charged. Fund it with a little SOL to include it next run.
* **Insufficient SOL for fee.** Same root cause on the per-row level (`BC_INSUFFICIENT_SOL_FOR_FEE`). Top up the source wallet.
* **Nothing to collect.** The amount resolved to zero for that wallet (`BC_ZERO_COLLECTABLE_AMOUNT`). Check the balance and the mode.
* **Token account not found.** For SPL, the source wallet has no account for that mint (`SOURCE_TOKEN_ACCOUNT_NOT_FOUND`). That wallet holds none of the token.
* **Transfer or confirm timeout.** The network was busy. Use "Keep Only Failed" and run again.
* **Rent guard kicked in.** If a partial collection would leave a wallet stranded between zero and the [rent-exempt minimum](/getting-started/glossary.md), the tool sweeps it fully to zero instead, to avoid a rent error.

For the full list, see the [Error codes reference](/reference/error-codes.md).

## Advanced tips

* **Use the `privateKey,amount` CSV format** when you already know exactly how much to pull from each wallet. Per-row amounts from the import beat the global mode, so you can mix precise targets with mode-driven rows.
* **Reclaim rent after the sweep.** Emptying a token account leaves its rent deposit in place. When you are done with an SPL token in a wallet, run [Close Account](/tools/utilities/close-account.md) on the emptied account to get the deposit back.
* **See what is in the wallets before you sweep.** Your import here is private keys, so derive the public address of each source wallet first, then paste that address list into [Wallet Scope](/tools/utilities/wallet-scope.md). You get SOL, token balances, and wallet age in one table, which tells you which wallets are worth the per-wallet fee and which hold nothing but dust. Wallet Scope takes up to 500 addresses per run, so a source list longer than that needs more than one pass.
* **Watch Net to destination, not Total SOL.** The KPI strip shows both. Net to destination is what actually lands after the per-wallet fee, and on a long list of small balances the gap between the two is what tells you whether the sweep is worth running at all.

## Related tools

{% content-ref url="/pages/ABVX2mBQDoCv7DEdVmKp" %}
[Multi Sender and Airdrop](/tools/wallets/multi-sender.md)
{% endcontent-ref %}

{% content-ref url="/pages/eyvl1w0Ri5KEBHvrUAxz" %}
[Many-to-Many Transfers](/tools/wallets/many-to-many.md)
{% endcontent-ref %}

{% content-ref url="/pages/a7TACAPAW24OFOSbtgNw" %}
[Solana Wallet Generator](/tools/wallets/wallet-generator.md)
{% endcontent-ref %}

{% content-ref url="/pages/tvk3KydrniyizApPkWZi" %}
[Wallet Scope: Bulk Wallet Analyzer](/tools/utilities/wallet-scope.md)
{% endcontent-ref %}

{% hint style="success" %}
**J Tools is non-custodial.** We never store or transmit your private keys and never ask for your seed phrase. Every transaction is signed in your own browser, and nothing about a key ever reaches our servers. A few multi-wallet tools do let you paste private keys for throwaway hot wallets, which stay in your browser tab and are used only to sign locally. Never paste a key tied to long-term holdings, and if a page ever asks for your seed phrase, stop and close it.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.j.tools/tools/wallets/batch-collector.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
