> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vibechain.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Wallet holdings

> Read cards, sealed pack tokens, pending pulls and values for one wallet.

<Warning>
  vibe.market is an **experimental protocol**. Indexed holdings can lag the chain and values are display estimates, not execution quotes. Review the [Terms](https://vibechain.com/terms).
</Warning>

Building with an agent? Start with the [canonical skill.md](https://vibechain.com/skill.md), our single agent instruction file. This page is the human and API reference for wallet inventory.

## The current holdings endpoint

There is no aggregate `GET /api/vibemarket2/user/holdings` route. That path returns HTTP 404. Holdings are graph-scoped because the same numeric drop or card ID can exist in more than one deployment.

Use the `inventory` board resource for one wallet on one runtime graph:

```http theme={null}
GET https://build.vibechain.com/api/vibemarket2/runtime/{runtimeId}/board?resource=inventory&owner={wallet}&limit=100
API-KEY: {yourKey}
```

It returns the wallet's cards, sealed pack-token positions, pending pulls, estimated ETH totals and an opaque `next` cursor. It does not require a wallet signature or account session because this is indexed public blockchain data; it does require a registered API key.

## Register an API key

The registration endpoint is outside the `/api/vibemarket2` namespace. Send JSON with both fields:

```bash theme={null}
curl --fail-with-body https://build.vibechain.com/apikey/create \
  -H 'Content-Type: application/json' \
  --data '{"email":"developer@example.com","description":"Wallet holdings integration"}'
```

A successful response has HTTP 200 and includes `success: true`, `code: "201"` and `key`. Store that key and send it as `API-KEY`; do not create a new key per request or page load. See [authentication and limits](/docs/vibemarket/authentication).

## Discover the runtime ID

Do not hardcode the latest-looking runtime name. Read discovery first:

```bash theme={null}
curl --fail-with-body https://vibechain.com/api/vibemarket2/catalog/sources \
  -H "API-KEY: $VIBECHAIN_API_KEY"
```

Use a version's `runtimeId`. For an existing pack or asset, use the graph recorded by its catalog entry or slug result; `launchTarget` is only the destination for new launches. Older graphs remain relevant to historical holdings.

## Read one graph's inventory

```bash theme={null}
RUNTIME_ID='v6-robinhood-20260921-r5-paid'
WALLET='0x000000000000000000000000000000000000dEaD'

curl --fail-with-body --get \
  "https://build.vibechain.com/api/vibemarket2/runtime/$RUNTIME_ID/board" \
  -H "API-KEY: $VIBECHAIN_API_KEY" \
  --data-urlencode 'resource=inventory' \
  --data-urlencode "owner=$WALLET" \
  --data-urlencode 'limit=100'
```

An empty inventory has this shape:

```json theme={null}
{
  "address": "0x000000000000000000000000000000000000dead",
  "cards": [],
  "tokens": [],
  "pendingPulls": [],
  "totals": {
    "cardsValueEth": "0",
    "tokensValueEth": "0"
  },
  "next": null
}
```

* `cards` contains revealed claims and collected NFTs owned by the wallet.
* `tokens` contains sealed pack-token positions with lot counts and the current indexed pack price when available.
* `pendingPulls` contains openings that have not resolved yet.
* `cardsValueEth` and `tokensValueEth` are decimal ETH strings. `tokensValueEth` can be `null` when a position cannot be priced; do not treat that as zero.
* `next` is one opaque cursor spanning the claim, NFT and sealed-token indexes. Pass it back unchanged as `before`; stop only when it is `null`.

To build a wallet-wide view across market generations, make bounded inventory requests for each runtime your integration supports and qualify every item with `chainId`, `market`, `runtimeId` and its item ID. Do not merge two graphs merely because their numeric IDs or symbols match.

## Raw wallet indexes

Use the raw indexes when you need exact projected rows rather than the display-oriented inventory:

| Data | Route under `/api/vibemarket2` |
| - | - |
| Sealed pack balances | `GET /runtime/{runtimeId}/sealed?owner={wallet}&limit=100` |
| Claims, including opening state | `GET /runtime/{runtimeId}/claims?owner={wallet}&limit=100` |
| Collected NFT ownership | `GET /runtime/{runtimeId}/nfts?owner={wallet}&limit=100` |

These return `{items, next, head}`. Their cursors are independent; never reuse a cursor between resources, wallets or runtimes.

## Other core market APIs

| Need | Route under `/api/vibemarket2` |
| - | - |
| Runtime registry | `GET /runtime/versions` |
| Runtime catalog | `GET /runtime/{runtimeId}/catalog?after=0` |
| Display pack list | `GET /runtime/{runtimeId}/board?resource=drops&limit=100` |
| One indexed market | `GET /runtime/{runtimeId}/markets/{dropId}` |
| Pack trades | `GET /runtime/{runtimeId}/board?resource=trades&dropId={dropId}` |
| Pack candles | `GET /runtime/{runtimeId}/board?resource=candles&dropId={dropId}&res=1h` |
| Runtime readiness | `GET /runtime/{runtimeId}/health` |
| Live updates | `GET /runtime/{runtimeId}/stream?topics=catalog,pot,wallet:{lowercaseWallet}` |
| Resolve a website slug | `GET /runtime/pack-slugs/{slug}` |

Every request above uses the `https://build.vibechain.com/api/vibemarket2` base and requires `API-KEY`. See [reading the market](/docs/vibemarket/api) for pagination, freshness, errors and stream reconnection behavior, or the [complete operation reference](/api-reference/vibemarket-intro) for schemas.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.