Skip to main content

NFTs

NFT holdings across chains, individually or grouped by collection.

Base URL: https://api-v2.kryptos.io · Required Permission: portfolios:read

EndpointReturns
GET/v1/nftsIndividual NFTs
GET/v1/nfts/collectionsGrouped by collection
GET/v1/nfts/{contractAddress}/{tokenId}One NFT
GET/v1/nfts/portfolio/{portfolioId}Individual NFTs, one portfolio
GET/v1/nfts/portfolio/{portfolioId}/{contractAddress}/{tokenId}One NFT, one portfolio

Request

curl -X GET "https://api-v2.kryptos.io/v1/nfts?chain=ethereum&limit=50" \
-H "Authorization: Bearer ACCESS_TOKEN"

Query Parameters

Shared by /v1/nfts, /v1/nfts/collections and the portfolio-scoped list.

ParameterTypeDefaultDescription
chainstringChain to filter by, e.g. ethereum
collectionIdstringFilter to one collection. On /collections, returns that single row
integrationIdstringScope to one connected account
searchstringFree-text match on NFT and collection name
includeSpambooleanfalseInclude NFTs flagged as spam. Accepts true or 1
offsetinteger0Rows to skip
limitinteger50Rows to return, 1–1000

Response — NFT list

{
"success": true,
"data": [
{
"id": "nft_31f9c2",
"contractAddress": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",
"tokenId": "1234",
"chain": "ethereum",
"assetRaw": {},
"price": { "price": 18400, "baseCurrency": "USD", "timestamp": 1721088000000, "source": "opensea" },
"collection": {},
"lastSale": {},
"source": {
"provider": "ethereum",
"providerPublicName": "Ethereum",
"publicAddress": "0xab...",
"walletId": "int_44de",
"logoUrl": "https://...",
"alias": "Main EVM"
},
"isSpam": false
}
],
"totalCount": 15,
"totalEstimatedValueUsd": 120500
}
FieldTypeDescription
idstringHolding id
contractAddressstringNFT contract
tokenIdstringToken id within the contract
chainstringChain
assetRawobjectProvider-supplied metadata — name, description, media URLs, traits
priceobjectEstimated value as { price, baseCurrency, timestamp, source }
collectionobjectCollection metadata, including floor price where known
lastSaleobjectMost recent observed sale
sourceobjectThe account holding it
isSpambooleanFlagged as spam

Two things to note. The NFT list envelope has no offset, limit or hasMore — only totalCount and totalEstimatedValueUsd. Page by tracking your own offset against totalCount. And assetRaw, collection and lastSale are passed through from the upstream provider, so their keys vary by chain and marketplace; probe rather than assume.

Response — collections

{
"success": true,
"data": [
{
"collectionId": "bored-ape-yacht-club",
"name": "Bored Ape Yacht Club",
"imageUrl": "https://...",
"itemCount": 3,
"totalValueUsd": 55200
}
],
"totalCount": 6,
"totalEstimatedValueUsd": 120500
}
FieldTypeDescription
collectionIdstringCollection identifier — use as the collectionId filter
namestring | nullCollection name, null when the provider reports none
imageUrlstring | nullCollection image
itemCountnumberNFTs held from this collection
totalValueUsdnumberSummed value of the held items

totalCount is the number of distinct collections; totalEstimatedValueUsd is the whole workspace's (or portfolio's) NFT value, not just this page.

Response — single NFT

{ success, data } with one NFT object, or 404 { "success": false, "error": "Not found" }.