Solana Commitment Levels
Choose processed, confirmed, or finalized commitment for Solana balance reads, swap confirmations, trading bots, dashboards, and settlement flows.
Solana Commitment Levels
Most Solana apps should not use one commitment level everywhere.
Use processed when freshness matters more than rollback safety, confirmed for most user-facing app and bot decisions, and finalized when the workflow values settlement confidence over speed.
This page owns the practical decision: which commitment level should your app ask Carbium RPC for? For the lower-level transaction path, use Transaction Lifecycle. For throughput and 429 behavior, use Solana RPC Rate Limits Explained.
Part of the Carbium Solana infrastructure stack.
The three levels
Solana RPC methods and subscriptions commonly accept a commitment parameter. The parameter tells the node how finalized the state must be before it returns data or sends a notification.
| Commitment | What it means | Use it when |
|---|---|---|
processed | The node has processed the newest available block, but that view can still roll back. | You need the freshest possible signal and can tolerate re-checks. |
confirmed | A supermajority of active stake has voted on the block. | You need a practical default for wallets, bots, app backends, and swap confirmation. |
finalized | The cluster has recognized the block as finalized with maximum lockout. | You need strongest settlement confidence and can accept slower UX. |
If a method accepts commitment and you omit it, many Solana clients and methods default toward finalized. That can be correct for audits, but it is often too slow for live product flows.
Use-case matrix
| Workflow | Recommended default | Why |
|---|---|---|
| Wallet balance display | confirmed | Fresh enough for UX without trusting the newest possible fork. |
| Payment or checkout fulfillment | confirmed, then optionally reconcile at finalized | Do not fulfill on processed; use finalized later for accounting if needed. |
| Swap quote freshness checks | processed or confirmed | Use processed only if the app can re-check before signing or submitting. |
| Swap transaction confirmation | confirmed | Good balance for user feedback and bot loops. |
| Trading bot reads | processed for signals, confirmed for decisions | Treat processed data as provisional. |
| Trading bot send-status checks | confirmed | Avoid declaring failure before the network has had a fair chance to confirm. |
| Portfolio dashboards | confirmed | Reduces stale display without making every refresh wait for finality. |
| Analytics, exports, accounting, and audits | finalized | Slower data is acceptable when correctness matters more than live UX. |
| Historical transaction lookups | finalized | You usually want settled history, not provisional state. |
The short rule: show and decide on confirmed, speculate on processed, reconcile on finalized.
Copy-paste examples
JavaScript connection default
Set a default commitment when you create the connection:
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
`https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`,
"confirmed"
);
const balance = await connection.getBalance(
new PublicKey("YOUR_WALLET_ADDRESS")
);This is a good default for most app backends. It keeps simple reads, status checks, and confirmation loops aligned unless you intentionally override the commitment for one call.
Per-request commitment
Some methods accept commitment inside the request config:
const account = await connection.getAccountInfo(
new PublicKey("ACCOUNT_ADDRESS"),
"confirmed"
);Use per-request commitment when one part of the app needs a different tradeoff than the default connection.
Raw JSON-RPC
curl https://rpc.carbium.io/?apiKey=$CARBIUM_RPC_KEY \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": [
"YOUR_WALLET_ADDRESS",
{ "commitment": "confirmed" }
]
}'For balance reads that drive UI or backend checks, confirmed is usually the right first setting.
Where teams usually get it wrong
Using finalized in every live path
finalized in every live pathThis makes an app feel slower than it needs to. A wallet, swap frontend, or trading backend can often act on confirmed and then reconcile final state later.
Treating processed as settled
processed as settledprocessed is useful when latency matters, but it is not a settlement signal. If your frontend marks a payment complete, unlocks an order, or retries a trade based only on processed, users can see confusing states when the app later disagrees with the chain.
Mixing reads and sends without a policy
If the quote path reads at processed, the signing path submits immediately, and the confirmation path waits for finalized, the app can feel inconsistent. Pick an explicit policy for each stage:
| Stage | Safer default |
|---|---|
| Pre-trade signal | processed or confirmed |
| User-facing confirmation | confirmed |
| Accounting reconciliation | finalized |
Retrying before checking status
Commitment level does not replace send-status logic. After submitting a transaction, check the signature status before deciding whether to retry. Blind retries can create duplicate user confusion even when the original transaction is still moving toward confirmation.
A practical Carbium default
For most production teams building on Carbium:
- Use
confirmedas the default connection commitment. - Use
processedonly for latency-sensitive reads that are re-checked before money or UX state changes. - Use
finalizedfor reconciliation, analytics, payment audits, and support investigations. - Log which commitment level each critical request used.
That last point matters. When support is debugging a balance, swap, or bot incident, knowing whether the app read processed, confirmed, or finalized usually explains the difference between "the chain lied" and "the app asked an intentionally early question."
Commitment is a correctness setting, not a performance trick. Faster is useful only when the app knows how to handle provisional state.
Building a production Solana app on Carbium? Start with
confirmed, then useprocessedandfinalizedonly where the workflow explicitly needs a different tradeoff.
Updated 9 days ago
