Documentation Index
Fetch the complete documentation index at: https://docs.tilt.pro/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The Backchannel API lets you answer two core questions about a portfolio:- “What would happen to my portfolio if X occurred?” — Describe any scenario in plain English and get a probability-weighted impact analysis.
- “How does this news event affect my holdings?” — Search curated news scenarios and compute portfolio exposure against them.
- “What happens if macro conditions change?” — Run what-if analysis with specific macro factor shocks (USD strength, oil prices, etc.).
tilt_asset_id → weight. This guide walks through resolving tickers, building portfolio weights, and calling the scenario and risk endpoints.
Step 1: Resolve Tickers to Tilt Asset IDs
All portfolio-related endpoints accept weights keyed by Tilt Asset ID — an internal identifier for each security. Use the Search Tickers endpoint to resolve symbols.A symbol may return multiple results across exchanges (e.g. NAS and TSE listings). Filter by
ticker_type: "common_stock" and the relevant exchange to get the primary US listing.tilt_asset_id from each result.
View API Reference →
Step 2: Build Portfolio Weights
Construct aportfolio_weights object mapping each tilt_asset_id to a decimal weight (summing to 1.0):
Weights should sum to 1.0. If they don’t, the API will still work but exposure calculations will be proportional to the weights provided.
portfolio_weights object is reused across all the endpoints below.
Step 3: Scenario Portfolio Analysis
The simplest way to analyze portfolio impact. Describe any scenario in plain English and the API generates a probability tree of outcomes with portfolio-level returns.Recommended: Use flat_scenarios mode
We recommend using flat_scenarios: true for most integrations. This generates a clean, single-level structure where each scenario directly contains its macro shocks — no nested sub-scenarios to traverse. The result is simpler to parse and display.
Key parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
scenario_description | string | — | Plain English description of the scenario to analyze. |
portfolio_weights | object | — | Map of tilt_asset_id → weight. |
as_of_date | string | today | Date for the analysis (YYYY-MM-DD). |
flat_scenarios | boolean | false | Recommended: true. Generates flat scenarios where each scenario directly contains its macro shocks. When false, generates a two-level tree with sub-scenarios. |
search_for_context | boolean | true | Search for relevant background articles to improve scenario quality. |
include_security_details | boolean | true | Include per-security breakdown in each leaf scenario. |
aggregate_scenarios | boolean | false | Collapse the scenario tree into summary stats (mean/std per top-level scenario). |
force_regenerate | boolean | false | Bypass the scenario cache and regenerate from scratch. |
Caching behavior
Scenario generation results are automatically cached. The first call for a given scenario generates fresh results (10–15 seconds). All subsequent calls with the samescenario_description, as_of_date, search_for_context, and flat_scenarios combination return cached results in under 1 second.
The cache is keyed on these four parameters. The portfolio weights are not part of the cache key — portfolio impact computation happens after scenario generation, so a single cached scenario tree can be reused for any portfolio instantly.
Use force_regenerate: true to bypass the cache if you need fresh results for an already-cached scenario.
Response structure
The response includes an AI-generated scenario tree, leaf-level portfolio impacts, and a probability-weighted expected return:When
flat_scenarios: true, each scenario in scenario_tree contains its macro_shocks directly (no sub_scenarios), and leaf_scenarios has one entry per scenario. When flat_scenarios: false (default), scenarios have nested sub_scenarios and leaf_scenarios contains one entry per sub-scenario with joint probabilities.| Field | Description |
|---|---|
expected_portfolio_return_pct | Probability-weighted expected portfolio return across all leaf scenarios. Decimal form (0.01 = 1%). |
portfolio_summary | Counts of scenarios, leaf scenarios, and securities analyzed. |
scenario_tree | The full probability tree. Flat when flat_scenarios: true, nested with sub_scenarios when false. |
leaf_scenarios | Flattened leaf nodes with joint probabilities, portfolio returns, top movers, and per-security details. |
leaf_scenarios[].portfolio_return_pct | Portfolio return for this specific leaf scenario. |
leaf_scenarios[].contribution_to_expected_return_pct | This leaf’s contribution to the overall expected return (joint_probability * portfolio_return). |
leaf_scenarios[].top_movers | Top 3 gainers and top 3 losers by contribution to portfolio return. |
context_articles | Headlines of articles used as background context (when search_for_context is true). |
context_article_ids | Point IDs of context articles. Use with the Batch Articles endpoint to retrieve full details. |
cache_hit | true if the scenario tree was served from cache, false if freshly generated. |
warnings | Array of warnings (e.g., unknown tilt_ids skipped). null if no warnings. |
This endpoint uses AI to generate scenarios on first encounter (~10–15 seconds). Cached scenarios return in under 1 second. For instant results on pre-computed news scenarios, use the Search Scenarios endpoint below instead.
Flat vs. hierarchical scenarios
flat_scenarios: true | flat_scenarios: false (default) | |
|---|---|---|
| Structure | 3 top-level scenarios, each with macro_shocks directly | 3–5 top-level scenarios, each with 2–3 sub_scenarios containing macro_shocks |
| Leaf count | 3 leaves (one per scenario) | 6–15 leaves (sub-scenarios) |
| Best for | Simple UIs, mobile cards, quick summaries | Detailed analysis, drill-down interfaces |
| Parse complexity | Flat list — no nesting to traverse | Two levels of nesting |
Batch fetch context articles
Thecontext_article_ids field returns point IDs of the background articles used during scenario generation. To resolve these into full articles (headlines, content, scenarios), use the batch endpoint:
Step 4: Search News Scenarios with Portfolio Exposure
Search for curated, pre-computed news scenarios and see how each one affects your portfolio. This is instant (no AI generation) and useful for browsing recent events.Key parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
queries | array | — | Weighted search queries. Each has query (string) and weight (0–1). |
subject_code | string | null | Filter by subject code (e.g. "Technology", "Tariffs & Trade"). Can be used alone or with queries. |
portfolio_weights | object | null | Map of tilt_asset_id → weight. When provided, each result includes a portfolio_exposure field. |
aggregate_scenarios | boolean | false | When true, collapses the scenario tree into probability-weighted summary stats. |
order_by_exposure | boolean | false | When true, sorts results by portfolio impact instead of relevance. Requires portfolio_weights. |
limit | integer | 10 | Number of results (1–100). |
min_importance | integer | null | Filter to scenarios with importance rating >= this value (1–10). |
At least one of
queries or subject_code must be provided. Sending an empty request body will return a 422 Validation Error.Response structure
The response wraps results inarticles. Each article is a news scenario with timeline, probability tree, and (when portfolio_weights is provided) portfolio exposure:
portfolio_exposure:
| Field | Description |
|---|---|
expected_return_pct | Probability-weighted expected portfolio return across all leaf scenarios. Decimal form (0.01 = 1%). |
mad_pct | Mean absolute deviation of returns across leaf scenarios — a measure of outcome uncertainty. |
num_leaf_scenarios | Number of leaf nodes in the scenario tree used for the calculation. |
scenario_level_details | Per-scenario breakdown with mean return, standard deviation, and sub-scenario count. |
Step 5: Get a Single Scenario with Portfolio Exposure
Once you have apoint_id from search results, fetch its full detail with portfolio exposure:
aggregate_scenarios is false, the response includes leaf_details and scenario_level_details within portfolio_exposure, giving you the full probability tree with per-leaf portfolio returns.
View API Reference →
Step 6: Macro Factor Analysis
Get Macro Sensitivities
Understand which macro factors your portfolio is most exposed to:Run a Macro Scenario
Use the sensitivities output to stress-test with specific macro shocks. Theshocks object maps factor identifiers to shock magnitudes in standard deviations.
The sensitivities endpoint returns factor names with a
macro_ prefix (e.g. macro_DTWEXBGS). When passing shocks to the scenario endpoint, drop the prefix — use the raw identifier (e.g. DTWEXBGS).Putting It Together
A typical integration flow:- Resolve tickers once and cache the
tilt_asset_idmapping. - Run scenario portfolio analysis with a plain English description to quickly assess portfolio impact for any hypothetical event. Use
flat_scenarios: truefor the simplest response structure. This is the easiest starting point. - Search news scenarios with
portfolio_weightsto find real-world events that matter to the portfolio. Useorder_by_exposure: trueto surface the highest-impact stories first. - Fetch individual scenarios with
portfolio_weightsfor detailed drill-down with leaf-level probability breakdowns. - Get macro sensitivities to understand the portfolio’s factor exposures.
- Run macro scenarios to stress-test against specific factor shocks (e.g., “what if the US Dollar Index rises 0.5 standard deviations?”).
Rate Limits
All endpoints are rate-limited at 120 requests per minute per API key. Thescenario_portfolio_analysis endpoint has an additional limit of 10 requests per minute to protect the AI generation backend.
If you exceed the limit, you’ll receive a 429 Too Many Requests response:
Error Handling
All error responses follow a consistent format:| Status Code | Meaning |
|---|---|
400 | Bad request (e.g., empty portfolio weights) |
401 | Missing or invalid authentication. Use the X-Api-Key header. |
403 | Invalid API key |
415 | Unsupported Content-Type. Use application/json. |
422 | Validation error with field-level details |
429 | Rate limit exceeded |
500 | Internal server error |