Score articles by portfolio relevance
curl --request POST \
--url https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"portfolio_weights": {},
"articles": [
{
"headline": "<string>",
"content": "<string>",
"article_id": "<string>",
"source": "<string>",
"published_at": "2023-12-25"
}
],
"response_detail": "score"
}
'import requests
url = "https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance"
payload = {
"portfolio_weights": {},
"articles": [
{
"headline": "<string>",
"content": "<string>",
"article_id": "<string>",
"source": "<string>",
"published_at": "2023-12-25"
}
],
"response_detail": "score"
}
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: {},
articles: [
{
headline: '<string>',
content: '<string>',
article_id: '<string>',
source: '<string>',
published_at: '2023-12-25'
}
],
response_detail: 'score'
})
};
fetch('https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance', 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/risk/article_portfolio_relevance",
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' => [
],
'articles' => [
[
'headline' => '<string>',
'content' => '<string>',
'article_id' => '<string>',
'source' => '<string>',
'published_at' => '2023-12-25'
]
],
'response_detail' => 'score'
]),
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/risk/article_portfolio_relevance"
payload := strings.NewReader("{\n \"portfolio_weights\": {},\n \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\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/risk/article_portfolio_relevance")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio_weights\": {},\n \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance")
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 \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"score_version": "<string>",
"results": [
{
"input_index": 1,
"relevance_score": 0.5,
"cache_hit": true,
"article_id": "<string>",
"scope": "company",
"reason": "<string>",
"components": {
"direct": 0.5,
"sector": 0.5,
"macro": 0.5
},
"matched_portfolio_weight": 1,
"top_contributors": [
{
"tilt_id": "<string>",
"contribution": 123,
"ticker": "<string>"
}
],
"profile": {
"scope": "company",
"reason": "<string>",
"mentioned_companies": [
{
"name": "<string>",
"ticker": "<string>",
"relationship": "primary",
"tilt_ids": [
"<string>"
]
}
],
"signals": [
{
"indicator": "<string>",
"impact": 123,
"confidence": 0.5,
"evidence": "<string>",
"category": "direct"
}
],
"profile_version": "<string>",
"model": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"validation_warnings": [
"<string>"
]
},
"gross_materiality": 1,
"net_directional_impact": 123
}
],
"errors": [
{
"input_index": 1,
"error": "<string>",
"article_id": "<string>"
}
]
}Risk Analysis
Article Portfolio Relevance
Classifies each article once and returns a comparable portfolio relevance score without generating a scenario tree.
POST
/
api
/
v1
/
backchannel
/
risk
/
article_portfolio_relevance
Score articles by portfolio relevance
curl --request POST \
--url https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"portfolio_weights": {},
"articles": [
{
"headline": "<string>",
"content": "<string>",
"article_id": "<string>",
"source": "<string>",
"published_at": "2023-12-25"
}
],
"response_detail": "score"
}
'import requests
url = "https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance"
payload = {
"portfolio_weights": {},
"articles": [
{
"headline": "<string>",
"content": "<string>",
"article_id": "<string>",
"source": "<string>",
"published_at": "2023-12-25"
}
],
"response_detail": "score"
}
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: {},
articles: [
{
headline: '<string>',
content: '<string>',
article_id: '<string>',
source: '<string>',
published_at: '2023-12-25'
}
],
response_detail: 'score'
})
};
fetch('https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance', 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/risk/article_portfolio_relevance",
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' => [
],
'articles' => [
[
'headline' => '<string>',
'content' => '<string>',
'article_id' => '<string>',
'source' => '<string>',
'published_at' => '2023-12-25'
]
],
'response_detail' => 'score'
]),
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/risk/article_portfolio_relevance"
payload := strings.NewReader("{\n \"portfolio_weights\": {},\n \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\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/risk/article_portfolio_relevance")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio_weights\": {},\n \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tilt.io/api/v1/backchannel/risk/article_portfolio_relevance")
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 \"articles\": [\n {\n \"headline\": \"<string>\",\n \"content\": \"<string>\",\n \"article_id\": \"<string>\",\n \"source\": \"<string>\",\n \"published_at\": \"2023-12-25\"\n }\n ],\n \"response_detail\": \"score\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"score_version": "<string>",
"results": [
{
"input_index": 1,
"relevance_score": 0.5,
"cache_hit": true,
"article_id": "<string>",
"scope": "company",
"reason": "<string>",
"components": {
"direct": 0.5,
"sector": 0.5,
"macro": 0.5
},
"matched_portfolio_weight": 1,
"top_contributors": [
{
"tilt_id": "<string>",
"contribution": 123,
"ticker": "<string>"
}
],
"profile": {
"scope": "company",
"reason": "<string>",
"mentioned_companies": [
{
"name": "<string>",
"ticker": "<string>",
"relationship": "primary",
"tilt_ids": [
"<string>"
]
}
],
"signals": [
{
"indicator": "<string>",
"impact": 123,
"confidence": 0.5,
"evidence": "<string>",
"category": "direct"
}
],
"profile_version": "<string>",
"model": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"validation_warnings": [
"<string>"
]
},
"gross_materiality": 1,
"net_directional_impact": 123
}
],
"errors": [
{
"input_index": 1,
"error": "<string>",
"article_id": "<string>"
}
]
}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.Authorizations
Body
application/json
Portfolio weights keyed by tilt_id or CUSIP. Mixed identifiers are allowed; CUSIPs are resolved to tilt_ids server-side.
Show child attributes
Show child attributes
Required array length:
1 - 100 elementsShow child attributes
Show child attributes
score returns ranking fields only; explain adds the reason and portfolio contribution summary; full also returns the classified impact profile and raw impact measures.
Available options:
score, explain, full