Migration guide

Migrate from Zerion API to GoldRush

Every Zerion v1 wallet endpoint, mapped to its GoldRush equivalent.

Zerion API is a wallet and portfolio API across 40+ EVM chains and Solana, returning JSON:API payloads. GoldRush is a decoded multichain data API across 100+ chains including Bitcoin, returning a flat data.items[] envelope. Most Zerion wallet reads have a direct GoldRush equivalent; DeFi protocol positions, one-call PnL, and transaction webhooks do not. This page maps all of it, including the parts where you should stay on Zerion.

9 direct2 need work4 no equivalent8 GoldRush only

Reviewed 2026-09-11. Endpoint paths read from developers.zerion.io, goldrush.dev. Verify against Zerion API docs before relying on a row.

What changes before any endpoint works

These are the cross-cutting differences. Miss one and every call fails the same way, so fix them first.

 Zerion APIGoldRush
Base URLhttps://api.zerion.iohttps://api.covalenthq.com
AuthHTTP Basic — API key as username, empty password: Authorization: Basic base64(KEY + ':')Authorization: Bearer <GOLDRUSH_API_KEY>
Chain addressingAll chains by default; narrow with filter[chain_ids]=ethereum,base. Chain per row under relationships.chain.data.id.Chain is a path segment: eth-mainnet, base-mainnet, matic-mainnet. Use the /v1/allchains/* endpoints for cross-chain reads in one call.
Response envelopeJSON:API — payload under data[].attributes, related entities under data[].relationships. Errors via HTTP status.Flat envelope — { data: { items: [...] }, error, error_message, error_code }. Errors carry an HTTP status AND the error fields.
Token amountsquantity.float (decimal), quantity.int (raw), quantity.numeric (decimal string)balance is the raw integer string; contract_decimals is a sibling field. Divide yourself, or read the pre-computed quote for fiat value.
PaginationFully-formed next-page URL at links.next — fetch as-is.Page number in the path: .../transactions_v3/page/{page}/. Page 0 is the OLDEST page, not the newest.

Endpoint mapping

Every Zerion API endpoint we could source, with its GoldRush equivalent. Rows marked No equivalent are gaps we are not going to paper over — read those first.

Use caseZerion APIGoldRushParity
Token balances
GoldRush returns spot quote per token in the same response, so no second pricing call.
GET /v1/wallets/{address}/positions/?filter[positions]=only_simpleGET /v1/{chainName}/address/{walletAddress}/balances_v2/Direct equivalent
Multichain balances in one call
Pass a comma-separated chains list to narrow, the same way filter[chain_ids] narrows Zerion.
GET /v1/wallets/{address}/positions/ (all chains by default)GET /v1/allchains/address/{walletAddress}/balances/Direct equivalent
DeFi protocol positions
No GoldRush equivalent. LP and receipt tokens appear in balances_v2 as tokens, but not decoded per protocol. Keep Zerion if this is load-bearing.
GET /v1/wallets/{address}/positions/?filter[positions]=only_complexNo equivalent
Net worth + 24h change
Sum the quote field across items. Zerion returns the total pre-computed; GoldRush makes you add it up.
GET /v1/wallets/{address}/portfolioGET /v1/allchains/address/{walletAddress}/balances/Needs work
Net worth over time
GoldRush is per-chain; call per chain and sum for a multichain curve.
GET /v1/wallets/{address}/charts/{chart_period}GET /v1/{chainName}/address/{walletAddress}/portfolio_v2/Needs work
Historical token balances
GoldRush returns per-token balances as of a date, not just a portfolio total.
Derived from the wallet chart endpointGET /v1/{chainName}/address/{walletAddress}/historical_balances/GoldRush advantage
Transaction history
Zerion gives a unified transfers[] with operation_type. GoldRush gives decoded log_events per transaction — lower level, more of it.
GET /v1/wallets/{address}/transactions/GET /v1/{chainName}/address/{walletAddress}/transactions_v3/page/{page}/Direct equivalent
Multichain transactionsGET /v1/wallets/{address}/transactions/ (all chains by default)GET /v1/allchains/transactions/Direct equivalent
Single transaction by hash
GoldRush looks a hash up directly. Zerion requires a wallet context plus a search filter.
GET /v1/wallets/{address}/transactions/?filter[search_query]=<hash>GET /v1/{chainName}/transaction_v2/{txHash}/GoldRush advantage
Wallet PnL
No single-call equivalent. Computable from transactions_v3 plus historical pricing, but that is your code.
GET /v1/wallets/{address}/pnlNo equivalent
NFTs heldGET /v1/wallets/{address}/nft-positions/GET /v1/{chainName}/address/{walletAddress}/balances_nft/Direct equivalent
NFTs by collectionGET /v1/wallets/{address}/nft-collections/GET /v1/{chainName}/address/{walletAddress}/collection/{collectionContract}/Direct equivalent
Token price by contract
Same endpoint serves live and historical — pass from/to for a range.
GET /v1/fungibles/by-implementation?implementation={chain}:{address}GET /v1/pricing/historical_by_addresses_v2/{chainName}/{quoteCurrency}/{contractAddress}/Direct equivalent
Token price chart
Date range instead of a named period.
GET /v1/fungibles/{fungible_id}/charts/{chart_period}GET /v1/pricing/historical_by_addresses_v2/{chainName}/{quoteCurrency}/{contractAddress}/Direct equivalent
Pool / DEX spot priceNot availableGET /v1/pricing/spot_prices/{chainName}/pools/{contractAddress}/GoldRush advantage
Chains a wallet has used
One call, returns the chain list directly rather than deriving it from a portfolio breakdown.
Derive from positions_distribution_by_chain on /portfolioGET /v1/address/{walletAddress}/activity/GoldRush advantage
Supported chain list
Identical path. GoldRush adds /v1/chains/status/ for per-chain sync height and freshness.
GET /v1/chains/GET /v1/chains/Direct equivalent
Token approvals / riskNot availableGET /v1/{chainName}/approvals/{walletAddress}/GoldRush advantage
Real-time updates
No webhook product. You poll transactions_v3 or allchains/transactions.
GET/POST /v1/tx-subscriptions/ (webhooks)No equivalent
Swap / bridge quotes
GoldRush is a data API and does not quote swaps.
GET /v1/swap/quotes/No equivalent
Bitcoin balances
Plus /hd_wallets/ for xpub-derived addresses and /historical_balances/.
Not available (EVM + Solana only)GET /v1/btc-mainnet/address/{walletAddress}/balances_v2/GoldRush advantage
Contract log events
Also by topic hash at /v1/{chainName}/events/topics/{topicHash}/.
Not availableGET /v1/{chainName}/events/address/{contractAddress}/GoldRush advantage
Token holders at a blockNot availableGET /v1/{chainName}/tokens/{tokenAddress}/token_holders_v2/GoldRush advantage

Before and after

Copy-pasteable. Left is what you have on Zerion API; right is the GoldRush replacement.

Token balances for a wallet

Zerion API
// BEFORE -- Zerion: Basic auth, JSON:API envelope, all chains by default
const auth = Buffer.from(process.env.ZERION_API_KEY + ":").toString("base64");
const res = await fetch(
  "https://api.zerion.io/v1/wallets/" + address +
    "/positions/?currency=usd&filter[positions]=only_simple",
  { headers: { accept: "application/json", authorization: "Basic " + auth } }
);
const { data } = await res.json();

// Amounts live under attributes; chain under relationships.
const tokens = data.map((p) => ({
  symbol: p.attributes.fungible_info.symbol,
  amount: p.attributes.quantity.float,
  usd: p.attributes.value,
  chain: p.relationships.chain.data.id,
}));
GoldRush
// AFTER -- GoldRush: Bearer auth, flat items[], one chain per path
const res = await fetch(
  "https://api.covalenthq.com/v1/eth-mainnet/address/" + address + "/balances_v2/",
  { headers: { Authorization: "Bearer " + process.env.GOLDRUSH_API_KEY } }
);
const { data, error, error_message } = await res.json();
if (error) throw new Error(error_message);

// balance is the raw integer string; divide by contract_decimals yourself.
const tokens = data.items.map((t) => ({
  symbol: t.contract_ticker_symbol,
  amount: Number(t.balance) / 10 ** t.contract_decimals,
  usd: t.quote,
  chain: data.chain_name,
}));

Multichain balances in one call

Zerion API
// BEFORE -- Zerion returns every chain by default; narrow with a filter.
const res = await fetch(
  "https://api.zerion.io/v1/wallets/" + address +
    "/positions/?filter[chain_ids]=ethereum,base,arbitrum",
  { headers: { authorization: "Basic " + auth } }
);
GoldRush
// AFTER -- GoldRush uses a dedicated allchains endpoint.
const res = await fetch(
  "https://api.covalenthq.com/v1/allchains/address/" + address +
    "/balances/?chains=eth-mainnet,base-mainnet,arbitrum-mainnet",
  { headers: { Authorization: "Bearer " + process.env.GOLDRUSH_API_KEY } }
);
const { data } = await res.json();

Paginating transaction history

Zerion API
// BEFORE -- Zerion hands you the next URL; follow it until it is absent.
let url =
  "https://api.zerion.io/v1/wallets/" + address + "/transactions/?page[size]=100";
const all = [];
while (url) {
  const res = await fetch(url, { headers: { authorization: "Basic " + auth } });
  const body = await res.json();
  all.push(...body.data);
  url = body.links?.next;
}
GoldRush
// AFTER -- GoldRush pages by number in the path.
// NOTE: page 0 is the OLDEST page. Walk down from has_more, or start at 0
// and ascend if you want chronological order.
const all = [];
let page = 0;
for (;;) {
  const res = await fetch(
    "https://api.covalenthq.com/v1/eth-mainnet/address/" + address +
      "/transactions_v3/page/" + page + "/",
    { headers: { Authorization: "Bearer " + process.env.GOLDRUSH_API_KEY } }
  );
  const { data, error, error_message } = await res.json();
  if (error) throw new Error(error_message);
  all.push(...data.items);
  if (!data.links?.next) break;
  page += 1;
}

Paying per request as an agent (no API key)

Zerion API
# BEFORE -- Zerion requires a dashboard account and a provisioned key
# before an agent can make its first call.
curl -H "Authorization: Basic $(printf '%s:' "$ZERION_API_KEY" | base64)" \
  "https://api.zerion.io/v1/wallets/$ADDRESS/positions/"
GoldRush
# AFTER -- GoldRush x402: the agent pays from its own wallet.
# No signup, no dashboard, no long-lived credential to rotate.
curl "https://api.covalenthq.com/v1/eth-mainnet/address/$ADDRESS/balances_v2/"
# -> 402 Payment Required, with payment details in the response.
# An x402-aware client settles onchain and retries automatically.

Migration steps

  1. Swap the auth header

    Replace HTTP Basic (key as username, empty password) with Authorization: Bearer <GOLDRUSH_API_KEY>. This is the change that breaks every call at once if you miss it.

  2. Translate chain identifiers

    Zerion uses plain lowercase names (ethereum, base). GoldRush uses suffixed slugs in the path (eth-mainnet, base-mainnet). Pull the authoritative list from GET /v1/chains/ rather than hardcoding a map.

  3. Move chain from filter to path

    Zerion returns all chains by default and narrows with filter[chain_ids]. In GoldRush, single-chain calls put the chain in the path; cross-chain calls use /v1/allchains/*. Decide per call site which one you want.

  4. Rewrite the response parser

    Replace JSON:API traversal (data[].attributes, data[].relationships) with the flat data.items[] envelope, and check the error and error_message fields in addition to the HTTP status.

  5. Fix decimal handling

    Zerion's quantity.float is already decimal-adjusted. GoldRush returns balance as a raw integer string with contract_decimals alongside — divide before displaying, or read quote for the fiat value.

  6. Replace link-following pagination

    Swap links.next URL-following for page numbers in the path. Remember that page 0 is the oldest page on transactions_v3.

  7. Handle the three gaps

    DeFi protocol positions, one-call PnL, and transaction webhooks have no GoldRush equivalent. Either drop the feature, compute it from primitives, or keep Zerion alongside GoldRush for those specific reads.

  8. Verify against a known wallet

    Run both APIs against the same address and diff token counts and USD totals before cutting traffic over. Expect small differences from spam-token filtering policy.

What you lose by moving

If any of these is load-bearing for your product, do not migrate that surface. Running both providers is a legitimate answer.

No first-class DeFi protocol positions

There is no GoldRush endpoint that returns staking, lending, or LP positions decoded per protocol. balances_v2 returns LP and receipt tokens as token balances, so the value is visible, but the protocol-level breakdown is not. This is a real gap, not a naming difference.

No single-call wallet PnL

GoldRush has no one-shot realized/unrealized PnL endpoint. You can compute it from transactions_v3 plus historical pricing, but that is your code to write, not a field to read. If PnL is the product, budget for it.

No transaction webhooks

GoldRush is request/response. There is no subscription endpoint that pushes transactions to a callback URL, so any real-time path becomes polling on your side.

What you gain

100+ chains, including Bitcoin

Live chain list at /v1/chains/ and per-chain sync state at /v1/chains/status/. Bitcoin is first-class with its own balances, historical balances, and HD-wallet endpoints — most wallet APIs are EVM-only or EVM+Solana.

x402: no signup, no API key

An autonomous agent can pay per request from an onchain wallet without registering an account or holding a key. If you are building agents rather than a dashboard, this removes the credential provisioning step entirely.

JSON-RPC on the same key

GoldRush serves JSON-RPC across 30+ EVM chains, so a decoded-data provider and a node provider can collapse into one vendor and one bill.

Log events, holders, and OHLCV

Raw and decoded log events by contract or topic, token holder lists at a block height, and pool-level pricing. Wallet-portfolio APIs generally stop at the wallet boundary and cannot answer contract-level questions.

Migration FAQ

For balances, transactions, NFTs, and prices, yes. For DeFi protocol positions, wallet PnL, and webhooks, no — GoldRush has no equivalent and this guide marks those rows as such. Teams whose product is a DeFi position tracker should stay on Zerion or run both.

Start the port

Free API key with 25,000 credits and no card, or skip signup entirely and pay per request with x402.

Still deciding?

This page assumes you have decided to move. If you are still evaluating, the comparison covers pricing, coverage, and feature parity side by side.

GoldRush vs Zerion API

Other migration guides

Get Started

Get started with GoldRush API in minutes. Sign up for a free API key and start building.

Support

Explore multiple support options! From FAQs for self-help to real-time interactions on Discord.

Contact Sales

Interested in our professional or enterprise plans? Contact our sales team to learn more.