curl --request POST \
--url https://tilt.io/api/v1/backchannel/scenarios/feed \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"portfolio_weights": {},
"queries": [
{
"weight": 0.5,
"query": "<string>"
}
],
"window_hours": 48,
"min_importance": 5,
"min_score": 0.4,
"importance_weight": 0.5,
"pool_size": 150,
"max_portfolio_articles": 30,
"holdings_min_importance": 5,
"holdings_boost": 0.5,
"full_boost_share": 0.5,
"exposure_specificity": 10.55,
"exposure_full_mad": 25,
"max_per_topic": 25,
"source_preference": [
"WSJ"
],
"source_margin": 0.1,
"limit_groups": 20,
"max_per_group": 5,
"group_threshold": 0.75,
"topic_grouping": false,
"topic_threshold": 0.7,
"collapse_versions": true,
"include_content": false,
"include_scenarios": false,
"include_exposure_details": false
}
'import requests
url = "https://tilt.io/api/v1/backchannel/scenarios/feed"
payload = {
"portfolio_weights": {},
"queries": [
{
"weight": 0.5,
"query": "<string>"
}
],
"window_hours": 48,
"min_importance": 5,
"min_score": 0.4,
"importance_weight": 0.5,
"pool_size": 150,
"max_portfolio_articles": 30,
"holdings_min_importance": 5,
"holdings_boost": 0.5,
"full_boost_share": 0.5,
"exposure_specificity": 10.55,
"exposure_full_mad": 25,
"max_per_topic": 25,
"source_preference": ["WSJ"],
"source_margin": 0.1,
"limit_groups": 20,
"max_per_group": 5,
"group_threshold": 0.75,
"topic_grouping": False,
"topic_threshold": 0.7,
"collapse_versions": True,
"include_content": False,
"include_scenarios": False,
"include_exposure_details": False
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
portfolio_weights: {},
queries: [{weight: 0.5, query: '<string>'}],
window_hours: 48,
min_importance: 5,
min_score: 0.4,
importance_weight: 0.5,
pool_size: 150,
max_portfolio_articles: 30,
holdings_min_importance: 5,
holdings_boost: 0.5,
full_boost_share: 0.5,
exposure_specificity: 10.55,
exposure_full_mad: 25,
max_per_topic: 25,
source_preference: ['WSJ'],
source_margin: 0.1,
limit_groups: 20,
max_per_group: 5,
group_threshold: 0.75,
topic_grouping: false,
topic_threshold: 0.7,
collapse_versions: true,
include_content: false,
include_scenarios: false,
include_exposure_details: false
})
};
fetch('https://tilt.io/api/v1/backchannel/scenarios/feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tilt.io/api/v1/backchannel/scenarios/feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'portfolio_weights' => [
],
'queries' => [
[
'weight' => 0.5,
'query' => '<string>'
]
],
'window_hours' => 48,
'min_importance' => 5,
'min_score' => 0.4,
'importance_weight' => 0.5,
'pool_size' => 150,
'max_portfolio_articles' => 30,
'holdings_min_importance' => 5,
'holdings_boost' => 0.5,
'full_boost_share' => 0.5,
'exposure_specificity' => 10.55,
'exposure_full_mad' => 25,
'max_per_topic' => 25,
'source_preference' => [
'WSJ'
],
'source_margin' => 0.1,
'limit_groups' => 20,
'max_per_group' => 5,
'group_threshold' => 0.75,
'topic_grouping' => false,
'topic_threshold' => 0.7,
'collapse_versions' => true,
'include_content' => false,
'include_scenarios' => false,
'include_exposure_details' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tilt.io/api/v1/backchannel/scenarios/feed"
payload := strings.NewReader("{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tilt.io/api/v1/backchannel/scenarios/feed")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tilt.io/api/v1/backchannel/scenarios/feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"window_since": "<string>",
"articles_considered": 123,
"stories_considered": 123,
"groups_total": 123,
"groups": [
{
"group_id": "<string>",
"title": "<string>",
"title_source": "story",
"score": 123,
"rank": 123,
"max_importance": 123,
"story_count": 123,
"versions_collapsed": 123,
"tilt_asset_ids": [
"<string>"
],
"holdings": [
"<string>"
],
"holdings_weight": 123,
"articles": [
{
"point_id": "<string>",
"headline": "<string>",
"date": "<string>",
"content": "<string>",
"publication_time": "<string>",
"tilt_source": "",
"importance_rating": 0,
"importance_rationale": "",
"generated_at": "",
"article_image_url": "<string>",
"fallback_image_id": "<string>",
"timeline": [],
"scenarios": [],
"subject_codes": [],
"subject_codes_original": [],
"prediction_markets": [],
"score": 123,
"tilt_asset_ids": [],
"securities": [],
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"num_leaf_scenarios": 123,
"leaf_details": [
{
"path": [
"<string>"
],
"title": "<string>",
"joint_probability_pct": 123,
"portfolio_return_pct": 123,
"abs_portfolio_return_pct": 123
}
],
"scenario_level_details": [
{
"title": "<string>",
"description": "<string>",
"probability_pct": 123,
"portfolio_return_mean_pct": 123,
"portfolio_return_std_pct": 123,
"macro_shocks": [
{
"indicator": "<string>",
"mean": 123,
"std": 123
}
],
"sub_scenario_count": 123
}
]
},
"warnings": [
"<string>"
]
}
],
"topic_point_id": "<string>",
"portfolio_relevance": 123,
"relevance_source": "holding",
"latest_published_at": "<string>",
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"article_point_id": "<string>",
"market_mad_pct": 123
}
}
],
"warnings": [
"<string>"
],
"topics": [
{
"topic_id": "<string>",
"title": "<string>",
"title_source": "subject_code",
"story_count": 123,
"article_count": 123,
"max_importance": 123,
"holdings": [
"<string>"
],
"holdings_weight": 123,
"groups": [
{
"group_id": "<string>",
"title": "<string>",
"title_source": "story",
"score": 123,
"rank": 123,
"max_importance": 123,
"story_count": 123,
"versions_collapsed": 123,
"tilt_asset_ids": [
"<string>"
],
"holdings": [
"<string>"
],
"holdings_weight": 123,
"articles": [
{
"point_id": "<string>",
"headline": "<string>",
"date": "<string>",
"content": "<string>",
"publication_time": "<string>",
"tilt_source": "",
"importance_rating": 0,
"importance_rationale": "",
"generated_at": "",
"article_image_url": "<string>",
"fallback_image_id": "<string>",
"timeline": [],
"scenarios": [],
"subject_codes": [],
"subject_codes_original": [],
"prediction_markets": [],
"score": 123,
"tilt_asset_ids": [],
"securities": [],
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"num_leaf_scenarios": 123,
"leaf_details": [
{
"path": [
"<string>"
],
"title": "<string>",
"joint_probability_pct": 123,
"portfolio_return_pct": 123,
"abs_portfolio_return_pct": 123
}
],
"scenario_level_details": [
{
"title": "<string>",
"description": "<string>",
"probability_pct": 123,
"portfolio_return_mean_pct": 123,
"portfolio_return_std_pct": 123,
"macro_shocks": [
{
"indicator": "<string>",
"mean": 123,
"std": 123
}
],
"sub_scenario_count": 123
}
]
},
"warnings": [
"<string>"
]
}
],
"topic_point_id": "<string>",
"portfolio_relevance": 123,
"relevance_source": "holding",
"latest_published_at": "<string>",
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"article_point_id": "<string>",
"market_mad_pct": 123
}
}
]
}
],
"typical_exposure_ratio": 123
}Portfolio Feed
One call: a portfolio, optional interests and a time window in; the window’s Dow Jones articles out, grouped into titled stories (and optionally broader topics), ranked by importance lifted by how much each story is about this portfolio (an article tagged to a position, or one whose scenario tree moves the portfolio more than it usually moves against the market), spread so one topic does not take the whole page, each article carrying its portfolio exposure. Stories and titles are precomputed at ingest, so a call takes tens of milliseconds.
curl --request POST \
--url https://tilt.io/api/v1/backchannel/scenarios/feed \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"portfolio_weights": {},
"queries": [
{
"weight": 0.5,
"query": "<string>"
}
],
"window_hours": 48,
"min_importance": 5,
"min_score": 0.4,
"importance_weight": 0.5,
"pool_size": 150,
"max_portfolio_articles": 30,
"holdings_min_importance": 5,
"holdings_boost": 0.5,
"full_boost_share": 0.5,
"exposure_specificity": 10.55,
"exposure_full_mad": 25,
"max_per_topic": 25,
"source_preference": [
"WSJ"
],
"source_margin": 0.1,
"limit_groups": 20,
"max_per_group": 5,
"group_threshold": 0.75,
"topic_grouping": false,
"topic_threshold": 0.7,
"collapse_versions": true,
"include_content": false,
"include_scenarios": false,
"include_exposure_details": false
}
'import requests
url = "https://tilt.io/api/v1/backchannel/scenarios/feed"
payload = {
"portfolio_weights": {},
"queries": [
{
"weight": 0.5,
"query": "<string>"
}
],
"window_hours": 48,
"min_importance": 5,
"min_score": 0.4,
"importance_weight": 0.5,
"pool_size": 150,
"max_portfolio_articles": 30,
"holdings_min_importance": 5,
"holdings_boost": 0.5,
"full_boost_share": 0.5,
"exposure_specificity": 10.55,
"exposure_full_mad": 25,
"max_per_topic": 25,
"source_preference": ["WSJ"],
"source_margin": 0.1,
"limit_groups": 20,
"max_per_group": 5,
"group_threshold": 0.75,
"topic_grouping": False,
"topic_threshold": 0.7,
"collapse_versions": True,
"include_content": False,
"include_scenarios": False,
"include_exposure_details": False
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
portfolio_weights: {},
queries: [{weight: 0.5, query: '<string>'}],
window_hours: 48,
min_importance: 5,
min_score: 0.4,
importance_weight: 0.5,
pool_size: 150,
max_portfolio_articles: 30,
holdings_min_importance: 5,
holdings_boost: 0.5,
full_boost_share: 0.5,
exposure_specificity: 10.55,
exposure_full_mad: 25,
max_per_topic: 25,
source_preference: ['WSJ'],
source_margin: 0.1,
limit_groups: 20,
max_per_group: 5,
group_threshold: 0.75,
topic_grouping: false,
topic_threshold: 0.7,
collapse_versions: true,
include_content: false,
include_scenarios: false,
include_exposure_details: false
})
};
fetch('https://tilt.io/api/v1/backchannel/scenarios/feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tilt.io/api/v1/backchannel/scenarios/feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'portfolio_weights' => [
],
'queries' => [
[
'weight' => 0.5,
'query' => '<string>'
]
],
'window_hours' => 48,
'min_importance' => 5,
'min_score' => 0.4,
'importance_weight' => 0.5,
'pool_size' => 150,
'max_portfolio_articles' => 30,
'holdings_min_importance' => 5,
'holdings_boost' => 0.5,
'full_boost_share' => 0.5,
'exposure_specificity' => 10.55,
'exposure_full_mad' => 25,
'max_per_topic' => 25,
'source_preference' => [
'WSJ'
],
'source_margin' => 0.1,
'limit_groups' => 20,
'max_per_group' => 5,
'group_threshold' => 0.75,
'topic_grouping' => false,
'topic_threshold' => 0.7,
'collapse_versions' => true,
'include_content' => false,
'include_scenarios' => false,
'include_exposure_details' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tilt.io/api/v1/backchannel/scenarios/feed"
payload := strings.NewReader("{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tilt.io/api/v1/backchannel/scenarios/feed")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tilt.io/api/v1/backchannel/scenarios/feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"portfolio_weights\": {},\n \"queries\": [\n {\n \"weight\": 0.5,\n \"query\": \"<string>\"\n }\n ],\n \"window_hours\": 48,\n \"min_importance\": 5,\n \"min_score\": 0.4,\n \"importance_weight\": 0.5,\n \"pool_size\": 150,\n \"max_portfolio_articles\": 30,\n \"holdings_min_importance\": 5,\n \"holdings_boost\": 0.5,\n \"full_boost_share\": 0.5,\n \"exposure_specificity\": 10.55,\n \"exposure_full_mad\": 25,\n \"max_per_topic\": 25,\n \"source_preference\": [\n \"WSJ\"\n ],\n \"source_margin\": 0.1,\n \"limit_groups\": 20,\n \"max_per_group\": 5,\n \"group_threshold\": 0.75,\n \"topic_grouping\": false,\n \"topic_threshold\": 0.7,\n \"collapse_versions\": true,\n \"include_content\": false,\n \"include_scenarios\": false,\n \"include_exposure_details\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"window_since": "<string>",
"articles_considered": 123,
"stories_considered": 123,
"groups_total": 123,
"groups": [
{
"group_id": "<string>",
"title": "<string>",
"title_source": "story",
"score": 123,
"rank": 123,
"max_importance": 123,
"story_count": 123,
"versions_collapsed": 123,
"tilt_asset_ids": [
"<string>"
],
"holdings": [
"<string>"
],
"holdings_weight": 123,
"articles": [
{
"point_id": "<string>",
"headline": "<string>",
"date": "<string>",
"content": "<string>",
"publication_time": "<string>",
"tilt_source": "",
"importance_rating": 0,
"importance_rationale": "",
"generated_at": "",
"article_image_url": "<string>",
"fallback_image_id": "<string>",
"timeline": [],
"scenarios": [],
"subject_codes": [],
"subject_codes_original": [],
"prediction_markets": [],
"score": 123,
"tilt_asset_ids": [],
"securities": [],
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"num_leaf_scenarios": 123,
"leaf_details": [
{
"path": [
"<string>"
],
"title": "<string>",
"joint_probability_pct": 123,
"portfolio_return_pct": 123,
"abs_portfolio_return_pct": 123
}
],
"scenario_level_details": [
{
"title": "<string>",
"description": "<string>",
"probability_pct": 123,
"portfolio_return_mean_pct": 123,
"portfolio_return_std_pct": 123,
"macro_shocks": [
{
"indicator": "<string>",
"mean": 123,
"std": 123
}
],
"sub_scenario_count": 123
}
]
},
"warnings": [
"<string>"
]
}
],
"topic_point_id": "<string>",
"portfolio_relevance": 123,
"relevance_source": "holding",
"latest_published_at": "<string>",
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"article_point_id": "<string>",
"market_mad_pct": 123
}
}
],
"warnings": [
"<string>"
],
"topics": [
{
"topic_id": "<string>",
"title": "<string>",
"title_source": "subject_code",
"story_count": 123,
"article_count": 123,
"max_importance": 123,
"holdings": [
"<string>"
],
"holdings_weight": 123,
"groups": [
{
"group_id": "<string>",
"title": "<string>",
"title_source": "story",
"score": 123,
"rank": 123,
"max_importance": 123,
"story_count": 123,
"versions_collapsed": 123,
"tilt_asset_ids": [
"<string>"
],
"holdings": [
"<string>"
],
"holdings_weight": 123,
"articles": [
{
"point_id": "<string>",
"headline": "<string>",
"date": "<string>",
"content": "<string>",
"publication_time": "<string>",
"tilt_source": "",
"importance_rating": 0,
"importance_rationale": "",
"generated_at": "",
"article_image_url": "<string>",
"fallback_image_id": "<string>",
"timeline": [],
"scenarios": [],
"subject_codes": [],
"subject_codes_original": [],
"prediction_markets": [],
"score": 123,
"tilt_asset_ids": [],
"securities": [],
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"num_leaf_scenarios": 123,
"leaf_details": [
{
"path": [
"<string>"
],
"title": "<string>",
"joint_probability_pct": 123,
"portfolio_return_pct": 123,
"abs_portfolio_return_pct": 123
}
],
"scenario_level_details": [
{
"title": "<string>",
"description": "<string>",
"probability_pct": 123,
"portfolio_return_mean_pct": 123,
"portfolio_return_std_pct": 123,
"macro_shocks": [
{
"indicator": "<string>",
"mean": 123,
"std": 123
}
],
"sub_scenario_count": 123
}
]
},
"warnings": [
"<string>"
]
}
],
"topic_point_id": "<string>",
"portfolio_relevance": 123,
"relevance_source": "holding",
"latest_published_at": "<string>",
"portfolio_exposure": {
"mad_pct": 123,
"expected_return_pct": 123,
"article_point_id": "<string>",
"market_mad_pct": 123
}
}
]
}
],
"typical_exposure_ratio": 123
}Authorizations
Body
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.
Show child attributes
Show child attributes
Interest queries, weighted. When omitted the feed is every article in the window ranked by importance.
1 - 20 elementsShow child attributes
Show child attributes
How far back to look, in hours (max 7 days).
1 <= x <= 168Drop articles rated below this.
1 <= x <= 10Minimum query similarity (query mode only).
0 <= x <= 1Query mode: score * (1 + weight * importance / 10).
0 <= x <= 2Max articles considered before grouping.
10 <= x <= 400Cap on holdings-tagged articles blended into the pool.
0 <= x <= 100A 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.
1 <= x <= 10The 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.
0 <= x <= 1Portfolio share at which a tagged position earns the full lift; smaller positions earn it pro rata. Omit to take SIG's default (0.03).
0 < x <= 1Multiple 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.
1.1 <= x <= 20Portfolio 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).
0 < x <= 50At 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.
0 <= x <= 50Vendors 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.
10How far below the group's best score a preferred vendor may still lead.
0 <= x <= 1Max groups returned.
1 <= x <= 100Max articles returned per group.
1 <= x <= 50Complete-link cosine threshold for two articles to share a group.
0.5 <= x <= 0.95Also 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.
Cosine at which two stories share a topic on embedding alone; stories that share a subject code join at a lower bar.
0.4 <= x <= 0.95Keep only the latest version of a re-issued article ('-- Update', '-- 4th Update').
Include full article text.
Include each article's scenario tree.
Include per-leaf portfolio exposure details (the summary is always included).
Response
Grouped, ranked feed
Show child attributes
Show child attributes
Only with topic_grouping: the returned groups gathered into broader topics, in feed order.
Show child attributes
Show child attributes
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.