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.

RegionEndpointStatus
Amsterdam 1ams1.glaive.tradeLive
Amsterdam 2ams2.glaive.tradeLive
Frankfurtfra.glaive.tradeLive

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

FieldTypeDescription
params[0]stringBase64-encoded signed transaction
encodingstringTransaction encoding. Default: base64
skipPreflightbooleanSkip preflight simulation. Default: true
maxRetriesnumberMax 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.

HeaderDescription
X-RateLimit-LimitYour TPS cap
X-RateLimit-RemainingRemaining TPS in current window
Retry-AfterSeconds to wait before retrying (on 429)

Error Codes

HTTP StatusMeaning
200Transaction accepted for delivery
400Malformed request or invalid transaction
401Missing or invalid API key
429Rate limit exceeded
500Internal 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.