Skip to content
Bundles fly in formationAn atomic bundle is up to five transactions flying in formation: they land together or not at all.N
An atomic bundle is up to five transactions flying in formation: they land together or not at all.

Atomic bundles (Jito)

Bundles are ordered groups of up to 5 transactions that execute atomically — all of them land in the same block, in the order you sent them, or none land at all. FastRelay submits bundles directly to the Jito Block Engine (sendBundle), choosing the lowest-latency regional block engine automatically and returning Jito's bundle id so you can track the outcome.

Use bundles when partial execution is unacceptable: multi-leg arbitrage, backrunning your own swap, atomic setup + trade + cleanup sequences, or any flow where transaction 2 is worthless unless transaction 1 landed first.

Submitting Bundles

All three transports accept bundles with the same payload shape:

TransportHow
HTTPSPOST /v1/sendBundle with {"txs": ["<base64>", ...], "id": "optional"}
QUICSame stream protocol as single txs — send {"txs": [...]} instead of {"tx": ...}
WebSocket/v1/stream/bundle frames — {"id": "b1", "txs": [...]}
bash
curl -X POST "https://fra.fastrelay.sh/v1/sendBundle?api-key=YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "txs": ["BASE64_TX_1", "BASE64_TX_2"],
    "id": "bundle-1"
  }'

Response:

json
{
  "status": "accepted",
  "bundle_id": "c9a8f2e1-...",
  "signatures": ["5wH...", "3kP..."],
  "jito_leader_in_slots": 2,
  "id": "bundle-1"
}

jito_leader_in_slots tells you how many slots away the next Jito-enabled leader is (0 = the current slot) — the relay tracks the Jito validator set automatically via Jito StakeNet. If no Jito leader is scheduled within the lookahead window, the response instead carries a warning field: the bundle was still submitted, but it is likely to expire, so plan to resubmit with a fresh blockhash.

bundle_id is the Jito bundle id — the same id Jito's own getBundleStatuses API knows the bundle by. The relay waits for block-engine acceptance (bounded ~1s) before responding, so an "accepted" response means the Block Engine has your bundle. If no channel accepts it, you get "status": "failed" instead.

Bundle Requirements — Two Tips

Every bundle needs two separate transfers (plain SystemProgram transfers, in any of the bundle's transactions):

  1. FastRelay tip — your effective tip to any registered tip wallet, same as single transactions. One transaction paying it covers the whole bundle. Wallets staked to a zero tip skip this.
  2. Jito tip — minimum 1,000 lamports to one of Jito's tip accounts. Required for everyone, however much you have staked — the Block Engine drops tipless bundles. During competitive periods, 10,000–100,000+ lamports is realistic; the Jito tip is an auction bid, not a flat fee.

Jito's 8 mainnet tip accounts (rotate randomly between them):

96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5
HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe
Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY
ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49
DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh
ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt
DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL
3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT

Additional rules:

  • All transactions fully signed, base64-encoded, ≤ ~1.6KB each
  • All transactions should use a fresh, shared recent blockhash
  • Both tips must be statically verifiable — no ALT-obscured transfers, and a bundle may not contain ALT transactions
  • Put the Jito tip in the last transaction (or as the last instruction) — if it's first, the rest of the bundle can be simulated against your paid tip

Landing Semantics

Bundles only land when the current slot leader runs the Jito-Solana client (~80%+ of stake). An accepted bundle that hits a stretch of non-Jito leaders will simply expire when its blockhash does. This is normal Jito behavior, not a relay failure:

  • Accepted ≠ landed. Track the outcome: confirm any of the returned signatures on-chain, or query Jito's getBundleStatuses with the bundle_id.
  • Expired? Re-sign with a fresh blockhash and resubmit. Same-signature resubmission is safe — bundle ids derive from the transaction signatures, and on-chain signature dedup guarantees at-most-once execution.
  • Failed/Invalid? One of the transactions errors when executed atomically (bundles are all-or-nothing — a revert anywhere drops the whole bundle) or a tip requirement wasn't met server-side.

Tip: Bundles are deliberately not fanned out through the TPU/UDP/RPC channels — splitting a bundle into individual transactions would silently destroy its atomicity. The Block Engine path is the only one that preserves the all-or-nothing guarantee.