Important
The scores route will return 200 with the full data or 202 if the address has a large amount of data and data is not immediately available.
If you receive a 202, try again later. Data is usually available within 60 seconds. It is safe to call the route multiple times with the same address.
Responses
You'll receive your full data immediately if it's been cached recently or is able to be scored within 5s. Otherwise you'll receive the Job Enqueued response.
Full Data Response
See below for an example response and explanation of the response format. For more details or questions about how we score and index data, join our Discord.
paper: Very consistent pattern of mint/purchase and resale of NFTs
normie: Not a consistent holder but not a repeat reseller
1: Holds with some resales, or new user with a pattern of holding
2: Holds with occasional resales
3: Long term pattern of holding
4: Very long term and firmly established pattern of holding
5: Extremely consistent pattern of holding
Collectibles
Currently held NFTs. An array of items with the following format:
{
"name": string,
"quantity": number, // number of this collection that the user holds
"openseaSlug": string,
"inTs": string, // iso 8601 datetime
"floorPrice": number | null // floor price of collection
}
Items are sorted by floorPrice * quantity in descending order. Where floorPrice is null, items are sorted by quantity in descending order.
Coins
Current Ether and ERC-20 balances. An array of items with the following format:
{
"symbol": string,
"name": string,
"contractAddress": string, // null for Ether
"amount": number,
"nativeValue": number | null, // value in Ether
"usdValue": number | null // value in USD
}
Ether will always appear first and is always present in the response.
The remaining items are sorted by nativeValue in descending order. Where nativeValue is null, items are sorted by amount in descending order.
Portfolio Stats
An object with the following format:
{
"longestHoldDuration": number | undefined; // in seconds
"averageHoldDuration": number | undefined; // in seconds
"oldestTransferIn": string | undefined; // iso 8601 datetime
"newestTransferIn": string | undefined; // iso 8601 datetime
"totalPortfolioValue": number; // in Ether
"collectiblePortfolioValue": number; // in Ether
"coinPortfolioValue": number; // in Ether
"collectibleCount": number; // number of UNIQUE collections held
}
Lifetime Stats
An object with the following format:
{
"longestHoldDuration": number || undefined; // in seconds
"averageHoldDuration": number || undefined; // in seconds
"firstTransferIn": string; // iso 8601 datetime
}
Transfer Counts
An object with the following format:
{
"mints": number;
"purchases": number;
"transfersIn": number;
"sales": number;
"transfersOut": number;
"flips": number; // sales of collectibles not transferred in
"profitableFlips": number;
}
Job Enqueued Response
If an address requires a particularly large amount of data to process, we respond with a job id and immediately begin processing it in the background.
No action is needed when you receive this response. You do not need to keep track of the job id.
You should periodically retry the request and route will respond with the full score data when available. This is usually in 60 seconds or less.