Skip to main content
POST
Grouped news feed for a portfolio

Authorizations

X-Api-Key
string
header
required

Body

application/json
portfolio_weights
object | null

Portfolio weights keyed by tilt_id or CUSIP. Mixed identifiers are allowed; CUSIPs are resolved to tilt_ids server-side. Stories tagged to a holding are blended into the feed and lifted in proportion to the position.

queries
object[] | null

Interest queries, weighted. When omitted the feed is every article in the window ranked by importance.

Required array length: 1 - 20 elements
window_hours
integer
default:48

How far back to look, in hours (max 7 days).

Required range: 1 <= x <= 168
min_importance
integer | null

Drop articles rated below this.

Required range: 1 <= x <= 10
min_score
number
default:0.4

Minimum query similarity (query mode only).

Required range: 0 <= x <= 1
importance_weight
number
default:0.5

Query mode: score * (1 + weight * importance / 10).

Required range: 0 <= x <= 2
pool_size
integer
default:150

Max articles considered before grouping.

Required range: 10 <= x <= 400
max_portfolio_articles
integer
default:30

Cap on holdings-tagged articles blended into the pool.

Required range: 0 <= x <= 100
holdings_min_importance
integer

A story rated below this earns no portfolio lift, whatever its holdings or exposure. Omit to take SIG's default (3); the ranking defaults are SIG's, so a value set here overrides them for every call.

Required range: 1 <= x <= 10
holdings_boost
number

The lift a fully relevant story earns, in score units where importance 10 is 1.0. Relevance is the larger of the holdings signal (an article tagged to a position, pro rata to its share until full_boost_share) and the exposure signal (the article's scenario tree moves the portfolio more than it usually moves against the market). Omit to take SIG's default (0.6, six importance points). 0 ranks the feed on importance alone.

Required range: 0 <= x <= 1
full_boost_share
number

Portfolio share at which a tagged position earns the full lift; smaller positions earn it pro rata. Omit to take SIG's default (0.03).

Required range: 0 < x <= 1
exposure_specificity
number | null

Multiple of the portfolio's typical move against the market at which an article's exposure counts as fully specific. Omit to take SIG's default (3); null ranks on tagged holdings alone.

Required range: 1.1 <= x <= 20
exposure_full_mad
number

Portfolio MAD, in percentage points, at which the exposure signal is at full strength; smaller moves scale it down. Omit to take SIG's default (0.5).

Required range: 0 < x <= 50
max_per_topic
integer

At most this many of the returned groups may belong to one topic until every other topic in reach is placed, so the day's dominant story keeps its lead but not the whole page. Omit to take SIG's default (2); 0 returns groups in rank order.

Required range: 0 <= x <= 50
source_preference
string[]

Vendors in order of preference. Within a group, a preferred vendor's article leads when its score is within source_margin of the group's best. Never moves a group down the feed; [] disables.

Maximum array length: 10
source_margin
number
default:0.1

How far below the group's best score a preferred vendor may still lead.

Required range: 0 <= x <= 1
limit_groups
integer
default:20

Max groups returned.

Required range: 1 <= x <= 100
max_per_group
integer
default:5

Max articles returned per group.

Required range: 1 <= x <= 50
group_threshold
number
default:0.75

Complete-link cosine threshold for two articles to share a group.

Required range: 0.5 <= x <= 0.95
topic_grouping
boolean
default:false

Also gather the returned story groups into broader topics (an ongoing conflict, a data release and its market reaction). Story groups are unchanged; the topics come back in topics.

topic_threshold
number
default:0.7

Cosine at which two stories share a topic on embedding alone; stories that share a subject code join at a lower bar.

Required range: 0.4 <= x <= 0.95
collapse_versions
boolean
default:true

Keep only the latest version of a re-issued article ('-- Update', '-- 4th Update').

include_content
boolean
default:false

Include full article text.

include_scenarios
boolean
default:false

Include each article's scenario tree.

include_exposure_details
boolean
default:false

Include per-leaf portfolio exposure details (the summary is always included).

Response

200 - application/json

Grouped, ranked feed

success
boolean
required
window_since
string
required
articles_considered
integer
required
stories_considered
integer
required
groups_total
integer
required
groups
object[]
required
warnings
string[]
required
topics
object[] | null

Only with topic_grouping: the returned groups gathered into broader topics, in feed order.

typical_exposure_ratio
number | null

Median over the pool of the portfolio's MAD to SPY's under one article's tree: how much more than the market this portfolio moves on a typical story. The exposure signal is measured against it.