---
title: "Screen Stocks"
method: POST
path: "/v0/search/screen_stocks"
tags: ["V0", "Search", "HAS_MCP_EQUIVALENT"]
---

# Screen Stocks

`POST /v0/search/screen_stocks`

## Request

- Base URL: `https://api.ultralayer.ai`
- URL: `https://api.ultralayer.ai/v0/search/screen_stocks`
- Auth: HTTP bearer

Find the public companies most exposed to a theme, event or trend described in plain language.

## Request body

- ScreenParams
  - `query` string, required
  - `limit` integer
  - `detail` 'full' | 'standard' | 'essential': essential:minimal; standard:scored+citable; full:all.

## Response `200`

Screen response at detail=full.

- ScreenResponse: Public response. Carries the rubric and categories so a user can see what a score means and how the table is grouped.
  - `criterion` string, required: The screening criterion restated as one precise sentence.
  - `score_rubric` string, required: What the exposure score means for this criterion.
  - `exposure_types` ScreenExposureType[], required: Categories the companies are grouped into.
    - `label` string, required: Short noun phrase a user would recognise, e.g. 'HBM memory supplier'.
    - `description` string, required: One sentence: which companies belong in this category.
  - `quant_filters` ScreenQuantFilter[]: Quantitative filters applied before the exposure screen
    - `field` union, required
      - 'country' | 'sector' | 'industry' | 'exchange'
      - 'market_cap_basic' | 'price_earnings_ttm' | 'dividends_yield_current' | 'total_revenue_yoy_growth_ttm' | 'net_margin_ttm' | 'Perf.1M' | 'Perf.YTD' | 'Perf.Y' | 'Value.Traded' | 'debt_to_equity'
    - `operation` 'equal' | 'greater' | 'less' | 'in_range', required
    - `values` string[], required: Text field: accepted values. Numeric field: one number, two for in_range, plain digits.
  - `quant_sort` ScreenQuantSort
    - `field` 'market_cap_basic' | 'price_earnings_ttm' | 'dividends_yield_current' | 'total_revenue_yoy_growth_ttm' | 'net_margin_ttm' | 'Perf.1M' | 'Perf.YTD' | 'Perf.Y' | 'Value.Traded' | 'debt_to_equity', required: market_cap_basic USD; price_earnings_ttm; dividends_yield_current %; total_revenue_yoy_growth_ttm %; net_margin_ttm %; Perf.1M, Perf.YTD, Perf.Y price change %; Value.Traded USD latest session; debt_to_equity ratio
    - `order` 'asc' | 'desc', required
  - `quant_filter_match_count` integer, nullable: Companies that passed the quantitative filters; null when none ran
  - `results` ScreenResult[], required: Companies that meet the criterion, strongest exposure first.
    - `stakeholder` StakeholderBase, required: Stakeholder information
      - `name` string, required: Name of the stakeholder
      - `stakeholder_type` 'PUBLIC_COMPANY', required: The type of stakeholder. ONLY the following are allowed: [PUBLIC_COMPANY].
      - `symbol` string, required: Ticker symbol of the stakeholder
    - `exposure_score` number, required: Sign: + benefits, - hurt as the criterion strengthens. Size: .5+ strong; below .5 weak.
    - `exposure_type` string, required: Short label for how the company is tied to the criterion. Shared by companies tied the same way.
    - `rationale` string, required: One or two self-contained sentences stating how the company is tied to the criterion.
    - `sources_with_quotes` SourceWithQuotes[], required: Sources (with exact quotes) that support this result.
      - `source_timestamp` string, date-time, required: Timestamp of the source item.
      - `source_table` 'news' | 'x_news' | 'youtube' | 'feeds' | 'x_posts' | 'tradingview_news' | 'telegram_messages' | 'web' | 'si_factor_assessments' | 'si_stakeholder_impacts' | 'fmp_company_descriptions' | 'fi_documents', required: Table (Type) of the source item.
      - `source_id` integer, required: 'id' of the source item
      - `url` string, required: Link to the source item. External sources link to the original page; first-party and synthesis sources link to their Ultralayer source page.
      - `source_metadata` union, required: Per-source metadata.
        - NewsSourceMetadata: source_metadata for rows where source_table == "news". News always has these two, so they are required (non-nullable). Do NOT widen this model for other sources; define a sibling model and register it in SOURCE_METADATA_BY_TABLE instead.
          - `title` string, required: Title of the news article.
          - `publisher` string, required: Publisher of the news article.
        - XNewsSourceMetadata: source_metadata for rows where source_table == "x_news". Only title: source_metadata is reserved for essential or genuinely filterable fields. x_id is encoded in Source.url; post_ids live in x_news.cluster_posts_results.
          - `title` string, required: X story title.
        - YouTubeSourceMetadata: source_metadata for rows where source_table == "youtube". Fields chosen for search filtering and source presentation: publisher links related channels; video_type distinguishes VIDEO, SHORT, and PODCAST; channel_name is the internal stable channel identity from YT_CONFIG. video_type / channel_name are optional because wire-derived citations only carry title/publisher from WireItemInternal. The documents-indexing path still sets both.
          - `title` string, required: YouTube video title.
          - `publisher` string, nullable, required: Internal publisher key linking related channels, e.g. bloomberg.
          - `video_type` string, nullable: VIDEO, SHORT, or PODCAST when known.
          - `channel_name` string, nullable: Internal stable channel identity from YT_CONFIG when known.
        - FeedsSourceMetadata: source_metadata for rows where source_table == "feeds". RSS headline rows. publisher is the internal feed/publisher key (nullable when unknown).
          - `title` string, required: Feed entry title.
          - `publisher` string, nullable, required: Internal publisher/feed key when known.
        - XPostsSourceMetadata: source_metadata for rows where source_table == "x_posts". Raw first-party posts have no title column — only publisher taxonomy.
          - `publisher` string, nullable, required: Publisher/rule-tag taxonomy when known.
        - TradingviewSourceMetadata: source_metadata for rows where source_table == "tradingview_news". TradingView stories always have a title; publisher is the normalized provider id.
          - `title` string, required: TradingView story title.
          - `publisher` string, nullable, required: Normalized provider id when known.
        - TelegramMessagesSourceMetadata: source_metadata for rows where source_table == "telegram_messages". Channel posts have no title column — only channel→publisher taxonomy.
          - `publisher` string, nullable, required: Channel→publisher taxonomy when known.
        - WebSourceMetadata: source_metadata for rows where source_table == "web".
          - `title` string, required: Title of the web record.
          - `record_type` string, required: Kind of web record (e.g. exa_search, azure_grounded).
        - SiFactorAssessmentSourceMetadata: source_metadata for rows where source_table == "si_factor_assessments". Lightweight identifiers only; full assessment content is retrieved via source_id. Assessments are first-party and have no public root URL; Source.coerce_source_metadata_and_url always mints /source/si_factor_assessments/{id}/{key} onto Source.url.
          - `factor_name` string, required: Factor name from the historical assessment.
          - `stakeholder_symbol` string, required: Stakeholder ticker from the historical assessment.
        - SiStakeholderImpactSourceMetadata: source_metadata for rows where source_table == "si_stakeholder_impacts". Lightweight identifiers only; full impact content (rationale, scores) is retrieved via source_id. Impacts are first-party and have no public root URL; Source.coerce_source_metadata_and_url always mints /source/si_stakeholder_impacts/{id}/{key} onto Source.url.
          - `stakeholder_symbol` string, required: Stakeholder ticker from the historical impact.
          - `stakeholder_name` string, required: Stakeholder name from the historical impact.
        - FmpCompanySourceMetadata: source_metadata for FMP data about one company. Today: rows where source_table == "fmp_company_descriptions". Lightweight identifiers only; the cited content is retrieved via source_id. Source.coerce_source_metadata_and_url mints FMP's page for symbol onto Source.url (ultralayer_python.source_url.build_fmp_company_url) for any table registered with this model. Nothing is stored for it. Another FMP company table reuses it by registering in SOURCE_METADATA_BY_TABLE and widening Source.source_table.
          - `symbol` string, required: Listing ticker of the company.
          - `company_name` string, required: Company name.
        - FilingDocumentSourceMetadata: source_metadata for rows where source_table == "fi_documents". No title column on fi_documents — do not invent one. document_class is not here: it is already GuidanceValue.source_type. fiscal_year / fiscal_quarter are the document's completed report period, not the guided period on the series — a Q2 release guiding FY revenue has Q2 here and FY on the series. Filing: fi_filings (nullable on a guidance update or an annual quarter). Call: fi_earnings_calls (always both; Q4 is 4). url lives on Source, not here: filing exhibits keep the document url; transcripts have none and Source mints a capability URL (ultralayer_python.source_url).
          - `symbol` string, required: Listing symbol of the filer.
          - `fiscal_year` integer, nullable, required: Filer fiscal year of the completed period this document reports, when it reports one.
          - `fiscal_quarter` integer, nullable, required: Filer fiscal quarter of that completed period; null for a full-year report or a document that reports no completed period.
          - `document_type` string, required: Source-native document label, e.g. EX-99.1 or transcript.
      - `quotes` string[], required: List of EXACT quotes from the source material.
    - `market_data` object, nullable: Listing data (country, sector, industry, market cap USD, valuation, growth, margin, price change); null when no quantitative filter ran

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/ultralayer/apis/ultralayer-api.md) · [All operations](https://skmtc.dev/ultralayer/apis/ultralayer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ultralayer/apis/ultralayer-api/revisions/4185459222be?raw)
