Portfolio APIs include everything you need to build a view of a user's assets: fungibles, NFTs, and their transactions.
- Multi-chain: All Portfolio APIs are multi-chain -- get all the data you need in a single API request, instead of parallelizing dozens of calls across different networks.
- Powerful: Query for the metadata you need (e.g. cached images, token metadata, prices) within the same API call.
- Constantly improving: These APIs are continuously improving, based on customer feedback.
- Long-term partners: We have 7+ years of experience supporting the largest onchain customers and will be around to support you for the long term.
- Scalable: These APIs power some of the biggest wallets in the space -- rest assured that we can scale with you.
| Get Tokens By Wallet | NFTs By Wallet | Transaction History |
|---|---|---|
![]() | ![]() | ![]() |
| Ideal for: Multi-chain token experiences, balance indexing How it works: Call an API to get balances, metadata, and prices. | Ideal for: NFT drops, token gating, analytics, wallets, marketplaces How it works: Call an API to return multi-chain and complete NFT data. | Ideal for: Wallets How it works: Call an API to get all transactions across different networks for a set of addresses. |
The four multichain fan-out endpoints below can succeed on some networks and fail on others within a single request. Applies to:
When one or more networks in a request fail (upstream error, or a per-network timeout: 5s on paginated requests, 10s on fetch-all), the request still returns HTTP 200 with whatever succeeded, plus a top-level error object describing which networks did not.
The error key is omitted entirely when every requested network succeeds; it is not present-and-null.
{
"data": { /* successful results, possibly an empty array */ },
"error": {
"message": "Failed to fetch tokens on certain networks",
"partialErrors": [
{ "network": "robinhood-mainnet", "message": "Internal server error" }
]
}
}error.message is a human-readable summary that currently reads "Failed to fetch tokens on certain networks" on the token endpoints and "Failed to fetch NFTs on certain networks" on the NFT endpoints. error.partialErrors[].message is currently always the literal string "Internal server error". Treat both messages as opaque strings, not enumerable error codes; they do not distinguish upstream errors from per-network timeouts.
- HTTP 200 does not mean every network returned data. Always check for the presence of
errorbefore treating the response as complete. - Every requested network can fail. If it does, the result array is empty and
partialErrorscontains one entry per network, still at HTTP 200. - Networks can repeat in
partialErrors. A network appears more than once when the request body contained multiple entries that covered it. - Failed networks are dropped from pagination. They are not retried on subsequent
pageKeyrequests, so retry a failed network as a fresh request rather than expecting it on the next page. - The top-level
erroris separate fromdata.tokens[].erroron Tokens By Wallet. The former reports networks that failed entirely; the latter reports a per-token metadata or pricing failure within an otherwise successful network response.
Treat partialErrors as retryable. Retry only the listed networks in a fresh request, surface the partial data to end users rather than discarding the whole response, and stop after a fixed number of retries so a persistently failing network cannot block the rest of the payload.
Get in touch with us directly:
Email: [email protected]


