Lightning Bundle API
Lightning Bundle is PumpDev's server-signed Jito bundle API — execute up to 5 Pump.fun transactions atomically in one HTTP call. Buy, sell, and create tokens across multiple wallets with MEV protection, guaranteed execution order, and all-or-nothing reliability. No client-side signing, no manual bundle submission.
API Endpoint: POST https://pumpdev.io/api/bundle-lightning
Prerequisites
You need a Lightning wallet with an API key. Create one via /api/wallet/create — it takes one call. Fund the wallet with SOL before trading (include enough for the Jito tip).
Why Lightning Bundle?
| Feature | Lightning Bundle |
|---|---|
| Signing | Server signs |
| Sending | Jito bundle endpoints |
| MEV Protection | Yes — Jito validators |
| Atomic Execution | Yes — all-or-nothing |
| Multi-Wallet | Yes — up to 5 transactions |
| Mixed Types | Yes — buy + sell + create in one |
| Jito Tip | Default 0.01 SOL — 0.03 SOL when the bundle contains a create |
When to Use Lightning Bundle
- MEV protection — Jito validators process your bundle privately, preventing front-running bots from seeing and acting on your trade before it lands
- Atomic create + buy — token creation and dev buy land in the same block, so no one can snipe between create and buy
- Multi-wallet bundles — coordinate up to 5 wallets buying a token simultaneously in one call
- Higher landing rate — Jito validators prioritize tipped transactions over standard RPC submissions
Lightning Bundle vs Lightning Trade
| Lightning Trade | Lightning Bundle | |
|---|---|---|
| Transactions | 1 per call | Up to 5 per call |
| Atomic Execution | N/A (single tx) | Yes — all-or-nothing |
| Multi-Wallet | No | Yes |
| Create + Buy | No (use Lightning Create) | Yes — in one bundle |
| Jito Tip | No | Yes (default 0.01 SOL, 0.03 with create) |
| Use Case | Fast single trades | MEV-sensitive trades, token launches, multi-wallet coordination |
- Lightning Trade: Fastest single buy/sell. One HTTP call, no Jito overhead.
- Lightning Bundle: Atomic multi-transaction bundles via Jito. Best for token launches, sniper protection, and coordinated multi-wallet trades.
Rules
Before building your request, note these constraints:
- Max 5 accounts per bundle — the ceiling Jito allows. The tip is an instruction inside one of these transactions, so it costs no slot of its own
- Bundles with a
createentry tip more by default — 0.03 SOL instead of 0.01. A launch bundle bids against every other pump.fun launch in the same slot, and a losing bundle is dropped with no error: Jito still returns a bundle id. Measured on 2026-08-24: 0.02 SOL never landed, 0.03 SOL landed on the first slot every time. Raise it further when launches are contested. - Only one
createentry allowed per bundle — it is auto-sorted to the first position - Same wallet can appear multiple times — e.g. create + buy from the same key, or two buys with different amounts
- No
sellalongsidecreate— you can't sell a token that doesn't exist yet. Sell in a separate bundle after the token lands on-chain - One transaction carries the tip — the
createentry when the bundle has one, otherwise the last entry. It is an instruction inside that transaction, not a transaction of its own - If a
createentry is present,mintat the top level is not required (auto-generated)
Request Format
Endpoint
POST https://pumpdev.io/api/bundle-lightning
Body
{
"accounts": [
{ "apiKey": "key1", "type": "buy", "amount": 0.1, "denominatedInSol": "true" },
{ "apiKey": "key2", "type": "sell", "amount": "100%" }
],
"mint": "TokenMintAddress",
"jitoTip": 0.01,
"slippage": 90,
"priorityFee": 0.0005
}
Top-Level Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
accounts | array | Yes | Array of 1-5 transaction entries |
mint | string | Yes* | Token mint address (*not required if a create entry is present) |
quoteMint | string | No | Quote mint for bundles that include a create entry. Omit for native SOL/WSOL pairs |
slippage | number | No | Slippage percentage (default: 90) |
priorityFee | number | No | Priority fee in SOL (default: 0.0005) |
jitoTip | number | No | Jito tip in SOL (default: 0.01, or 0.03 when the bundle contains a create). Only one transaction carries the tip. Increase it when you want to bid more aggressively for bundle inclusion |
mayhemMode | boolean | No | Enable Pump.fun Mayhem Mode on created tokens in this bundle |
Account Entry — type: "buy"
| Parameter | Type | Required | Description |
|---|---|---|---|
apiKey | string | Yes | Wallet API key |
type | string | Yes | "buy" |
amount | number | Yes | Amount to buy |
denominatedInSol | string | No | Legacy field name. Set "true" when a buy amount is in the pair's quote asset: SOL for SOL pairs, USDC for USDC pairs |
Account Entry — type: "sell"
| Parameter | Type | Required | Description |
|---|---|---|---|
apiKey | string | Yes | Wallet API key |
type | string | Yes | "sell" |
amount | number/string | Yes | Amount to sell. Supports "100%", "50%", or exact amount |
denominatedInSol | string | No | Keep "false" for sell percentages or exact token amounts |
closeTokenAccount | boolean | No | Close token ATA after selling to reclaim ~0.002 SOL rent. Auto-enabled on "100%" sells. Set false to disable |
Account Entry — type: "create"
| Parameter | Type | Required | Description |
|---|---|---|---|
apiKey | string | Yes | Creator wallet API key |
type | string | Yes | "create" |
name | string | Yes | Token name (max 32 chars) |
symbol | string | Yes | Token symbol (max 10 chars) |
image | string | Yes* | Image URL for token logo (*not required if uri provided) |
uri | string | No | Pre-uploaded metadata URI — skips server-side storage |
description | string | No | Token description |
twitter | string | No | Twitter/X URL |
telegram | string | No | Telegram URL |
website | string | No | Website URL |
quoteMint | string | No | Override the top-level quote mint for this create entry |
mintKeypair | string | No | Base58-encoded mint secret key (vanity address) |
cashbackEnabled | boolean | No | Enable cashback rewards for traders |
Quote mint note: When a bundle contains a
createentry, setquoteMintif you want the new coin quoted in USDC or another SPL token. Buy entries that follow the create should keep usingamountwithdenominatedInSol: "true"; for non-SOL quote pairs that amount is interpreted in quote-token units.
Response
{
"results": [
{ "type": "buy", "signature": "5x7...", "publicKey": "...", "error": null },
{ "type": "sell", "signature": "3k9...", "publicKey": "...", "error": null }
],
"mint": "TokenMintAddress"
}
For create entries, the result also includes mint and metadataUri:
{
"type": "create",
"signature": "4j2...",
"publicKey": "...",
"mint": "NewTokenMintAddress",
"metadataUri": "https://pumpdev.io/metadata/uuid.json",
"error": null
}
Examples
Buy — Single Wallet
const response = await fetch(
'https://pumpdev.io/api/bundle-lightning',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{ apiKey: 'YOUR_KEY', type: 'buy', amount: 0.1, denominatedInSol: 'true' }
],
mint: 'TokenMintAddress',
jitoTip: 0.01
})
}
);
const { results } = await response.json();
console.log('Buy executed via Jito:', results[0].signature);
jitoTip When Bundle Landing Mattersbundle-lightning includes a default jitoTip because bundle submission is Jito-specific. Raise it during congestion when inclusion priority matters, or override it explicitly if you need different economics.
Multi-Wallet Sell
Dump all 4 wallets at once — supports percentage-based amounts ("100%", "50%"):
const response = await fetch(
'https://pumpdev.io/api/bundle-lightning',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{ apiKey: WALLET1_KEY, type: 'sell', amount: '100%' },
{ apiKey: WALLET2_KEY, type: 'sell', amount: '100%' },
{ apiKey: WALLET3_KEY, type: 'sell', amount: '50%' },
{ apiKey: WALLET4_KEY, type: 'sell', amount: '100%' },
],
mint: 'TokenMintAddress',
slippage: 99,
jitoTip: 0.01
})
}
);
const { results } = await response.json();
console.log(`${results.filter(r => r.signature).length}/${results.length} sold`);
Multi-Wallet Buy
Bundle up to 5 wallets buying the same token atomically — all land in the same block or none do:
const response = await fetch(
'https://pumpdev.io/api/bundle-lightning',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{ apiKey: WALLET1_KEY, type: 'buy', amount: 0.5, denominatedInSol: 'true' },
{ apiKey: WALLET2_KEY, type: 'buy', amount: 1.0, denominatedInSol: 'true' },
{ apiKey: WALLET3_KEY, type: 'buy', amount: 0.3, denominatedInSol: 'true' },
{ apiKey: WALLET4_KEY, type: 'buy', amount: 0.2, denominatedInSol: 'true' },
],
mint: 'TokenMintAddress',
jitoTip: 0.01
})
}
);
const { results } = await response.json();
console.log(`${results.filter(r => r.signature).length}/${results.length} succeeded`);
Create Token + Dev Buy
Launch a token and buy it in the same block. The create entry is auto-sorted to position 1, so your buy executes immediately after — no one can snipe between them:
const response = await fetch(
'https://pumpdev.io/api/bundle-lightning',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{
apiKey: 'YOUR_KEY', type: 'create',
name: 'pumpdev.io', symbol: 'pumpdev.io',
image: 'https://pumpdev.io/img/logo.jpg',
quoteMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
twitter: 'https://x.com/MyToken',
website: 'http://pumpdev.io/'
},
{ apiKey: 'YOUR_KEY', type: 'buy', amount: 25, denominatedInSol: 'true' }
],
jitoTip: 0.01
})
}
);
const { results, mint } = await response.json();
console.log(`Token launched: https://pump.fun/${mint}`);
console.log('Create sig:', results[0].signature);
console.log('Buy sig:', results[1].signature);
Create Token + Creator Buy + 3 Buyers
The full launch: the creator mints the token, the creator buys first, and three other wallets buy right behind — five transactions filling every slot of a Jito bundle. All five land in the same block or none of them do, so nobody can slip a buy in between the create and your own.
const response = await fetch(
'https://pumpdev.io/api/bundle-lightning',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
// 1. Create the token (auto-sorted to the front, carries the tip)
{
apiKey: CREATOR_KEY, type: 'create',
name: 'My Token', symbol: 'MTK',
image: 'https://example.com/logo.png'
},
// 2. Creator buy — a separate entry, the create itself takes no amount
{ apiKey: CREATOR_KEY, type: 'buy', amount: 0.5, denominatedInSol: 'true' },
// 3-5. Three more wallets, each its own transaction
{ apiKey: BUYER1_KEY, type: 'buy', amount: 1.0, denominatedInSol: 'true' },
{ apiKey: BUYER2_KEY, type: 'buy', amount: 0.5, denominatedInSol: 'true' },
{ apiKey: BUYER3_KEY, type: 'buy', amount: 0.25, denominatedInSol: 'true' },
],
jitoTip: 0.03
})
}
);
const { results, mint } = await response.json();
console.log(`Token: https://pump.fun/${mint}`);
for (const r of results) {
console.log(`${r.type} ${r.publicKey}: ${r.signature ?? r.error}`);
}
Things that trip people up here:
- The creator buy is its own entry. A
createentry takes noamount— it only mints the token. To have the creator buy, add a second entry of typebuyusing the sameapiKey. That is why this launch costs 5 slots, not 4. - Five is the ceiling. A Jito bundle holds at most 5 transactions, so a creator buy leaves room for exactly 3 other buyers. Need more wallets? Send the extras as a second bundle right after — they will land a block later.
- Tip like a launch, not like a trade. Launch bundles compete with every
other pump.fun launch in the slot. At 0.01 SOL the bundle is simply outbid and
dropped, and Jito reports no error — it returns a bundle id either way. The
default for a bundle containing a
createis 0.03 SOL for that reason. - Order is preserved. Buys execute in the order you list them, so the entry right after the create gets the best price on the curve.
resultsis per transaction. An entry that fails to build comes back witherrorset instead ofsignature, and the rest of the bundle still goes.
Automated Sniper Bot with Jito
Combine WebSocket streaming + Lightning Bundle for a sniper bot. The bot watches for new token launches and buys instantly via Jito:
import WebSocket from 'ws';
const API_URL = 'https://pumpdev.io';
const WS_URL = 'wss://pumpdev.io/ws';
// 4 wallets sniping together in one atomic bundle
const WALLET_KEYS = [
'pk_wallet1_xxxxxxxx',
'pk_wallet2_xxxxxxxx',
'pk_wallet3_xxxxxxxx',
'pk_wallet4_xxxxxxxx',
];
const BUY_AMOUNT_SOL = 0.01;
const JITO_TIP = 0.01;
const MAX_MARKET_CAP_SOL = 50;
let isBuying = false;
const ws = new WebSocket(WS_URL);
ws.on('open', () => {
ws.send(JSON.stringify({ method: 'subscribeNewToken' }));
console.log('Watching for new tokens (4-wallet Jito sniper)...');
});
ws.on('message', async (data) => {
const event = JSON.parse(data.toString());
const marketCap = event.marketCapQuote ?? event.marketCapSol ?? 0;
if (
event.txType === 'create' &&
event.quoteMint === 'So11111111111111111111111111111111111111112' &&
marketCap <= MAX_MARKET_CAP_SOL &&
!isBuying
) {
console.log(`New token: ${event.name} (${event.symbol})`);
await buyToken(event.mint);
}
});
async function buyToken(mint) {
isBuying = true;
try {
const response = await fetch(
`${API_URL}/api/bundle-lightning`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: WALLET_KEYS.map(apiKey => ({
apiKey, type: 'buy', amount: BUY_AMOUNT_SOL, denominatedInSol: 'true'
})),
mint: mint,
jitoTip: JITO_TIP
})
}
);
const { results } = await response.json();
const succeeded = results.filter(r => r.signature).length;
console.log(`${succeeded}/${results.length} buys landed`);
results.forEach((r, i) => {
console.log(` Wallet ${i + 1}: ${r.signature || r.error}`);
});
} catch (err) {
console.error('Error:', err.message);
} finally {
isBuying = false;
}
}
Lightning Bundle sends your transaction through Jito validators, which prevents front-running bots from seeing and acting on your trade before it lands. This is especially important for sniper bots buying new tokens at launch.
Token Launch + Sell Strategy
Launch a token with multiple buyer wallets, then sell from all wallets in a separate bundle. You cannot combine create + sell in the same bundle because the token must exist on-chain before it can be sold:
const API_URL = 'https://pumpdev.io';
const CREATOR_KEY = 'pk_creator_xxxxxxxx';
const BUYER1_KEY = 'pk_buyer1_xxxxxxxx';
const BUYER2_KEY = 'pk_buyer2_xxxxxxxx';
const BUYER3_KEY = 'pk_buyer3_xxxxxxxx';
// 1. Create token + buy from 4 wallets (atomic via Jito)
const createRes = await fetch(
`${API_URL}/api/bundle-lightning`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{
apiKey: CREATOR_KEY, type: 'create',
name: 'My Token', symbol: 'MTK',
image: 'https://example.com/logo.png',
quoteMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
},
{ apiKey: CREATOR_KEY, type: 'buy', amount: 25, denominatedInSol: 'true' },
{ apiKey: BUYER1_KEY, type: 'buy', amount: 15, denominatedInSol: 'true' },
{ apiKey: BUYER2_KEY, type: 'buy', amount: 15, denominatedInSol: 'true' },
],
jitoTip: 0.02
})
}
);
const { mint, results } = await createRes.json();
console.log(`Token launched: https://pump.fun/${mint}`);
console.log(`${results.filter(r => r.signature).length}/${results.length} succeeded`);
// 2. Later: sell from all wallets via a separate Jito bundle
const sellRes = await fetch(
`${API_URL}/api/bundle-lightning`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
accounts: [
{ apiKey: CREATOR_KEY, type: 'sell', amount: '100%' },
{ apiKey: BUYER1_KEY, type: 'sell', amount: '100%' },
{ apiKey: BUYER2_KEY, type: 'sell', amount: '100%' },
{ apiKey: BUYER3_KEY, type: 'sell', amount: '100%' },
],
mint: mint,
slippage: 99,
jitoTip: 0.01
})
}
);
const sellResult = await sellRes.json();
console.log(`${sellResult.results.filter(r => r.signature).length}/${sellResult.results.length} sold`);
Jito Tip Recommendations
The Jito tip incentivizes validators to include your bundle. Higher tips = faster landing.
| Scenario | Recommended Tip | Notes |
|---|---|---|
| Standard buy/sell | 0.01 SOL | Default — good for most trades |
| Token launch (create + buy) | 0.02 SOL | Higher priority for launches |
| Competitive sniper | 0.05+ SOL | When speed is critical |
| Low urgency | 0.005 SOL | Minimum viable tip |
The Jito tip is a separate cost from the PumpDev trading commission. The tip goes directly to Jito validators. Only the last transaction in the bundle includes the tip. See Pricing for commission details.
Use the Local-Sign Bundle API to build unsigned transactions, sign locally, and submit to Jito yourself.
Error Handling
All errors return JSON with an error field. Common errors:
| HTTP Status | Error | Root Cause | Solution |
|---|---|---|---|
400 | Missing or invalid accounts array | accounts not provided or empty | Provide 1-5 account entries |
400 | Maximum 5 accounts per bundle | Too many entries | Reduce to 5 or fewer |
400 | type must be "buy", "sell", or "create" | Invalid type | Use buy, sell, or create |
400 | mint is required when no create entry is present | No mint and no create | Provide mint or add create entry |
400 | Only one create entry allowed per bundle | Multiple create entries | Use single create entry |
400 | sell entries cannot be combined with create | Sell + create in same bundle | Sell in a separate bundle after the token exists |
403 | invalid or deactivated API key | Bad apiKey in accounts | Verify wallet API key via Lightning Setup |
Frequently Asked Questions
What is the difference between Lightning Bundle and Lightning Trade?
Lightning Trade sends a single transaction via standard RPC — fastest for simple buy/sell. Lightning Bundle wraps up to 5 transactions in a Jito bundle for atomic execution. Use Lightning Trade for speed on single trades; use Lightning Bundle when you need atomicity, multi-wallet coordination, or front-running protection.
What happens if one transaction in my bundle fails?
The entire bundle fails. Jito bundles are atomic — all transactions succeed or none execute. No partial state changes occur on-chain.
Can I check the status of my bundle after submission?
Lightning Bundle handles submission for you. If the API returns signatures in the results array, the bundle was accepted by Jito. You can verify on-chain status using the returned transaction signatures on any Solana explorer.
Can I use the same wallet for multiple entries?
Yes. The same apiKey can appear in multiple account entries — for example, create + buy from the same wallet, or two buys with different amounts targeting different strategies.
Is there a retry mechanism if the bundle doesn't land?
Lightning Bundle submits to Jito once. If the bundle is not included in a block (e.g., due to low tip during congestion), you need to submit a new request. Consider increasing the jitoTip during high-congestion periods.
Next Steps
- Lightning Setup — Create or import a Lightning wallet and get your API key
- Lightning Trade — Single buy/sell in one call (no Jito)
- Lightning Create — Token creation in one call (no Jito)
- Jito Bundles — Client-side Jito bundles with local signing
- Real-Time Data — WebSocket streaming for sniper bots
- Pricing — Commission and fee details