> For the complete documentation index, see [llms.txt](https://docs.nansen.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nansen.ai/api/portfolio.md).

# Portfolio

### Data Freshness & Historical Coverage

For data freshness and historical coverage, see [Data Coverage by Chain](/api/data-coverage.md); this endpoint follows it except where noted below.

* Returns a **current, point-in-time snapshot** of active DeFi positions across all chains and protocols — there is no date-range parameter or historical look-back; balances, rewards, and debt update continuously off on-chain activity and reflect within the standard live latency.

## Get Portfolio DeFi Holdings Data

> Get simplified DeFi holdings for a wallet address with aggregated tokens\
> &#x20;       and protocol summaries in a user-friendly format.

```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":{"PortfolioDefiHoldingsRequest":{"properties":{"wallet_address":{"type":"string","title":"Wallet Address","description":"Wallet address to get DeFi holdings for"}},"type":"object","required":["wallet_address"],"title":"PortfolioDefiHoldingsRequest","description":"Request model for portfolio DeFi holdings endpoint."},"PortfolioDefiHoldingsResponse":{"properties":{"summary":{"$ref":"#/components/schemas/HoldingsSummary","description":"Overall portfolio summary"},"protocols":{"items":{"$ref":"#/components/schemas/ProtocolHolding"},"type":"array","title":"Protocols","description":"Protocol-specific holdings with token breakdown"}},"type":"object","required":["summary","protocols"],"title":"PortfolioDefiHoldingsResponse","description":"Response model for portfolio DeFi holdings endpoint."},"HoldingsSummary":{"properties":{"total_value_usd":{"type":"number","title":"Total Value Usd","description":"Total USD value of all holdings"},"total_assets_usd":{"type":"number","title":"Total Assets Usd","description":"Total USD value of all assets"},"total_debts_usd":{"type":"number","title":"Total Debts Usd","description":"Total USD value of all debts"},"total_rewards_usd":{"type":"number","title":"Total Rewards Usd","description":"Total USD value of all rewards"},"token_count":{"type":"integer","title":"Token Count","description":"Total number of unique tokens"},"protocol_count":{"type":"integer","title":"Protocol Count","description":"Total number of protocols"}},"type":"object","required":["total_value_usd","total_assets_usd","total_debts_usd","total_rewards_usd","token_count","protocol_count"],"title":"HoldingsSummary","description":"Summary statistics for DeFi holdings."},"ProtocolHolding":{"properties":{"protocol_name":{"type":"string","title":"Protocol Name","description":"User-friendly protocol name"},"chain":{"type":"string","title":"Chain","description":"Blockchain network"},"total_value_usd":{"type":"number","title":"Total Value Usd","description":"Total USD value in this protocol"},"total_assets_usd":{"type":"number","title":"Total Assets Usd","description":"Total USD value of assets in this protocol"},"total_debts_usd":{"type":"number","title":"Total Debts Usd","description":"Total USD value of debts in this protocol"},"total_rewards_usd":{"type":"number","title":"Total Rewards Usd","description":"Total USD value of rewards in this protocol"},"tokens":{"items":{"$ref":"#/components/schemas/ProtocolToken"},"type":"array","title":"Tokens","description":"Token holdings in this protocol"}},"type":"object","required":["protocol_name","chain","total_value_usd","total_assets_usd","total_debts_usd","total_rewards_usd","tokens"],"title":"ProtocolHolding","description":"Holdings summary for a specific protocol."},"ProtocolToken":{"properties":{"address":{"anyOf":[{"type":"string"}],"title":"Address","description":"Token contract address (null for native tokens)"},"symbol":{"anyOf":[{"type":"string"}],"title":"Symbol","description":"Token symbol"},"amount":{"anyOf":[{"type":"number"}],"title":"Amount","description":"Token amount"},"value_usd":{"anyOf":[{"type":"number"}],"title":"Value Usd","description":"USD value"},"position_type":{"type":"string","title":"Position Type","description":"Position type: deposit, stake, borrow, or mixed"}},"type":"object","required":["symbol","amount","value_usd","position_type"],"title":"ProtocolToken","description":"Individual token holding within a protocol."},"ErrorEnvelope":{"type":"object","required":["error","message","code","status","request_id","doc_url"],"properties":{"error":{"type":"string","description":"Human-readable error category."},"message":{"type":"string","description":"Human-readable explanation of the error."},"code":{"type":"string","enum":["missing_field","unknown_field","invalid_field_value","invalid_address_format","invalid_date_format","invalid_date_range","mutually_exclusive_fields","value_out_of_range","too_many_items","unauthenticated","forbidden","geo_blocked","plan_upgrade_required","insufficient_credits","rate_limit_exceeded","not_found","method_not_allowed","conflict","payload_too_large","query_timeout","query_too_large","upstream_unavailable","internal_error"],"description":"Stable machine-readable error code."},"status":{"type":"integer","description":"HTTP status code returned for the request."},"request_id":{"type":["string","null"],"description":"Identifier for the request, when available."},"doc_url":{"type":"string","format":"uri","description":"Link to the error-code reference documentation, anchored to this error's code."},"param":{"type":"string","description":"Request parameter associated with the error."},"retry_after":{"type":"integer","minimum":0,"description":"Seconds to wait before retrying the request."}}}},"headers":{"XNansenCreditsCost":{"description":"Quoted credit cost of this request. It is present on successful responses and errors reached after pricing, but absent when a request is rejected before pricing. A value of 0 means plan credits do not apply.","schema":{"type":"string"}},"XRequestId":{"description":"Unique identifier for this request, returned on every response. Uses the upstream-assigned request id when available; otherwise echoes a caller-supplied X-Request-Id or generates an id. Include this value in support requests.","schema":{"type":"string"}},"XNansenCreditsUsed":{"description":"Credits actually deducted for this request. Can differ from the quoted cost, for example 0 when the request was rejected.","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":"Seconds until the rate limit window resets. A delta in seconds, not a Unix timestamp.","schema":{"type":"string"}},"XRateLimitLimit":{"description":"Request limit for the most constrained app-enforced window","schema":{"type":"string"}},"XRateLimitRemaining":{"description":"Requests remaining in the most constrained app-enforced window","schema":{"type":"string"}},"XRateLimitReset":{"description":"Seconds until the most constrained app-enforced window resets. A delta in seconds, not a Unix timestamp: it is at least 1 and never exceeds the window span.","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"}},"RetryAfter":{"description":"Number of seconds to wait before making a new request","schema":{"type":"string"}},"XNansenRateLimitScope":{"description":"Window that caused an enforced rate-limit rejection: `second` or `minute` for global plan windows, or `endpoint` for an endpoint-specific window. This is an open set; clients should handle unknown future values with generic rate-limit behavior.","schema":{"type":"string"}}},"responses":{"BadRequestError":{"description":"Bad Request - Invalid request parameters or malformed request","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"detail":{"type":"string"}}}]}}}},"UnauthorizedError":{"description":"Authentication error - No API key found in request","headers":{"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"detail":{"type":"string"}}}]}}}},"ForbiddenError":{"description":"Forbidden - User does not have required subscription tier or has exceeded credit limit","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Nansen-Credits-Used":{"$ref":"#/components/headers/XNansenCreditsUsed"},"X-Nansen-Credits-Remaining":{"$ref":"#/components/headers/XNansenCreditsRemaining"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"detail":{"type":"string"}}}]}}}},"NotFoundError":{"description":"Not Found - The requested resource was not found","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"ValidationError":{"description":"Validation error - Invalid request parameters","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"errors":{"type":"array","description":"Per-field request-validation errors, in the order they were detected. This field is absent from other 422 responses. The top-level error, message, and code reflect the primary error, which is not always the first entry. When a request produces an unusually large number of errors the list is truncated and a final entry reports how many were omitted.","items":{"type":"object","required":["field","message","code"],"properties":{"field":{"type":"string","description":"Path of the request field that failed validation, prefixed with its location in the request (body, query, path, header, or cookie) and including array indices. Unlike param, this path keeps the location prefix and array indices."},"message":{"type":"string","description":"Human-readable explanation of the field error."},"code":{"type":"string","enum":["missing_field","unknown_field","invalid_field_value","invalid_address_format","invalid_date_format","invalid_date_range","mutually_exclusive_fields","value_out_of_range","too_many_items"],"description":"Stable machine-readable error code."}}}}}}]}}}},"TooManyRequestsError":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","properties":{"detail":{"type":"string"},"retry_after":{"type":"integer","description":"Seconds to wait before retrying"}}}]}}},"headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"X-Nansen-RateLimit-Scope":{"$ref":"#/components/headers/XNansenRateLimitScope"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}}},"InternalServerError":{"description":"Internal Server Error - An unexpected error occurred","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"BadGatewayError":{"description":"Bad Gateway - Upstream service unavailable","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","required":["retry_after"],"properties":{"retry_after":{"type":"integer","description":"Seconds to wait before retrying"}}}]}}}},"ServiceUnavailableError":{"description":"Service Unavailable - Service temporarily unavailable","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","required":["retry_after"],"properties":{"retry_after":{"type":"integer","description":"Seconds to wait before retrying"}}}]}}}},"GatewayTimeoutError":{"description":"Gateway Timeout - Upstream service timed out","headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorEnvelope"},{"type":"object","required":["retry_after"],"properties":{"retry_after":{"type":"integer","description":"Seconds to wait before retrying"}}}]}}}}}},"paths":{"/api/v1/portfolio/defi-holdings":{"post":{"tags":["Portfolio"],"summary":"Get Portfolio DeFi Holdings Data","description":"Get simplified DeFi holdings for a wallet address with aggregated tokens\n        and protocol summaries in a user-friendly format.","operationId":"portfolio_defi_holdings_v1_api_v1_portfolio_defi_holdings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioDefiHoldingsRequest"}}},"required":true},"responses":{"200":{"description":"Portfolio DeFi holdings data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioDefiHoldingsResponse"}}},"headers":{"X-Nansen-Credits-Cost":{"$ref":"#/components/headers/XNansenCreditsCost"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"},"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":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"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"},"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"},"502":{"description":"Bad Gateway","$ref":"#/components/responses/BadGatewayError"},"503":{"description":"Service Unavailable","$ref":"#/components/responses/ServiceUnavailableError"},"504":{"description":"Gateway Timeout","$ref":"#/components/responses/GatewayTimeoutError"}}}}}}
```

### Output Field Meanings

#### Top-Level Fields

| Field                | Description                                                                 |
| -------------------- | --------------------------------------------------------------------------- |
| `protocolsUsed`      | Array of protocol names the wallet actively uses (e.g., "aave-v3-ethereum") |
| `holdingsByProtocol` | Detailed breakdown of positions per protocol                                |
| `success`            | Boolean indicating API call success                                         |
| `totalProtocols`     | Count of protocols with detected activity                                   |

#### Position Types within `holdingsByProtocol`

| Type                  | Description                                                                                  |
| --------------------- | -------------------------------------------------------------------------------------------- |
| `deposits`/`lendings` | Assets supplied to lending protocols (Aave, Compound), including amounts, value, and rewards |
| `borrows`             | Borrowed assets with debt ratios and health factors                                          |
| `stakings`            | Tokens staked for rewards (liquid staking, governance tokens)                                |
| `positions`           | Complex positions like LP tokens, derivatives, or structured products                        |
| `locked`              | Time-locked or vested tokens (e.g., vote-escrowed tokens)                                    |
| `rewards`             | Claimable but unclaimed protocol rewards                                                     |
| `farms`               | Yield farming positions with staked LP tokens                                                |

#### Position Detail Structure

| Field     | Description                                                                       |
| --------- | --------------------------------------------------------------------------------- |
| `type`    | Position category (e.g., "lending", "common", "locked")                           |
| `summary` | High-level metrics (asset value, rewards, debt)                                   |
| `detail`  | Granular breakdown including individual token balances, prices, and price changes |

## Supported Protocols

You can find the list of supported protocols on each supported chain by [clicking here](https://app.nansen.ai/portfolio/protocols).

## Usage Guide: Creating Complete Portfolio Overview

Use the following steps to create a complete Portfolio Overview:

**Step 1: Fetch DeFi Positions**\
Get active protocol positions, staking rewards, and lending activities. This shows how assets are being used in DeFi.

**Step 2: Fetch Wallet Balances** [**(Link Here)**](https://docs.nansen.ai/api/profiler/balances#post-beta-profiler-address-balances)\
Retrieve all token holdings across chains, including idle tokens not actively deployed in protocols.

**Step 3: Combine & Analyze**

* Total Portfolio Value = DeFi positions + wallet balances
* Strategy Analysis: Compare liquid vs. staked vs. lending positions
* Chain Distribution: Identify multi-chain allocation patterns
* Risk Assessment: Analyze borrowing ratios, protocol concentration


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.nansen.ai/api/portfolio.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
