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:
https://exclusivo.one/v1Requests 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 "https://exclusivo.one/v1/collections?limit=2"{
"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 "https://exclusivo.one/v1/collections/solgods_/floor"| Field | Meaning | Use it for |
|---|---|---|
askFloor | Lowest seller ask — what the seller receives. | Comparing against other marketplaces’ listed floor. |
buyerFloor | Lowest all-in cost including marketplace fee and royalty. | Showing a user what they will actually pay. |
Do not mix these up
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.
# 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
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": {
"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
rawfor anything financial. It is exact.decimalis a convenience for display and can lose precision on large wei values. - Treat
usdas 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
Where to go next
- Building an aggregator? Aggregator integration covers backfill, incremental sync, and dedupe.
- Need to verify us without trusting the API? Verify listings on-chain.
- Want the full surface? API reference or the OpenAPI spec.