Jito Bundles
A bundle lands up to five transactions in one block, atomically and in order: all land or none do, and nothing gets between them. Typical uses are a create plus buys from several wallets, or a coordinated sell.
Two calls, both keyless:
POST /api/local-bundlebuilds the unsigned transactions with a shared blockhash and the Jito tip on the last one.- Sign each transaction with its wallet, then
POST /api/send-bundleforwards the signed set to a Jito block engine and returns the bundle id. You can also submit to Jito yourself.
Build
POST https://sol.shrine.trade/api/local-bundle
{
"trades": [
{ "action": "buy", "publicKey": "<wallet A>", "mint": "<mint>", "amount": 0.5, "slippage": 15, "pool": "pumpfun" },
{ "action": "buy", "publicKey": "<wallet B>", "mint": "<mint>", "amount": 0.3, "slippage": 15, "pool": "pumpfun" }
],
"jitoTip": 0.001
}
Each entry takes the same fields as local trade. Wallets may differ per trade; each wallet signs its own transaction. The tip is paid by the last trade's wallet.
Response:
{
"transactions": ["<base64 tx 1>", "<base64 tx 2>"],
"blockhash": "…",
"feeLamports": 2000000,
"tipLamports": 1000000
}
Multi-action transactions in a bundle
Instead of trades, pass transactions: each entry is a multi-action body with its own publicKey and actions. This is how a launch gets its snipers: the create in transaction one, buys from other wallets after it. A mintRef set in one transaction resolves in the later ones.
{
"transactions": [
{ "publicKey": "<dev>", "actions": [
{ "action": "create", "mintRef": "coin", "mint": "<mint keypair public key>", "name": "My Coin", "symbol": "COIN", "uri": "https://…/metadata.json", "initialBuy": 0.5 }
]},
{ "publicKey": "<wallet A>", "actions": [{ "action": "buy", "mint": "$coin", "amount": 0.3, "slippage": 30 }] },
{ "publicKey": "<wallet B>", "actions": [
{ "action": "buy", "mint": "$coin", "amount": 0.3, "slippage": 30 },
{ "action": "buy", "mint": "$coin", "amount": 0.2, "slippage": 30, "publicKey": "<wallet C>" }
]}
],
"jitoTip": 0.001
}
The response then carries signers, one list per transaction, naming every key that must sign it (the dev wallet and the mint keypair for the first one here). Buys on the not-yet-existing coin are quoted from its launch constants, so give them room with slippage.
Send
POST https://sol.shrine.trade/api/send-bundle
{
"transactions": ["<base64 signed tx 1>", "<base64 signed tx 2>"],
"blockEngine": "https://frankfurt.mainnet.block-engine.jito.wtf",
"guaranteedDelivery": true
}
blockEngine is optional and must be a Jito mainnet host; the default is the global endpoint. Submissions carry our block-engine authentication, which Jito requires for bundles to enter its system. The response is { "bundleId": "…", "guaranteedDelivery": true }. Poll Jito's getBundleStatuses with it, or watch your wallets.
With guaranteedDelivery we keep resending the same signed bundle every two seconds until Jito reports it landed, or its blockhash expires about a minute later. One call, no retry loop on your side; the transactions cannot land twice, since a landed signature is rejected on resend.
Single-transaction tip
Any local trade, create or claim accepts jitoTip, which appends the tip transfer to that one transaction so you can send it alone as a one-transaction bundle.
Fees
The normal 0.25% trade fee per trade. The tip goes to Jito, not to us.