Skip to main content
Zerion is offering discounts for teams migrating from Zapper. To claim yours, reach out via the chat widget on dashboard.zerion.io or email api@zerion.io.
Zapper is winding down all of its services on August 3, 2026, including the GraphQL API at build.zapper.xyz. If you’ve been querying portfolioV2 for token, app, and NFT balances, or transactionHistoryV2 for wallet activity, the same data is available on Zerion API across 60+ EVM chains and Solana. This guide shows the direct mapping for the main Zapper queries, with copy-pasteable code for each. What you get with Zerion:
  • Plain REST: Each use case is a single GET request with query-string filters. No GraphQL documents to maintain, no edges/node wrappers to unwrap.
  • One endpoint for tokens + DeFi: Wallet tokens and DeFi positions both come from /positions/, switchable with filter[positions]. USD values are precomputed on every row.
  • Deeper Solana coverage: Zapper covers token balances only on Solana (no transaction history or price data). Zerion returns Solana balances, enriched transaction history, and price charts from the same endpoints as EVM.
  • Realtime webhooks: Subscribe wallets once and receive a POST when they transact, instead of polling transaction history.

Endpoint parity

Token balances

Zapper’s portfolioV2.tokenBalances.byToken returns a Relay-style connection of token nodes. Zerion returns a flat JSON:API collection where each token is one entry under data[], with attributes.fungible_info for metadata and attributes.value for the USD value. The same endpoint accepts both EVM and Solana addresses.

Field mapping

price and value are null for tokens without a reliable price. Guard for null before summing or formatting.
Zapper’s byToken accepts a minBalanceUSD argument to cut dust by value. Zerion’s lever is a spam classifier instead: pass filter[trash]=only_non_trash to hide spam tokens, and filter client-side on value if you also want a hard USD threshold. See spam filtering.

Portfolio value

Zapper reports totalBalanceUSD separately on tokenBalances, appBalances, and nftBalances. Zerion’s /portfolio returns the fungible total with a 24h change, a breakdown by chain, and a breakdown by position type (wallet, deposited, borrowed, locked, staked) in one response. The NFT total lives on /nft-portfolio.
cURL
For a portfolio-value chart over time (Zapper’s portfolio charts), use /wallets/{address}/charts/{period} with hour, day, week, month, 3months, 6months, year, 5years, or max.
/portfolio totals count only positions with flags.displayable: true. Zerion marks some wallet-held DeFi derivative tokens (LP tokens, vault shares, index tokens) as non-displayable, so the wallet bucket can be lower than a raw sum over /positions/. If you want a Zapper-style total that counts every priced token, sum value over the /positions/ rows instead.

DeFi positions

Zapper’s portfolioV2.appBalances groups positions by app, with nested positionBalances that are either app tokens (LP tokens, vault shares) or contract positions with underlying tokens[]. Zerion returns one flat row per position from the same /positions/ endpoint with filter[positions]=only_complex; group by relationships.dapp.data.id client-side if you want the per-app view back.

Field mapping

Zapper nests every underlying token of a contract position under tokens[]. Zerion returns one row per position with a single fungible_info; a two-sided LP shows up as its pool position with the position’s total USD value.

Transaction history

Zapper’s transactionHistoryV2 returns timeline events with a natural-language interpretation.processedDescription and per-account deltas. Zerion’s /transactions/ returns structured, enriched transactions instead: an operation_type, typed transfers[] with direction and USD values, the fee, and the dApp when Zerion recognizes it. Compose display strings from those fields. The same endpoint accepts both EVM and Solana addresses. Unlike Zapper’s transactionHistoryV2, which returns no Solana activity, Zerion returns the same enriched shape (trades, sends, USD values, fees) for Solana wallets.

Field mapping

Filter mapping

Token prices and charts

Zapper’s fungibleTokenV2(address, chainId) returns market data and OHLC priceTicks. On Zerion, look the asset up by implementation (chain:address), read market_data for the price and stats, and call the charts endpoint for history.

Field mapping

Zapper chart timestamps are in milliseconds; Zerion chart points use Unix seconds. Chart periods map as HOUR → hour, DAY → day, WEEK → week, MONTH → month, YEAR → year, plus 3months, 6months, 5years, and max.

NFTs

Zapper’s nftBalances totals map to /wallets/{address}/nft-portfolio, and per-item holdings map to /wallets/{address}/nft-positions/, which returns each NFT with collection metadata, media URLs, and a floor-price-based value. For a collection-level rollup like Zapper’s NFT collection queries, use /wallets/{address}/nft-collections/.
cURL
Key fields per position: nft_info.contract_address, nft_info.token_id, nft_info.name, nft_info.content.preview.url for media, and price/value for the floor-based valuation. value is null when Zerion has no floor data for the collection, so handle missing values when totaling (Zapper’s nftBalances.totalBalanceUSD includes estimates for more collections, so totals can differ). The NFT endpoints accept EVM addresses only.

Pagination

Replace Zapper’s Relay cursors (first/after + pageInfo.endCursor) with Zerion’s links.next URL. Paginated endpoints (transactions, NFT positions, fungibles) include a fully-formed next-page link you can fetch as-is. /positions/ is not paginated and returns the full set in one response.

Webhooks (realtime updates)

Zapper’s API has no push mechanism, so most integrations poll transactionHistoryV2. Zerion offers transaction webhooks: subscribe a callback URL to one or more wallets and receive a POST when any of them transact. See the wallet activity alerts recipe for a working example.

Differences from Zapper

Most Zapper use cases have a direct Zerion equivalent. A few aren’t covered, and others behave differently. Worth a scan before you cut over. Not supported today:
  • Onchain identity: Zapper resolves ENS, Basenames, Farcaster, and Lens profiles. Zerion doesn’t; resolve names to addresses with an ENS library or a provider like Neynar before calling Zerion.
  • Farcaster portfolios: Zapper accepts Farcaster usernames/FIDs as portfolio subjects. On Zerion, resolve the user’s verified addresses first, then pass those.
  • Natural-language descriptions: Zapper’s processedDescription returns prose like “Swapped 400 USDC for 0.2 ETH”. Zerion returns structured fields (operation_type, transfers[], fee); compose your own template (see the transaction history section).
  • Token holders and rankings: Zapper exposes holder lists and trending-token rankings. Not on Zerion today; pair with a separate data source if you need them.
  • Cross-entity search: Zapper’s search spans tokens, NFTs, apps, and accounts. Zerion’s search covers fungible tokens only, via /v1/fungibles/?filter[search_query]=….
  • Bitcoin and other non-EVM chains: Zapper lists Bitcoin and a few other non-EVM networks. Zerion covers 60+ EVM chains and Solana; check the supported chains list before migrating.
If any of these matter for your migration, let us know. Your feedback helps shape our roadmap. Worth knowing:
  • Authentication: Zapper uses an x-zapper-api-key header on a GraphQL POST. Zerion uses HTTP Basic Auth on REST GETs. Get a key at dashboard.zerion.io.
  • Solana: Zapper supports Solana for token balances only. Zerion additionally returns enriched transaction history and price charts for Solana, on the same endpoints as EVM. Solana DeFi positions and NFTs are not yet supported (the NFT endpoints accept EVM addresses only).
  • Chain identifiers: Zapper uses numeric chainId values (and legacy network enums like ETHEREUM_MAINNET). Zerion uses string chain IDs (e.g. ethereum, base, solana). The /v1/chains/ endpoint lists them all with their numeric counterparts.
  • Timestamps: Zapper returns millisecond epochs. Zerion returns ISO 8601 strings on transactions (mined_at) and Unix seconds in chart points.
  • Response shape: Zerion uses JSON:API. Payloads live under data[].attributes with related entities under data[].relationships, no GraphQL field selection.
  • Per-app grouping: Zapper groups DeFi by app with nested position balances. Zerion returns one flat row per position; group by relationships.dapp.data.id client-side (see the DeFi positions section).
  • Token identifiers: Zapper keys tokens by chainId + contract address. Zerion uses its own chain-agnostic fungible IDs; resolve one via /v1/fungibles/by-implementation.
  • Currencies: Zapper’s currency argument on price ticks maps to Zerion’s currency query parameter, which also applies to positions, portfolio, and transactions.

Get in touch

Have a use case we don’t cover or need assistance with the migration? Our team is happy to help! Reach out via the chat widget on dashboard.zerion.io, or email us.