> ## 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.

# Tokens

> One token — owner, rarity, its active listing and its last sale.

```http theme={"system"}
GET /v1/tokens/{chain}/{address}/{tokenId}
```

| Path parameter | EVM                                                          | Solana                  |
| -------------- | ------------------------------------------------------------ | ----------------------- |
| `chain`        | `ethereum`, `polygon`, `base`, `ink`, `apechain`, `abstract` | `solana`                |
| `address`      | The contract                                                 | The **collection mint** |
| `tokenId`      | The token id                                                 | The **asset mint**      |

<Warning>
  On Solana both segments are mints and they're different things — `{address}` is
  the collection, `{tokenId}` is the individual asset. Passing the asset mint in
  both positions returns a `404`.

  Solana base58 is case-sensitive. Don't lowercase it, and don't derive it by
  slicing a `collectionId`, which is lowercased for every chain.
</Warning>

<CodeGroup>
  ```bash Solana theme={"system"}
  curl "https://exclusivo.one/v1/tokens/solana/GDfn…CollectionMint/7xKX…AssetMint"
  ```

  ```bash EVM theme={"system"}
  curl "https://exclusivo.one/v1/tokens/base/0xabc…/1421"
  ```
</CodeGroup>

## Response

```json theme={"system"}
{
  "data": {
    "chain": "base",
    "contractAddress": "0xabc…",
    "tokenId": "1421",
    "owner": "0x11…",
    "rarityRank": 284,
    "listing": {
      "price": { "raw": "48000000000000000", "decimal": 0.048, "currency": "ETH", "usd": 172.4 },
      "marketplace": "EXC",
      "seller": "0x11…",
      "status": "active"
    },
    "lastSale": {
      "price": { "raw": "52000000000000000", "decimal": 0.052, "currency": "ETH", "usd": 186.8 }
    }
  }
}
```

## owner is the beneficial owner

The party who actually controls the token. While something is listed, that's the
**seller** — never the shared custody wallet holding it in escrow.

Worth knowing if you're comparing against a raw indexer, which would report the
escrow wallet as the owner of every listed Solana NFT.

## lastSale is a price and nothing else

No buyer, no timestamp, no transaction hash. For full sale detail use
[the sales feed](/api/marketplace/sales).

## rarityRank

Worked out from trait distribution once a collection is indexed.

Ranks calculated while a collection was still being indexed only reflect the part
that had been indexed at the time — internally consistent, wrong against the
finished collection. Treat rarity as advisory on recently launched collections.

## Failure behaviour

|                              |                                      |
| ---------------------------- | ------------------------------------ |
| Token unknown to the indexer | `404`                                |
| Listing lookup times out     | Falls back to the indexer's own view |
| Rate limited                 | `429`                                |

Never returns 502 — a slow listing lookup degrades to a slightly stale `listing`
rather than failing the request.

## Rate limit

A single-item endpoint: **300 requests per minute** per IP, on a counter separate
from the list endpoints. → [Rate limits](/api/rate-limits)
