---
title: "A compact brief across multiple tickers"
method: GET
path: "/api/news/brief/"
tags: ["news"]
---

# A compact brief across multiple tickers

`GET /api/news/brief/`

One response with recent news grouped by story, a separate SEC Form
4/8-K/6-K filings section, and the next confirmed earnings date per
ticker. Supply your symbols explicitly; this endpoint does not read
an account's saved watchlist. The website and MCP tool
`alphai_watchlist_brief` use the caller's saved list instead.

`hours` is a publication-time window ending at `generated_at`, both
ends inclusive. This is a ranked snapshot, not a delta since the last
call. Bulk backfills are excluded. Within each section, the newest
500 matching articles at the configured relevance floor (default 4)
are grouped, then ranked by each group's highest relevance and novelty,
then its newest publication time. Fields on a returned event describe
the representative article. `limit`
applies independently to news and filings. Either a candidate overflow
or additional grouped stories sets that section's `*_truncated` flag.
A truncated response is a selection, not a complete event inventory;
narrow `hours` or use the paginated ticker feed for further coverage.

An event shared by several requested tickers appears once, with
`matched_tickers` naming all matches. If press coverage and a filing
share a story, the filing represents it once in the filings section.
Distinct Form 4 transaction legs
remain separate even when they share a filing URL. Share classes and
former ticker names are included. Unrecognized symbols are returned
in `unknown_tickers`; bare crypto names are not guessed (use BTC-USD).
Dates are confirmed only, on or after today's America/New_York date,
excluding reports already matched to a published filing;
absence means no confirmed date on file, not that no report is due.
Available on every tier. Responses use `Cache-Control: private, no-store`.

## Query parameters

- `tickers` string[], required
- `hours` integer
- `limit` integer

## Response `200`

Brief with explicit coverage and truncation information.

- WatchlistBriefDTO
  - `generated_at` string, date-time, required
  - `window_start` string, date-time, required
  - `window_end` string, date-time, required
  - `hours` integer, required
  - `tickers` string[], required
  - `unknown_tickers` string[], required
  - `events` BriefEventDTO[], required
    - `uid` string, required
    - `story_id` string, required
    - `title` string, required
    - `summary` string, required
    - `url` string, required
    - `article_url` string, required
    - `source_domain` string, required
    - `source_type` string, required
    - `time_published` string, date-time, required
    - `matched_tickers` string[], required
    - `category` string, required
    - `relevance_score` integer, required
    - `information_novelty` integer, nullable
    - `actionability` string, nullable
    - `signals` BriefSignalDTO[]
      - `ticker` string, required
      - `sentiment` string, nullable
    - `earnings_available` boolean
  - `filings` BriefEventDTO[], required
    - `uid` string, required
    - `story_id` string, required
    - `title` string, required
    - `summary` string, required
    - `url` string, required
    - `article_url` string, required
    - `source_domain` string, required
    - `source_type` string, required
    - `time_published` string, date-time, required
    - `matched_tickers` string[], required
    - `category` string, required
    - `relevance_score` integer, required
    - `information_novelty` integer, nullable
    - `actionability` string, nullable
    - `signals` BriefSignalDTO[]
      - `ticker` string, required
      - `sentiment` string, nullable
    - `earnings_available` boolean
  - `upcoming_earnings` BriefEarningsDateDTO[], required
    - `ticker` string, required
    - `report_date` string, date, required
  - `events_truncated` boolean
  - `filings_truncated` boolean

## Other responses

- `400` — Invalid
- `401` — Missing or invalid API key.
- `429` — Rate limit exceeded — either the per-minute burst cap or the per-day volume cap. The `Retry-After` header is the earliest second a retry can succeed, not a guess (a burst block is short, ≤60s; a day-cap block is capped at 3600s — the true reset is `X-RateLimit-Reset`). The `X-RateLimit-*` trio shows the daily volume budget. The body's `extra` names your tier, its `limit_per_minute` / `limit_per_day`, `retry_after_seconds`, and — below Pro — an `upgrade` block with the higher tiers' caps and the pricing URL. A rejected request does not itself consume quota, so retrying after `Retry-After` costs you nothing extra.

## Changes

- **2026-09-20** `9cd79fbd9f21` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/alphai/apis/alphai-rest-api/changes/api/news/brief/get.md)

---

[API](https://skmtc.dev/alphai/apis/alphai-rest-api.md) · [All operations](https://skmtc.dev/alphai/apis/alphai-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/alphai/apis/alphai-rest-api/revisions/8bc11a8dc9ca?raw)
