Skip to content

Tokens

client.token is read-only. Token records are populated automatically by the indexer when it observes on-chain transfers — you don’t create them directly via the SDK.

const res = await client.token.list({
highlightId,
page: 1,
limit: 20,
sort: "mintedAt", // "tokenId" | "name" | "mintedAt" | "createdAt"
order: "desc", // "asc" | "desc"
ownerAddress: "0x...", // optional — filter by owner
search: "rare", // optional — name search
});
// res.data.items — Array<Token>
// res.data.pageInfo — { page, limit, totalCount, totalPages, hasNextPage, hasPreviousPage }

For public (Live) collections, this works without auth. Draft collections require ownership.

const res = await client.token.get({
highlightId,
tokenId: "1", // the on-chain token ID as a string
});
{
id: "uuid", // internal UUID
collectionId: "uuid", // internal collection UUID
tokenId: "1", // on-chain token ID as string
name: string | null,
description: string | null,
externalUrl: string | null,
attributes: Array<{
trait_type: string, // read-side uses snake_case — matches on-chain metadata JSON
value: string | number,
display_type?: string,
}> | null,
properties: { /* freeform */ } | null,
imageMediaId: string | null, // look up the actual image via client.media.get
animationMediaId: string | null, // look up the actual animation via client.media.get
mintedAt: string | null, // null for un-minted placeholder tokens
createdAt: string,
updatedAt: string,
}

Token metadata shape depends on the collection type:

  • Editions — every token shares the same metadata.
  • Series — each token has unique metadata, uploaded as part of the series asset bundle.
  • Generative — metadata (including captured image) is materialized from the generator at mint time.

Read responses use trait_type (matching ERC-721 metadata JSON), but write inputs on client.collection.updateEditionDetails and updateSeriesDetails use traitType. Don’t round-trip a read directly into a write — rename the key.

// From a list/get response
const readAttrs = token.attributes ?? [];
// readAttrs[0] -> { trait_type: "Background", value: "Gold" }
// Into updateEditionDetails
const writeAttrs = readAttrs.map((a) => ({
traitType: a.trait_type,
value: String(a.value),
}));