# Historical Top Holders

## Get historical "Token God Mode" (TGM) top holders (Beta)

> \*\*Beta — subject to breaking changes.\*\*\
> \
> Top token holders at a historical \`as\_of\_date\` with temporally-correct labels.\
> Labels are resolved from label history tables to avoid forward-looking bias.\
> \
> \*\*Key differences from \`/tgm/holders\`:\*\*\
> \- Accepts an explicit \`as\_of\_date\` (Date) instead of returning current state\
> \- Labels resolved at \`as\_of\_date\`, not from current-state dictionaries\
> \- \`value\_usd\` priced at the historical median price for \`as\_of\_date\`\
> \- The \`filters.include\_sm\_labels\` field only sub-restricts the \`smart\_money\` bucket;\
> &#x20; to switch buckets use the top-level \`label\_type\` field\
> \- No dust-filter default — set filters at the caller side if needed\
> \
> \*\*Performance:\*\* Can be slow for high-volume tokens (USDC, native ETH, etc.).

```json
{"openapi":"3.1.0","info":{"title":"Nansen API","version":"1.0.0"},"servers":[{"url":"https://api.nansen.ai"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"apiKey","description":"API key for authentication"}},"schemas":{"TGMHistoricalTopHoldersRequest":{"properties":{"chain":{"$ref":"#/components/schemas/TGMChain","description":"Blockchain chain"},"token_address":{"type":"string","title":"Token Address","description":"Token contract address"},"as_of_date":{"type":"string","title":"As Of Date","description":"Historical date (YYYY-MM-DD) to compute holder balances at."},"label_type":{"$ref":"#/components/schemas/TGMHistoricalTopHoldersLabel","description":"Holder filter bucket. 'all_holders' returns everyone; the others restrict to a specific label class.","default":"all_holders"},"pagination":{"$ref":"#/components/schemas/PaginationRequest","description":"Pagination parameters"},"filters":{"anyOf":[{"$ref":"#/components/schemas/TGMHistoricalTopHoldersFilters"}],"description":"Optional filters applied server-side"},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/SortOrder_TGMHistoricalTopHoldersSortField_"},"type":"array"}],"title":"Order By","description":"Sort order. Defaults to token_amount DESC. Only the first element is used."},"apply_blacklist_filter":{"type":"boolean","title":"Apply Blacklist Filter","description":"When True, exclude blacklisted addresses from the results. Defaults to True.","default":true}},"additionalProperties":false,"type":"object","required":["chain","token_address","as_of_date"],"title":"TGMHistoricalTopHoldersRequest","description":"Request model for the historical top holders endpoint.\n\nReturns the top holders of a token at a historical `as_of_date` with\ntemporally-correct labels resolved from label history tables to avoid\nforward-looking bias.\n\nCan be slow for high-volume tokens (e.g. USDC, ETH)."},"TGMChain":{"type":"string","enum":["arbitrum","avalanche","base","bnb","ethereum","hyperevm","hyperliquid","injective","iotaevm","linea","mantle","mantra","monad","near","optimism","plasma","polygon","ronin","scroll","sei","solana","sonic","starknet","sui","ton","tron"],"title":"TGMChain","description":"Chains supported in TGM (Token God Mode) endpoints."},"TGMHistoricalTopHoldersLabel":{"type":"string","enum":["all_holders","whale","public_figure","exchange","smart_money"],"title":"TGMHistoricalTopHoldersLabel","description":"Holder label-type filter for the historical top holders endpoint."},"PaginationRequest":{"properties":{"page":{"type":"integer","minimum":1,"title":"Page","description":"Page number (1-based)","default":1},"per_page":{"type":"integer","maximum":1000,"minimum":1,"title":"Per Page","description":"Number of records per page (max 1000)","default":10}},"type":"object","title":"PaginationRequest","description":"Pagination parameters for API requests."},"TGMHistoricalTopHoldersFilters":{"properties":{"include_sm_labels":{"anyOf":[{"items":{"$ref":"#/components/schemas/HistoricalLabelType"},"type":"array"}],"title":"Include Sm Labels","description":"When label_type is 'smart_money', restrict to these specific smart-money labels (e.g. ['Fund']). Empty = all smart-money labels."}},"additionalProperties":false,"type":"object","title":"TGMHistoricalTopHoldersFilters","description":"Filters for the historical top holders endpoint.\n\nUse `label_type` (top-level field) to choose the holder bucket; this filter only\nsub-restricts the smart_money bucket."},"HistoricalLabelType":{"type":"string","enum":["30D Smart Trader","90D Smart Trader","180D Smart Trader","Fund","Smart Trader","Smart Dex Trader","30D Smart Dex Trader","90D Smart Dex Trader","180D Smart Dex Trader","Public Figure","Exchange","Whale","BananaGun Bot User","Top Maestro Bot User","Top BananaGun Bot User","Maestro Bot User","Early MAGIC Miner","First Mover LP","First Mover Staking","Profitable LP","Smart HL Perps Trader"],"title":"HistoricalLabelType","description":"Filter by entity label type. Includes legacy label classes (e.g. Smart Dex Trader) that appear in historical data."},"SortOrder_TGMHistoricalTopHoldersSortField_":{"properties":{"field":{"$ref":"#/components/schemas/TGMHistoricalTopHoldersSortField","description":"Field to sort by"},"direction":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction (ASC or DESC)"}},"type":"object","required":["field","direction"],"title":"SortOrder[TGMHistoricalTopHoldersSortField]"},"TGMHistoricalTopHoldersSortField":{"type":"string","enum":["token_amount","value_usd","total_outflow","total_inflow","balance_change_24h","balance_change_7d","balance_change_30d","ownership_percentage"],"title":"TGMHistoricalTopHoldersSortField","description":"Sortable fields for the historical top holders endpoint."},"SortDirection":{"type":"string","enum":["ASC","DESC"],"title":"SortDirection","description":"Enum for sort directions."},"TGMHistoricalTopHoldersResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TGMHistoricalTopHolder"},"type":"array","title":"Data","description":"List of historical top-holder records"},"pagination":{"$ref":"#/components/schemas/PaginationInfo","description":"Pagination information"}},"type":"object","required":["data","pagination"],"title":"TGMHistoricalTopHoldersResponse","description":"Response model for the historical top holders endpoint."},"TGMHistoricalTopHolder":{"properties":{"token_symbol":{"anyOf":[{"type":"string"}],"title":"Token Symbol","description":"Token symbol resolved at the queried date"},"address":{"anyOf":[{"type":"string"}],"title":"Address","description":"Holder wallet address"},"address_label":{"anyOf":[{"type":"string"}],"title":"Address Label","description":"Temporally-correct label resolved at as_of_date"},"token_amount":{"anyOf":[{"type":"number"}],"title":"Token Amount","description":"Holder's cumulative token balance at as_of_date"},"total_outflow":{"anyOf":[{"type":"number"}],"title":"Total Outflow","description":"Cumulative tokens sent by the holder up to as_of_date"},"total_inflow":{"anyOf":[{"type":"number"}],"title":"Total Inflow","description":"Cumulative tokens received by the holder up to as_of_date"},"balance_change_24h":{"anyOf":[{"type":"number"}],"title":"Balance Change 24H","description":"Net token balance change on as_of_date"},"balance_change_7d":{"anyOf":[{"type":"number"}],"title":"Balance Change 7D","description":"Net token balance change over the 7 days ending at as_of_date"},"balance_change_30d":{"anyOf":[{"type":"number"}],"title":"Balance Change 30D","description":"Net token balance change over the 30 days ending at as_of_date"},"ownership_percentage":{"anyOf":[{"type":"number"}],"title":"Ownership Percentage","description":"Fraction of total supply held by this address (0-1)"},"value_usd":{"anyOf":[{"type":"number"}],"title":"Value Usd","description":"USD value of the holder's balance at the historical price for as_of_date"}},"type":"object","title":"TGMHistoricalTopHolder","description":"Single historical top-holder record.\n\nBalances and labels are resolved at `as_of_date` using label history tables\nto avoid forward-looking bias. Mirrors the `/tgm/holders` response where\nthey overlap, and adds `token_symbol`."},"PaginationInfo":{"properties":{"page":{"type":"integer","minimum":1,"title":"Page","description":"Current page number","default":1},"per_page":{"type":"integer","maximum":1000,"minimum":1,"title":"Per Page","description":"Number of records per page","default":10},"is_last_page":{"type":"boolean","title":"Is Last Page","description":"Whether this is the last page","default":true}},"type":"object","title":"PaginationInfo","description":"Pagination information for API responses."}},"headers":{"XNansenCreditsUsed":{"description":"Number of credits consumed by this API request","schema":{"type":"string"}},"XNansenCreditsRemaining":{"description":"Total credits remaining in the user's account after this request","schema":{"type":"string"}},"PaymentReceipt":{"description":"Base64url-encoded MPP receipt returned on successful paid requests via Authorization: Payment","schema":{"type":"string"}},"RateLimitLimit":{"description":"Combined rate limit across all configured time windows","schema":{"type":"string"}},"RateLimitRemaining":{"description":"Number of requests remaining in the current limiting window","schema":{"type":"string"}},"RateLimitReset":{"description":"Time in seconds until the rate limit window resets","schema":{"type":"string"}},"XRateLimitLimitSecond":{"description":"Maximum requests allowed per second","schema":{"type":"string"}},"XRateLimitRemainingSecond":{"description":"Requests remaining in the current second","schema":{"type":"string"}},"XRateLimitLimitMinute":{"description":"Maximum requests allowed per minute","schema":{"type":"string"}},"XRateLimitRemainingMinute":{"description":"Requests remaining in the current minute","schema":{"type":"string"}},"PaymentRequired":{"description":"Base64-encoded x402 payment options returned on 402 responses for x402 clients","schema":{"type":"string"}},"WWWAuthenticatePayment":{"description":"MPP payment challenge returned on 402 responses, for example `Payment id=\"...\", realm=\"api.nansen.ai\", method=\"tempo\", intent=\"charge\", request=\"...\"`","schema":{"type":"string"}},"RetryAfter":{"description":"Number of seconds to wait before making a new request","schema":{"type":"string"}}},"responses":{"BadRequestError":{"description":"Bad Request - Invalid request parameters or malformed request","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}},"UnauthorizedError":{"description":"Authentication error - No API key found in request","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}},"PaymentRequiredError":{"description":"Payment Required - This endpoint supports pay-per-request via x402 and MPP. x402 responses advertise payment options in `Payment-Required`; MPP responses advertise a fresh `WWW-Authenticate: Payment ...` challenge. Successful MPP responses may include `Payment-Receipt`.","headers":{"Payment-Required":{"$ref":"#/components/headers/PaymentRequired"},"WWW-Authenticate":{"$ref":"#/components/headers/WWWAuthenticatePayment"}},"content":{"application/json":{"schema":{"type":"object","description":"Problem-details body for x402 or MPP payment challenges."}}}},"ForbiddenError":{"description":"Forbidden - User does not have required subscription tier or has exceeded credit limit","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}},"NotFoundError":{"description":"Not Found - The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}},"ValidationError":{"description":"Validation error - Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"array","items":{"type":"object","properties":{"loc":{"type":"array","items":{"type":"string"}},"msg":{"type":"string"},"type":{"type":"string"}}}}}}}}},"TooManyRequestsError":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"},"retry_after":{"type":"integer","description":"Seconds to wait before retrying"}}}}},"headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"InternalServerError":{"description":"Internal Server Error - An unexpected error occurred","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}}}},"paths":{"/api/v1beta1/tgm/historical-top-holders":{"post":{"tags":["Token God Mode"],"summary":"Get historical \"Token God Mode\" (TGM) top holders (Beta)","description":"**Beta — subject to breaking changes.**\n\nTop token holders at a historical `as_of_date` with temporally-correct labels.\nLabels are resolved from label history tables to avoid forward-looking bias.\n\n**Key differences from `/tgm/holders`:**\n- Accepts an explicit `as_of_date` (Date) instead of returning current state\n- Labels resolved at `as_of_date`, not from current-state dictionaries\n- `value_usd` priced at the historical median price for `as_of_date`\n- The `filters.include_sm_labels` field only sub-restricts the `smart_money` bucket;\n  to switch buckets use the top-level `label_type` field\n- No dust-filter default — set filters at the caller side if needed\n\n**Performance:** Can be slow for high-volume tokens (USDC, native ETH, etc.).","operationId":"get_tgm_historical_top_holders_beta_api_v1beta1_tgm_historical_top_holders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TGMHistoricalTopHoldersRequest"}}},"required":true},"responses":{"200":{"description":"Historical TGM top holders data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TGMHistoricalTopHoldersResponse"}}},"headers":{"X-Nansen-Credits-Used":{"$ref":"#/components/headers/XNansenCreditsUsed"},"X-Nansen-Credits-Remaining":{"$ref":"#/components/headers/XNansenCreditsRemaining"},"Payment-Receipt":{"$ref":"#/components/headers/PaymentReceipt"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"X-RateLimit-Limit-Second":{"$ref":"#/components/headers/XRateLimitLimitSecond"},"X-RateLimit-Remaining-Second":{"$ref":"#/components/headers/XRateLimitRemainingSecond"},"X-RateLimit-Limit-Minute":{"$ref":"#/components/headers/XRateLimitLimitMinute"},"X-RateLimit-Remaining-Minute":{"$ref":"#/components/headers/XRateLimitRemainingMinute"}}},"400":{"description":"Bad Request","$ref":"#/components/responses/BadRequestError"},"401":{"description":"Unauthorized","$ref":"#/components/responses/UnauthorizedError"},"402":{"description":"Payment Required","$ref":"#/components/responses/PaymentRequiredError"},"403":{"description":"Forbidden","$ref":"#/components/responses/ForbiddenError"},"404":{"description":"Not Found","$ref":"#/components/responses/NotFoundError"},"422":{"description":"Unprocessable Content","$ref":"#/components/responses/ValidationError"},"429":{"description":"Too Many Requests","$ref":"#/components/responses/TooManyRequestsError"},"500":{"description":"Internal Server Error","$ref":"#/components/responses/InternalServerError"}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.nansen.ai/api/backtesting-data/historical-top-holders.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
