Skip to main content
A drop-in mapping from the Zapper API to Octav. The biggest wins:
  • A REST GET instead of a GraphQL query. Zapper makes you write a nested portfolioV2 query with edges, nodes, inline fragments, and hand-picked field selections. Octav returns wallet tokens, DeFi positions, and net worth from a single GET /v1/portfolio with no query body.
  • USD values precomputed. Both return balanceUSD / value, but Octav layers on P&L and cost basis in the same response.
  • Deeper, more consistent DeFi decoding. Zapper is known to under-value Pendle-style yield tokens; Octav decodes them into their underlying assets so positions carry their real value.
  • P&L and cost basis come back in the same response.
Get your API key at data.octav.fi. Base URL: https://api.octav.fi/v1.

Endpoint mapping

Everything except history comes from a single GET /v1/portfolio call. There is no GraphQL query to write, and no tokenBalances / appBalances branches to stitch back together.

Authentication

Zapper uses an x-zapper-api-key header on a GraphQL POST. Octav uses a standard Authorization: Bearer token on a GET.

Wallet token balances

Zapper’s tokenBalances.byToken returns a paginated connection of edges { node }. In Octav, wallet tokens live under the wallet protocol, grouped by chain:
Field mapping

Net worth and per-chain breakdown

Zapper splits net worth across two branches you have to add together. Octav returns the same total on the top-level networth field, plus a per-chain chains breakdown.
JavaScript

DeFi positions

Zapper returns app positions under appBalances.byApp.edges[].node, with each position split into AppTokenPositionBalance and ContractPositionBalance inline fragments, and token roles hidden behind a metaType enum. Octav returns the same money under assetByProtocols, keyed by protocol, then chain, then position type (LENDING, LIQUIDITYPOOL, STAKED, FARMING, …).
Field mapping
Zapper is known to under-value Pendle-style yield tokens. Octav decodes those positions into their underlying assets, so assets[] and totalValue reflect the real position value.

Transaction history

Swap Zapper’s GraphQL activity query for GET /v1/transactions.
Octav categorizes each transaction (swap, deposit, stake, bridge, …) and prices transfers in USD. See the transaction types reference.

Key differences

  • Protocol shape. Zapper is a single GraphQL POST with a nested portfolioV2 query (edges, nodes, inline fragments, field selection). Octav is one plain GET /v1/portfolio with no query body.
  • Branches. Zapper splits a portfolio across tokenBalances and appBalances, each with its own totalBalanceUSD. Octav returns both plus networth in one shape.
  • Values. Both return balanceUSD / value. Octav also returns openPnl, closedPnl, and totalCostBasis at no extra call.
  • Grouping. Zapper groups DeFi by app → positionBalances with a metaType enum. Octav groups assetByProtocolschainsprotocolPositionsassets[], with a dedicated wallet bucket for loose tokens.
  • DeFi decoding. Zapper under-values Pendle-style yield tokens; Octav decodes them into their underlying assets.
  • Chains. Both cover EVM and Solana from the same endpoint and shape.
  • Billing. Zapper bills roughly 3 credits per query. Octav charges 1 credit per call (see pricing).

Need help migrating?

Join our Discord

Share your Zapper query shape and we’ll map it.

Portfolio endpoint

Full reference for the endpoint you’ll be calling.