> 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

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

```mermaid
flowchart LR
  W1[Wallet 1] --> S{Sweep / collect}
  W2[Wallet 2] --> S
  W3[Wallet 3] --> S
  W4[Wallet N] --> S
  S --> D[Destination wallet]
  classDef brand fill:#EF2A2A,stroke:#EF2A2A,color:#ffffff,font-weight:bold;
  classDef soft fill:#1f2937,stroke:#374151,color:#e5e7eb;
  class D brand;
  class W1,W2,W3,W4,S soft;
```

{% 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 %}

## When to use this

* 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`, up to 1000 wallets per run.
* 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-wallet 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 locally in the tab and are never stored. Only the signed transaction bytes leave your browser, not the keys themselves. Closing or refreshing the tab clears them. 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. Token-2022 mints are detected automatically and routed to the correct token program.
{% 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

| Field                    | What it does                                                                                                                                                                                                                                               |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Token type               | Collect native SOL or an SPL token. SPL needs a valid mint; Token-2022 mints are auto-detected.                                                                                                                                                            |
| Collect mode             | Per-wallet amount rule. **Max** drains the wallet, leaving only fee and network cost. **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 %}

## If something goes wrong

* **Needs SOL.** The wallet cannot cover the per-wallet fee plus the network cost. 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).

## FAQ

<details>

<summary>Who pays the platform fee, my wallet or the source wallets?</summary>

Each source wallet pays its own share, taken inside that wallet's collect transaction. Your connected wallet does not approve or pay the fee. A wallet that cannot cover the fee plus the network cost is skipped and never charged.

</details>

<details>

<summary>Are my private keys safe?</summary>

Keys are parsed and signed locally in your browser and are never stored. Only the signed transaction bytes are sent to the server to broadcast, never the keys. Closing or refreshing the tab clears them. Use a clean profile and only keys you can rotate.

</details>

<details>

<summary>What does Max mode leave behind?</summary>

Almost nothing. It drains the wallet down to fee plus a tiny SOL reserve, so the wallet ends close to empty. If you want a usable balance to remain, use Keep to leave a fixed amount or Percent to collect a share.

</details>

<details>

<summary>Why was a wallet marked "Needs SOL" instead of failing?</summary>

It did not have enough SOL to pay the per-wallet fee and the network base fee, so the tool skipped it rather than charge it for a transaction that cannot land. Add a little SOL and run again.

</details>

<details>

<summary>Can I collect an SPL token, including Token-2022?</summary>

Yes. Pick the token by mint with the token selector. Token-2022 mints are detected automatically and routed to the right program. The first SPL collection may create the destination token account once, a small one-time rent cost paid by a source wallet.

</details>

## Related tools

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

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

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

{% content-ref url="/pages/nHTziE15NKeVLAQMnxv5" %}
[Relay Transfer](/tools/wallets/relay-transfer.md)
{% endcontent-ref %}

{% hint style="warning" %}
**About multi-wallet mode.** This mode works with private keys you import into the page. Only use wallets you can treat as disposable, and rotate them after you are done. For everything else, J Tools stays non-custodial: you sign in your own wallet, and we never ask for its key.
{% 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.
