Getting started

Quickstart

Three calls: find a collection, read its floor, list what's for sale. Everything here works from a terminal right now, with no signup.

No key required

The API is public and read-only. There is no key, no header, and no signup — just a base URL:

Base URL
https://exclusivo.one/v1

Requests are rate limited per IP (120/min on list endpoints, 300/min on single-item endpoints) and cached at the edge. If you need a higher limit for a production integration, email dev@psukhe.media and we will sort it out.

1. Find a collection

Start with the collections list. It is paginated and sorted by volume by default, so the first page is our most active collections.

curl
curl "https://exclusivo.one/v1/collections?limit=2"
Response
{
  "data": [
    {
      "id": "solana_85Ghq5ExuySXEU4aExGs7d44udeGrF3bvF6GX8YsgaMe",
      "chain": "solana",
      "contractAddress": null,
      "name": "SolGods",
      "slug": "solgods_",
      "image": "https://…",
      "stats": {
        "floor": { "raw": "12500000000", "decimal": 12.5, "currency": "SOL", "usd": 2437.5 },
        "volumeAllTime": 48210.4,
        "supply": 4444,
        "owners": 1872
      }
    }
  ],
  "pagination": { "nextCursor": "eyJrIjoi…", "hasMore": true }
}

The id field is what every other endpoint accepts. You can also pass a contract address or a collection slug — all three resolve to the same collection.

2. Read its floor

Floor is the number most integrations want first, and it is the one most likely to be subtly wrong. We return two, explicitly labelled:

curl
curl "https://exclusivo.one/v1/collections/solgods_/floor"
FieldMeaningUse it for
askFloorLowest seller ask — what the seller receives.Comparing against other marketplaces’ listed floor.
buyerFloorLowest all-in cost including marketplace fee and royalty.Showing a user what they will actually pay.

Do not mix these up

Comparing our buyerFloor against another marketplace's ask floor will make us look more expensive than we are. Compare like for like.

3. Page through listings

Listings are cursor-paginated. Pass the nextCursor you received back as cursor — never construct one yourself, and never send cursor=null.

curl
# first page
curl "https://exclusivo.one/v1/collections/solgods_/listings?limit=50"

# next page
curl "https://exclusivo.one/v1/collections/solgods_/listings?limit=50&cursor=eyJrIjoi…"

Looping until done

JavaScript
let cursor = null;
const listings = [];

do {
  const url = new URL("https://exclusivo.one/v1/collections/solgods_/listings");
  url.searchParams.set("limit", "100");
  if (cursor) url.searchParams.set("cursor", cursor);

  const res = await fetch(url);
  if (!res.ok) throw new Error((await res.json()).error.message);

  const { data, pagination } = await res.json();
  listings.push(...data);
  cursor = pagination.hasMore ? pagination.nextCursor : null;
} while (cursor);

Reading prices correctly

Every price in the API is the same object, and it is designed to be unambiguous:

Price object
"price": {
  "raw": "12500000000",   // integer base units (lamports / wei) as a string
  "decimal": 12.5,        // human-readable native amount
  "currency": "SOL",
  "usd": 2437.5           // best-effort, null when no feed is available
}
  • Use raw for anything financial. It is exact. decimal is a convenience for display and can lose precision on large wei values.
  • Treat usd as advisory. It is null whenever the price feed is down, and always null for chains without a feed (Polygon, ApeChain).
  • Prices are the seller ask. Buyer-side fees are added on top — see Conventions.

Address casing

EVM addresses come back lowercase. Solana base58 addresses are case-sensitive and are returned exactly as they are on-chain — lowercasing one produces a different, invalid address.

Where to go next