@pioneer-platform/zapper-client 8.11.0 → 8.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1514 @@
1
+ Portfolio Data
2
+
3
+ Access complete onchain portfolio data with a single query. The portfolio query provides comprehensive access to balances across tokens, apps, and NFTs, along with detailed portfolio totals and breakdowns.
4
+
5
+ NOTE
6
+
7
+ Use portfolioV2 to query portfolio data and ensure up-to-date information. Avoid using the deprecated portfolio endpoint, as it will soon be made unavailable.
8
+
9
+ Overview​
10
+
11
+ The portfolioV2 query takes an array of addresses as input, and an optional array of chainIds. It returns a complete view of onchain holdings including:
12
+
13
+ Token balances
14
+ App balances
15
+ NFT balances
16
+ Portfolio totals and breakdowns
17
+ Claimables
18
+ Portfolio Fields​
19
+ tokenBalances​
20
+
21
+ Access native token holdings across different networks with real-time computation built in.
22
+
23
+ Try it now
24
+ Example Variables​
25
+ {
26
+ "addresses": ["0x849151d7d0bf1f34b70d5cad5149d28cc2308bf1"],
27
+ "first": 5,
28
+ "chainIds": [8453], // Optional (Returns all chains when omitted)
29
+ "filters": {"minBalanceUSD": 10} // Optional
30
+ }
31
+
32
+ Example Query​
33
+ query TokenBalances($addresses: [Address!]!, $first: Int, $chainIds: [Int!]) {
34
+ portfolioV2(addresses: $addresses, chainIds: $chainIds) {
35
+ tokenBalances {
36
+ totalBalanceUSD
37
+ byToken(first: $first) {
38
+ totalCount
39
+ edges {
40
+ node {
41
+ symbol
42
+ tokenAddress
43
+ balance
44
+ balanceUSD
45
+ price
46
+ imgUrlV2
47
+ name
48
+ network {
49
+ name
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ Example Response​
59
+ {
60
+ "data": {
61
+ "portfolioV2": {
62
+ "tokenBalances": {
63
+ "totalBalanceUSD": 251379.07705505722,
64
+ "byToken": {
65
+ "totalCount": 6443,
66
+ "edges": [
67
+ {
68
+ "node": {
69
+ "symbol": "BKIT",
70
+ "tokenAddress": "0x262a9f4e84efa2816d87a68606bb4c1ea3874bf1",
71
+ "balance": 28980487535.238518,
72
+ "balanceUSD": 31298.9265380576,
73
+ "price": 0.00000108,
74
+ "imgUrlV2": "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x262a9f4e84efa2816d87a68606bb4c1ea3874bf1.png",
75
+ "name": "Bangkit",
76
+ "network": {
77
+ "name": "Base"
78
+ }
79
+ }
80
+ },
81
+ {
82
+ "node": {
83
+ "symbol": "SYNDOG",
84
+ "tokenAddress": "0x3d1d651761d535df881740ab50ba4bd8a2ec2c00",
85
+ "balance": 30000000,
86
+ "balanceUSD": 23449.8,
87
+ "price": 0.00078166,
88
+ "imgUrlV2": "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x3d1d651761d535df881740ab50ba4bd8a2ec2c00.png",
89
+ "name": "Synthesizer Dog",
90
+ "network": {
91
+ "name": "Base"
92
+ }
93
+ }
94
+ },
95
+ {
96
+ "node": {
97
+ "symbol": "BNKR",
98
+ "tokenAddress": "0x22af33fe49fd1fa80c7149773dde5890d3c76f3b",
99
+ "balance": 55181351.17643974,
100
+ "balanceUSD": 17482.251815591913,
101
+ "price": 0.00031681449335470687,
102
+ "imgUrlV2": "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x22af33fe49fd1fa80c7149773dde5890d3c76f3b.png",
103
+ "name": "BankrCoin",
104
+ "network": {
105
+ "name": "Base"
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "node": {
111
+ "symbol": "GEKO",
112
+ "tokenAddress": "0x64baa63f3eedf9661f736d8e4d42c6f8aa0cda71",
113
+ "balance": 10000000,
114
+ "balanceUSD": 14040.5,
115
+ "price": 0.00140405,
116
+ "imgUrlV2": "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x64baa63f3eedf9661f736d8e4d42c6f8aa0cda71.png",
117
+ "name": "Geko Base",
118
+ "network": {
119
+ "name": "Base"
120
+ }
121
+ }
122
+ },
123
+ {
124
+ "node": {
125
+ "symbol": "SAINT",
126
+ "tokenAddress": "0x7588880d9c78e81fade7b7e8dc0781e95995a792",
127
+ "balance": 10000000,
128
+ "balanceUSD": 9881.1,
129
+ "price": 0.00098811,
130
+ "imgUrlV2": "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x7588880d9c78e81fade7b7e8dc0781e95995a792.png",
131
+ "name": "Satoshi AI agent by Virtuals",
132
+ "network": {
133
+ "name": "Base"
134
+ }
135
+ }
136
+ }
137
+ ]
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ Key Features​
145
+ Real-time Computation: No separate computation jobs needed
146
+ Flexible Querying: View balances by token, account, or network
147
+ Detailed Token Data: Complete token metadata and balances
148
+ Account-level Breakdown: See individual wallet contributions to total balances
149
+ Available Fields​
150
+ Token Balance Root Fields​
151
+ Field Description Type
152
+ totalBalanceUSD Total portfolio value in USD Float!
153
+ byToken Token-centric view of balances PortfolioV2TokenBalanceByTokenConnection!
154
+ byAccount Account-centric view of balances PortfolioV2TokenBalancesByAccountConnection!
155
+ byNetwork Network-centric view of balances PortfolioV2TokenBalancesByNetworkConnection!
156
+ Token Balance Node Fields​
157
+ Field Description Type
158
+ tokenAddress Token contract address String!
159
+ networkId Network identifier ID!
160
+ name Token name String!
161
+ symbol Token symbol String!
162
+ decimals Token decimal places Float!
163
+ price Current token price Float!
164
+ balance Total balance across all accounts Float!
165
+ balanceUSD USD value of total balance Float!
166
+ balanceRaw Raw balance amount (pre-decimal adjustment) String!
167
+ network Detailed network information NetworkObject!
168
+ imgUrl Token icon URL (deprecated) String!
169
+ imgUrlV2 Token icon URL (null if not found) String
170
+ Account Balance Fields​
171
+ Field Description Type
172
+ accountAddress Wallet address Address!
173
+ balance Token balance for this account Float!
174
+ balanceUSD USD value for this account Float!
175
+ balanceRaw Raw balance for this account String!
176
+ account Detailed account information Account!
177
+ Filtering Options​
178
+
179
+ The byToken query accepts several filtering parameters:
180
+
181
+ byToken(
182
+ first: Int = 25,
183
+ after: String,
184
+ filters: {
185
+ minBalanceUSD: Float
186
+ symbolLike: String
187
+ tokenAddress: String
188
+ includeTokensWithMissingPrices: Boolean
189
+ }
190
+ )
191
+
192
+
193
+ Similar filtering options are available for byAccount and byNetwork queries.
194
+
195
+ TIP
196
+
197
+ When working with raw balances, remember to adjust for token decimals. For example, a balanceRaw of "1000000000000000000" with 18 decimals represents 1.0 tokens.
198
+
199
+ appBalances​
200
+
201
+ View positions within onchain applications like lending protocols, DEXes, etc.
202
+
203
+ Try it now
204
+ Key Features​
205
+ Real-time Computation: No separate computation jobs needed
206
+ Flexible Querying: View app positions by app, account, meta-type, network, or token
207
+ Detailed Position Data: Complete position metadata and underlying assets
208
+ Account-level Breakdown: See individual wallet contributions to positions
209
+ Key Fields​
210
+ totalBalanceUSD: Total value of all app positions
211
+ byApp: View positions grouped by application
212
+ byAccount: View positions grouped by wallet address (useful for accounts with smart accounts)
213
+ byMetaType: View positions grouped by their classification (SUPPLIED, BORROWED, etc.)
214
+ byNetwork: View positions grouped by blockchain network
215
+ byToken: View positions grouped by underlying token
216
+
217
+ Position balances come in two types that require GraphQL fragments to access their specific fields:
218
+
219
+ AppTokenPositionBalance (for fungible tokens like LP tokens):
220
+
221
+ type: "app-token"
222
+ balance: Token balance
223
+ balanceUSD: USD value
224
+ price: Token price
225
+ symbol: Token symbol
226
+ tokens: Array of underlying tokens
227
+
228
+ ContractPositionBalance (for positions like a lending position):
229
+
230
+ type: "contract-position"
231
+ balanceUSD: Position USD value
232
+ tokens: Array of underlying tokens with their meta-types
233
+ displayProps: Formatted data for UI rendering
234
+ Example Variables​
235
+ {
236
+ "addresses": ["0xaf06a5ee843215e156e1b42efbc4de5404607164"],
237
+ "first": 5,
238
+ "chainIds": [8453], // Optional (Returns all chains when omitted)
239
+ }
240
+
241
+ Example App Balance Query​
242
+ query AppBalances($addresses: [Address!]!, $first: Int = 10) {
243
+ portfolioV2(addresses: $addresses) {
244
+ appBalances {
245
+ # Total value of all app positions
246
+ totalBalanceUSD
247
+
248
+ # Group positions by application
249
+ byApp(first: $first) {
250
+ totalCount
251
+ edges {
252
+ node {
253
+ # App metadata
254
+ balanceUSD
255
+ app {
256
+ displayName
257
+ imgUrl
258
+ description
259
+ slug
260
+ url
261
+ category {
262
+ name
263
+ }
264
+ }
265
+ network {
266
+ name
267
+ slug
268
+ chainId
269
+ evmCompatible
270
+ }
271
+
272
+ # Position details with underlying assets
273
+ positionBalances(first: 10) {
274
+ edges {
275
+ node {
276
+ # App token positions (e.g. LP tokens, wstETH, wrapped tokens)
277
+ ... on AppTokenPositionBalance {
278
+ type
279
+ address
280
+ network
281
+ symbol
282
+ decimals
283
+ balance
284
+ balanceUSD
285
+ price
286
+ appId
287
+ groupId
288
+ groupLabel
289
+ supply
290
+ pricePerShare
291
+
292
+ # LEVEL 1: Direct underlying tokens (e.g. wstETH -> stETH)
293
+ tokens {
294
+ # Base tokens at level 1 (e.g. USDC, DAI in a LP)
295
+ ... on BaseTokenPositionBalance {
296
+ type
297
+ address
298
+ network
299
+ balance
300
+ balanceUSD
301
+ price
302
+ symbol
303
+ decimals
304
+ }
305
+
306
+ # App tokens at level 1 (e.g. stETH underlying wstETH)
307
+ ... on AppTokenPositionBalance {
308
+ type
309
+ address
310
+ network
311
+ balance
312
+ balanceUSD
313
+ price
314
+ symbol
315
+ decimals
316
+ appId
317
+ supply
318
+ pricePerShare
319
+
320
+ # LEVEL 2: Underlying of the underlying (e.g. stETH -> ETH)
321
+ tokens {
322
+ # Base tokens at level 2
323
+ ... on BaseTokenPositionBalance {
324
+ type
325
+ address
326
+ network
327
+ balance
328
+ balanceUSD
329
+ price
330
+ symbol
331
+ decimals
332
+ }
333
+
334
+ # App tokens at level 2 (for complex nested positions)
335
+ ... on AppTokenPositionBalance {
336
+ type
337
+ address
338
+ network
339
+ balance
340
+ balanceUSD
341
+ price
342
+ symbol
343
+ decimals
344
+ appId
345
+ supply
346
+ pricePerShare
347
+
348
+ # LEVEL 3: Third level of underlying tokens
349
+ # This covers cases like: complexLP -> simpleLP -> baseTokens
350
+ tokens {
351
+ # Usually base tokens at this level
352
+ ... on BaseTokenPositionBalance {
353
+ type
354
+ address
355
+ network
356
+ balance
357
+ balanceUSD
358
+ price
359
+ symbol
360
+ decimals
361
+ }
362
+
363
+ # Rare but possible: another app token
364
+ ... on AppTokenPositionBalance {
365
+ type
366
+ address
367
+ network
368
+ balance
369
+ balanceUSD
370
+ price
371
+ symbol
372
+ decimals
373
+ appId
374
+ supply
375
+ pricePerShare
376
+ # Continue returning underlying tokens if needed
377
+ }
378
+ }
379
+ }
380
+ }
381
+ }
382
+ }
383
+
384
+ # Detailed display properties
385
+ displayProps {
386
+ label
387
+ images
388
+ balanceDisplayMode
389
+ }
390
+ }
391
+
392
+ # Contract positions (e.g. lending, farming, vaults)
393
+ ... on ContractPositionBalance {
394
+ type
395
+ address
396
+ network
397
+ appId
398
+ groupId
399
+ groupLabel
400
+ balanceUSD
401
+
402
+ # Underlying tokens with meta-types (SUPPLIED, BORROWED, CLAIMABLE, etc.)
403
+ tokens {
404
+ metaType
405
+ token {
406
+ # LEVEL 1: Direct tokens in the contract position
407
+ # Base tokens (e.g. supplied USDC)
408
+ ... on BaseTokenPositionBalance {
409
+ type
410
+ address
411
+ network
412
+ balance
413
+ balanceUSD
414
+ price
415
+ symbol
416
+ decimals
417
+ }
418
+
419
+ # App tokens in contract positions (e.g. supplied aUSDC)
420
+ ... on AppTokenPositionBalance {
421
+ type
422
+ address
423
+ network
424
+ balance
425
+ balanceUSD
426
+ price
427
+ symbol
428
+ decimals
429
+ appId
430
+ supply
431
+ pricePerShare
432
+
433
+ # LEVEL 2: Underlying of app tokens in contract positions
434
+ tokens {
435
+ # Base tokens at level 2
436
+ ... on BaseTokenPositionBalance {
437
+ type
438
+ address
439
+ network
440
+ balance
441
+ balanceUSD
442
+ price
443
+ symbol
444
+ decimals
445
+ }
446
+
447
+ # App tokens at level 2
448
+ ... on AppTokenPositionBalance {
449
+ type
450
+ address
451
+ network
452
+ balance
453
+ balanceUSD
454
+ price
455
+ symbol
456
+ decimals
457
+ appId
458
+ supply
459
+ pricePerShare
460
+
461
+ # LEVEL 3: Third level for complex contract positions
462
+ tokens {
463
+ # Base tokens at level 3
464
+ ... on BaseTokenPositionBalance {
465
+ type
466
+ address
467
+ network
468
+ balance
469
+ balanceUSD
470
+ price
471
+ symbol
472
+ decimals
473
+ }
474
+
475
+ # App tokens at level 3 (rare but possible)
476
+ ... on AppTokenPositionBalance {
477
+ type
478
+ address
479
+ network
480
+ balance
481
+ balanceUSD
482
+ price
483
+ symbol
484
+ decimals
485
+ appId
486
+ supply
487
+ pricePerShare
488
+ # Not going deeper than 3 levels
489
+ }
490
+ }
491
+ }
492
+ }
493
+ }
494
+
495
+ # NFT positions (no further nesting needed)
496
+ ... on NonFungiblePositionBalance {
497
+ type
498
+ address
499
+ network
500
+ balance
501
+ balanceUSD
502
+ price
503
+ symbol
504
+ decimals
505
+ }
506
+ }
507
+ }
508
+
509
+ # Detailed display properties
510
+ displayProps {
511
+ label
512
+ images
513
+ balanceDisplayMode
514
+ }
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+ }
521
+ }
522
+ }
523
+ }
524
+ }
525
+
526
+ Example Response​
527
+ {
528
+ "data": {
529
+ "portfolioV2": {
530
+ "appBalances": {
531
+ "totalBalanceUSD": 23939642.91719707,
532
+ "byApp": {
533
+ "totalCount": 1,
534
+ "edges": [
535
+ {
536
+ "node": {
537
+ "balanceUSD": 23939642.91719707,
538
+ "app": {
539
+ "displayName": "Lido",
540
+ "imgUrl": "https://storage.googleapis.com/zapper-fi-assets/apps%2Flido.png",
541
+ "description": "Simplified and secure participation in staking",
542
+ "slug": "lido",
543
+ "url": "https://lido.fi/",
544
+ "category": {
545
+ "name": "Staking"
546
+ }
547
+ },
548
+ "network": {
549
+ "name": "Ethereum",
550
+ "slug": "ethereum",
551
+ "chainId": 1,
552
+ "evmCompatible": true
553
+ },
554
+ "positionBalances": {
555
+ "edges": [
556
+ {
557
+ "node": {
558
+ "type": "app-token",
559
+ "address": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",
560
+ "network": "ETHEREUM_MAINNET",
561
+ "symbol": "wstETH",
562
+ "decimals": 18,
563
+ "balance": "7880.037743210678",
564
+ "balanceUSD": 23939642.91719707,
565
+ "price": 3038.01119960664,
566
+ "appId": "lido",
567
+ "groupId": "wsteth",
568
+ "groupLabel": "wstETH",
569
+ "supply": 3461283.5529221934,
570
+ "pricePerShare": [
571
+ 1.2056461174237205
572
+ ],
573
+ "tokens": [
574
+ {
575
+ "type": "app-token",
576
+ "address": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84",
577
+ "network": "ETHEREUM_MAINNET",
578
+ "balance": "9500.536910254332",
579
+ "balanceUSD": 23939642.91719707,
580
+ "price": 2519.82,
581
+ "symbol": "stETH",
582
+ "decimals": 18,
583
+ "appId": "lido",
584
+ "supply": 9122602.975724617,
585
+ "pricePerShare": [
586
+ 1
587
+ ],
588
+ "tokens": [
589
+ {
590
+ "type": "base-token",
591
+ "address": "0x0000000000000000000000000000000000000000",
592
+ "network": "ETHEREUM_MAINNET",
593
+ "balance": "9500.536910254332",
594
+ "balanceUSD": 23939642.91719707,
595
+ "price": 2519.82,
596
+ "symbol": "ETH",
597
+ "decimals": 18
598
+ }
599
+ ]
600
+ }
601
+ ],
602
+ "displayProps": {
603
+ "label": "wstETH",
604
+ "images": [
605
+ "https://storage.googleapis.com/zapper-fi-assets/tokens/ethereum/0x0000000000000000000000000000000000000000.png"
606
+ ],
607
+ "balanceDisplayMode": null
608
+ }
609
+ }
610
+ }
611
+ ]
612
+ }
613
+ }
614
+ }
615
+ ]
616
+ }
617
+ }
618
+ }
619
+ }
620
+ }
621
+
622
+ App Balances by Network​
623
+
624
+ View all app positions grouped by network:
625
+
626
+ query AppBalancesByNetwork($addresses: [Address!]!) {
627
+ portfolioV2(addresses: $addresses) {
628
+ appBalances {
629
+ byNetwork(first: 10) {
630
+ totalCount
631
+ edges {
632
+ node {
633
+ network {
634
+ name
635
+ slug
636
+ chainId
637
+ }
638
+ balanceUSD
639
+ }
640
+ }
641
+ }
642
+ }
643
+ }
644
+ }
645
+
646
+ NOTE
647
+
648
+ Smart accounts like Maker's DSProxy are automatically included in balance responses as part of an "implicit" bundle. For a breakdown by account use the byAccount field.
649
+
650
+ Main Fields​
651
+ Field Description Type
652
+ totalBalanceUSD Total value of all app positions in USD Float!
653
+ byApp Positions grouped by application Connection!
654
+ byAccount Positions grouped by wallet address Connection!
655
+ byMetaType Positions grouped by classification Connection!
656
+ byNetwork Positions grouped by blockchain network Connection!
657
+ byToken Positions grouped by underlying token Connection!
658
+ App Position Fields​
659
+ Field Description Type
660
+ appId Application identifier ID!
661
+ balanceUSD Total value in this app Float!
662
+ app App metadata (name, description, etc.) App!
663
+ network Network information NetworkObject!
664
+ accountBalances Breakdown by wallet address Connection!
665
+ balances Detailed position information Connection!
666
+ Position Types​
667
+ AppTokenPositionBalance (For LP tokens, yield tokens, etc.)​
668
+ Field Description Type
669
+ type Position type ("app-token") String!
670
+ address Token contract address String!
671
+ balance Token balance String!
672
+ balanceUSD USD value of position Float!
673
+ price Token price Float!
674
+ symbol Token symbol String!
675
+ tokens Underlying tokens [AbstractToken!]!
676
+ displayProps UI display properties DisplayProps
677
+ ContractPositionBalance (For lending, staking positions, etc.)​
678
+ Field Description Type
679
+ type Position type ("contract-position") String!
680
+ address Contract address String!
681
+ balanceUSD USD value of position Float!
682
+ tokens Underlying tokens with meta-types [TokenWithMetaType!]!
683
+ displayProps UI display properties DisplayProps
684
+ Meta-Type Values​
685
+
686
+ The metaType field indicates the role of tokens within positions:
687
+
688
+ Value Description
689
+ SUPPLIED Tokens supplied to a protocol
690
+ BORROWED Tokens borrowed from a protocol
691
+ CLAIMABLE Tokens that can be claimed as rewards
692
+ VESTING Tokens that are currently vesting
693
+ LOCKED Tokens that are locked in a protocol
694
+ Best Practices​
695
+
696
+ Use fragments for position types: Since app positions can be either AppTokenPositionBalance or ContractPositionBalance, always use fragments to properly access all fields.
697
+
698
+ Filter low-value positions: Use the minBalanceUSD filter to exclude dust or low-value positions from results:
699
+
700
+ byApp(first: 10, filters: { minBalanceUSD: 10 })
701
+
702
+
703
+ Include proxy accounts: Set includeProxyAccounts: true to see positions held in smart contract wallets:
704
+
705
+ portfolioV2(addresses: $addresses, includeProxyAccounts: true)
706
+
707
+
708
+ Handle token decimals: Remember to adjust token balances based on their decimals field.
709
+
710
+ nftBalances​
711
+
712
+ Get all NFTs held by address(s), with complete metadata, estimated USD valuations, and flexible filters and ordering.
713
+
714
+ Try it now
715
+ Key Features​
716
+ Flexible Querying: View NFT holdings by network, collection, or individual tokens
717
+ Detailed NFT metadata: Complete collection and token metadata
718
+ USD Valuations: Get estimated USD values for NFTs
719
+ Filters: Filter by name, network, min USD value, or hidden (spam)
720
+ Ordering: Order by USD value or recently received
721
+ Key Fields​
722
+ totalBalanceUSD: Total estimated value of all NFT holdings
723
+ totalTokensOwned: Total number of NFTs owned, including multiple copies of ERC-1155s
724
+ byNetwork: View NFTs grouped by blockchain network
725
+ byCollection: View NFTs grouped by collection
726
+ byToken: View individual NFT tokens with details
727
+ Example Variables​
728
+ {
729
+ "addresses": ["0x52c8ff44260056f896e20d8a43610dd88f05701b"],
730
+ "first": 10,
731
+ "chainIds": [8453], // Optional (Returns all chains when omitted)
732
+ "order": {
733
+ "by": "USD_WORTH" // Or LAST_RECEIVED
734
+ },
735
+ }
736
+
737
+ Example Query​
738
+ query NFTBalances_USDSorted(
739
+ $addresses: [Address!]!
740
+ $first: Int
741
+ $order: PortfolioV2NftBalanceByTokenInputInput
742
+ $filters: PortfolioV2NftBalanceByTokenFiltersInput
743
+ ) {
744
+ portfolioV2(addresses: $addresses) {
745
+ nftBalances {
746
+ totalBalanceUSD
747
+ totalTokensOwned
748
+ byToken(first: $first, order: $order, filters: $filters) {
749
+ edges {
750
+ node {
751
+ lastReceived
752
+ token {
753
+ tokenId
754
+ name
755
+ description
756
+ supply
757
+ circulatingSupply
758
+ estimatedValue {
759
+ valueUsd
760
+ valueWithDenomination
761
+ denomination {
762
+ address
763
+ symbol
764
+ network
765
+ }
766
+ }
767
+ collection {
768
+ network
769
+ address
770
+ name
771
+ type
772
+ deployer
773
+ deployedAt
774
+ owner
775
+ medias {
776
+ logo {
777
+ mimeType
778
+ fileSize
779
+ blurhash
780
+ height
781
+ width
782
+ originalUri
783
+ original
784
+ large
785
+ medium
786
+ thumbnail
787
+ predominantColor
788
+ }
789
+ }
790
+ }
791
+ mediasV3 {
792
+ images {
793
+ edges {
794
+ node {
795
+ mimeType
796
+ fileSize
797
+ blurhash
798
+ height
799
+ width
800
+ originalUri
801
+ original
802
+ thumbnail
803
+ medium
804
+ large
805
+ predominantColor
806
+ }
807
+ }
808
+ }
809
+ }
810
+ }
811
+ }
812
+ }
813
+ }
814
+ }
815
+ }
816
+ }
817
+
818
+ Example Response​
819
+ {
820
+ "data": {
821
+ "portfolioV2": {
822
+ "nftBalances": {
823
+ "totalBalanceUSD": 7330.6878496656,
824
+ "totalTokensOwned": "31134",
825
+ "byToken": {
826
+ "edges": [
827
+ {
828
+ "node": {
829
+ "lastReceived": 1734041699000,
830
+ "token": {
831
+ "tokenId": "10407",
832
+ "name": "Lil Pudgy #10407",
833
+ "description": "Lil Pudgys are a collection of 22,222 randomly generated NFTs minted on Ethereum.",
834
+ "supply": "1",
835
+ "circulatingSupply": "1",
836
+ "estimatedValue": {
837
+ "valueUsd": 2671.701185940551,
838
+ "valueWithDenomination": 1.4814883824848697,
839
+ "denomination": {
840
+ "address": "0x0000000000000000000000000000000000000000",
841
+ "symbol": "ETH",
842
+ "network": "ethereum"
843
+ }
844
+ },
845
+ "collection": {
846
+ "network": "ETHEREUM_MAINNET",
847
+ "address": "0x524cab2ec69124574082676e6f654a18df49a048",
848
+ "name": "LilPudgys",
849
+ "type": "GENERAL",
850
+ "deployer": "0xe9da256a28630efdc637bfd4c65f0887be1aeda8",
851
+ "deployedAt": 1639933745000,
852
+ "owner": "0xe9da256a28630efdc637bfd4c65f0887be1aeda8",
853
+ "medias": {
854
+ "logo": {
855
+ "mimeType": "image/png",
856
+ "fileSize": 5962,
857
+ "blurhash": "URHyw=WZ0stTN2j?xuWD0ut8^aj[?vWYIUt6",
858
+ "height": 250,
859
+ "width": 250,
860
+ "originalUri": "https://storage.googleapis.com/zapper-fi-assets/nfts/collections/ethereum/0x524cab2ec69124574082676e6f654a18df49a048/logo.png",
861
+ "original": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x524cab2ec69124574082676e6f654a18df49a048/logo.png&checksum=VklwQoOgHYKsPj8GPZ1FDTXN8hPPSaVBjHCmiQ7vZy8",
862
+ "large": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x524cab2ec69124574082676e6f654a18df49a048/logo.png&width=500&checksum=NlRY3lUeBcOFw3CzxcAGAQKxOLw3JhreqJ38BZTC9D0",
863
+ "medium": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x524cab2ec69124574082676e6f654a18df49a048/logo.png&width=250&checksum=VPxH2Ejt_0dOcWCesNcsfQYZgcGYPIFERQexdytLyP0",
864
+ "thumbnail": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x524cab2ec69124574082676e6f654a18df49a048/logo.png&width=100&checksum=BFebU_PxxIAdlqld0-cJ_M0bjMTd3qTBRdFx02pBX5M",
865
+ "predominantColor": "#9ab3ed"
866
+ }
867
+ }
868
+ },
869
+ "mediasV3": {
870
+ "images": {
871
+ "edges": [
872
+ {
873
+ "node": {
874
+ "mimeType": "image/png",
875
+ "fileSize": 181886,
876
+ "blurhash": "UPQ4c{$j_$+^{0n%CRX8s;jtS0bFtlbHv#n%",
877
+ "height": 2700,
878
+ "width": 2700,
879
+ "originalUri": "https://api.pudgypenguins.io/lil/image/10407",
880
+ "original": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/fa856d9f7907ea90f93067a80cfe2a84be04242e834306ddcbe25876438a8684.png&checksum=fRHieiOCQj_0piw8VZc-HDP-f5Uy8cl4p99Dx-66ycM",
881
+ "thumbnail": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/fa856d9f7907ea90f93067a80cfe2a84be04242e834306ddcbe25876438a8684.png&width=100&checksum=oDAXzMIzWvlGOLbb1nN8IWKl4_B26B840wd6CXwhSWw",
882
+ "medium": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/fa856d9f7907ea90f93067a80cfe2a84be04242e834306ddcbe25876438a8684.png&width=250&checksum=jiyBP_I0JxBPasrg273qHzkTPOfnzRyMCdHakPTV-vk",
883
+ "large": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/fa856d9f7907ea90f93067a80cfe2a84be04242e834306ddcbe25876438a8684.png&width=500&checksum=Ndb7k_Uoscl4oQ8vjoCCLljQcDG7BvtTV-SQ6w6JDRM",
884
+ "predominantColor": "#e35063"
885
+ }
886
+ }
887
+ ]
888
+ }
889
+ }
890
+ }
891
+ }
892
+ },
893
+ {
894
+ "node": {
895
+ "lastReceived": 1734390407000,
896
+ "token": {
897
+ "tokenId": "11410",
898
+ "name": "Opepen 11410",
899
+ "description": "This artwork may or may not be handmade.",
900
+ "supply": "1",
901
+ "circulatingSupply": "1",
902
+ "estimatedValue": {
903
+ "valueUsd": 458.7449105987138,
904
+ "valueWithDenomination": 0.2543792169395613,
905
+ "denomination": {
906
+ "address": "0x0000000000000000000000000000000000000000",
907
+ "symbol": "ETH",
908
+ "network": "ethereum"
909
+ }
910
+ },
911
+ "collection": {
912
+ "network": "ETHEREUM_MAINNET",
913
+ "address": "0x6339e5e072086621540d0362c4e3cea0d643e114",
914
+ "name": "Opepen Edition",
915
+ "type": "GENERAL",
916
+ "deployer": "0xf74b146ce44cc162b601dec3be331784db111dc1",
917
+ "deployedAt": 1673205671000,
918
+ "owner": "0xc8f8e2f59dd95ff67c3d39109eca2e2a017d4c8a",
919
+ "medias": {
920
+ "logo": {
921
+ "mimeType": "image/png",
922
+ "fileSize": 13075,
923
+ "blurhash": "USFsZ5?wWBj]%NWBWBofa#Riaef6ogazayj[",
924
+ "height": 250,
925
+ "width": 250,
926
+ "originalUri": "https://storage.googleapis.com/zapper-fi-assets/nfts/collections/ethereum/0x6339e5e072086621540d0362c4e3cea0d643e114/logo.png",
927
+ "original": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x6339e5e072086621540d0362c4e3cea0d643e114/logo.png&checksum=rc8N2fjdu3WxsdZAkJK2NuTJ_ZWfQyn3DpIngJ4oMX8",
928
+ "large": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x6339e5e072086621540d0362c4e3cea0d643e114/logo.png&width=500&checksum=pOMoxeVP5zir59MtGm692O8j2MGyJzh0g_dxzoaiBAM",
929
+ "medium": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x6339e5e072086621540d0362c4e3cea0d643e114/logo.png&width=250&checksum=0xvI1F84R9aW5NeNLJJGlJ8EdjRF2ZDWzT5hM9y-guY",
930
+ "thumbnail": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/collections/ethereum/0x6339e5e072086621540d0362c4e3cea0d643e114/logo.png&width=100&checksum=kepZS3NVGOfheaxy4Hq9bKwqjDeyqSLaC42dmxASbd0",
931
+ "predominantColor": "#8897a9"
932
+ }
933
+ }
934
+ },
935
+ "mediasV3": {
936
+ "images": {
937
+ "edges": [
938
+ {
939
+ "node": {
940
+ "mimeType": "image/png",
941
+ "fileSize": 28712,
942
+ "blurhash": "U03l5Ot700M{D%Rj-;WB00Rj~qay00Rj_3ay",
943
+ "height": 1400,
944
+ "width": 1400,
945
+ "originalUri": "ipfs://QmVXvZ5Sp6aSDBrWvtJ5gZ3bwNWRqqY3iPvyF8nveWj5HF/40.png",
946
+ "original": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/19c1f0ba5396e3fd79b06122557eb81924f1b8a782d731e616d54576ed4e1317.png&checksum=aZqb1HchmOlEo-5jrdn7kKojpyllaESyBm2KFmXCUvc",
947
+ "thumbnail": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/19c1f0ba5396e3fd79b06122557eb81924f1b8a782d731e616d54576ed4e1317.png&width=100&checksum=1LDcOITKGytwQuG6EnfFOZV9Z_kiiFjCL9Bn4klYW9I",
948
+ "medium": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/19c1f0ba5396e3fd79b06122557eb81924f1b8a782d731e616d54576ed4e1317.png&width=250&checksum=dlYO9zWHV0YdHKPeuyapwm6ZouiwbVkUsSTUPiZiAfk",
949
+ "large": "https://images.zapper.xyz/z/?path=zapper-fi-assets/nfts/medias/19c1f0ba5396e3fd79b06122557eb81924f1b8a782d731e616d54576ed4e1317.png&width=500&checksum=4ICCFrmEAAeSAnAMFwnvb4RgIAXLwI3Bp8wCMIMGyl4",
950
+ "predominantColor": "#1f1f1f"
951
+ }
952
+ }
953
+ ]
954
+ }
955
+ }
956
+ }
957
+ }
958
+ }
959
+ ]
960
+ }
961
+ }
962
+ }
963
+ }
964
+ }
965
+
966
+
967
+ Flexible Ordering​
968
+ {
969
+ "by": "USD_WORTH" // Orders NFTs by their USD value (default)
970
+ // OR
971
+ "by": "LAST_RECEIVED" // Orders NFTs by when they were last received
972
+ }
973
+
974
+ byNetwork​
975
+
976
+ View NFT balances grouped by chain with optional ordering and filtering:
977
+
978
+ byNetwork(
979
+ first: Int = 25,
980
+ after: String,
981
+ filters: {
982
+ minBalanceUSD: Float, // Minimum USD value threshold
983
+ hidden: Boolean, // Include/exclude hidden NFTs
984
+ chainId: Int // Filter by specific chain
985
+ },
986
+ order: {
987
+ by: PortfolioV2NftOrderByOption // USD_WORTH or LAST_RECEIVED
988
+ }
989
+ )
990
+
991
+ byCollection​
992
+
993
+ View NFT balances grouped by collection with additional filtering options:
994
+
995
+ byCollection(
996
+ first: Int = 25,
997
+ after: String,
998
+ filters: {
999
+ collectionName: String, // Filter by collection name
1000
+ hidden: Boolean, // Include/exclude hidden NFTs
1001
+ chainId: Int // Filter by specific chain
1002
+ },
1003
+ order: {
1004
+ by: PortfolioV2NftOrderByOption // USD_WORTH or LAST_RECEIVED
1005
+ }
1006
+ )
1007
+
1008
+ byToken​
1009
+
1010
+ Access individual NFT tokens with detailed filtering options:
1011
+
1012
+ byToken(
1013
+ first: Int = 25,
1014
+ after: String,
1015
+ filters: {
1016
+ hidden: Boolean, // Include/exclude hidden NFTs
1017
+ chainId: Int // Filter by specific chain
1018
+ },
1019
+ order: {
1020
+ by: PortfolioV2NftOrderByOption // USD_WORTH or LAST_RECEIVED
1021
+ }
1022
+ )
1023
+
1024
+ Common Filter Options​
1025
+
1026
+ All query methods support these common filtering parameters:
1027
+
1028
+ Parameter Type Description
1029
+ hidden Boolean When true, returns only NFTs marked as hidden by the user
1030
+ chainId Int Filter NFTs by a specific blockchain network
1031
+ collections - Input an address and chainId to NFTs from a specific collection
1032
+ Filter by specific collections​
1033
+ {
1034
+ "addresses": ["0x3d280fde2ddb59323c891cf30995e1862510342f"],
1035
+ "first": 10,
1036
+ "filters": {
1037
+ "collections": [
1038
+ {
1039
+ "address": "0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb",
1040
+ "chainId": 1
1041
+ }
1042
+ ]
1043
+ }
1044
+ }
1045
+
1046
+ Best Practices​
1047
+ Use order by value for portfolio displays: Sort by USD_WORTH for financial portfolio views
1048
+ Use order by time for activity views: Sort by LAST_RECEIVED when showing recent acquisitions
1049
+ Handle low-value NFTs: Consider using minBalanceUSD to filter out low-value or unsellable NFTs
1050
+ 4. Portfolio Totals​
1051
+
1052
+ Get aggregated portfolio values and breakdowns with portfolioV2 by using the totalBalanceUSD fields from different sections:
1053
+
1054
+ Try it now
1055
+ Key Fields​
1056
+ tokenBalances.totalBalanceUSD: Total value of token balances
1057
+ appBalances.totalBalanceUSD: Total value of app positions
1058
+ nftBalances.totalBalanceUSD: Total value of NFTs
1059
+ byNetwork: Network breakdowns available in tokenBalances, appBalances, and nftBalances
1060
+ byAccount: Account breakdowns
1061
+ byToken: Token-specific breakdowns (in appBalances)
1062
+ byMetaType: Type-specific breakdowns (in appBalances, includes CLAIMABLE tokens)
1063
+ Example Variables​
1064
+ {
1065
+ "addresses": ["0x849151d7d0bf1f34b70d5cad5149d28cc2308bf1"],
1066
+ "first": 20
1067
+ }
1068
+
1069
+ Example Query​
1070
+ query PortfolioV2Totals($addresses: [Address!]!, $first: Int) {
1071
+ portfolioV2(addresses: $addresses) {
1072
+ # Token balances total
1073
+ tokenBalances {
1074
+ totalBalanceUSD
1075
+ # Network breakdown for tokens
1076
+ byNetwork(first: $first) {
1077
+ edges {
1078
+ node {
1079
+ network {
1080
+ name
1081
+ slug
1082
+ chainId
1083
+ }
1084
+ balanceUSD
1085
+ }
1086
+ }
1087
+ }
1088
+ }
1089
+
1090
+ # NFT balances total
1091
+ nftBalances {
1092
+ totalBalanceUSD
1093
+ # Network breakdown for NFTs
1094
+ byNetwork(first: $first) {
1095
+ edges {
1096
+ node {
1097
+ network {
1098
+ name
1099
+ slug
1100
+ chainId
1101
+ }
1102
+ balanceUSD
1103
+ }
1104
+ }
1105
+ }
1106
+ }
1107
+
1108
+ # App balances (e.g., DeFi postions) total
1109
+ appBalances {
1110
+ totalBalanceUSD
1111
+ # Network breakdown for app positions
1112
+ byNetwork(first: $first) {
1113
+ edges {
1114
+ node {
1115
+ network {
1116
+ name
1117
+ slug
1118
+ chainId
1119
+ }
1120
+ balanceUSD
1121
+ }
1122
+ }
1123
+ }
1124
+ }
1125
+ }
1126
+ }
1127
+
1128
+ Getting Overall Portfolio Value​
1129
+
1130
+ To get an aggregate net worth of a portfolio sum the totalBalanceUSD from tokenBalances, appBalances, and nftBalances
1131
+
1132
+ Example Response​
1133
+ {
1134
+ "data": {
1135
+ "portfolioV2": {
1136
+ "tokenBalances": {
1137
+ "totalBalanceUSD": 225590.09863164127,
1138
+ "byNetwork": {
1139
+ "edges": [
1140
+ {
1141
+ "node": {
1142
+ "network": {
1143
+ "name": "Base",
1144
+ "slug": "base",
1145
+ "chainId": 8453
1146
+ },
1147
+ "balanceUSD": 221754.1899751895
1148
+ }
1149
+ },
1150
+ {
1151
+ "node": {
1152
+ "network": {
1153
+ "name": "ZKsync",
1154
+ "slug": "zksync",
1155
+ "chainId": 324
1156
+ },
1157
+ "balanceUSD": 1229.80913712
1158
+ }
1159
+ },
1160
+ {
1161
+ "node": {
1162
+ "network": {
1163
+ "name": "Optimism",
1164
+ "slug": "optimism",
1165
+ "chainId": 10
1166
+ },
1167
+ "balanceUSD": 975.3859591021923
1168
+ }
1169
+ }
1170
+ ]
1171
+ }
1172
+ },
1173
+ "nftBalances": {
1174
+ "totalBalanceUSD": 62906.44492750787,
1175
+ "byNetwork": {
1176
+ "edges": [
1177
+ {
1178
+ "node": {
1179
+ "network": {
1180
+ "name": "Base",
1181
+ "slug": "base",
1182
+ "chainId": 8453
1183
+ },
1184
+ "balanceUSD": 50749.39954198
1185
+ }
1186
+ },
1187
+ {
1188
+ "node": {
1189
+ "network": {
1190
+ "name": "Ethereum",
1191
+ "slug": "ethereum",
1192
+ "chainId": 1
1193
+ },
1194
+ "balanceUSD": 12117.4980912
1195
+ }
1196
+ },
1197
+ {
1198
+ "node": {
1199
+ "network": {
1200
+ "name": "Optimism",
1201
+ "slug": "optimism",
1202
+ "chainId": 10
1203
+ },
1204
+ "balanceUSD": 30.3182139
1205
+ }
1206
+ }
1207
+ ]
1208
+ }
1209
+ },
1210
+ "appBalances": {
1211
+ "totalBalanceUSD": 4410.540131308049,
1212
+ "byNetwork": {
1213
+ "edges": [
1214
+ {
1215
+ "node": {
1216
+ "network": {
1217
+ "name": "Base",
1218
+ "slug": "base",
1219
+ "chainId": 8453
1220
+ },
1221
+ "balanceUSD": 4393.335087708013
1222
+ }
1223
+ },
1224
+ {
1225
+ "node": {
1226
+ "network": {
1227
+ "name": "Ethereum",
1228
+ "slug": "ethereum",
1229
+ "chainId": 1
1230
+ },
1231
+ "balanceUSD": 16.714002810036998
1232
+ }
1233
+ },
1234
+ {
1235
+ "node": {
1236
+ "network": {
1237
+ "name": "Polygon",
1238
+ "slug": "polygon",
1239
+ "chainId": 137
1240
+ },
1241
+ "balanceUSD": 0.49104079000000006
1242
+ }
1243
+ }
1244
+ ]
1245
+ }
1246
+ }
1247
+ }
1248
+ }
1249
+ }
1250
+
1251
+ 5. Claimables​
1252
+
1253
+ In portfolioV2, claimable tokens are now part of app positions with a metaType of "CLAIMABLE". You can access them through the app balances with token filters.
1254
+
1255
+ Try it now
1256
+ Key Fields​
1257
+ metaType: Used to identify "CLAIMABLE" tokens within positions
1258
+ tokens: Contains claimable tokens with their balance, value, and metadata
1259
+ balanceUSD: Value of each claimable token
1260
+ Example Variables​
1261
+ {
1262
+ "addresses": ["0x849151d7d0bf1f34b70d5cad5149d28cc2308bf1"],
1263
+ "first": 5
1264
+ }
1265
+
1266
+ Example Query​
1267
+ query ClaimablesV2($addresses: [Address!]!) {
1268
+ portfolioV2(addresses: $addresses) {
1269
+ appBalances {
1270
+ # Get app balances and look for claimable tokens
1271
+ byApp(first: 10) {
1272
+ edges {
1273
+ node {
1274
+ app {
1275
+ displayName
1276
+ slug
1277
+ }
1278
+ network {
1279
+ name
1280
+ slug
1281
+ }
1282
+ balances(first: 10) {
1283
+ edges {
1284
+ node {
1285
+ ... on ContractPositionBalance {
1286
+ address
1287
+ balanceUSD
1288
+ tokens {
1289
+ # Look for CLAIMABLE meta-type
1290
+ metaType
1291
+ token {
1292
+ ... on BaseTokenPositionBalance {
1293
+ address
1294
+ network
1295
+ balance
1296
+ balanceUSD
1297
+ symbol
1298
+ price
1299
+ decimals
1300
+ }
1301
+ }
1302
+ }
1303
+ displayProps {
1304
+ label
1305
+ images
1306
+ }
1307
+ }
1308
+ }
1309
+ }
1310
+ }
1311
+ }
1312
+ }
1313
+ }
1314
+ }
1315
+ }
1316
+ }
1317
+
1318
+ Example Response​
1319
+ {
1320
+ "data": {
1321
+ "portfolioV2": {
1322
+ "appBalances": {
1323
+ "byApp": {
1324
+ "edges": [
1325
+ {
1326
+ "node": {
1327
+ "app": {
1328
+ "displayName": "Uniswap V3",
1329
+ "slug": "uniswap-v3"
1330
+ },
1331
+ "network": {
1332
+ "name": "Base",
1333
+ "slug": "base"
1334
+ },
1335
+ "balances": {
1336
+ "edges": [
1337
+ {
1338
+ "node": {
1339
+ "address": "0x03a520b32c04bf3beef7beb72e919cf822ed34f1",
1340
+ "balanceUSD": 290.2802431386432,
1341
+ "tokens": [
1342
+ {
1343
+ "metaType": "SUPPLIED",
1344
+ "token": {
1345
+ "address": "0x00000000000007c8612ba63df8ddefd9e6077c97",
1346
+ "network": "BASE_MAINNET",
1347
+ "balance": "29351.972884702704",
1348
+ "balanceUSD": 238.5238178121461,
1349
+ "symbol": "⌘",
1350
+ "price": 0.00812633,
1351
+ "decimals": 18
1352
+ }
1353
+ },
1354
+ {
1355
+ "metaType": "SUPPLIED",
1356
+ "token": {
1357
+ "address": "0x4200000000000000000000000000000000000006",
1358
+ "network": "BASE_MAINNET",
1359
+ "balance": "0",
1360
+ "balanceUSD": 0,
1361
+ "symbol": "WETH",
1362
+ "price": 1872.93,
1363
+ "decimals": 18
1364
+ }
1365
+ },
1366
+ {
1367
+ "metaType": "CLAIMABLE",
1368
+ "token": {
1369
+ "address": "0x00000000000007c8612ba63df8ddefd9e6077c97",
1370
+ "network": "BASE_MAINNET",
1371
+ "balance": "1069.849937435888",
1372
+ "balanceUSD": 8.693953642083379,
1373
+ "symbol": "⌘",
1374
+ "price": 0.00812633,
1375
+ "decimals": 18
1376
+ }
1377
+ },
1378
+ {
1379
+ "metaType": "CLAIMABLE",
1380
+ "token": {
1381
+ "address": "0x4200000000000000000000000000000000000006",
1382
+ "network": "BASE_MAINNET",
1383
+ "balance": "0.022992034771408265",
1384
+ "balanceUSD": 43.06247168441369,
1385
+ "symbol": "WETH",
1386
+ "price": 1872.93,
1387
+ "decimals": 18
1388
+ }
1389
+ }
1390
+ ],
1391
+ "displayProps": {
1392
+ "label": "⌘ / WETH (Token ID: 1568607)",
1393
+ "images": [
1394
+ "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x00000000000007c8612ba63df8ddefd9e6077c97.png",
1395
+ "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x4200000000000000000000000000000000000006.png",
1396
+ "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x00000000000007c8612ba63df8ddefd9e6077c97.png",
1397
+ "https://storage.googleapis.com/zapper-fi-assets/tokens/base/0x4200000000000000000000000000000000000006.png"
1398
+ ]
1399
+ }
1400
+ }
1401
+ }
1402
+ ]
1403
+ }
1404
+ }
1405
+ },
1406
+ ]
1407
+ }
1408
+ }
1409
+ }
1410
+ }
1411
+ }
1412
+
1413
+ Use the byApp query to see claimable tokens in the context of their specific apps, filtering for tokens with metaType: "CLAIMABLE"
1414
+
1415
+ For applications building on top of this data, you'll typically want to:
1416
+
1417
+ Extract all tokens with metaType: "CLAIMABLE" from the app balances
1418
+ Present the user with a view of what they can claim, grouped by app or by token
1419
+ 6. App Balances By Type​
1420
+
1421
+ Get total balances by metaType (e.g, CLAIMABLE, SUPPLIED, BORROWED, etc.)
1422
+
1423
+ Try it now
1424
+ Balance Types​
1425
+ metaType: Used to identify the type of position
1426
+ positionCount: The number of positions with a given type
1427
+ balanceUSD: The total value in USD of positions with a given type
1428
+ enum metaType {
1429
+ SUPPLIED # Assets supplied to lending protocols
1430
+ BORROWED # Assets borrowed from lending protocols
1431
+ CLAIMABLE # Assets available to claim (rewards, airdrops, etc.)
1432
+ VESTING # Assets locked in vesting schedule
1433
+ LOCKED # Assets locked or staked in protocols
1434
+ NFT # Non-fungible token positions
1435
+ WALLET # Deposits in a wallet application
1436
+ }
1437
+
1438
+ Example Variables​
1439
+ {
1440
+ "addresses": ["0x849151d7d0bf1f34b70d5cad5149d28cc2308bf1"],
1441
+ "first": 10
1442
+ }
1443
+
1444
+ Example Query​
1445
+ query BreakdownByType($addresses: [Address!]!, $first: Int) {
1446
+ portfolioV2(addresses: $addresses) {
1447
+ appBalances {
1448
+ # Get app total balances by MetaType
1449
+ byMetaType(first: $first) {
1450
+ totalCount
1451
+ edges {
1452
+ node {
1453
+ metaType
1454
+ positionCount
1455
+ balanceUSD
1456
+ }
1457
+ }
1458
+ }
1459
+ }
1460
+ }
1461
+ }
1462
+
1463
+ Example Response​
1464
+ {
1465
+ "data": {
1466
+ "portfolioV2": {
1467
+ "appBalances": {
1468
+ "byMetaType": {
1469
+ "totalCount": 4,
1470
+ "edges": [
1471
+ {
1472
+ "node": {
1473
+ "metaType": "SUPPLIED",
1474
+ "positionCount": 9,
1475
+ "balanceUSD": 2440.56541427308
1476
+ }
1477
+ },
1478
+ {
1479
+ "node": {
1480
+ "metaType": "LOCKED",
1481
+ "positionCount": 1,
1482
+ "balanceUSD": 1217.68061929713
1483
+ }
1484
+ },
1485
+ {
1486
+ "node": {
1487
+ "metaType": "CLAIMABLE",
1488
+ "positionCount": 3,
1489
+ "balanceUSD": 755.86366790903
1490
+ }
1491
+ },
1492
+ {
1493
+ "node": {
1494
+ "metaType": "BORROWED",
1495
+ "positionCount": 1,
1496
+ "balanceUSD": -5.371015208905
1497
+ }
1498
+ }
1499
+ ]
1500
+ }
1501
+ }
1502
+ }
1503
+ }
1504
+ }
1505
+
1506
+ Best Practices​
1507
+ Always specify required fields to minimize response size
1508
+ Use network filters when you only need specific chains
1509
+ Consider caching responses based on the updatedAt timestamp
1510
+ Handle NFT valuations appropriately based on your use case
1511
+
1512
+ Remember that the portfolio query is highly flexible - you can request as much or as little data as needed for your specific use case.
1513
+
1514
+ Copy page for LLMs