Skip to main content

Protocols

The Raze Sender relay accepts transactions over three protocols. Choose based on your latency and integration requirements.
ProtocolPortFormatResponseBest for
HTTP80/443JSON-RPCTransaction signature / bundle IDEasiest integration, full feedback
QUIC8011Solana TPU wire formatNone (fire-and-forget)Low latency, Solana-native clients
UDP8010Raw bincode bytesNone (fire-and-forget)Lowest latency, high throughput

Servers

RegionHTTPQUICUDP
Frankfurtfra.send.raze.shfra.send.raze.sh:8011fra.send.raze.sh:8010
Amsterdamams.send.raze.shams.send.raze.sh:8011ams.send.raze.sh:8010
Chicagochi.send.raze.shchi.send.raze.sh:8011chi.send.raze.sh:8010
Singaporesg.send.raze.shsg.send.raze.sh:8011sg.send.raze.sh:8010

HTTP (JSON-RPC)

Standard HTTP POST with JSON-RPC 2.0. Returns transaction signature or bundle ID. See sendTransaction and sendBundle for full details.
curl -X POST https://fra.send.raze.sh \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "sendTransaction",
    "params": ["<base64_signed_tx>", {"encoding": "base64"}]
  }'

QUIC (Solana TPU)

Native Solana TPU protocol over QUIC. Compatible with solana-tpu-client and any client using ALPN solana-tpu. Fire-and-forget — no response is returned. Connection details:
  • TLS with self-signed certificate (verification skipped by Solana clients)
  • ALPN protocol: solana-tpu
  • Max transaction size: 1232 bytes
  • Open a unidirectional stream, write the raw transaction bytes, close the stream
use solana_tpu_client::tpu_client::TpuClient;
use solana_client::rpc_client::RpcClient;
use solana_sdk::transaction::Transaction;

// The relay acts as a TPU endpoint
let rpc = RpcClient::new("https://api.mainnet-beta.solana.com");
let tpu_addr = "fra.send.raze.sh:8011".parse().unwrap();

// Send raw wire transaction
let tx_bytes = bincode::serialize(&transaction)?;
// Send via QUIC unidirectional stream to tpu_addr

UDP (Raw Bincode)

Lowest latency option. Send raw bincode-serialized Solana transactions as UDP datagrams. Fire-and-forget — no response, no connection overhead. Details:
  • Max transaction size: 1232 bytes per datagram
  • No handshake, no connection state
  • Processed on a dedicated OS thread with recvmmsg() batch processing (32 packets per syscall)
import socket
from solders.transaction import Transaction

tx_bytes = bytes(transaction)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(tx_bytes, ("fra.send.raze.sh", 8010))
sock.close()

Tip-based routing

All protocols use the same tip-based routing. The relay extracts tip amounts from transaction instructions (zero-copy, no full deserialization) and forwards accordingly:
TipChannels
< 0.0001 SOLRejected (HTTP returns error -32003, QUIC/UDP silently dropped)
0.0001 – 0.001 SOLQUIC TPU
0.001 – 0.01 SOLQUIC TPU + RPC
≥ 0.01 SOLQUIC TPU + RPC + SWQoS + Jito