Ethereum JSON-RPC Block Tags: latest, safe, finalized, and pending
Learn how Ethereum JSON-RPC block tags choose state, why latest is not final, and when to use safe, finalized, pending, a number, or a hash.

Two Ethereum apps can ask for the same balance and briefly receive different answers without either one being broken. The missing detail is often the block reference. Ethereum blockchain basics give us an ordered history, but a JSON-RPC query still has to say which point in that history it means.
Block tags are compact labels for that choice. latest, safe, finalized, pending, and earliest trade freshness for confidence in different ways. A fixed block number or hash makes the reference more explicit. Choosing deliberately helps dashboards, indexers, simulations, and payment systems avoid subtle inconsistencies.
What an Ethereum block tag actually selects
Think of chain state as a document with several saved versions. latest opens the newest version your node currently accepts. safe opens an older version that is harder to replace. finalized opens a checkpoint protected by Ethereum's strongest normal consensus guarantee. pending is more like a local draft assembled from unconfirmed work.
The canonical Ethereum Execution API specification defines five named tags:
| Selector | What it asks the node for | Main trade-off |
|---|---|---|
latest | Most recent canonical block observed by that client | Fresh, but can be reorganized |
safe | Most recent block considered safe under honest-majority and network assumptions | Less fresh, stronger confidence |
finalized | Most recent crypto-economically finalized block | Strongest normal settlement confidence, most lag |
pending | A sample next block or pending state built locally on latest | Useful for previews, not a shared chain fact |
earliest | Lowest-numbered block the client has available | Historical anchor, subject to data availability |
These labels are resolved by the RPC node at request time. They are not permanent block identifiers. Today's latest points somewhere different after the next block, and two providers may briefly resolve it differently while their views converge.
How the tags move from pending to finalized
A transaction normally moves through several different kinds of confidence:
- Pending: a node knows about the transaction and may include it in a locally constructed pending state.
- Latest: a proposed block containing the transaction becomes the head that the node currently treats as canonical.
- Safe: consensus information makes replacement unlikely under the assumptions encoded by the API.
- Finalized: proof-of-stake checkpoints provide Ethereum's strongest normal irreversibility guarantee.
That progression is not a timer attached to each transaction. The tags name block states selected by the client. Ethereum's Gasper documentation explains that checkpoints become justified with votes representing two-thirds of staked ether and become finalized through the subsequent checkpoint relationship. Read blockchain finality explained for the consensus model behind those labels.
safe and finalized also should not be treated as synonyms for “successful.” A finalized block can contain a reverted contract call. Finality describes the stability of the block's place in history; a transaction receipt describes whether top-level execution succeeded.
Which RPC methods use a block reference
Many state-reading calls accept a block number or tag. Ethereum.org's current JSON-RPC reference documents this parameter on methods including eth_getBalance, eth_getStorageAt, eth_getTransactionCount, eth_getCode, eth_call, and block queries.
The block choice changes the question:
{ "jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0xYourAddress", "latest"], "id": 1 }asks for the balance at the node's current head, while replacing latest with finalized asks for the balance at the finalized state. Neither answer is universally “the balance” without that context.
This distinction matters for simulations too. An eth_call against pending may account for a node's local pending state, while the same call against finalized intentionally uses older state. A successful simulation does not guarantee later inclusion or execution because balances, nonces, storage, fees, ordering, and contract state can change.
Tag, block number, or block hash?
Use a tag when your requirement is relative: the freshest view, a safer view, or finalized state. Use a block number when you need a particular height and can separately handle canonical-chain changes. Use a block hash when identity matters and “whichever block is currently at height N” is not precise enough.
EIP-1898 standardized block-hash objects for several state methods. A request can identify a block by hash and optionally set requireCanonical: true:
{
"blockHash": "0x<64-hex-character-block-hash>",
"requireCanonical": true
}This is valuable when several reads must describe one coherent state snapshot. First fetch and retain the block identity, then issue supported queries against that hash. If a reorganization removes the block from the canonical chain, requireCanonical lets the caller request an error instead of silently accepting state from a non-canonical block.
For proof-oriented reads, the block header remains part of the trust boundary. The eth_getProof guide explains how account and storage proofs connect to the selected block's state root.
Practical selection patterns
There is no single correct tag for every product. Start from the consequence of being wrong.
User interfaces and low-consequence reads
latest is often appropriate for a responsive dashboard, wallet preview, or nonbinding estimate. Label provisional data honestly and refresh it when the head changes. Do not turn a fast display into a settlement claim.
Payments, withdrawals, and irreversible actions
Prefer a documented confirmation policy based on safe or finalized where the network and provider support those tags. The higher the consequence, the more important it is to separate “observed at the head” from “settled under the application's policy.” This is risk engineering, not a promise that every layer above Ethereum is safe.
Indexers and multi-call snapshots
Pin related reads to one block number or, when supported, an EIP-1898 block hash. Store both number and hash. If the canonical hash at that height changes, roll back derived records and replay from a known point rather than mixing state from multiple heads.
Rollups and other EVM networks
Do not assume every network gives these words identical semantics. A rollup may expose safe and finalized according to its relationship with a settlement layer, while provider and client support can differ. The guide to Ethereum rollup transaction status covers the L2-specific boundary.
Risks and common mistakes
- Treating
latestas final: the canonical head may be reorganized, so a fresh result can disappear. - Treating
pendingas universal: pending state is built from a node's local view and policy. Another provider can have a different mempool. - Mixing block contexts: sequential calls using a moving tag can read different blocks. Pin a snapshot when consistency matters.
- Ignoring method support: the standard defines selectors, but networks, clients, providers, and individual methods can expose different capabilities. Test the exact endpoint and handle explicit errors or
nullresponses. - Confusing finality with application correctness: a finalized malicious approval, failed call, or bad price is still finalized. Block confidence does not audit a contract or validate an economic decision.
- Assuming historical state is retained: a node may know an old block header while no longer serving the state needed for an old balance, code, storage, call, or proof query.
Quick implementation checklist
- Write down whether each read needs freshness, consistency, or settlement confidence.
- Pass the block parameter explicitly instead of relying on a library default.
- Log the returned block number and hash with derived data.
- Pin multi-call reads to one block reference.
- Handle reorgs for
latestand provisional event data. - Feature-test
safe,finalized,pending, and EIP-1898 support on the exact RPC endpoint. - Define fallback behavior; never silently downgrade a settlement check to
latest. - Keep chain ID and network-specific finality semantics in the same policy.
FAQ
Is latest the newest finalized Ethereum block?
No. It is the newest canonical block observed by the client, and the Execution API explicitly notes that it may be reorganized under normal conditions. Use finalized when that is the confidence level your application requires.
Does safe mean a block can never be reorganized?
No absolute guarantee should be inferred. The specification defines it under honest-majority and synchrony assumptions. It is stronger than the head but distinct from finalized state.
Why can two RPC providers return different pending results?
Nodes maintain local transaction pools and may build different candidate pending states. Propagation, filtering, ordering, and node policy can differ before consensus chooses an actual block.
Should an indexer query every field with finalized?
Not necessarily. That sacrifices freshness and may be unnecessary for reversible displays. Many systems ingest recent blocks provisionally, store block hashes, handle reorganizations, and promote records after their chosen confidence threshold.
Is a block number enough for a consistent snapshot?
It is usually better than a moving tag, but a reorganization can replace the canonical block at that height. Store its hash too. Where supported, an EIP-1898 hash selector with requireCanonical makes the intended identity explicit.
Final takeaway
An Ethereum read is incomplete without its block context. Use latest for fresh provisional state, safe or finalized for stronger confidence, pending only when local preview semantics are acceptable, and a fixed number or hash when reproducibility matters. Then record the resolved block identity and design for errors and reorganizations.
This guide is educational, not financial advice. Crypto networks, applications, and assets carry technical and market risk. Verify current specifications, test your provider, use only funds you can afford to lose, and do your own research (DYOR).
Keep learning

Blockchain Finality Explained: When Is a Crypto Transaction Really Settled?
Learn how blockchain finality differs from confirmation, why Bitcoin and Ethereum settle differently, and what to check before moving funds again.

Ethereum Rollup Transaction Status: Unsafe, Safe, and Finalized
Learn what unsafe, safe, and finalized mean for Ethereum rollup transactions, why withdrawals take longer, and which status your app should trust.

Ethereum eth_getProof Guide: Verify Account and Storage State
Learn what eth_getProof returns, how account and storage proofs connect to a block state root, and which trust and availability limits still matter.
Explore related topics

Ethereum Glamsterdam Upgrade: ePBS, BALs, and What Is Actually Planned
Ethereum Glamsterdam is expected in Q4 2026. Learn its frozen scope, Sepolia milestone, ePBS, block-level access lists, and remaining uncertainties.
Crypto Address Poisoning: How to Verify Wallet Addresses Before You Send
Crypto address poisoning plants a lookalike address in your transaction history. Learn how it works and follow a safer verification checklist.