Solana transaction sending: a direct lane and parallel send paths

Last updated:

Which send should you use?

Solana send options on Triport
You needUseEndpointPlan
One transaction, no tipsendTransactionfra.triport.io/sol, then triport.io/solEvery plan
One transaction competing for block spacesendTransaction with a priority fee and a tipfra.triport.io/sol, then triport.io/solEvery plan
Several transactions that must land together, in ordersendBundletriport.io/solPro and above
A check before sendingPreflight (default), or simulateTransactiontriport.io/solPreflight: 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.

Send paths and what enables each
PathUsed whenWorth knowing
Triport RPC path (cohort)AlwaysA Solana RPC node that forwards to the current leader
Helius Sender (sender)The transaction tips a Helius Sender accountRequires its own tip and a priority fee, or it rejects the transaction
Jito block engine (jito)The transaction tips a Jito accountUsed 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 example cohort,sender. If you tipped and the path is missing, look at the tip account.
  • X-Triport-Send-Winner: the path whose answer you received, or none.
  • 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.

WhatFree trial (7 days)Basic $20/moPro $249/moBusiness $499/moEnterprise from $999/mo
sendTransaction5 RPS sustained · up to 10 burst10 RPS sustained · up to 20 burst50 RPS sustained · up to 100 burst150 RPS sustained · up to 300 burstNo 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.