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

# Collections

> Browse collections, read one, and get its real-time floor.

## Browse

```http theme={"system"}
GET /v1/collections
```

Cursor-paginated, with summary stats. EXC-launched collections rank first.

| Parameter | Type    | Default  |                                                                        |
| --------- | ------- | -------- | ---------------------------------------------------------------------- |
| `chain`   | enum    | —        | `solana`, `ethereum`, `polygon`, `base`, `ink`, `apechain`, `abstract` |
| `sort`    | enum    | `volume` | `volume`, `floor`, `recent`                                            |
| `limit`   | integer | `25`     |                                                                        |
| `cursor`  | string  | —        | From `pagination.nextCursor`                                           |

```bash theme={"system"}
curl "https://exclusivo.one/v1/collections?chain=base&sort=floor&limit=10"
```

Errors: `400`, `429`, `502`.

## One collection

```http theme={"system"}
GET /v1/collections/{id}
```

Identity comes from the stored record; stats are merged from two sources, each
timed out independently. You get floor in the chain's native currency, volume,
supply, owners and listed count.

This one **never returns 502**. A failing source degrades the response — null
fields, and `stale: true` only when both sources fail. Errors: `404`, `429`.

<Tip>
  This is where you get a **case-preserved** `contractAddress`. Never derive an
  address by slicing a `collectionId` — that value is lowercased for every chain,
  which breaks Solana base58.
</Tip>

<h2 id="floor">
  Floor
</h2>

```http theme={"system"}
GET /v1/collections/{id}/floor
```

Returns **two floors**, because they answer different questions:

|              |                                                                                       |
| ------------ | ------------------------------------------------------------------------------------- |
| `askFloor`   | The cheapest seller ask                                                               |
| `buyerFloor` | What a buyer actually pays for the cheapest fill, across EXC and outside marketplaces |

They aren't interchangeable. If you're showing a buyer "the floor", `buyerFloor`
is the honest number. If you're comparing against another aggregator's floor,
`askFloor` is usually the like-for-like one.

`stale: true` marks a last-known-good `buyerFloor`, and only happens on Solana
and Ethereum.

Never returns 502 — a total failure comes back as null floors with a `200`.
Returns `404` when the id doesn't resolve, or resolves to something with no
usable chain.

## Don't trust stored supply and floor

Indexed collection records carry `totalSupply` and `floorPrice` fields that go
stale quickly. We don't render them and neither should you — use the floor
endpoint, and treat supply from a collection record as indicative.

## Putting it together

```js theme={"system"}
const base = 'https://exclusivo.one/v1';

// 1. Browse
const list = await fetch(`${base}/collections?chain=solana&limit=5`).then(r => r.json());
const id = list.data[0].collectionId;

// 2. Detail — where the real, case-preserved address lives
const detail = await fetch(`${base}/collections/${id}`).then(r => r.json());
const address = detail.data.contractAddress;   // not id.split('_')[1]

// 3. Floor
const floor = await fetch(`${base}/collections/${id}/floor`).then(r => r.json());
console.log(floor.data.askFloor?.decimal, floor.data.buyerFloor?.decimal);
```

## Related

* [Listings](/api/marketplace/listings)
* [Sales](/api/marketplace/sales)
* [Tokens](/api/marketplace/tokens)
