AllenHark Relay
Land your Solana transactions in the same block.
AllenHark Relay hands your signed transaction to the current leader at 0.1 ms. Create a key, add a tip, send.
- Pricing
- A tip inside each transaction, from 0.001 SOL
- Connect
- QUIC · WebSocket · HTTPS
Start in three steps
Create your key
Sign in and open Relay in the console. Your key and endpoints are there.
Add the tip
A top-level transfer of at least 0.001 SOL to one of the wallets below, picked at random.
Send it
Post the signed transaction with your key in the x-api-key header, or stream it over QUIC or WebSocket.
hark1zxc5Rz3K8Kquz79WPWFEgNCFeJnsMJ16f22uNP
harkm2BTWxZuszoNpZnfe84jRbQTg6KGHaQBmWzDGQQ
hark4CwtTnN2y9FaxjcFBAJdJqQrpouu5pgEixfqdEz
harkoJfnM6dxrJydx5eVmDVwAgwC94KbhuxF69UbXwP
hark6hUDUTekc1DGxWdJcuyDZwf6pJdCxd4SXAVtta6
harkoTvFpKSrEQduYrNHXCurARVT19Ud3BnFhVxabos
harkEpXoJv5qVzHaN7HSuUAd6PHjyMcFMcDYBMDJCEQ
harkyXDdZSoJGyCxa24t2QXx1poPyp8YfghbtpzGSzK
harkR2YJ4Dpt4UDJTcBirjnSPBhNpQFcoFkNpCkVqNk
harkRBygM8pHYe4K8eBjfxyEX19oJn3LepFjvNbLbyi
harkYFxB6DuUFNwDLvA5CQ66KpfRvFgUoVypMagNcmdConnect
Each example adds the tip and sends with your key.
# BASE64_SIGNED_TX: your signed transaction, with the tip transfer inside it.
curl -X POST https://fra.relay.allenhark.com/v1/sendTx \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"tx":"BASE64_SIGNED_TX","simulate":false}'
# → {"status":"accepted","request_id":"550e8400-…","signature":"5wH…"}import {
Connection, Keypair, PublicKey, SystemProgram,
Transaction, TransactionInstruction,
} from "@solana/web3.js";
const RELAY = "https://fra.relay.allenhark.com/v1/sendTx";
const TIP_LAMPORTS = 1_000_000; // 0.001 SOL minimum; raise it under congestion
const TIP_WALLETS = [
"hark1zxc5Rz3K8Kquz79WPWFEgNCFeJnsMJ16f22uNP",
"harkm2BTWxZuszoNpZnfe84jRbQTg6KGHaQBmWzDGQQ",
"hark4CwtTnN2y9FaxjcFBAJdJqQrpouu5pgEixfqdEz",
"harkoJfnM6dxrJydx5eVmDVwAgwC94KbhuxF69UbXwP",
"hark6hUDUTekc1DGxWdJcuyDZwf6pJdCxd4SXAVtta6",
"harkoTvFpKSrEQduYrNHXCurARVT19Ud3BnFhVxabos",
"harkEpXoJv5qVzHaN7HSuUAd6PHjyMcFMcDYBMDJCEQ",
"harkyXDdZSoJGyCxa24t2QXx1poPyp8YfghbtpzGSzK",
"harkR2YJ4Dpt4UDJTcBirjnSPBhNpQFcoFkNpCkVqNk",
"harkRBygM8pHYe4K8eBjfxyEX19oJn3LepFjvNbLbyi",
"harkYFxB6DuUFNwDLvA5CQ66KpfRvFgUoVypMagNcmd",
];
export async function sendViaRelay(
connection: Connection,
payer: Keypair,
instructions: TransactionInstruction[],
): Promise<string> {
const tipWallet = new PublicKey(TIP_WALLETS[Math.floor(Math.random() * TIP_WALLETS.length)]);
const tx = new Transaction().add(
...instructions,
// The tip: a top-level transfer to a random tip wallet.
SystemProgram.transfer({ fromPubkey: payer.publicKey, toPubkey: tipWallet, lamports: TIP_LAMPORTS }),
);
tx.feePayer = payer.publicKey;
tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash;
tx.sign(payer);
const res = await fetch(RELAY, {
method: "POST",
headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
body: JSON.stringify({ tx: tx.serialize().toString("base64"), simulate: false }),
});
const result = await res.json();
if (result.status !== "accepted") throw new Error(`Relay rejected: ${result.code ?? result.error}`);
return result.signature; // accepted is not landed: confirm it on chain
}use base64::{engine::general_purpose::STANDARD, Engine};
use rand::seq::SliceRandom;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_sdk::{
instruction::Instruction, pubkey::Pubkey, signature::{Keypair, Signer},
system_instruction, transaction::Transaction,
};
use std::str::FromStr;
const TIP_LAMPORTS: u64 = 1_000_000; // 0.001 SOL minimum; raise it under congestion
const TIP_WALLETS: [&str; 11] = [
"hark1zxc5Rz3K8Kquz79WPWFEgNCFeJnsMJ16f22uNP",
"harkm2BTWxZuszoNpZnfe84jRbQTg6KGHaQBmWzDGQQ",
"hark4CwtTnN2y9FaxjcFBAJdJqQrpouu5pgEixfqdEz",
"harkoJfnM6dxrJydx5eVmDVwAgwC94KbhuxF69UbXwP",
"hark6hUDUTekc1DGxWdJcuyDZwf6pJdCxd4SXAVtta6",
"harkoTvFpKSrEQduYrNHXCurARVT19Ud3BnFhVxabos",
"harkEpXoJv5qVzHaN7HSuUAd6PHjyMcFMcDYBMDJCEQ",
"harkyXDdZSoJGyCxa24t2QXx1poPyp8YfghbtpzGSzK",
"harkR2YJ4Dpt4UDJTcBirjnSPBhNpQFcoFkNpCkVqNk",
"harkRBygM8pHYe4K8eBjfxyEX19oJn3LepFjvNbLbyi",
"harkYFxB6DuUFNwDLvA5CQ66KpfRvFgUoVypMagNcmd",
];
async fn send_via_relay(
rpc: &RpcClient,
payer: &Keypair,
mut ixs: Vec<Instruction>,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
// The tip: a top-level transfer to a random tip wallet.
let tip_wallet = Pubkey::from_str(TIP_WALLETS.choose(&mut rand::thread_rng()).unwrap())?;
ixs.push(system_instruction::transfer(&payer.pubkey(), &tip_wallet, TIP_LAMPORTS));
let blockhash = rpc.get_latest_blockhash().await?;
let tx = Transaction::new_signed_with_payer(&ixs, Some(&payer.pubkey()), &[payer], blockhash);
let res = reqwest::Client::new()
.post("https://fra.relay.allenhark.com/v1/sendTx")
.header("x-api-key", "YOUR_API_KEY")
.json(&serde_json::json!({ "tx": STANDARD.encode(bincode::serialize(&tx)?), "simulate": false }))
.send()
.await?;
Ok(res.json().await?) // {"status":"accepted","request_id":"…","signature":"…"}
}import base64, random, requests
from solana.rpc.api import Client
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
from solders.system_program import TransferParams, transfer
from solders.transaction import Transaction
TIP_LAMPORTS = 1_000_000 # 0.001 SOL minimum; raise it under congestion
TIP_WALLETS = [
"hark1zxc5Rz3K8Kquz79WPWFEgNCFeJnsMJ16f22uNP",
"harkm2BTWxZuszoNpZnfe84jRbQTg6KGHaQBmWzDGQQ",
"hark4CwtTnN2y9FaxjcFBAJdJqQrpouu5pgEixfqdEz",
"harkoJfnM6dxrJydx5eVmDVwAgwC94KbhuxF69UbXwP",
"hark6hUDUTekc1DGxWdJcuyDZwf6pJdCxd4SXAVtta6",
"harkoTvFpKSrEQduYrNHXCurARVT19Ud3BnFhVxabos",
"harkEpXoJv5qVzHaN7HSuUAd6PHjyMcFMcDYBMDJCEQ",
"harkyXDdZSoJGyCxa24t2QXx1poPyp8YfghbtpzGSzK",
"harkR2YJ4Dpt4UDJTcBirjnSPBhNpQFcoFkNpCkVqNk",
"harkRBygM8pHYe4K8eBjfxyEX19oJn3LepFjvNbLbyi",
"harkYFxB6DuUFNwDLvA5CQ66KpfRvFgUoVypMagNcmd",
]
def send_via_relay(rpc: Client, payer: Keypair, ixs: list) -> dict:
# The tip: a top-level transfer to a random tip wallet.
tip = transfer(TransferParams(
from_pubkey=payer.pubkey(),
to_pubkey=Pubkey.from_string(random.choice(TIP_WALLETS)),
lamports=TIP_LAMPORTS,
))
blockhash = rpc.get_latest_blockhash().value.blockhash
tx = Transaction([payer], Message.new_with_blockhash([*ixs, tip], payer.pubkey(), blockhash), blockhash)
r = requests.post(
"https://fra.relay.allenhark.com/v1/sendTx",
headers={"x-api-key": "YOUR_API_KEY"},
json={"tx": base64.b64encode(bytes(tx)).decode(), "simulate": False},
timeout=5,
)
return r.json() # {"status": "accepted", "request_id": "...", "signature": "..."}# QUIC: connect by IP; the first line of each stream is api-key: YOUR_API_KEY
88.216.36.108:4433 # Frankfurt
84.32.104.38:4433 # Amsterdam
74.214.174.50:4433 # New York
88.216.188.28:4433 # Tokyo
# WebSocket: x-api-key header at the upgrade
wss://fra.relay.allenhark.com/v1/stream/tx
wss://ams.relay.allenhark.com/v1/stream/tx
wss://ny.relay.allenhark.com/v1/stream/tx
wss://tyo.relay.allenhark.com/v1/stream/tx
wss://fra.relay.allenhark.com/v1/stream/bundle
wss://ams.relay.allenhark.com/v1/stream/bundle
wss://ny.relay.allenhark.com/v1/stream/bundle
wss://tyo.relay.allenhark.com/v1/stream/bundle
# HTTPS: x-api-key header on every POST
https://fra.relay.allenhark.com/v1/sendTx
https://ams.relay.allenhark.com/v1/sendTx
https://ny.relay.allenhark.com/v1/sendTx
https://tyo.relay.allenhark.com/v1/sendTx
https://fra.relay.allenhark.com/v1/sendBundle
https://ams.relay.allenhark.com/v1/sendBundle
https://ny.relay.allenhark.com/v1/sendBundle
https://tyo.relay.allenhark.com/v1/sendBundleHow tips work
At least 0.001 SOL
A top-level transfer to a tip wallet in the static account keys. Less gets 400 tip_insufficient.
More when it is busy
Under congestion, raise it to 0.002 to 0.005 SOL.
Jito bundles
Up to five transactions, atomic and in order. One tip covers the whole bundle.
Sending at volume? Relay Dedicated
Your whitelisted wallets send with no tip.
Relay Dedicated
Billed monthly
$315/mo
- No tip from whitelisted wallets
- Higher rate limit
Questions
How do I get an API key?
Create it in the console's Relay tab. Send it as the x-api-key header, or as the first line of a QUIC stream.
How do I pay?
You pay per transaction, with a tip inside it of at least 0.001 SOL. At volume, Relay Dedicated is a monthly plan.
Why was my transaction rejected?
Usually the tip: missing or nested in another program (tip_missing), under the minimum (tip_insufficient), or behind a lookup table (tip_hidden_in_alt).
It was accepted but did not land. Why?
Accepted means we sent it on. Usually the blockhash expired, the state moved, or the tip was low for the congestion.
Do Jito bundles work?
Yes, up to five. One AllenHark tip covers the bundle, and the last transaction also carries a Jito tip of at least 1,000 lamports.
Is this the 0-slot relay?
Yes. AllenHark Relay is the service first sold as 0-slot, and the old address brings you here.
