Sending via HTTPS
A simpler integration path using a standard REST API. API keys are optional — if provided, they enable rate tracking and the stake-scaled rate limit.
Endpoints
| Region | Single transaction | Atomic bundle |
|---|---|---|
| Frankfurt (Primary) | POST https://fra.fastrelay.sh/v1/sendTx | POST https://fra.fastrelay.sh/v1/sendBundle |
| Amsterdam | POST https://ams.fastrelay.sh/v1/sendTx | POST https://ams.fastrelay.sh/v1/sendBundle |
| New York | POST https://ny.fastrelay.sh/v1/sendTx | POST https://ny.fastrelay.sh/v1/sendBundle |
| Tokyo | POST https://tyo.fastrelay.sh/v1/sendTx | POST https://tyo.fastrelay.sh/v1/sendBundle |
Every endpoint also answers over plain HTTP on the same host — swap https:// for http:// (for example http://fra.fastrelay.sh/v1/sendTx). HTTP saves the TLS handshake on a fresh connection; HTTPS keeps the request and your API key encrypted in transit. The bare fastrelay.sh is the website and does not accept transactions.
Bundle request/response shapes are covered in Atomic Bundles (Jito).
Keep-Alive
Use the /keepalive endpoint to maintain your HTTP connection and monitor server time:
curl https://fastrelay.sh/keepalive{
"status": "alive",
"server_time": "2026-05-02T12:00:00.000Z",
"region": "fra",
"slot": 312345678
}Poll /keepalive every 5–10 seconds to keep your connection warm and avoid repeated TLS handshakes.
Request Format
{
"tx": "BASE64_ENCODED_TRANSACTION",
"simulate": false
}Important: The
simulateparameter must befalse. Simulation requests are rejected to prevent abuse.
Node.js Example (fetch)
// Without API key
const response = await fetch("https://fra.fastrelay.sh/v1/sendTx", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
tx: "BASE64_ENCODED_TRANSACTION",
simulate: false
})
});
const data = await response.json();
console.log("Response:", data);
// With API key via query param
const response2 = await fetch(
"https://fra.fastrelay.sh/v1/sendTx?api-key=YOUR_API_KEY",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ tx: "BASE64_TX", simulate: false })
}
);Rust Example (reqwest)
use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let res = client.post("https://fra.fastrelay.sh/v1/sendTx")
.header("x-api-key", "YOUR_API_KEY")
.json(&json!({
"tx": "BASE64_ENCODED_TRANSACTION",
"simulate": false
}))
.send()
.await?;
let response_text = res.text().await?;
println!("Response: {}", response_text);
Ok(())
}