Skip to content
Alchemy Logo

Migrating UTXO data to Alchemy

Side-by-side migration guide for QuickNode, BlockCypher, and Blockdaemon

This guide provides a straightforward path for migrating your UTXO API calls to Alchemy from QuickNode, BlockCypher, or Blockdaemon. Whether you're already on Alchemy for other chains or evaluating providers, we'll walk you through every step.

Please reach out to data-services-product@alchemy.com with any questions.

Our UTXO APIs are available on the following networks:

  • BTC Bitcoin (mainnet and testnet4)
  • BCH Bitcoin Cash (mainnet and testnet)
  • LTC Litecoin (mainnet and testnet)
  • DOGE Dogecoin (mainnet)

Our UTXO API endpoints are a drop-in replacement for QuickNode's Blockbook add-on, BlockCypher's Address API, and Blockdaemon's custom Bitcoin RPC methods.

  • Full Blockbook parity. Balance history, address info, block data, transaction lookups, and UTXOs.
  • REST API. Clean, simple GET requests with no JSON-RPC boilerplate.
  • Multi-chain support. Bitcoin, Bitcoin Cash, Litecoin, and Dogecoin from a single provider.

UTXO API reference: Bitcoin, Bitcoin Cash, Litecoin, Dogecoin.

Purchase the UTXO add-on for your desired chain from the Alchemy dashboard.

Key difference

Alchemy's standard chain endpoints use JSON-RPC, while the UTXO API endpoints are REST. QuickNode wraps its UTXO functionality (Blockbook) in JSON-RPC. This is the primary architectural difference between the two.

Below is a side-by-side comparison of the same API call, with the same address and same time range, showing how the request and response differ between Alchemy and QuickNode.

Example address: bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0

QuickNode request (old)

curl -X POST "https://docs-demo.btc.quiknode.pro/" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "method": "bb_getBalanceHistory",
  "params": [
    "bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0",
    {
      "from": "1683684000",
      "to": "1700042400"
    }
  ],
  "id": 1
}'

QuickNode response

{
  "id": 1,
  "jsonrpc": "2.0",
  "result": [
    {
      "time": 1685689200,
      "txs": 5,
      "received": "0",
      "sent": "10247601921605917",
      "sentToSelf": "0",
      "rates": {
        "usd": 1907.2123
      }
    },
    {
      "time": 1694084400,
      "txs": 4,
      "received": "0",
      "sent": "8064344277547668",
      "sentToSelf": "0",
      "rates": {
        "usd": 1646.305
      }
    }
  ]
}

Source: QuickNode bb_getBalanceHistory.

Alchemy request (new)

curl --request GET \
  --url 'https://bitcoin-mainnet.g.alchemy.com/v2/{apiKey}/api/v2/balancehistory/bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0?from=1683684000&to=1700042400'

Alchemy response

[
  {
    "time": 1685689200,
    "txs": 5,
    "received": "0",
    "sent": "10247601921605917",
    "sentToSelf": "0"
  },
  {
    "time": 1694084400,
    "txs": 4,
    "received": "0",
    "sent": "8064344277547668",
    "sentToSelf": "0"
  }
]

Source: Alchemy Get balance history.

QuickNodeAlchemy
ProtocolJSON-RPC (POST)REST (GET)
AddressPassed in params arrayPassed in URL path
Time rangePassed as strings in params objectPassed as query parameters
Response wrapperWrapped in jsonrpc, id, resultClean JSON array, no wrapper
Fiat rates in responseIncluded via fiatcurrency paramIncluded via fiatcurrency query param

Below is a side-by-side comparison of how to retrieve address balance and transaction summary data. Both requests query the same address.

Example address: 1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD

BlockCypher request (old)

curl --request GET \
  --url 'https://api.blockcypher.com/v1/btc/main/addrs/1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD/balance'

Source: BlockCypher Address Balance Endpoint.

BlockCypher response

{
  "address": "1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD",
  "total_received": 4433416,
  "total_sent": 0,
  "balance": 4433416,
  "unconfirmed_balance": 0,
  "final_balance": 4433416,
  "n_tx": 7,
  "unconfirmed_n_tx": 0,
  "final_n_tx": 7
}

Alchemy request (new)

curl --request GET \
  --url 'https://bitcoin-mainnet.g.alchemy.com/v2/{apiKey}/api/v2/address/1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD'

Source: Alchemy Get address.

Alchemy response

{
  "address": "1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD",
  "balance": "4433416",
  "totalReceived": "4433416",
  "totalSent": "0",
  "unconfirmedBalance": "0",
  "unconfirmedTxs": 0,
  "txs": 7
}

BlockCypherAlchemy
ProtocolREST (GET)REST (GET)
Base URL pattern/v1/btc/main/addrs/{address}/v2/{apiKey}/api/v2/address/{address}
AuthenticationToken as query parameterAPI key in URL path
Balance unitInteger (satoshis)String (satoshis)
Response formatFlat JSON with snake_case fieldsFlat JSON with camelCase fields
Supported chainsBTC, LTC, DOGE, DASHBTC, BCH, LTC, DOGE

Below is a side-by-side comparison of how to retrieve address balance data. Both requests query the same address.

Example address: bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0

Blockdaemon request (old)

curl -X POST "https://svc.blockdaemon.com/bitcoin/mainnet/native" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "1.0",
  "id": "curltest",
  "method": "bd_getbalance",
  "params": [
    "bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0"
  ]
}'

Source: Blockdaemon Bitcoin custom methods.

Blockdaemon response

{
  "id": "curltest",
  "result": {
    "trusted": "0.00000000",
    "untrusted_pending": "0.00000000"
  }
}

Alchemy request (new)

curl --request GET \
  --url 'https://bitcoin-mainnet.g.alchemy.com/v2/{apiKey}/api/v2/address/bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0'

Source: Alchemy Get address.

Alchemy response

{
  "address": "bc1qwfgdjyy95aay2686fn74h6a4nu9eev6np7q4fn204dkj3274frlqrskvx0",
  "balance": "0",
  "totalReceived": "18311946199153585",
  "totalSent": "18311946199153585",
  "unconfirmedBalance": "0",
  "unconfirmedTxs": 0,
  "txs": 9
}

BlockdaemonAlchemy
ProtocolJSON-RPC 1.0 (POST)REST (GET)
AddressPassed in params arrayPassed in URL path
AuthenticationAuthorization: Bearer headerAPI key in URL path
Balance dataReturns trusted and untrusted_pending onlyReturns balance, totalReceived, totalSent, tx count
Response wrapperWrapped in jsonrpc, id, resultClean JSON object, no wrapper
Balance historyNot availableAvailable via /api/v2/balancehistory/{address}

Across Bitcoin, Litecoin, Dogecoin, and Bitcoin Cash, Alchemy is 3x faster overall than competitors on average latency, and up to 5x faster on UTXO-specific methods, the API surface that matters most for blockchain applications querying transaction and balance data.

We maintain a live dashboard with real-time performance metrics for our UTXO endpoints across all supported networks, benchmarked against QuickNode and Blockdaemon. View live dashboard.

We understand migrating services can be complex, but we are here to make it easy with dedicated support, feature parity, and expanded capabilities.

If there's a feature you need, let us know. Contact us at data-services-product@alchemy.com.

  • Why should I migrate my UTXO calls to Alchemy?
    • Alchemy's UTXO API provides full Blockbook feature parity with a clean REST interface - no JSON-RPC boilerplate, no wrappers in responses, and consistent multi-chain support from a single provider. Whether you're coming from QuickNode, BlockCypher, or Blockdaemon, the migration is straightforward.
  • Is Alchemy's UTXO API a drop-in replacement?
    • The data returned is equivalent, but the request format may differ. QuickNode and Blockdaemon use JSON-RPC POST requests, while BlockCypher and Alchemy both use REST GET. You will need to update your HTTP calls, but the underlying data models are the same.
  • How do I enable UTXO endpoints on my Alchemy account?
    • Purchase the UTXO add-on for your desired chain directly from the Alchemy dashboard. Once enabled, you can start making REST API calls immediately.
  • I'm migrating from BlockCypher. How different is the integration?
    • BlockCypher and Alchemy both use REST GET endpoints, so the migration is the most straightforward of the three. The main changes are the base URL pattern, field naming convention (snake_case vs camelCase), and authentication method (query param vs URL path).
  • I'm migrating from Blockdaemon. Does Alchemy support the same data?
    • Alchemy provides richer address data than Blockdaemon's bd_getbalance method, including total received, total sent, and transaction counts - all from a single REST call with no JSON-RPC wrapper. Alchemy also offers balance history, which is not available through Blockdaemon's Bitcoin RPC.
  • Where can I get help with my migration?
Was this page helpful?