> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wealthyhood.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get investment product fundamentals

> Return pricing, tags, and fundamentals for an investment product resolved by ISIN.

Resolve an investment product by ISIN to retrieve pricing metadata, market tags, and the appropriate
fundamentals payload for the asset type. ETF responses include holdings and index statistics, while
stocks return analyst views and key metrics.

### Authentication & headers

<ParamField header="Authorization" type="string" required>
  Bearer token issued by Auth0. Format: `Bearer YOUR_ACCESS_TOKEN` with the `read:users` scope.
</ParamField>

<ParamField header="x-user-id" type="string" required>
  MongoDB identifier of the requesting user (24-char hex). Required so locale- and subscription-aware
  fields can be applied.
</ParamField>

### Path parameters

<ParamField path="isin" type="string" required>
  ISIN of the investment product (12 alphanumeric characters).
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET 'https://api.wealthyhood.com/investment-products/IE00B4L5Y983/fundamentals' \
    -H 'Accept: application/json' \
    -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
    -H 'x-user-id: 64f0c51e7fb3fc001234abcd'
  ```
</RequestExample>

### Response fields

The response structure varies based on asset type. ETFs return holdings, distributions, and fund metadata,
while stocks return company information, financial metrics, and analyst ratings.

<ResponseField name="fundamentals" type="AssetFundamentals" required>
  Asset-type specific fundamentals. The structure varies by asset type:

  <Expandable title="ETF fundamentals (type: etf)">
    <ResponseField name="topHoldings" type="ETFHolding[]">
      Top holdings with name, weight percentage, and logo URL.
    </ResponseField>

    <ResponseField name="holdingsCount" type="integer">
      Total number of holdings in the ETF.
    </ResponseField>

    <ResponseField name="expenseRatio" type="string">
      Expense ratio formatted as percentage.
    </ResponseField>

    <ResponseField name="indexStats" type="ETFIndexStats">
      Performance statistics including expected return, annual risk, and yield metrics.
    </ResponseField>

    <ResponseField name="geographyDistribution" type="ETFGeographyAllocation[]">
      Geographic allocation breakdown.
    </ResponseField>

    <ResponseField name="sectorDistribution" type="ETFSectorAllocation[]">
      Sector allocation breakdown.
    </ResponseField>

    <ResponseField name="about" type="ETFAbout">
      Fund information including provider, replication method, tracked index, and income type.
    </ResponseField>
  </Expandable>

  <Expandable title="Stock fundamentals (type: stock)">
    <ResponseField name="about" type="StockAbout">
      Company information: ticker, exchange, sector, industry, description, employees, website, CEO, headquarters, and ISIN.
    </ResponseField>

    <ResponseField name="metrics" type="StockMetrics">
      Financial metrics: market cap, PE ratio, EPS, dividend yield, beta, and forward PE.
    </ResponseField>

    <ResponseField name="analystViews" type="StockAnalystViews">
      Analyst ratings: average price target, percentage difference from current price, total analysts, and buy/sell/hold percentages.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="currentPrice" type="number" required>
  Latest traded price in the asset's traded currency.
</ResponseField>

<ResponseField name="tradedCurrency" type="&#x22;GBP&#x22; | &#x22;EUR&#x22; | &#x22;USD&#x22;" required>
  Primary settlement currency for the asset.
</ResponseField>

<ResponseField name="tags" type="AssetTag[]" required>
  Commercial or trading flags that should be surfaced to end users.
</ResponseField>

<ResponseField name="marketInfo" type="MarketInfo">
  Current market status and the next opening timestamp.
</ResponseField>

<ResponseField name="kid" type="uri">
  Link to the Key Information Document when the product requires one (primarily ETFs).
</ResponseField>


## OpenAPI

````yaml GET /investment-products/{isin}/fundamentals
openapi: 3.0.3
info:
  title: Wealthyhood Investment Products API
  version: 1.0.0
  description: >
    Machine-to-machine endpoints that expose the Wealthyhood asset universe,
    fundamentals, and

    user-specific portfolio context.


    All requests require an Auth0-issued bearer token with the `read:users`
    scope, and must 

    include the `x-user-id` header so the retail user context can be resolved.
servers:
  - url: https://{host}
    variables:
      host:
        default: api.wealthyhood.com
        description: Wealthyhood API host.
security:
  - bearerAuth: []
tags:
  - name: Investment Products
    description: >-
      Listed instruments available to Wealthyhood investors together with
      client-specific insights.
paths:
  /investment-products/{isin}/fundamentals:
    get:
      tags:
        - Investment Products
      summary: Get investment product fundamentals
      description: >
        Resolve a Wealthyhood investment product by ISIN and return pricing,
        trading tags, and the

        fundamentals set required to render instrument detail screens. ETF
        responses include holdings,

        distributions, and KID metadata, while stocks return analyst views and
        key metrics.
      parameters:
        - $ref: '#/components/parameters/ExternalUserId'
        - $ref: '#/components/parameters/Isin'
      responses:
        '200':
          description: Investment product fundamentals snapshot.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetDetailResponse'
              examples:
                etfDetails:
                  summary: ETF fundamentals
                  value:
                    fundamentals:
                      topHoldings:
                        - name: Apple Inc.
                          weight: 12.3%
                          logoUrl: https://cdn.wealthyhood.com/assets/aapl.svg
                        - name: Microsoft Corp.
                          weight: 9.8%
                          logoUrl: https://cdn.wealthyhood.com/assets/msft.svg
                      expenseRatio: '0.12'
                      indexStats:
                        expectedReturn: 5.2%
                        annualRisk: 12.4%
                        dividendYield: 2.1%
                        fpEarnings: 7.5%
                      holdingsCount: 98
                      baseCurrency: USD
                      geographyDistribution:
                        - name: North America
                          percentage: 68
                        - name: Europe
                          percentage: 18
                      sectorDistribution:
                        - name: Technology
                          percentage: 42
                        - name: Consumer
                          percentage: 16
                      about:
                        exchange: LSE
                        isin: IE00B4L5Y983
                        ticker: VUSA.L
                        assetClass: Global Equities
                        sector: Broad Market
                        advancedName: Vanguard S&P 500 UCITS ETF
                        description: Tracks the performance of the S&P 500 index.
                        provider: Vanguard
                        income: ACCUMULATING
                        replication: Physical
                        index: S&P 500
                      news:
                        - id: '12345'
                          title: US stocks rally as earnings beat expectations
                          text: >-
                            Major US equities moved higher after strong
                            quarterly results.
                          source: Reuters
                          newsUrl: https://reuters.com/markets/us-stocks-rally
                          imageUrl: https://cdn.wealthyhood.com/news/us-rally.jpg
                          date: '2024-07-11T09:20:00.000Z'
                          displayDate: 2h ago
                          sentiment: Positive
                          type: market
                    currentPrice: 79.42
                    tradedCurrency: USD
                    tags:
                      - FRACTIONAL
                      - MARKET_OPEN
                    marketInfo:
                      isOpen: true
                      nextMarketOpen: 1720779600000
                    kid: https://cdn.wealthyhood.com/kid/VUSA.pdf
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
components:
  parameters:
    ExternalUserId:
      name: x-user-id
      in: header
      required: true
      description: >-
        MongoDB identifier of the Wealthyhood user whose subscription context
        should be applied.
      schema:
        type: string
        pattern: ^[a-f0-9]{24}$
    Isin:
      name: isin
      in: path
      required: true
      description: ISIN of the investment product to retrieve.
      schema:
        type: string
        pattern: ^[A-Z0-9]{12}$
  schemas:
    AssetDetailResponse:
      type: object
      properties:
        fundamentals:
          $ref: '#/components/schemas/AssetFundamentals'
        currentPrice:
          type: number
          format: float
          description: Latest traded price in the main traded currency.
        tradedCurrency:
          type: string
          enum:
            - GBP
            - EUR
            - USD
        tags:
          type: array
          description: Commercial and trading flags that should be surfaced to clients.
          items:
            $ref: '#/components/schemas/AssetTag'
        marketInfo:
          $ref: '#/components/schemas/MarketInfo'
        kid:
          type: string
          format: uri
          description: URL to the KID document when applicable.
      required:
        - fundamentals
        - currentPrice
        - tradedCurrency
        - tags
    AssetFundamentals:
      oneOf:
        - $ref: '#/components/schemas/ETFAssetFundamentals'
        - $ref: '#/components/schemas/StockAssetFundamentals'
      discriminator:
        propertyName: type
        mapping:
          etf:
            $ref: '#/components/schemas/ETFAssetFundamentals'
          stock:
            $ref: '#/components/schemas/StockAssetFundamentals'
    AssetTag:
      type: string
      enum:
        - FRACTIONAL
        - ADR
        - SMART_EXECUTION
        - COMMISSION_FREE
        - MARKET_OPEN
        - MARKET_CLOSED
    MarketInfo:
      type: object
      properties:
        isOpen:
          type: boolean
        nextMarketOpen:
          type: integer
          format: int64
          description: Epoch milliseconds for the next market opening.
      required:
        - isOpen
    ApiErrorResponse:
      type: object
      properties:
        status:
          type: integer
        error:
          type: object
          properties:
            message:
              type: string
            description:
              type: string
              nullable: true
        responseId:
          type: string
          format: uuid
      required:
        - status
        - error
    ETFAssetFundamentals:
      type: object
      description: Fundamentals for an ETF.
      properties:
        type:
          type: string
          enum:
            - etf
          default: etf
        topHoldings:
          type: array
          items:
            $ref: '#/components/schemas/ETFHolding'
          nullable: true
        holdingsCount:
          type: integer
        expenseRatio:
          type: string
          description: Expense ratio formatted for the user's locale.
        indexStats:
          $ref: '#/components/schemas/ETFIndexStats'
        baseCurrency:
          type: string
        geographyDistribution:
          type: array
          items:
            $ref: '#/components/schemas/ETFGeographyAllocation'
          nullable: true
        sectorDistribution:
          type: array
          items:
            $ref: '#/components/schemas/ETFSectorAllocation'
          nullable: true
        about:
          $ref: '#/components/schemas/ETFAbout'
        news:
          type: array
          items:
            $ref: '#/components/schemas/AssetNewsItem'
      required:
        - type
        - holdingsCount
        - expenseRatio
        - indexStats
        - baseCurrency
        - about
        - news
    StockAssetFundamentals:
      type: object
      description: Fundamentals for a stock.
      properties:
        type:
          type: string
          enum:
            - stock
          default: stock
        about:
          $ref: '#/components/schemas/StockAbout'
        metrics:
          $ref: '#/components/schemas/StockMetrics'
        analystViews:
          $ref: '#/components/schemas/StockAnalystViews'
        news:
          type: array
          items:
            $ref: '#/components/schemas/AssetNewsItem'
      required:
        - type
        - about
        - metrics
        - analystViews
        - news
    ETFHolding:
      type: object
      properties:
        name:
          type: string
        weight:
          type: string
          description: Weight formatted as percentage string.
        logoUrl:
          type: string
          format: uri
          nullable: true
      required:
        - name
        - weight
    ETFIndexStats:
      oneOf:
        - $ref: '#/components/schemas/BondIndexStats'
        - $ref: '#/components/schemas/EquityIndexStats'
    ETFGeographyAllocation:
      type: object
      properties:
        name:
          type: string
        percentage:
          type: number
          format: float
      required:
        - name
        - percentage
    ETFSectorAllocation:
      type: object
      properties:
        name:
          type: string
        percentage:
          type: number
          format: float
      required:
        - name
        - percentage
    ETFAbout:
      type: object
      properties:
        exchange:
          type: string
        isin:
          type: string
        ticker:
          type: string
        assetClass:
          type: string
        sector:
          type: string
        advancedName:
          type: string
        description:
          type: string
        provider:
          type: string
        income:
          type: string
          enum:
            - ACCUMULATING
            - DISTRIBUTING
        replication:
          type: string
        index:
          type: string
      required:
        - exchange
        - isin
        - ticker
        - assetClass
        - sector
        - advancedName
        - description
        - provider
        - income
        - replication
        - index
    AssetNewsItem:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        text:
          type: string
        source:
          type: string
        newsUrl:
          type: string
          format: uri
        imageUrl:
          type: string
          format: uri
          nullable: true
        date:
          type: string
          format: date-time
        displayDate:
          type: string
        sentiment:
          type: string
          enum:
            - Positive
            - Neutral
            - Negative
        type:
          type: string
      required:
        - id
        - title
        - text
        - source
        - newsUrl
        - date
        - displayDate
        - sentiment
        - type
    StockAbout:
      type: object
      properties:
        ticker:
          type: string
        exchange:
          type: string
        sector:
          type: string
        industry:
          type: string
        description:
          type: string
        employees:
          type: string
        website:
          type: string
        ceo:
          type: string
        headquarters:
          type: string
        isin:
          type: string
      required:
        - ticker
        - exchange
        - sector
        - industry
        - description
        - employees
        - website
        - ceo
        - headquarters
        - isin
    StockMetrics:
      type: object
      properties:
        marketCap:
          type: string
        peRatio:
          type: string
        eps:
          type: string
        dividendYield:
          type: string
        beta:
          type: string
        forwardPE:
          type: string
      required:
        - marketCap
        - peRatio
        - eps
        - dividendYield
        - beta
        - forwardPE
    StockAnalystViews:
      type: object
      properties:
        averagePriceTarget:
          type: string
        priceTargetPercentageDifference:
          type: string
        isPriceTargetPercentageDifferencePositive:
          type: boolean
        totalAnalysts:
          type: integer
        percentageBuy:
          type: number
          format: float
        percentageSell:
          type: number
          format: float
        percentageHold:
          type: number
          format: float
        isMajority:
          type: string
          enum:
            - buy
            - sell
            - hold
      required:
        - averagePriceTarget
        - priceTargetPercentageDifference
        - isPriceTargetPercentageDifferencePositive
        - totalAnalysts
        - percentageBuy
        - percentageSell
        - percentageHold
        - isMajority
    BondIndexStats:
      type: object
      properties:
        expectedReturn:
          type: string
        annualRisk:
          type: string
        coupon:
          type: string
        bondYield:
          type: string
      required:
        - expectedReturn
        - annualRisk
        - coupon
        - bondYield
    EquityIndexStats:
      type: object
      properties:
        expectedReturn:
          type: string
        annualRisk:
          type: string
        dividendYield:
          type: string
        fpEarnings:
          type: string
          description: Forward earnings metric formatted for locale.
      required:
        - expectedReturn
        - annualRisk
        - dividendYield
        - fpEarnings
  responses:
    BadRequestError:
      description: Validation failure or business rule violation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorResponse'
          example:
            status: 400
            error:
              message: Unknown asset ISIN
            responseId: 6d86bcab-9c21-45da-9b9d-820d598e1f3b
    UnauthorizedError:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorResponse'
          example:
            status: 401
            error:
              message: User not found
            responseId: 145f2b0d-1d5b-4e91-8d0d-7af0ae9ad13a
    ForbiddenError:
      description: Authenticated user cannot access the requested resource or lacks scopes.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorResponse'
          example:
            status: 403
            error:
              message: Access forbidden for portfolio
            responseId: 5e467f79-c62c-4d83-9810-7a0f8529fd76
    NotFoundError:
      description: Investment product was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorResponse'
          example:
            status: 404
            error:
              message: Product not found
            responseId: 0c8d8376-43db-4318-8ad4-0452bc0ce450
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Auth0-issued access token that includes the `read:users` scope.

````