Get Start
Choose a region#
Pick the region and endpoint closest to your servers for the lowest possible latency.
Available endpoints#
| Region | Endpoint URL |
|---|---|
| Frankfurt | http://fra.landing.fast |
| Amsterdam | http://ams.landing.fast |
| New York | http://nyc.landing.fast |
| London | http://lon.landing.fast |
| Tokyo | http://toy.landing.fast |
See Endpoints for the full list.
Add a tip to your transaction#
Every transaction must carry a tip. Attach a System Program transfer to a randomly selected tip account.
import { SystemProgram, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
const TIP_ACCOUNTS = [
"1andAhkXmzRbuD37iuzTLnYKRkBGU7X26zw1wv2FBpT",
"1andoC8jkb9EXEz1RpgQiuGqgm8sEAsASBScS2nip4f",
"1andeJ5dyAENtyMHSHv3ZXDzJEctmqgAFvGbssqoyvH",
"1andf7rAwTZHozYhEm7ieCMvWMczGbHDNbAR5ktsmAq",
"1andxYDwQuoWuDFJ1rdyGCXET5AfEc4H3nYJkaU9Eay"
].map((a) => new PublicKey(a));
// Pick random account
const tipAccount = TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)];
transaction.add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey,
toPubkey: tipAccount,
lamports: 0.001 * LAMPORTS_PER_SOL, // 0.001 - Minimum tip.
})
);
See Tips for the complete list of tip accounts and recommended practices.
Submit your transaction#
Using curl#
curl -sS 'http://fra.landing.fast/' \
-H 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["<BASE64_TX>", {"encoding": "base64", "skipPreflight": true}]
}'
Using JavaScript#
const response = await fetch(
`http://fra.landing.fast`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendTransaction",
params: [base64Transaction, { encoding: "base64", skipPreflight: true }],
}),
}
);
const { result: signature } = await response.json();
console.log("Submitted:", signature);
Using Rust#
use reqwest::Client;
use serde_json::json;
let client = Client::new();
let response = client
.post(format!("http://fra.landing.fast"))
.json(&json!({
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": [base64_tx, {"encoding": "base64", "skipPreflight": true}]
}))
.send()
.await?;
Verify the transaction#
A successful response from Landing.fast means the transaction was forwarded not that it landed on-chain. Always confirm the signature through an RPC node.
const confirmation = await connection.confirmTransaction(signature, "confirmed");
Rate Limits#
| Tier | TPS | How to Get |
|---|---|---|
| Default | 5 | Granted automatically when you create an account |
| Upgraded | Custom | Open a ticket on Discord or Telegram |
Error handling#
| Status | Meaning | Action |
|---|---|---|
200 | Accepted | Transaction was forwarded successfully |
429 | Rate Limited | Slow down and apply a backoff strategy |
500 | Server Error | Retry with exponential backoff |
if (response.status === 429) {
// Exponential backoff with jitter
const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
const jitter = Math.random() * 1000;
await sleep(delay + jitter);
}
Best practices#
- Simulate first. Run
simulateTransactionagainst your primary RPC before submitting. - Stick to one region. Route all traffic from a single instance to the nearest endpoint.
- Monitor landing rates. Use the dashboard to track how many of your transactions land successfully.
- Handle failures gracefully. Apply exponential backoff when retrying.
- Verify signatures. Always confirm transaction finality through an RPC node.