Migrating from v1 to v3

Map every deprecated /extended/v1 endpoint to its /extended/v3 replacement.

Overview

Most /extended/v1 endpoints are now deprecated in favor of /extended/v3. The v3 API is a redesign, not a rename: it uses cursor-based pagination, splits large "kitchen sink" responses into focused resources, and nests related fields into objects instead of flattening them into prefixed keys.

Deprecated endpoints still work today. Every response from one carries a Warning header:

Warning: 299 - "Deprecated: See https://docs.hiro.so/stacks/api for more information"

At the sunset date, deprecated endpoints stop executing and return 410 Gone instead. Migrate before then.

What changed in v3

Before mapping endpoints one by one, these are the cross-cutting changes you will hit on almost every route.

Cursor pagination replaces offsets

v1 list endpoints take limit and offset and return { limit, offset, total, results }. v3 list endpoints take limit and cursor, and return { limit, total, cursor: { next, previous, current }, results }. See Pagination for the full walkthrough.

The practical consequence: you cannot jump to an arbitrary page. Walk the list with cursor.next until it is null.

Summaries by default, details on request

v3 list endpoints return a summary of each object (the fields most callers need) rather than the full record. The single-resource endpoints return the full record, and the heavy fields are opt-in via ?include=:

Terminal
$
curl 'https://api.hiro.so/extended/v3/transactions/{tx_id}?include=function_args,post_conditions,result,source_code'

Available include values on GET /extended/v3/transactions/{tx_id}: function_args, source_code, post_conditions, result. They may be repeated (?include=a&include=b) or comma-separated (?include=a,b).

This replaces the v1 exclude_function_args pattern, inverted: v1 sent everything unless you opted out, v3 sends the lean payload unless you opt in.

Nested objects replace prefixed fields

v1 flattened everything into the top level (block_height, burn_block_time, execution_cost_runtime, pending_balance_inbound). v3 groups them (block.height, bitcoin_block.time, execution_cost.runtime, mempool.inbound).

Only canonical data is returned

v1 marked records with a canonical flag. v3 has no such field: it only returns canonical data.

Every timestamp has an ISO twin

v1 returned both burn_block_time and burn_block_time_iso. v3 keeps that pairing in its nested objects: every Unix-seconds time field has a sibling time_iso (ISO 8601, UTC), e.g. block.time / block.time_iso and bitcoin_block.time / bitcoin_block.time_iso. Mempool transactions pair receipt_time with receipt_time_iso.

Hashes without 0x are redirected

Every v3 endpoint that takes a transaction id or block hash in its path answers a hash sent without the 0x prefix with a 302 redirect to the same URL with the prefix, as v1 did. Send the prefix to save the extra round trip.

v3 list endpoints do not support filtering yet

GET /extended/v1/tx accepts type, from_address, to_address, contract_id, function_name, nonce, start_time, end_time, sort_by, and order. GET /extended/v3/transactions accepts only limit and cursor. The same applies to the mempool endpoints (sender_address, recipient_address, address, order_by are not available in v3). If you depend on server-side filtering, keep using the v1 endpoint until a v3 equivalent ships, and filter client-side where you can.

Transactions

Deprecated v1 endpointv3 replacement
GET /extended/v1/txGET /extended/v3/transactions
GET /extended/v1/tx/{tx_id}GET /extended/v3/transactions/{tx_id}
GET /extended/v1/tx/multipleGET /extended/v3/transactions/batch
GET /extended/v1/tx/{tx_id}/rawStacks node RPC GET /v3/transaction/{tx_id}
GET /extended/v1/tx/mempoolGET /extended/v3/mempool/transactions
GET /extended/v1/tx/mempool/statsGET /extended/v3/mempool
GET /extended/v1/tx/block/{block_hash}GET /extended/v3/blocks/{height_or_hash}/transactions
GET /extended/v1/tx/block_height/{height}GET /extended/v3/blocks/{height_or_hash}/transactions
GET /extended/v1/tx/eventsNo direct replacement — see Endpoints without a v3 replacement

The two v1 "transactions in a block" endpoints collapse into one: {height_or_hash} accepts a block height, a block hash, or the literal latest.

GET /extended/v3/transactions/batch differs from /tx/multiple in two ways. It returns mined transactions only, so use GET /extended/v3/transactions/{tx_id} for one that may still be in the mempool. And it returns a results array rather than a map keyed by transaction id, so ids it cannot resolve are absent from the response instead of being reported as found: false.

GET /extended/v3/mempool replaces the mempool statistics endpoint with a differently shaped summary: fields are renamed and regrouped, percentiles are discrete rather than interpolated, and transaction age in blocks is replaced by receipt_block_height.

Transaction field mapping

v1 fieldv3 field
tx_typetype
tx_statusstatus
tx_resultresult (only with ?include=result)
sender_addresssender.address
noncesender.nonce
sponsor_addresssponsor.address (sponsor is null when unsponsored)
sponsor_noncesponsor.nonce (sponsor is null when unsponsored)
sponsoredRemoved — check sponsor !== null
block_hashblock.hash
block_heightblock.height
block_timeblock.time
tx_indexblock.tx_index
parent_block_hashparent_block.hash (single-transaction endpoint only)
burn_block_heightbitcoin_block.height
burn_block_timebitcoin_block.time
block_time_isoblock.time_iso
burn_block_time_isobitcoin_block.time_iso
event_countevent_count (in summaries as well as the single-transaction endpoint)
execution_cost_*execution_cost.* — e.g. execution_cost_runtime becomes execution_cost.runtime
contract_call.function_argsSame path, only with ?include=function_args
smart_contract.source_codeSame path, only with ?include=source_code
post_conditionsSame field, only with ?include=post_conditions
post_condition_modeRemoved
anchor_modeRemoved
canonicalRemoved — v3 only returns canonical data
—block.index_hash (new)
—vm_error (new)

status gained a problematic_skipped value in Epoch 4.0 alongside success, abort_by_response, and abort_by_post_condition.

Mempool transactions use receipt_time and receipt_block_height in place of block fields, and their status is one of pending or the dropped_* values.

Accounts and principals

The v1 "address" resource is the v3 "principal" resource.

Deprecated v1 endpointv3 replacement
GET /extended/v1/address/{principal}/stxGET /extended/v3/principals/{principal}/balances/stx
GET /extended/v1/address/{principal}/balancesSplit across /balances/stx, /balances/ft, and /balances/nft
GET /extended/v1/address/{principal}/transactionsGET /extended/v3/principals/{principal}/transactions
GET /extended/v1/address/{principal}/transactions_with_transfersGET /extended/v3/principals/{principal}/transactions
GET /extended/v1/address/{principal}/{tx_id}/with_transfersGET /extended/v3/principals/{principal}/transactions/{tx_id}/balance-changes
GET /extended/v1/address/{principal}/mempoolGET /extended/v3/principals/{principal}/mempool/transactions
GET /extended/v1/address/{principal}/noncesGET /extended/v3/principals/{principal}/nonces
GET /extended/v1/address/{principal}/assetsNo direct replacement — closest is GET /extended/v3/principals/{principal}/balance-changes
GET /extended/v1/address/{principal}/stx_inboundGET /extended/v3/principals/{principal}/transfers/stx/inbound
GET /extended/v1/tokens/nft/holdings?principal=GET /extended/v3/principals/{principal}/balances/nft

v3 also adds two transfer feeds with no v1 counterpart:

  • GET /extended/v3/principals/{principal}/transfers/stx/outbound — the debit side of stx_inbound.
  • GET /extended/v3/principals/{principal}/transfers/ft/{asset_identifier} — a principal's history for one fungible token, credits and debits interleaved in a single feed, newest first, in the token's own base units.

All three transfer endpoints return one result per event rather than per transaction, so a transaction that moves the asset several times for this principal yields several rows. Mints have a null sender and burns a null recipient.

GET /extended/v3/principals/{principal}/balances/nft accepts an optional asset_identifier query parameter, which replaces the v1 asset_identifiers array filter. It takes a single asset class, not a list.

STX balance field mapping

GET /extended/v1/address/{principal}/stx → GET /extended/v3/principals/{principal}/balances/stx

v1 fieldv3 field
balancebalance
—available (new — balance minus locked STX)
lockedlocked.amount (locked is null when nothing is locked)
lock_tx_idlocked.lock_tx_id
lock_heightlocked.stacks_lock_height
burnchain_lock_heightlocked.burn_lock_height
burnchain_unlock_heightlocked.burn_unlock_height
—locked.pox_version (new)
estimated_balancemempool.estimated_balance (mempool is null when nothing is pending)
pending_balance_inboundmempool.inbound
pending_balance_outboundmempool.outbound
total_sentRemoved
total_receivedRemoved
total_fees_sentRemoved
total_miner_rewards_receivedMoved to GET /extended/v3/principals/{principal}/mining → rewards.total
token_offering_lockedRemoved
changed meaning

In v1, estimated_balance was the total balance plus the pending mempool delta. In v3, mempool.estimated_balance is the available (spendable) balance plus the pending delta, so locked STX is excluded. If you were subtracting locked yourself, stop.

v1 accepted until_block on the balance endpoints. v3 always reports the current chain tip.

Miner rewards

v1 only exposed a principal's miner rewards as the total_miner_rewards_received counter on the STX balance. v3 gives them their own resource:

  • GET /extended/v3/principals/{principal}/mining — lifetime matured miner reward totals, { rewards: { count, coinbase, fees, total } }, in µSTX.
  • GET /extended/v3/principals/{principal}/mining/rewards — the individual matured rewards, cursor-paginated, newest first. Each reports the block it matured (and was credited) in and the source_block whose reward matured.

Miner rewards are credited to the recipient's balance without a transaction or STX event, so they never appear in the principal's transactions or transfer feeds. Only canonical rewards are counted, and zero-value rewards are left out.

FT and NFT balances

GET /extended/v1/address/{principal}/balances returned FT and NFT balances as objects keyed by asset identifier, with the NFT entry being a count. v3 returns cursor-paginated arrays instead:

  • GET /extended/v3/principals/{principal}/balances/ft — { asset_identifier, balance } per token, sorted by balance descending.
  • GET /extended/v3/principals/{principal}/balances/ft/{asset_identifier} — a single token's balance; returns zero rather than 404 when the principal does not hold it.
  • GET /extended/v3/principals/{principal}/balances/nft — one entry per owned NFT instance, { asset_identifier, value: { hex, repr } }, not a per-collection count.

The v1 total_sent / total_received counters on each token are not carried over.

Nonce field mapping

GET /extended/v1/address/{principal}/nonces → GET /extended/v3/principals/{principal}/nonces

v1 fieldv3 field
possible_next_noncenext_nonce
last_executed_tx_noncelast_confirmed_nonce
last_mempool_tx_noncemempool.last_nonce
detected_mempool_noncesmempool.pending_nonces
detected_missing_noncesmempool.missing_nonces

The v1 endpoint accepted block_height and block_hash to read the nonce at a past block. v3 only reports current nonce state.

Account transactions and transfers

v1 had three overlapping endpoints. v3 has two, with a cleaner split between "which transactions touched this principal" and "what changed for this principal".

GET /extended/v3/principals/{principal}/transactions returns, per transaction:

  • transaction — the transaction summary (same shape as GET /extended/v3/transactions).
  • involvement — sender, sponsor, or affected.
  • balance_changes.stx — { sent, received, net } in micro-STX, fee included in sent.
  • affected_balances — { stx, ft, nft } booleans telling you whether it is worth fetching the detailed balance changes.

For the FT and NFT detail that v1 packed into stx_transfers / ft_transfers / nft_transfers, call GET /extended/v3/principals/{principal}/transactions/{tx_id}/balance-changes, or fetch several transactions at once with GET /extended/v3/principals/{principal}/balance-changes?tx_id=A,B,C for several IDs in one call.

Each balance change is { asset: { type, identifier? }, balance_change: { sent, received, net } }, where type is stx, ft, or nft.

Blocks

Deprecated v1 endpointv3 replacement
GET /extended/v1/blockGET /extended/v3/blocks
GET /extended/v1/block/{hash}GET /extended/v3/blocks/{height_or_hash}
GET /extended/v1/block/by_height/{height}GET /extended/v3/blocks/{height_or_hash}
GET /extended/v1/block/by_burn_block_height/{burn_block_height}GET /extended/v3/bitcoin-blocks/{height_or_hash}/blocks
GET /extended/v1/block/by_burn_block_hash/{burn_block_hash}GET /extended/v3/bitcoin-blocks/{height_or_hash}/blocks

{height_or_hash} on GET /extended/v3/blocks/{height_or_hash} accepts a block height, a block hash, an index block hash, or the literal latest. The two v1 "by burn block" endpoints returned a single Stacks block; their v3 replacement returns every canonical Stacks block anchored to that Bitcoin block, as a cursor-paginated list, newest first. Since Nakamoto there are usually many.

If you already migrated to the v2 block routes (GET /extended/v2/blocks, GET /extended/v2/blocks/{height_or_hash}, GET /extended/v2/burn-blocks*), those are deprecated too and move to the same v3 endpoints — see Also deprecated: v2 endpoints.

Block field mapping

GET /extended/v3/blocks returns block summaries; GET /extended/v3/blocks/{height_or_hash} adds the fields marked "detail only".

v1 / v2 fieldv3 field
heightheight
hashhash
index_block_hashindex_hash
block_timetime
block_time_isotime_iso
tenure_heighttenure_height (null for a Nakamoto block indexed before tenure heights were recorded)
[object Object], (v2) / ,[object Object], (v1)tx_count — fetch the transactions from GET /extended/v3/blocks/{height_or_hash}/transactions
burn_block_hashbitcoin_block.hash
burn_block_heightbitcoin_block.height
burn_block_timebitcoin_block.time (detail only)
burn_block_time_isobitcoin_block.time_iso (detail only)
parent_block_hashparent_block.hash (detail only)
parent_index_block_hashparent_block.index_hash (detail only)
execution_cost_*execution_cost.* (detail only)
miner_txidRemoved
canonicalRemoved — v3 only returns canonical blocks
[object Object],, ,[object Object],, ,[object Object]Removed — microblocks no longer exist
—size (new, detail only: total transaction bytes; null for blocks indexed before sizes were recorded)

Bitcoin blocks

v3 renames "burn blocks" to Bitcoin blocks:

Deprecated v2 endpointv3 replacement
GET /extended/v2/burn-blocksGET /extended/v3/bitcoin-blocks
GET /extended/v2/burn-blocks/{height_or_hash}GET /extended/v3/bitcoin-blocks/{height_or_hash}
GET /extended/v2/burn-blocks/{height_or_hash}/blocksGET /extended/v3/bitcoin-blocks/{height_or_hash}/blocks
v2 fieldv3 field
burn_block_heightheight
burn_block_hashhash (null for a future block)
burn_block_timetime
burn_block_time_isotime_iso
stacks_blocksstacks_block_count — list them with GET /extended/v3/bitcoin-blocks/{height_or_hash}/blocks
total_tx_counttx_count
avg_block_timeRemoved — use GET /extended/v2/blocks/average-times
—projected_time, projected_time_iso (new)

The API learns a Bitcoin block's time from the Stacks blocks anchored to it. For a past Bitcoin block no Stacks block anchored to (a missed sortition, for example), time is interpolated between its neighbors. For the newest Bitcoin blocks no Stacks block has anchored to yet, time is null and projected_time carries an estimate instead. GET /extended/v3/bitcoin-blocks/{height} also accepts a height above the Bitcoin tip and returns that future block with a null hash and its projected time, rather than 404.

Smart contracts

Deprecated v1 endpointReplacement
GET /extended/v1/contract/{contract_id}GET /extended/v3/smart-contracts/{contract_id}
GET /extended/v1/contract/{contract_id}/eventsGET /extended/v2/smart-contracts/{contract_id}/logs
GET /extended/v1/contract/by_traitNone — see Endpoints without a v3 replacement

Contract field mapping

GET /extended/v1/contract/{contract_id} → GET /extended/v3/smart-contracts/{contract_id}

v1 fieldv3 field
contract_idcontract_id
clarity_versionclarity_version
tx_idtx_id
block_heightblock.height
source_codesource_code, only with ?include=source_code
abiRemoved — use the Stacks node RPC GET /v2/contracts/interface/{address}/{name}
canonicalRemoved — v3 returns canonical data only
—block.hash, block.index_hash, block.time, block.tx_index (new)
—bitcoin_block (new: height, time)
Failed deployments are no longer returned

v1 wrote a row for every contract-deploy transaction, successful or not, and returned it with abi: null and no indication that the deploy had aborted. v3 returns only contracts that were successfully deployed; a contract id whose deploy transaction failed responds 404.

Stacking rewards

The burnchain reward endpoints report the Bitcoin reward addresses and BTC payouts of the pox-1 through pox-4 reward model. That model is keyed on the pox-addr a stacker supplies when stacking, and pox-5 has no such address: stakers lock BTC or sBTC against a bond, and rewards accrue as sBTC on the Stacks layer rather than as BTC sent to a burnchain address.

These endpoints therefore serve historical pox-4-and-earlier data only. No new records are written to them once the last pox-4 lock unlocks.

Deprecated v1 endpointReplacement
GET /extended/v1/burnchain/reward_slot_holdersNone — reward slots do not exist in pox-5. The nearest concept is the cycle signer set, GET /extended/v3/staking/cycles/{cycle_number}/signers
GET /extended/v1/burnchain/reward_slot_holders/{address}None
GET /extended/v1/burnchain/rewardsNo global feed. Per-bond payouts: GET /extended/v3/staking/bonds → balances.paid_out.btc
GET /extended/v1/burnchain/rewards/{address}GET /extended/v3/principals/{principal}/staking/bonds → rewards.btc
GET /extended/v1/burnchain/rewards/{address}/totalGET /extended/v3/principals/{principal}/staking → bonds.rewards.btc and stx.rewards.btc
These are not drop-in replacements

Three things change at once. The lookup key flips from a Bitcoin address to a Stacks principal — the v1 endpoints accept either and convert a STX address to its Bitcoin equivalent, and pox-5 has no such relationship to convert through. The asset flips from BTC on Bitcoin to sBTC on Stacks (both denominated in sats, so amounts look interchangeable when they are not). And the granularity flips from per-burn-block payout events to running accrued / claimed / claimable totals per position — v3 has no per-block reward history.

For per-burn-block BTC payouts under the current model, see GET /extended/v2/burn-blocks/{height_or_hash}/pox-transactions and GET /extended/v2/addresses/{burnchain_address}/pox-transactions, which are not deprecated.

Stacking events

The pox4 event endpoints read the pox-2 through pox-4 event tables and have no pox-5 event history counterpart. They serve historical data only.

Deprecated v1 endpointReplacement
GET /extended/v1/pox4/eventsNone — there is no global pox-5 event feed
GET /extended/v1/pox4/tx/{tx_id}None — v3 transaction events do not carry decoded pox operations
GET /extended/v1/pox4/stacker/{principal}GET /extended/v3/principals/{principal}/staking for the current pox-5 position (no event history)
GET /extended/v1/pox4/{pool_principal}/delegationsGET /extended/v3/staking/signers/{principal}/stakers

The same deprecation applies under the pox2 and pox3 prefixes.

Deprecated v1 endpointv3 replacement
GET /extended/v1/search/{id}GET /extended/v3/search

v1 took a complete hash or ID in the path and returned the first match. v3 takes the search term in the q query parameter, accepts partial terms as well as complete ones, matches block heights and token assets in addition to blocks, transactions, contracts, and accounts, and returns up to 20 ranked matches.

Faucets

Deprecated v1 endpointv3 replacement
POST /extended/v1/faucets/stxPOST /extended/v3/faucets/stx
POST /extended/v1/faucets/btcPOST /extended/v3/faucets/btc
POST /extended/v1/faucets/sbtcPOST /extended/v3/faucets/sbtc

The v3 faucets take the recipient as an address field in a JSON body rather than the query string, send a single fixed amount configured by the API operator (no size or stacking options), and return a transaction object plus the amount sent instead of the transaction id and raw transaction hex. They remain testnet-only.

Fees

Deprecated v1 endpointReplacement
POST /extended/v1/fee_rateStacks node RPC POST /v2/fees/transaction

STX supply

All four v1 supply endpoints — including the JSON one — are deprecated in favor of a single v3 endpoint.

Deprecated v1 endpointReplacement
GET /extended/v1/stx_supplyGET /extended/v3/tokens/stx/supply
GET /extended/v1/stx_supply/total/plainGET /extended/v3/tokens/stx/supply → total
GET /extended/v1/stx_supply/circulating/plainGET /extended/v3/tokens/stx/supply → total
GET /extended/v1/stx_supply/legacy_formatGET /extended/v3/tokens/stx/supply

Supply field mapping

v1 fieldv3 field
total_stxtotal
total_stx_year_2050projected_total_2050
unlocked_stxRemoved
unlocked_percentRemoved
block_heightRemoved
Units and definition both changed

v1 returned decimal STX strings ("1470469916.700000"). v3 returns string-quoted integer micro-STX ("1470469916700000"). Multiply by 10^6 when comparing against stored v1 values.

The quantity itself is also defined differently. v1 total_stx was the circulating supply at a given block height, with unlocked_stx tracking the unlocked portion separately. v3 total is the total liquid supply at the current chain tip: all STX minted (vesting unlocks included) plus matured miner coinbase rewards, minus burned STX. There is no separate locked/unlocked split, and v3 always reports the chain tip — the v1 height query parameter is gone.

Fungible tokens

Deprecated v1 endpointv3 replacement
GET /extended/v1/tokens/ft/{token}/holdersGET /extended/v3/tokens/ft/{asset_identifier}/holders
GET /extended/v1/tokens/ft/stx/holdersGET /extended/v3/tokens/stx/holders

v1 took the literal string stx in the token path parameter to mean STX holders. v3 splits that into its own route, matching how /tokens/stx/supply is already separated, and validates {asset_identifier} as a real Clarity asset identifier.

Holder field mapping

v1 fieldv3 field
addressprincipal
balancebalance
total_supplyMoved to GET /extended/v3/tokens/ft/{asset_identifier}/supply → total

The v1 response fused total_supply into the paginated envelope as an extra top-level field. In v3 the holders response is the standard cursor envelope and nothing else, and supply is its own endpoint — { asset_identifier, total } for fungible tokens, or the existing /tokens/stx/supply for STX.

Zero balances are no longer holders

ft_balances rows are never deleted, so a principal that has spent its entire position stays in the table with a 0 balance. v1 listed those rows and counted them in total; v3 filters them out, matching GET /extended/v3/principals/{principal}/balances/ft. Expect a smaller total than v1 reported for the same token.

Sort order also changed: v1 ordered by balance DESC with no tiebreaker, so holders with equal balances came back in an arbitrary order and offset paging could skip or repeat them. v3 orders by (balance DESC, principal ASC), which is what makes the cursor stable.

Balances are in the token's own base units. This API does not know a token's decimal precision — fetch that from the Token Metadata API.

For /tokens/stx/holders, the balance is the total µSTX held, including STX locked for stacking. It is not the spendable figure that GET /extended/v3/principals/{principal}/balances/stx reports as available.

Non-fungible tokens

Deprecated v1 endpointv3 replacement
GET /extended/v1/tokens/nft/historyGET /extended/v3/tokens/nft/{asset_identifier}/{value}/history

asset_identifier moved from a query parameter into the path, matching the fungible token routes. The token instance moved into the path too, and is accepted in two forms:

  • A plain integer — a SIP-009 token id, e.g. .../the-explorer-guild/2051/history. This is the form to use for almost every collection.
  • A 0x-prefixed serialized Clarity value — required for assets not keyed by a uint. BNS names are the notable case: bns.clar defines them as { name: (buff 48), namespace: (buff 20) }, a tuple, so they have no integer id.
The prefix is required for the hex form

v1 accepted value with or without it. In a path segment a bare hex string is ambiguous with a decimal token id — and a serialized uint happens to be all decimal digits — so hex stripped of its prefix is read as a (very large) token id and resolves to an empty page rather than erroring. Always send the prefix.

To tell which form a collection needs, look at value.repr from GET /extended/v3/principals/{principal}/balances/nft: a repr like u2051 means the integer form works.

Field mapping

v1 fieldv3 field
asset_event_typeRemoved — a mint has a null sender, a burn a null recipient
sendersender (null on mints)
recipientrecipient (null on burns)
event_indextransaction.event_index
tx_idtransaction.tx_id
valuevalue (mints only — for history it is the request parameter)
txRemoved — the tx_metadata parameter is gone
—block (new: height, hash, index_hash, time, tx_index)
has no v3 equivalent

v1 could inline a full transaction object into each row via tx_metadata=true. v3 returns the transaction id and event index only; fetch the transaction separately from GET /extended/v3/transactions/{tx_id} when you need its detail.

Network block times

Deprecated v1 endpointReplacement
GET /extended/v1/info/network_block_timesNone
GET /extended/v1/info/network_block_time/{network}None

These return hardcoded legacy values (600s mainnet, 120s testnet) that no longer reflect actual Stacks block production since the Nakamoto upgrade. For real block timing, use GET /extended/v2/blocks/average-times, which is not deprecated.

BNS

All BNS endpoints are deprecated. They are no longer maintained.

Deprecated endpointReplacement
GET /v1/namesNone
GET /v1/names/{name}None
GET /v1/names/{name}/subdomainsNone
GET /v1/names/{name}/zonefileNone
GET /v1/names/{name}/zonefile/{zoneFileHash}None
GET /v1/namespacesNone
GET /v1/namespaces/{tld}/namesNone
GET /v2/prices/names/{name}None
GET /v2/prices/namespaces/{tld}None
GET /v1/addresses/{blockchain}/{address}GET /extended/v3/principals/{principal}/balances/nft?asset_identifier=SP000000000000000000002Q6VF78.bns::names
Names-owned lookups are not equivalent

Querying NFT balances filtered to the BNS asset class returns only NFT-backed names. It does not include subdomains, nor names imported from Blockstack v1, both of which GET /v1/addresses/{blockchain}/{address} did return.

Endpoints without a v3 replacement

These are deprecated with no successor. Plan around them rather than swapping a URL.

Deprecated endpointNotes
GET /extended/v1/tx/eventsGlobal event feed filtered by principal, transaction, or event type. Several v3 endpoints cover parts of it: per-transaction events at GET /extended/v3/transactions/{tx_id}/events, a principal's history for one fungible token at GET /extended/v3/principals/{principal}/transfers/ft/{asset_identifier}, a principal's STX transfers at GET /extended/v3/principals/{principal}/transfers/stx/{inbound,outbound}, and per-principal asset movement at GET /extended/v3/principals/{principal}/balance-changes. There is no single global event feed.
GET /extended/v1/address/{principal}/assetsClosest equivalent is GET /extended/v3/principals/{principal}/balance-changes, which reports net balance deltas rather than raw asset events.
GET /extended/v1/contract/by_traitSearches deployed contracts by Clarity trait ABI. No v3 equivalent. To look up a specific contract you already know, use GET /extended/v3/smart-contracts/{contract_id}.
GET /extended/v1/tokens/nft/mintsMint events for an asset class. Retired rather than migrated — the endpoint serves negligible traffic. A single instance's mint is the oldest entry in GET /extended/v3/tokens/nft/{asset_identifier}/{value}/history, but there is no collection-wide mint feed.
GET /extended/v1/faucets/btc/{address}Testnet-only BTC balance helper. No replacement.
GET /extended/v1/pox4/eventsHistorical pox-4-and-earlier event feed. No pox-5 equivalent.
GET /extended/v1/pox4/tx/{tx_id}Historical pox-4-and-earlier events for one transaction. v3 transaction events do not decode pox operations.

Also deprecated: v2 endpoints

A handful of /extended/v2 routes are deprecated alongside v1 and move to v3. If you already migrated from v1 to v2, these are your next hop.

Deprecated v2 endpointv3 replacement
GET /extended/v2/addresses/{address}/transactionsGET /extended/v3/principals/{principal}/transactions
GET /extended/v2/addresses/{address}/transactions/{tx_id}/eventsGET /extended/v3/principals/{principal}/transactions/{tx_id}/balance-changes
GET /extended/v2/addresses/{principal}/balances/stxGET /extended/v3/principals/{principal}/balances/stx
GET /extended/v2/addresses/{principal}/balances/ftGET /extended/v3/principals/{principal}/balances/ft
GET /extended/v2/addresses/{principal}/balances/ft/{token}GET /extended/v3/principals/{principal}/balances/ft/{asset_identifier}
GET /extended/v2/blocksGET /extended/v3/blocks
GET /extended/v2/blocks/{height_or_hash}GET /extended/v3/blocks/{height_or_hash}
GET /extended/v2/blocks/{height_or_hash}/transactionsGET /extended/v3/blocks/{height_or_hash}/transactions
GET /extended/v2/burn-blocksGET /extended/v3/bitcoin-blocks
GET /extended/v2/burn-blocks/{height_or_hash}GET /extended/v3/bitcoin-blocks/{height_or_hash}
GET /extended/v2/burn-blocks/{height_or_hash}/blocksGET /extended/v3/bitcoin-blocks/{height_or_hash}/blocks

See Blocks for the block and Bitcoin block field mappings.

The v2 block routes outlive the sunset

The six v2 block and burn block routes above carry the deprecation Warning header but are exempt from the sunset: they keep serving after the other deprecated endpoints start returning 410 Gone. Migrate them anyway, since new block fields only land in v3.

Endpoints that are not deprecated

Every /extended/v1 route is now deprecated except the API status endpoint, GET /extended.

These /extended/v2 routes are not deprecated and have no v3 successor yet: GET /extended/v2/blocks/average-times, GET /extended/v2/blocks/by-block-time/{timestamp}, GET /extended/v2/blocks/{height_or_hash}/signer-signatures, GET /extended/v2/block-tenures/{tenure_height}/blocks, GET /extended/v2/pox/cycles*, GET /extended/v2/mempool/fees, GET /extended/v2/smart-contracts/*, and the two pox-transactions routes noted under Stacking rewards.

Need help migrating?

Reach out on the #api channel on Discord under the Hiro Developer Tools section.

How is this guide?