Solana transaction sending: a direct lane and parallel send paths
Last updated:
Which send should you use?
| You need | Use | Endpoint | Plan |
|---|---|---|---|
| One transaction, no tip | sendTransaction | fra.triport.io/sol, then triport.io/sol | Every plan |
| One transaction competing for block space | sendTransaction with a priority fee and a tip | fra.triport.io/sol, then triport.io/sol | Every plan |
| Several transactions that must land together, in order | sendBundle | triport.io/sol | Pro and above |
| A check before sending | Preflight (default), or simulateTransaction | triport.io/sol | Preflight: every plan. simulateTransaction: Pro and above |
The FRA direct lane
https://fra.triport.io/sol takes the same API key and the same JSON-RPC body as https://triport.io/sol, without Cloudflare on the path. The benefit depends on where your server is: the shorter the path to Frankfurt, the more of the gap you keep. A client far from Frankfurt adds its own network distance, and may do no better than the regular endpoint. Measure it from your own server. Our dated measurement, with its method, is in the sendTransaction reference.
There is no failover on this lane. Build the fallback into your client: on a network error or a timeout, send the same signed bytes to https://triport.io/sol. Solana processes a signature at most once, so a duplicate send is safe.
for (const url of ["https://fra.triport.io/sol", "https://triport.io/sol"]) {
try {
const res = await fetch(url, {
method: "POST",
signal: AbortSignal.timeout(2000),
headers: { "x-token": process.env.TRIPORT_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0", id: 1, method: "sendTransaction",
params: [signedTxBase64, { encoding: "base64", preflightCommitment: "confirmed", maxRetries: 0 }],
}),
});
const body = await res.json();
if (body.error) throw Object.assign(new Error(body.error.message), { final: true });
return body.result; // accepted, not landed: confirm by signature
} catch (e) {
if (e.final) throw e;
}
}Parallel paths
On the Frankfurt edge, one sendTransaction request can go down up to three paths at once, and you get the first upstream answer that returns a signature. The tip in your transaction decides which paths are used.
| Path | Used when | Worth knowing |
|---|---|---|
Triport RPC path (cohort) | Always | A Solana RPC node that forwards to the current leader |
Helius Sender (sender) | The transaction tips a Helius Sender account | Requires its own tip and a priority fee, or it rejects the transaction |
Jito block engine (jito) | The transaction tips a Jito account | Used when capacity is available: read X-Triport-Send-Legs to see whether it was attempted |
Paths are chosen from the transaction's static account keys, so a tip account loaded through an address lookup table is not detected. Requests inside a JSON-RPC batch use only the Triport RPC path, and so does a request served by a fallback region. The tip account lists are in the reference. For how much to pay, read which payment does what.
See what happened to your request
Every send through the edge says what it did, so you can check instead of guessing:
X-Triport-Send-Legs: the paths your transaction went down, for examplecohort,sender. If you tipped and the path is missing, look at the tip account.X-Triport-Send-Winner: the path whose answer you received, ornone.Server-Timing: time from our edge receiving the request to the winning answer, measured on our server.
What this does not do
- It cannot promise landing. Nobody can. An accepted transaction can be dropped or expire, so diagnose by signature.
- It does not rebroadcast. After a path has accepted the transaction, retrying is your client's job.
- It does not fix fees. Priority fee and compute limit are set when you build the transaction.
- It is not for reads or streams. Keep those on
triport.io.
Plans
Requests per second on sol_send_tx, from tier-matrix.yaml, the same source as RPC pricing. This budget is separate from your read budget.
| What | Free trial (7 days) | Basic $20/mo | Pro $249/mo | Business $499/mo | Enterprise from $999/mo |
|---|---|---|---|---|---|
sendTransaction | 5 RPS sustained · up to 10 burst | 10 RPS sustained · up to 20 burst | 50 RPS sustained · up to 100 burst | 150 RPS sustained · up to 300 burst | No per-category cap |
A flat monthly price, no credits or overage. Tips are yours to set, and go to the tip account you choose.
When this is the wrong choice
If your bot needs a colocated send path in a region far from Frankfurt, the direct lane is the wrong tool, and a regional sender service may suit you better: compare send services, including where they run and what they charge. No provider listed there commits to landing either, so plan for retries wherever you send from.
Put it together
The send guide walks through the whole loop: blockhash, compute limit, priority fee, sending, rebroadcast and confirmation. When a send returns an error, start with transaction simulation failed or blockhash not found. To act on transactions before they execute, pair sending with the Shred stream.
FAQ
- What does fra.triport.io do that triport.io does not?
- It is a direct endpoint on our Frankfurt edge with no Cloudflare in front, meant only for sending transactions. It has no automatic failover: if it does not answer, resend through https://triport.io/sol. Keep reads and streams on triport.io.
- Do I need a tip?
- No. Without a tip your transaction takes the Triport RPC path. A tip to a Jito or Helius Sender tip account adds that path as well. A tip pays for that service's routing, so it only makes sense if your transaction is competing for space.
- Does Triport retry my transaction?
- Triport does not rebroadcast after an upstream has accepted a transaction. maxRetries is passed through and keeps its usual meaning on the upstream node. For time-sensitive sends, set maxRetries to 0 and rebroadcast the same signed bytes yourself until the blockhash expires.
- Does a successful response mean the transaction landed?
- No. A result means an upstream accepted the transaction for forwarding. It can still be dropped or expire with its blockhash. Confirm with getSignatureStatuses, signatureSubscribe or getTransaction.
- Does Triport charge per transaction or take a platform fee?
- No. Sending is part of the flat plan. Any tip is an instruction in your transaction, so it goes to the tip account you chose and not to Triport.