virtual:<id> addresses.
Interactive Playground: Test these endpoints in the API Playground. Get your API key at data.octav.fi
Cost: 1 credit per call (list) · 1 credit per virtual user address (portfolio)
List Virtual Users
Returns all virtual users belonging to the authenticated API user.Endpoint
Parameters
No query parameters required — returns all virtual users for the authenticated user.Response
Returns an array of virtual user objects.string
Virtual user identifier in
virtual:<id> format. Use this value in the portfolio endpoint’s addresses parameter.string
The virtual user type (e.g.
BALANCE, CEX)string
User-defined label for the virtual user
Example Request
Example Response
View Full Response
View Full Response
Virtual Users Portfolio
Fetch portfolios for one or more virtual users. Works identically to GET /v1/portfolio but uses virtual user addresses instead of wallet addresses.Endpoint
Parameters
string
required
Comma-separated virtual user addresses (from the list endpoint). Format:
virtual:<id>. Max 10.boolean
default:"false"
Return a single reduced portfolio across all virtual usersWhen
true, returns a single-element array with merged holdings from all specified virtual usersboolean
default:"false"
Wait for fresh data if cache is stale
false: Return cached data immediately (recommended)true: Wait for sync if data is older than 1 minute
boolean
default:"false"
Include image URLs for chains, assets, and protocolsUseful for displaying logos in your application UI
boolean
default:"false"
Include blockchain explorer URLs for assets and transactionsLinks to Etherscan, Arbiscan, etc. for easy navigation
Response
Same portfolio schema as GET /v1/portfolio. Returns an array of portfolio objects (one per virtual user), or a single-element array ifaggregated=true.
Portfolio Object
string
The virtual user address (
virtual:<id>)string
Total portfolio net worth in USD
string
Available cash balance
string
Income generated today
string
Expenses incurred today
string
Total fees in native asset
string
Total fees in USD
string
Last sync timestamp (milliseconds since epoch)
string
Unrealized profit/loss (if available, otherwise “N/A”)
string
Realized profit/loss (if available, otherwise “N/A”)
string
Total cost basis of holdings (if available, otherwise “N/A”)
object
Assets organized by protocol (wallet, lending, staking, etc.)Each protocol contains:
key: Protocol identifiername: Protocol display namevalue: Total value in USDassets[]: Array of asset holdings
object
Assets organized by blockchainEach chain contains:
key: Chain identifier (e.g., “ethereum”, “arbitrum”)name: Chain display namevalue: Total value on this chainprotocols[]: Protocols with positions on this chain
Example Request
Example Response
View Full Response
View Full Response
Data Freshness
The Virtual Users Portfolio endpoint uses the same caching strategy as Portfolio:How Caching Works
How Caching Works
Cache Duration: 1 minuteWhen data is less than 1 minute old:
- Cached data returned immediately
- Response time: under 100ms
- Cached data returned immediately
- Background sync initiated for next request
- Next request gets fresh data
- Waits for sync if data is stale
- Returns data less than 1 minute old
- Response time: Variable (1-10 seconds)
Best Practices
Best Practices
For most use cases:
- Use default
waitForSync=false - Data fresher than 1 minute is sufficient
- Fast response times
- Set
waitForSync=truewhen you need the absolute latest data - Accept longer response times
- Consider rate limits
Use Cases
- List & Query
- Per-User Breakdown
- Combined View
Discover virtual users and fetch their portfolios in a single flow:
Error Responses
400 Bad Request
400 Bad Request
Invalid parameters provided.Common causes:
- Missing
addressesparameter (portfolio endpoint) - Invalid address format (must be
virtual:<id>) - More than 10 addresses in single request
403 Forbidden
403 Forbidden
Attempted to access virtual users that don’t belong to the authenticated API user.Solution: Only use virtual user addresses returned by
GET /v1/virtual-users for your API key429 Too Many Requests
429 Too Many Requests
Rate limit exceeded.Solution: Wait for the specified time or implement retry logic
402 Payment Required
402 Payment Required
Related Endpoints
Portfolio
Retrieve portfolio holdings for wallet addresses
Historical Portfolio
View portfolio value at specific dates
Status
Check when portfolio was last synced
Credits
Check your remaining API credits