Skip to content
Via a domainHTTPS reaches the relay through its regional domain name, one extra fix on the way to the slot.HTTPSNSLOT N
HTTPS reaches the relay through its regional domain name, one extra fix on the way to the slot.

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

RegionSingle transactionAtomic bundle
Frankfurt (Primary)POST https://fra.fastrelay.sh/v1/sendTxPOST https://fra.fastrelay.sh/v1/sendBundle
AmsterdamPOST https://ams.fastrelay.sh/v1/sendTxPOST https://ams.fastrelay.sh/v1/sendBundle
New YorkPOST https://ny.fastrelay.sh/v1/sendTxPOST https://ny.fastrelay.sh/v1/sendBundle
TokyoPOST https://tyo.fastrelay.sh/v1/sendTxPOST 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:

bash
curl https://fastrelay.sh/keepalive
json
{
  "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

json
{
  "tx": "BASE64_ENCODED_TRANSACTION",
  "simulate": false
}

Important: The simulate parameter must be false. Simulation requests are rejected to prevent abuse.

Node.js Example (fetch)

javascript
// 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)

rust
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(())
}