Skip to main content

SWQOS Quickstart

Integrate with AI
I'm integrating Blockspace SWQOS to improve transaction landing rates on Solana.

Product: Blockspace SWQOS — stake-weighted priority transaction routing through Everstake validators. Two submission paths.

Path 1 — HTTP (easiest to integrate):
- No API key or auth. Public endpoint.
- Every transaction MUST include a tip-transfer: SystemProgram::transfer paying ≥1,000,000 lamports to a designated Everstake tip account.
- Tip account list: https://github.com/everstake/everstake-swqos-docs
- The HTTP endpoint only accepts sendTransaction — no read methods. Fetch blockhash from a separate standard Solana RPC.
- Endpoints (6 regions): fra-swqos.everstake.one / ams-swqos.everstake.one / ny-swqos.everstake.one / tyo-swqos.everstake.one / lon-swqos.everstake.one / sgp-swqos.everstake.one / main-swqos.everstake.one (anycast)

Path 2 — QUIC (lower latency, custom client):
- Auth: signing-keypair allowlist. Generate a dedicated Solana keypair, add pubkey in dashboard → SWQOS → QUIC pubkeys.
- To connect: log in to your Blockspace account, purchase a subscription or activate a trial, then add your QUIC pubkey to the desired location in the dashboard.
- 6 locations available: Frankfurt, Amsterdam, New York, Tokyo, London, Singapore.
- Tip is still required in every transaction.
- Reference QUIC client: https://github.com/everstake/everstake-swqos-docs

Important: SWQOS doesn't replace standard priority fees. No preflight — invalid txs are silently dropped at the validator. This is a landing probability boost, not a guarantee.
Full reference: https://docs.blockspace.everstake.one/llms-full.txt

My stack: [ADAPT: Rust / TypeScript — pick one and tell me which].
Generate a minimal HTTP-path example that: fetches a recent blockhash from mainnet-beta, builds a transaction with a tip-transfer instruction + a placeholder business instruction, and submits it to the Frankfurt SWQOS endpoint. Then explain what I need to change to switch to QUIC.

SWQOS has two submission paths. Pick one — they have different setup requirements.

Path 1 — HTTP / RPC (no auth, fastest to integrate)

The HTTP path is a public endpoint. You don't need an API key, you don't whitelist anything. The only thing it cares about: each transaction must include a tip-transfer instruction.

1. Build a transaction with a tip-transfer

Add a SystemProgram::transfer instruction paying ≥1,000,000 lamports to a designated Everstake tip account. Without it, SWQOS doesn't prioritize the tx.

The list of valid tip accounts is published in the open-source SWQOS docs at github.com/everstake/everstake-swqos-docs.

2. Fetch a recent blockhash

The SWQOS HTTP endpoint only accepts sendTransaction — no read methods, no preflight. Fetch your blockhash from any standard Solana RPC (your own RPC, public mainnet, etc.).

3. Submit via sendTransaction

use solana_client::rpc_client::RpcClient;
use solana_sdk::{
commitment_config::CommitmentConfig,
instruction::Instruction,
pubkey::Pubkey,
signature::Keypair,
signer::Signer,
system_instruction,
transaction::Transaction,
};

// 1. Fetch blockhash from any standard RPC (NOT the SWQOS endpoint)
let rpc = RpcClient::new_with_commitment(
"https://api.mainnet-beta.solana.com".to_string(),
CommitmentConfig::confirmed(),
);
let blockhash = rpc.get_latest_blockhash()?;

// 2. Build transaction with tip-transfer + your business logic instruction
let tip_account: Pubkey = "<EVERSTAKE_TIP_ACCOUNT_PUBKEY>".parse()?;
let tip_ix = system_instruction::transfer(&payer.pubkey(), &tip_account, 1_000_000);
let business_ix: Instruction = /* your logic here */;

let tx = Transaction::new_signed_with_payer(
&[tip_ix, business_ix],
Some(&payer.pubkey()),
&[&payer],
blockhash,
);

// 3. Submit to SWQOS HTTP endpoint
let swqos = RpcClient::new("https://fra-swqos.everstake.one".to_string());
let sig = swqos.send_transaction(&tx)?;
println!("Submitted: {}", sig);

Endpoints

Pick the region closest to your bot:

https://fra-swqos.everstake.one    # Frankfurt
https://ams-swqos.everstake.one # Amsterdam
https://ny-swqos.everstake.one # New York
https://tyo-swqos.everstake.one # Tokyo
https://lon-swqos.everstake.one # London
https://sgp-swqos.everstake.one # Singapore
https://main-swqos.everstake.one # Cloudflare anycast (region routes automatically)

For lowest latency, use HTTP/2 with prior knowledge (h2c) over plain http://. HTTPS works too, just adds TLS handshake.

Path 2 — QUIC (lowest latency, custom client)

QUIC requires a pubkey-authenticated connection and a custom client implementation. Solana SDK doesn't speak this protocol.

1. Whitelist your QUIC pubkey

Generate a Solana keypair you'll use only for QUIC authentication (not necessarily the same one that signs your transactions):

solana-keygen new --no-passphrase --outfile ~/.config/solana/swqos-quic.json
solana-keygen pubkey ~/.config/solana/swqos-quic.json

In the dashboard → SWQOS → QUIC pubkeys, add the pubkey from above. Save.

Whitelist edits propagate within ~30 seconds.

2. Connect to a QUIC endpoint

To get access to the QUIC endpoints, log in to your Blockspace account, purchase a subscription or activate a trial, then add your QUIC pubkey to the desired location in the dashboard under SWQOS → QUIC pubkeys.

We have 6 locations available:

  • Frankfurt
  • Amsterdam
  • New York
  • Tokyo
  • London
  • Singapore

The QUIC handshake is authenticated by the keypair you whitelisted. There's no separate API key.

3. Send a raw serialized transaction

The transaction itself still must include the tip-transfer instruction (≥1,000,000 lamports to an Everstake tip account). Serialize the signed transaction and write its bytes to a QUIC stream.

The reference open-source implementation lives at github.com/everstake/everstake-swqos-docs — see the example Rust binary that does the QUIC handshake and submits.

Common to both paths

  • Tip is required in every transaction (≥1,000,000 lamports).
  • No API key on either flow.
  • No preflight checks by SWQOS — invalid transactions are silently dropped at the validator.
  • Set priority fees on your transaction as you would normally; SWQOS layers on top, it doesn't replace them.
  • Standard transaction lifecycle — SWQOS bumps probability of inclusion, doesn't skip block production.

Next