Summary
Solana staking integration is not a single API call. You combine RPC access for reading stake accounts and submitting transactions, a staking program interface (native staking or a liquid staking protocol), and a wallet or signer layer. The RPC endpoint is the foundation, because every stake, delegate, deactivate, and withdraw action is a Solana transaction that must be built, simulated, and confirmed through an RPC node.
This article maps the API surface you actually need, shows how to read and build staking transactions over JSON-RPC, and explains how to choose an RPC provider that keeps staking flows responsive as your user base grows. OnFinality offers Solana RPC and dedicated node infrastructure you can point your staking integration at.
Solana staking looks simple from a wallet UI: pick a validator, enter an amount, confirm. Under the hood it is a sequence of on-chain transactions against the Solana stake program, and every one of those transactions has to be built, simulated, signed, and confirmed through an RPC node. So the honest answer to "which API integrates Solana staking" is that there is no single staking API. There is a stack of APIs, and the RPC layer is the one you cannot skip.
This page breaks that stack into its parts, shows the JSON-RPC methods you will call most, and gives you a way to decide which provider to build on.
Which layer do you actually need?
Before you pick a provider, decide what kind of staking integration you are building. The API surface changes a lot depending on the answer.
- Native staking (your own UI): You build and submit stake program instructions yourself. You need full RPC access plus a signer. This gives you the most control and the most responsibility.
- Liquid staking protocol integration: You call a protocol's program or SDK, which mints a receipt token. You still need RPC to read state and submit transactions, but the staking logic lives in the protocol.
- Custodial or managed staking: A provider handles keys and delegation. You integrate their API, but you should still understand the RPC layer for monitoring and reconciliation.
If you are building native staking, your RPC provider is effectively part of your product. If you are integrating a liquid staking protocol, your RPC provider is your reliability layer. Either way, the next section is the same.
The RPC methods behind every staking action
Solana's JSON-RPC API is how you read stake state and push transactions. The methods below cover the core staking workflow.
| Task | JSON-RPC method | Notes |
|---|---|---|
| Read a stake account | getAccountInfo | Decode the stake account state (delegated, activating, active, deactivating) |
| List a wallet's stake accounts | getProgramAccounts | Filter by the stake program and owner; can be heavy, so scope filters tightly |
| Get recent blockhash | getLatestBlockhash | Required for every transaction you build |
| Simulate before sending | simulateTransaction | Catch instruction errors before you spend fees |
| Submit a transaction | sendTransaction | Returns a signature you then confirm |
| Confirm a transaction | getSignatureStatuses or getTransaction | Poll until confirmed at your chosen commitment |
| Check epoch and timing | getEpochInfo | Stake activation and deactivation are epoch-bound |
| Read validator info | getVoteAccounts | Discover validators and their current stake |
A typical read path looks like this:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getEpochInfo",
"params": []
}'
And a transaction submission looks like this:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["<base64-signed-transaction>", {"encoding": "base64", "skipPreflight": false}]
}'
In JavaScript, you would typically use @solana/web3.js and let the library handle encoding:
import { Connection, PublicKey, Transaction } from "@solana/web3.js";
const connection = new Connection("https://solana.api.onfinality.io/public", "confirmed");
// Read the current epoch before building a stake or deactivate instruction
const epoch = await connection.getEpochInfo();
console.log("Current epoch:", epoch.epoch);
// Simulate before sending to surface instruction errors early
const sim = await connection.simulateTransaction(transaction);
if (sim.value.err) {
throw new Error("Simulation failed: " + JSON.stringify(sim.value.err));
}
const signature = await connection.sendTransaction(transaction, [signer]);
await connection.confirmTransaction(signature, "confirmed");
Notice that none of this is staking-specific. Staking is just a set of instructions you assemble and send through these generic methods. That is why the quality of your RPC endpoint matters more than any single "staking API."
Staking program interfaces you will build against
Once you can read and write through RPC, you need the actual staking instructions. There are two main paths.
Native stake program. Solana's built-in stake program exposes instructions for creating a stake account, delegating to a validator, deactivating, and withdrawing. You construct these instructions in your client and submit them like any other transaction. This is the most direct integration and gives you full control over UX, fees, and account management.
Liquid staking protocols. These wrap native staking behind their own program and SDK. You call their instructions, and in return your users receive a transferable receipt token. The tradeoff is that you inherit the protocol's smart contract risk and its fee model, but you avoid managing stake accounts yourself.
For most teams, the decision is: build native staking if staking is your product, and integrate a liquid staking protocol if staking is a feature inside a larger product.
Choosing an RPC provider for staking workloads
Staking flows have a specific traffic shape. Reads are frequent and bursty (dashboards, epoch transitions), and writes are latency-sensitive because a stale blockhash means a failed transaction. Public endpoints are fine for prototyping but tend to degrade under this pattern.
Here is how to compare options for a staking integration:
| What to evaluate | Why it matters for staking |
|---|---|
| Throughput under bursty reads | Epoch boundaries and dashboard refreshes create spikes |
| Write latency and blockhash freshness | Stale blockhashes cause dropped transactions |
| WebSocket support | Lets you subscribe to account and slot changes instead of polling |
| Dedicated vs shared capacity | Shared nodes can be noisy neighbors during peak load |
| Environment coverage | You need devnet for testing and mainnet for production |
| Monitoring and alerting | You need to know when confirmation times drift |
OnFinality provides Solana RPC over HTTP and WebSocket, plus dedicated node options when you need isolated capacity. You can review RPC pricing and the supported RPC networks to see what fits your workload, and start on Solana Devnet before moving to mainnet.
A practical integration sequence
A staking integration usually follows this order. Build it in this sequence and you will catch most problems early.
- Connect and read. Point at an RPC endpoint and confirm you can call
getEpochInfoandgetAccountInfo. - Discover stake accounts. Use
getProgramAccountswith tight filters to list a wallet's stake accounts. - Build a transaction. Assemble the stake instruction, fetch a fresh blockhash, and sign.
- Simulate. Always simulate before sending. It is the cheapest way to catch bad instructions.
- Send and confirm. Submit, then poll
getSignatureStatusesuntil confirmed. - Handle epoch timing. Remember that activation and deactivation take effect across epochs, so your UI should reflect pending states.
- Add monitoring. Track confirmation latency and error rates so you notice degradation before users do.
Common failure modes and how to debug them
Staking integrations fail in predictable ways. Here is a quick reference.
| Symptom | Likely cause | First thing to check |
|---|---|---|
| Transaction never confirms | Stale blockhash | Re-fetch getLatestBlockhash and resend |
| Simulation error on delegate | Wrong stake account state | Read the account with getAccountInfo |
getProgramAccounts times out | Filters too broad | Add owner and dataSize filters |
| Stake shows as pending for a long time | Epoch boundary not reached | Check getEpochInfo and surface pending state in UI |
| Intermittent 429 responses | Shared endpoint rate limits | Move to dedicated capacity or back off with retries |
A useful debugging habit is to log the blockhash, the simulation result, and the signature for every transaction. When something fails in production, that log is usually enough to identify whether the problem is your instruction, your timing, or your endpoint.
Key Takeaways
- There is no single "Solana staking API." Staking is built from generic RPC methods plus stake program instructions.
- The RPC layer is non-negotiable: you need it to read stake state, fetch blockhashes, simulate, send, and confirm.
- Native staking gives you control; liquid staking protocols give you speed of integration at the cost of added protocol risk.
- Staking traffic is bursty and latency-sensitive, so provider choice matters more than for read-only apps.
- Simulate before sending, handle epoch timing in your UI, and monitor confirmation latency.
- OnFinality offers Solana RPC over HTTP and WebSocket plus dedicated node options; see RPC pricing and supported RPC networks.
Frequently Asked Questions
Do I need a special API for Solana staking? No. You use the standard Solana JSON-RPC API to read state and submit transactions, and you build staking instructions against the stake program or a liquid staking protocol.
Can I integrate staking with just a public RPC endpoint? For prototyping, yes. For production, public endpoints often struggle with bursty read traffic and latency-sensitive writes, so a managed or dedicated endpoint is usually the better fit.
What is the most common cause of failed staking transactions? A stale blockhash. Always fetch a fresh blockhash immediately before signing and sending.
How do I test staking without risking real SOL? Use devnet. OnFinality provides a Solana Devnet endpoint you can develop against before moving to mainnet.
Does staking need WebSocket support? It is not strictly required, but WebSocket subscriptions let you react to account and slot changes instead of polling, which improves responsiveness for staking dashboards.
Where can I see which Solana endpoints OnFinality supports? See the Solana network page for endpoint details and transport support.