sendTransaction
Submit a single signed transaction via JSON-RPC. The relay extracts the tip amount and routes the transaction through the appropriate channels.
Transactions must include a tip transfer to a configured tip wallet. Transactions with tips below 0.0001 SOL (100,000 lamports) are rejected.
Routing by tip
| Tip amount | Forwarding channels |
|---|
| < 0.0001 SOL | Rejected |
| 0.0001 – 0.001 SOL | QUIC TPU |
| 0.001 – 0.01 SOL | QUIC TPU + RPC |
| ≥ 0.01 SOL | QUIC TPU + RPC + SWQoS + Jito |
Servers
| Region | Endpoint |
|---|
| Frankfurt | https://fra.send.raze.sh |
| Amsterdam | https://ams.send.raze.sh |
| Chicago | https://chi.send.raze.sh |
| Singapore | https://sg.send.raze.sh |
Request
POST /
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": [
"<encoded_transaction>",
{
"encoding": "base64"
}
]
}
| Field | Type | Required | Description |
|---|
params[0] | string | Yes | Signed transaction, base64 or base58 encoded |
params[1].encoding | string | No | "base64" (default) or "base58" |
Response
Success — returns the transaction signature:
{
"jsonrpc": "2.0",
"result": "5KtPn1LGuxhFiwjxqLHpBCa6xjnB7YaB1pPB263DezXAZ8z7Pnrn...",
"id": 1
}
Error — returns an error object:
{
"jsonrpc": "2.0",
"error": {
"code": -32003,
"message": "tip below minimum (0.0001 SOL)"
},
"id": 1
}
| Error code | Meaning |
|---|
-32700 | Parse error — invalid JSON |
-32602 | Invalid params — missing or malformed transaction |
-32003 | Transaction rejected — tip below minimum |
Code examples
curl -X POST https://fra.send.raze.sh \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["<base64_signed_transaction>", {"encoding": "base64"}]
}'
const response = await fetch("https://fra.send.raze.sh", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendTransaction",
params: [base64Transaction, { encoding: "base64" }],
}),
});
const { result, error } = await response.json();
if (error) throw new Error(error.message);
console.log("Signature:", result);
import requests
resp = requests.post("https://fra.send.raze.sh", json={
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": [base64_transaction, {"encoding": "base64"}],
})
data = resp.json()
if "error" in data:
raise Exception(data["error"]["message"])
print("Signature:", data["result"])
let client = reqwest::Client::new();
let resp = client
.post("https://fra.send.raze.sh")
.json(&serde_json::json!({
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": [base64_transaction, {"encoding": "base64"}]
}))
.send()
.await?;
let body: serde_json::Value = resp.json().await?;
println!("Signature: {}", body["result"]);
Alternative protocols
For lower latency, you can also submit transactions via:
- QUIC (Solana TPU wire format) — connect with
solana-tpu-client using ALPN "solana-tpu". Fire-and-forget, no response.
- UDP (raw bincode) — send raw serialized transaction bytes. Fire-and-forget, lowest latency.
Port assignments depend on the relay’s configuration. Contact support for QUIC/UDP port details.