All routes require a bearer token with the appropriate scopes plus the
x-user-id header to identify the user account.Data sources
Prerequisites
- Bearer token with required scopes
x-user-idheader to identify the user
What to fetch
Daily summaries
Daily summaries
Use Get daily summaries to retrieve all data needed for the home screen.Returns:
- Historical portfolio snapshots (cash, savings, holdings, total)
- Performance metrics (returns, performers)
- Market data (today’s markets, market summary)
- Sentiment scores
- Chart scaling data (
maxValueDifferences)
Component Guide
1. Date Selector / Time Series Navigation
Purpose: Allows users to navigate through historical portfolio data by selecting different dates. Data Source:- Use the
dataarray from the response - Filter out items where
isOnlyForChartLabelistrue(these entries are used for chart axis labeling in future & past data points when there is no daily summary for those dates)
timestamp- Unix timestamp in milliseconds for the dateisOnlyForChartLabel- Boolean flag to identify chart-label-only entries
2. Portfolio Value Cards
Purpose: Display four key portfolio metrics as cards that users can swipe through. Data Source:portfolioobject from the selected daily summary item
Total Account Value Card
portfolio.total.displayValue- Formatted value string (e.g., “€12,345.67”)portfolio.total.value- Numeric value in cents
Holdings Card
portfolio.holdings.displayValue- Formatted investment valueportfolio.holdings.upBy- Percentage increase (if positive)portfolio.holdings.downBy- Percentage decrease (if negative)
Savings Card
portfolio.savings.displayValue- Formatted savings valueportfolio.savings.dailyInterest- Daily interest earned (if applicable)portfolio.savings.unrealisedMonthlyInterest- Monthly interest (if applicable)portfolio.savings.estimated- Boolean indicating if interest is estimated
Cash Card
portfolio.cash.displayValue- Formatted cash balanceportfolio.cash.value- Numeric value in cents
- Display cards in a horizontal scrollable container
- Show up/down indicators with appropriate colors (green for up, red for down)
- Cards should be swipeable/scrollable
- Default selection should be “Total” (index 0)
3. Portfolio Chart
Purpose: Visualize portfolio value trends over time with an interactive line chart. Data Source:- Use the entire
dataarray from the response - Filter based on selected portfolio type (Total, Holdings, Savings, or Cash)
For Total Account Value:
- Iterate through all items in
dataarray - Use
data[].portfolio.total.chartValue- Numeric value for chart plotting - Use
data[].timestamp- For sorting and date handling - Use
data[].portfolio.total.displayValue- Tooltip/display value on hover - X-axis Labels: Generate labels from
timestampfield
For Holdings:
data[].portfolio.holdings.chartValuedata[].timestampdata[].portfolio.holdings.displayValue
For Savings:
data[].portfolio.savings.chartValuedata[].timestampdata[].portfolio.savings.displayValue
For Cash:
data[].portfolio.cash.chartValuedata[].timestampdata[].portfolio.cash.displayValue
maxValueDifferences.total- Maximum value difference for Total (used for chart scaling)maxValueDifferences.holdings- Maximum value difference for HoldingsmaxValueDifferences.savings- Maximum value difference for SavingsmaxValueDifferences.cash- Maximum value difference for Cash
- Chart should update when user selects a different portfolio card type
- Chart should highlight the currently selected date
- Use
maxValueDifferencesto properly scale the Y-axis - Chart should be interactive, allowing users to tap/click on data points to select that date
- Chart Label Handling: For items where
isOnlyForChartLabelistrue, generate labels fromtimestampfor x-axis display - Filter out chart-label-only points when allowing date selection, but include them in chart rendering for proper axis labels
4. Top Movers (Best & Worst Performers)
Purpose: Display the best and worst performing assets in the user’s portfolio. Data Source:performersobject from the selected daily summary item
Best Performers Section
performers.best- Array of top performing assets- Each item contains:
value- Formatted value stringupBy- Percentage increaseweight- Portfolio weight percentageassetId- Asset identifier for navigation
- Each item contains:
Worst Performers Section
performers.worst- Array of worst performing assets- Each item contains:
value- Formatted value stringdownBy- Percentage decreaseweight- Portfolio weight percentageassetId- Asset identifier for navigation
- Each item contains:
performers.all- Complete list of all performers (used for “See All” functionality)seeAllTopPerformersEnabled- Boolean indicating if “See All” button should be enabled
- Only show this section if
performersexists and has data - Display best performers in green/positive styling
- Display worst performers in red/negative styling
- Show “See All” button if
performers.allis not empty andseeAllTopPerformersEnabledistrue - Hide the entire section if
performersis null/undefined or both arrays are empty
5. Today’s Markets
Purpose: Display a scrolling ticker of market indices and their daily performance. Data Source:todayMarketsarray from the selected daily summary item
todayMarkets[]- Array of market items- Each item contains:
label- Market/index name (e.g., “FTSE 100”, “S&P 500”)returns.upBy- Percentage increase (if positive)returns.downBy- Percentage decrease (if negative)
- Each item contains:
- Display as a horizontally scrolling ticker/marquee
- Auto-scroll continuously if multiple markets are present
- Show green/positive styling for
upBy, red/negative styling fordownBy - Hide the section if
todayMarketsis null or empty - Pause auto-scroll on user interaction, resume after a delay
6. Sentiment Score
Purpose: Display a comprehensive sentiment score gauge showing overall portfolio sentiment and breakdowns. Data Source:sentimentScoreobject from the selected daily summary item
Overall Sentiment
sentimentScore.total.score- Overall sentiment score (integer, typically 0-100)sentimentScore.total.label- Score label: “optimal”, “suboptimal”, or “underperforming”
News Sentiment
sentimentScore.news.score- News-based sentiment score (if available)sentimentScore.news.label- Score label
Analyst Sentiment
sentimentScore.analyst.score- Analyst-based sentiment score (if available)sentimentScore.analyst.label- Score label
Price Momentum
sentimentScore.priceMomentum.score- Price momentum score (if enabled)sentimentScore.priceMomentum.label- Score label
- Display as a gauge/chart visualization
- Use color coding based on
label:- “optimal” - Green
- “suboptimal” - Yellow/Orange
- “underperforming” - Red
- Show breakdown sections for News, Analyst, and Price Momentum (only if they exist)
- Price Momentum section should only be shown if
priceMomentumexists - Hide the entire section if
sentimentScoreis null
7. Market Summary
Purpose: Display a daily market summary with overview text and detailed sections. Data Source:marketSummaryobject from the selected daily summary item
Overview Section
marketSummary.overview- Main summary text (displayed on home screen)
Detailed Sections (for full view)
marketSummary.sections[]- Array of detailed sections- Each section contains:
tag- Section category/tagtitle- Section titlecontent- Section content textassetId- Related asset ID (if applicable)tickerSymbol- Ticker symbol (if applicable)assetReturns.upBy- Asset return percentage (if positive)assetReturns.downBy- Asset return percentage (if negative)
- Each section contains:
- Display overview text on the home screen
- Show “Read more” button/link if
marketSummary.sectionsexists and has items - Navigate to full market summary view when “Read more” is clicked
- Hide the section if
marketSummaryis null
8. Uninvested State
Purpose: Show a special state when the user hasn’t made any investments yet. Data Source:isUninvestedboolean from the selected daily summary item
isUninvested- Boolean flag indicating if user has no investments
- When
isUninvestedistrue:- Hide or blur portfolio value cards
- Hide chart
- Hide top movers section
- Show call-to-action buttons for first investment
- Display encouraging message about starting to invest
- When
isUninvestedisfalse, show all normal components
Data Flow
-
Initial Load:
- Fetch data from
GET /daily-summariesendpoint withx-user-idheader - Filter
dataarray to remove items whereisOnlyForChartLabelistrue - Select the most recent date (last item in filtered array) as default
- Render all components using data from the selected date
- Fetch data from
-
Date Selection:
- When user selects a different date from the date selector
- Update all components with data from the newly selected daily summary item
- Update chart highlight to show selected date
- Maintain selected portfolio card type (Total/Holdings/Savings/Cash)
-
Portfolio Card Selection:
- When user selects a different portfolio card (Total/Holdings/Savings/Cash)
- Update chart to show data for the selected portfolio type
- Use corresponding
maxValueDifferencesvalue for chart scaling - Update chart data points using the appropriate
portfolio.*.chartValuefields
-
Refresh:
- Re-fetch from
GET /daily-summariesendpoint - Update all components with fresh data
- Maintain current date and portfolio card selection if still valid
- Re-fetch from
Error Handling
- If the API request fails, display an appropriate error message
- If
dataarray is empty or null, show an empty state - If specific fields are missing (e.g.,
portfolio,performers), hide the corresponding components gracefully - Handle cases where historical data might be incomplete
- Always check if optional fields exist before accessing nested properties (especially
performers,sentimentScore,todayMarkets,marketSummary)
Performance Considerations
- The
dataarray may contain many items (potentially weeks or months of data) - Consider pagination or limiting the number of data points if the array becomes very large
- Cache the response appropriately to avoid unnecessary API calls
- Filter
isOnlyForChartLabelitems early to reduce processing overhead - Use
maxValueDifferencesvalues to optimize chart rendering - Generate date labels efficiently using cached formatters