sendBundle
https://api.triport.io/v1/solSubmits an ordered MEV bundle — a list of Solana transactions — to be landed atomically, all-or-nothing, in a single block.
sendBundle submits an ordered bundle of fully-signed Solana transactions
to be executed back-to-back, atomically, within a single block. Either every
transaction in the bundle lands in the given order, or none of them do — there
is no partial execution. This is the submission counterpart to
simulateBundle, which dry-runs the same bundle without
broadcasting it.
Because the bundle lands atomically and in order, later transactions can safely depend on the state changes produced by earlier ones (for example, a swap that funds a later repay). Use it for MEV / atomic-arbitrage strategies and any sequence of dependent transactions that must not be interleaved with other traffic.
This is a pro-tier-only method, rate-limited separately under the
sol_send_bundle category at 10 RPS (pro) / 30 RPS (business), with burst
headroom of twice the sustained limit. Always
simulateBundle first: a bundle that would revert is
rejected at submission, and you still consume your send budget.
Parameters
The parameter schema is provisional (scaffold — finalized in a later spec version). The shape below reflects the intended contract.
JSON-RPC params is a positional array: [bundle, config?].
bundleobjectrequiredtransactionsstring[]requiredconfigobjectoptionalencodingstringoptionalbundle.transactions — base64 (recommended) or base58.Response
The result schema is provisional (scaffold — finalized in a later spec version). The shape below reflects the intended contract; the result is an open object, so additional fields may appear.
resultobjectadditionalProperties allowed).result.bundleIdstringresult.signaturesstring[]Errors
Errors are returned in the standard JSON-RPC error envelope. See the shared errors reference for the full envelope shape and shared codes.
| Code | Meaning | When it happens |
|---|---|---|
-32602 | Invalid params | bundle is missing/malformed, transactions is empty or not an array, or a transaction is not decodable under the chosen encoding. |
-32002 | Tier insufficient (HTTP 403) | The key's tier is below pro. The error data includes current_tier, required_tier, category (sol_send_bundle), and an upgrade_url. |
-32003 | Rate limited (HTTP 429) | More than your tier's sustained RPS on sol_send_bundle (10 pro / 30 business). data includes limit_rps and burst_capacity; honor the Retry-After header. |
401 | Unauthorized | Missing or invalid Authorization: Bearer key. |
A tier-insufficient response looks like:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32002,
"message": "Method 'sendBundle' requires pro tier or higher",
"data": {
"current_tier": "free",
"required_tier": "pro",
"method": "sendBundle",
"category": "sol_send_bundle",
"upgrade_url": "https://triport.io/upgrade/pro"
}
}
}Examples
JavaScript (fetch)
const res = await fetch("https://api.triport.io/v1/sol", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.TRIPORT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendBundle",
params: [
{ transactions: [base64Tx1, base64Tx2] },
{ encoding: "base64" },
],
}),
});
const { result, error } = await res.json();
if (error) throw new Error(`${error.code}: ${error.message}`);
console.log("bundle accepted:", result.bundleId);TypeScript SDK (@triport/sdk)
import { TriportClient } from "@triport/sdk";
// sendBundle requires a pro-tier (or higher) API key.
const client = new TriportClient({ apiKey: process.env.TRIPORT_API_KEY });
const { bundleId, signatures } = await client.solana.sendBundle(
{ transactions: [base64Tx1, base64Tx2] },
{ encoding: "base64" }
);
console.log("submitted bundle:", bundleId, signatures);Python (triport-sdk)
import os
from triport import TriportClient
# sendBundle requires a pro-tier (or higher) API key.
client = TriportClient(api_key=os.environ["TRIPORT_API_KEY"])
result = client.solana.send_bundle(
{"transactions": [base64_tx_1, base64_tx_2]},
encoding="base64",
)
print("submitted bundle:", result["bundleId"])Notes
- Scaffold / provisional: params and result are finalized in spec
api.2.2/2.3/2.4. Treat the shapes on this page as the intended contract and re-pin once a published schema version is available. - Pro tier only:
sol_send_bundlehas no free or basic access — see rate limits and tiers. - Atomic and ordered: the whole bundle lands together in array order or not at all — there is no partial inclusion.
- Simulate first: dry-run with
simulateBundlebefore submitting; it shares the bundle model and catches reverts without spending your send budget. - Acceptance ≠ landing: a successful response means the bundle was accepted,
not confirmed. Poll
getSignatureStatusesorgetTransactionto verify it landed. - Single transactions: to broadcast one transaction at a time, use
sendTransactioninstead.