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.
List tokens
Section titled “List tokens”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.
Get a single token
Section titled “Get a single token”const res = await client.token.get({ highlightId, tokenId: "1", // the on-chain token ID as a string});Token shape
Section titled “Token shape”{ 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.
Attribute case — read vs write
Section titled “Attribute case — read vs write”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 responseconst readAttrs = token.attributes ?? [];// readAttrs[0] -> { trait_type: "Background", value: "Gold" }
// Into updateEditionDetailsconst writeAttrs = readAttrs.map((a) => ({ traitType: a.trait_type, value: String(a.value),}));