Overview
Glaive is a high-performance Solana transaction sender. It maintains persistent connections to current and upcoming slot leaders, delivering your transactions directly into the validator processing pipeline.
The API is JSON-RPC compatible -- you can use it as a drop-in replacement for your existing RPC endpoint when sending transactions.
Quickstart
Get a transaction submitted through Glaive in under a minute.
1. Get an API key
Contact the Glaive team to get an API key.
2. Send a transaction
curl "http://ams1.glaive.trade?key=YOUR_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["<base64-encoded-tx>"]
}'
3. Or use a client library
TypeScript
import { Connection } from "@solana/web3.js";
const connection = new Connection(
`http://ams1.glaive.trade?key=${process.env.GLAIVE_KEY}`
);
const sig = await sendAndConfirmTransaction(connection, tx, [payer]);
Rust
use solana_client::rpc_client::RpcClient;
use solana_sdk::signature::Signer;
let url = format!("http://ams1.glaive.trade?key={}", api_key);
let client = RpcClient::new(url);
let sig = client.send_and_confirm_transaction(&tx)?;
Authentication
All requests require a key query parameter.
Each API key has an individually configured rate limit (TPS).
http://ams1.glaive.trade?key=your-api-key-here
Keys are UUID v4 strings. Treat them like passwords -- do not commit them to source control or share them in client-side code.
Don't have a key yet? Contact us to get one.
Regions
Glaive runs in multiple regions. Use the endpoint closest to your infrastructure.
| Region | Endpoint | Status |
|---|---|---|
| Amsterdam 1 | ams1.glaive.trade | Live |
| Amsterdam 2 | ams2.glaive.trade | Live |
| Frankfurt | fra.glaive.trade | Live |
Endpoint
Glaive runs regional endpoints. Send requests to the nearest region:
POST http://ams1.glaive.trade?key=YOUR_API_KEY
The endpoint accepts standard Solana JSON-RPC format.
Content type must be application/json.
sendTransaction
Submit a signed transaction for delivery to current and upcoming leaders.
Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": [
"<base64-encoded-transaction>",
{
"encoding": "base64",
"skipPreflight": true,
"maxRetries": 0
}
]
}
Parameters
| Field | Type | Description |
|---|---|---|
params[0] | string | Base64-encoded signed transaction |
encoding | string | Transaction encoding. Default: base64 |
skipPreflight | boolean | Skip preflight simulation. Default: true |
maxRetries | number | Max send attempts. Default: 0 (Glaive handles retries) |
Response
{
"jsonrpc": "2.0",
"id": 1,
"result": "<transaction-signature>"
}
TypeScript Example
import { Connection, Transaction, SystemProgram, PublicKey } from "@solana/web3.js";
const connection = new Connection(
`http://ams1.glaive.trade?key=${process.env.GLAIVE_KEY}`
);
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: new PublicKey("dest..."),
lamports: 1_000_000,
})
);
const sig = await sendAndConfirmTransaction(connection, tx, [payer]);
console.log("Confirmed:", sig);
Rust Example
use solana_client::rpc_client::RpcClient;
use solana_sdk::{
signature::{Keypair, Signer},
system_transaction,
};
let url = format!("http://ams1.glaive.trade?key={}", api_key);
let client = RpcClient::new(url);
let blockhash = client.get_latest_blockhash()?;
let tx = system_transaction::transfer(&payer, &dest, 1_000_000, blockhash);
let sig = client.send_and_confirm_transaction(&tx)?;
println!("Confirmed: {sig}");
Minimum Tip
All transactions sent through Glaive must include a transfer of at least
0.001 SOL (1,000,000 lamports) to one of the Glaive tip accounts.
Transactions without a valid tip will be rejected with a 400 response.
Tip Accounts
Your transaction must include a SOL transfer to any one of these addresses:
GLaiv4GMRYQmthatDS98uQT4HoucgxWT8NeJz6oSwxeU
GLaivL5uPrDpvd1wTtvat38KGqb5WLhEdqQfnmNd3oNr
GLaivinAWh21NaJMhtExtD5G2gZs1xnvaYVZmwqobWZL
GLaivJSUL71FcocYa8tks5vpVyYzvaDMHtyrzfQF2ABr
GLaivRU6eDKrta3p3psFAWPEFLzCjeMHGpPUuQqTjtyv
GLaivq5dU8qHayz9Qf13LjPfVy3SmUhbmickfGiZdmfh
TypeScript
import { SystemProgram, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
const GLAIVE_TIP_ACCOUNTS = [
"GLaiv4GMRYQmthatDS98uQT4HoucgxWT8NeJz6oSwxeU",
"GLaivL5uPrDpvd1wTtvat38KGqb5WLhEdqQfnmNd3oNr",
"GLaivinAWh21NaJMhtExtD5G2gZs1xnvaYVZmwqobWZL",
"GLaivJSUL71FcocYa8tks5vpVyYzvaDMHtyrzfQF2ABr",
"GLaivRU6eDKrta3p3psFAWPEFLzCjeMHGpPUuQqTjtyv",
"GLaivq5dU8qHayz9Qf13LjPfVy3SmUhbmickfGiZdmfh",
];
const TIP_LAMPORTS = 0.001 * LAMPORTS_PER_SOL; // 1_000_000
const tipAccount = GLAIVE_TIP_ACCOUNTS[Math.floor(Math.random() * GLAIVE_TIP_ACCOUNTS.length)];
tx.add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: new PublicKey(tipAccount),
lamports: TIP_LAMPORTS,
})
);
Rust
use solana_sdk::{system_instruction, pubkey::Pubkey};
use rand::seq::SliceRandom;
use std::str::FromStr;
const TIP_LAMPORTS: u64 = 1_000_000; // 0.001 SOL
const GLAIVE_TIP_ACCOUNTS: &[&str] = &[
"GLaiv4GMRYQmthatDS98uQT4HoucgxWT8NeJz6oSwxeU",
"GLaivL5uPrDpvd1wTtvat38KGqb5WLhEdqQfnmNd3oNr",
"GLaivinAWh21NaJMhtExtD5G2gZs1xnvaYVZmwqobWZL",
"GLaivJSUL71FcocYa8tks5vpVyYzvaDMHtyrzfQF2ABr",
"GLaivRU6eDKrta3p3psFAWPEFLzCjeMHGpPUuQqTjtyv",
"GLaivq5dU8qHayz9Qf13LjPfVy3SmUhbmickfGiZdmfh",
];
let tip_account = GLAIVE_TIP_ACCOUNTS
.choose(&mut rand::thread_rng())
.unwrap();
let tip_pubkey = Pubkey::from_str(tip_account).unwrap();
let tip_ix = system_instruction::transfer(
&payer.pubkey(),
&tip_pubkey,
TIP_LAMPORTS,
);
tx.add(tip_ix);
Rate Limits
Each API key has a configured transactions-per-second (TPS) limit.
When exceeded, requests return 429 Too Many Requests.
| Header | Description |
|---|---|
X-RateLimit-Limit | Your TPS cap |
X-RateLimit-Remaining | Remaining TPS in current window |
Retry-After | Seconds to wait before retrying (on 429) |
Error Codes
| HTTP Status | Meaning |
|---|---|
200 | Transaction accepted for delivery |
400 | Malformed request or invalid transaction |
401 | Missing or invalid API key |
429 | Rate limit exceeded |
500 | Internal server error |
FAQ
Does Glaive replace my RPC provider?
Only for sendTransaction. You still need a standard RPC
for reading state, fetching blockhashes, and other queries.
Which encoding formats are supported?
Base64 (default) and base58. We recommend base64 for smaller payload size.
What happens if the leader rotates mid-send?
Glaive fans out to multiple upcoming leaders simultaneously. Leader rotation during delivery is expected and handled automatically.
Is there a testnet endpoint?
Not currently. Glaive targets mainnet-beta only.
Contact
To get an API key or ask questions, reach out to us directly.