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

# Article Portfolio Relevance

> Classifies each article once and returns a comparable portfolio relevance score without generating a scenario tree.

Use this endpoint to rank a news feed for a portfolio without generating a scenario tree. Send up to 100 articles per request and compare `relevance_score` values within the response.

Each article may contain up to 50,000 content characters, with a maximum of 2,000,000 content characters across the request. Supplied `article_id` values must be unique within the batch.

The default `response_detail` is `score`. Use `explain` when you also need the classification reason and leading portfolio contributors. Use `full` only for debugging or deeper analysis.

Article classification is cached independently of the portfolio. Reusing the same headline, content, and publication time across portfolios avoids repeating the classification work, while each portfolio still receives its own relevance score.


## OpenAPI

````yaml POST /api/v1/backchannel/risk/article_portfolio_relevance
openapi: 3.0.3
info:
  title: Pulse API
  version: 1.0.0
  description: >-
    API for integrating Tilt market intelligence capabilities, including
    scenarios, topics, company news, company search, and risk analysis.
servers:
  - url: https://tilt.io
    description: Production
security:
  - apiKeyAuth: []
paths:
  /api/v1/backchannel/risk/article_portfolio_relevance:
    post:
      tags:
        - Risk
      summary: Score articles by portfolio relevance
      description: >-
        Classifies each article once and returns a comparable portfolio
        relevance score without generating a scenario tree.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ArticlePortfolioRelevanceRequest'
      responses:
        '200':
          description: Portfolio relevance scores and any per-article processing errors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArticlePortfolioRelevanceResponse'
      security:
        - apiKeyAuth: []
components:
  schemas:
    ArticlePortfolioRelevanceRequest:
      type: object
      properties:
        portfolio_weights:
          type: object
          additionalProperties:
            type: number
          description: >-
            Portfolio weights keyed by tilt_id or CUSIP. Mixed identifiers are
            allowed; CUSIPs are resolved to tilt_ids server-side.
        articles:
          type: array
          items:
            $ref: '#/components/schemas/ArticleRelevanceInput'
          minItems: 1
          maxItems: 100
        response_detail:
          type: string
          enum:
            - score
            - explain
            - full
          default: score
          description: >-
            score returns ranking fields only; explain adds the reason and
            portfolio contribution summary; full also returns the classified
            impact profile and raw impact measures.
      required:
        - portfolio_weights
        - articles
      additionalProperties: false
    ArticlePortfolioRelevanceResponse:
      type: object
      properties:
        success:
          type: boolean
        score_version:
          type: string
        results:
          type: array
          items:
            $ref: '#/components/schemas/ArticlePortfolioRelevanceResult'
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ArticlePortfolioRelevanceError'
      required:
        - success
        - score_version
        - results
        - errors
    ArticleRelevanceInput:
      type: object
      properties:
        article_id:
          type: string
          minLength: 1
          maxLength: 300
          description: >-
            Optional client identifier, echoed in the response for batch
            correlation.
        headline:
          type: string
          minLength: 1
          maxLength: 500
        content:
          type: string
          minLength: 1
          maxLength: 50000
        source:
          type: string
          minLength: 1
          maxLength: 200
        published_at:
          anyOf:
            - type: string
              format: date
            - type: string
              format: date-time
      required:
        - headline
        - content
      additionalProperties: false
    ArticlePortfolioRelevanceResult:
      type: object
      properties:
        input_index:
          type: integer
          minimum: 0
        article_id:
          type: string
        relevance_score:
          type: number
          minimum: 0
          maximum: 1
        cache_hit:
          type: boolean
        scope:
          type: string
          enum:
            - company
            - sector
            - macro
            - none
        reason:
          type: string
        components:
          $ref: '#/components/schemas/ArticleRelevanceComponents'
        matched_portfolio_weight:
          type: number
          minimum: 0
        top_contributors:
          type: array
          items:
            $ref: '#/components/schemas/ArticleRelevanceContribution'
        profile:
          $ref: '#/components/schemas/ArticleImpactProfile'
        gross_materiality:
          type: number
          minimum: 0
        net_directional_impact:
          type: number
      required:
        - input_index
        - relevance_score
        - cache_hit
    ArticlePortfolioRelevanceError:
      type: object
      properties:
        input_index:
          type: integer
          minimum: 0
        article_id:
          type: string
        error:
          type: string
      required:
        - input_index
        - error
    ArticleRelevanceComponents:
      type: object
      properties:
        direct:
          type: number
          minimum: 0
          maximum: 1
        sector:
          type: number
          minimum: 0
          maximum: 1
        macro:
          type: number
          minimum: 0
          maximum: 1
      required:
        - direct
        - sector
        - macro
    ArticleRelevanceContribution:
      type: object
      properties:
        tilt_id:
          type: string
        ticker:
          type: string
          nullable: true
        contribution:
          type: number
      required:
        - tilt_id
        - contribution
    ArticleImpactProfile:
      type: object
      properties:
        scope:
          type: string
          enum:
            - company
            - sector
            - macro
            - none
        reason:
          type: string
        mentioned_companies:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              ticker:
                type: string
              relationship:
                type: string
                enum:
                  - primary
                  - secondary
              tilt_ids:
                type: array
                items:
                  type: string
            required:
              - name
              - ticker
              - relationship
              - tilt_ids
        signals:
          type: array
          items:
            type: object
            properties:
              indicator:
                type: string
              impact:
                type: number
              confidence:
                type: number
                minimum: 0
                maximum: 1
              evidence:
                type: string
              category:
                type: string
                enum:
                  - direct
                  - sector
                  - macro
            required:
              - indicator
              - impact
              - confidence
              - evidence
              - category
        profile_version:
          type: string
        model:
          type: string
        generated_at:
          type: string
          format: date-time
        validation_warnings:
          type: array
          items:
            type: string
      required:
        - scope
        - reason
        - mentioned_companies
        - signals
        - profile_version
        - model
        - generated_at
        - validation_warnings
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-Api-Key

````