Schema reference
Every field in the Vera news API, with explicit definitions for the interpretive fields.
News schema (/pm/v2/news)
The rich news feed. Each item is a news event with related markets nested underneath, including source metadata, context, rationale, market snapshots, and momentum tags.
{
"news_event": {
"id": "headline_abc123",
"headline": "Iran says it will close the Strait of Hormuz",
"short_headline": "Iran threatens Hormuz closure",
"source_news_url": null,
"source_name": "RSS",
"source_type": "rss",
"source_tier": "t1",
"source_url": null,
"short_context": "Direct closure would resolve multiple geopolitics markets.",
"long_context": "Extended context on the story...",
"author": null,
"feed_categories": ["geopolitics"],
"source_published_at": "2026-06-10T14:32:00Z",
"endpoint_published_at": "2026-06-10T14:34:12Z",
"aggregate_event_relevance": {
"bucket": "high"
}
},
"related_markets": [
{
"main_market": {
"market_id": "polymarket_event_abc",
"market_url": "https://polymarket.com/event/...",
"market_title": "Will Iran close the Strait of Hormuz by EOY 2026?",
"outcomes": null,
"news_effect": null,
"market_snapshot": null,
"thin_liquidity": null,
"momentum": null
},
"market_relationship": {
"bucket": "high",
"summary": "Markets interpret the Iranian statement as supportive of YES."
},
"sub_markets": [
{
"sub_market_id": "polymarket_0x1a2b...",
"sub_market_title": "Will Iran close the Strait of Hormuz by EOY 2026?",
"market_url": "https://polymarket.com/event/...",
"outcomes": {
"yes": { "token_id": null },
"no": { "token_id": null }
},
"news_effect": {
"affected_outcome": "YES",
"effect": "supports",
"relevance_bucket": "high",
"rationale": "Markets appear to interpret the Iranian statement as supportive of YES because direct closure of Hormuz would resolve the market in favour of YES."
},
"market_snapshot": {
"yes_ask": 0.62,
"no_ask": 0.39,
"volume_24h": 142351.20,
"total_volume": 4821550.00,
"yes_ask_source": "ask",
"no_ask_source": "ask",
"yes_tick_age_seconds": 4,
"no_tick_age_seconds": 9,
"note": "Reference only."
},
"momentum": {
"passed": true,
"pre_move_pp": 1.8,
"criteria": "ANY |+1.8pp| >= 0.5",
"config": "v4"
}
}
]
}
],
"meta": {
"content_type": "event-driven market intelligence",
"not_investment_advice": true,
"not_trading_signal": true
}
}News event fields
| Field | Type | Notes |
|---|---|---|
| id | string | Stable identifier for the news event. |
| headline | string | null | The full headline text. |
| short_headline | string | null | 60–80 char curated display headline. Null on older items or when generation failed. |
| source_news_url | string | null | Reserved — currently always null. |
| source_name | string | null | Source modality: X (curated X/Twitter sources) or RSS (news feeds). Specific source identities are not disclosed. |
| source_type | string | null | tweet, rss, or other source types. |
| source_tier | string | null | t1 (top-tier institutional), t2 (established secondary), t3 (informal). Null when classification is pending. |
| source_url | string | null | Reserved — currently always null. |
| short_context | string | null | Brief "why this matters for traders" context. |
| long_context | string | null | Extended context or full body. |
| author | string | null | Reserved — currently always null. |
| feed_categories | string[] | Category tags (e.g. geopolitics, crypto). |
| source_published_at | string | null | ISO 8601. When the source originally published. |
| endpoint_published_at | string | null | ISO 8601. When our endpoint emitted this item. |
| aggregate_event_relevance | object | Contains bucket: one of low, moderate, high. |
Related markets structure
Each news item has zero or more related_markets. Each related market contains a main_market (the parent Polymarket event), a market_relationship, and sub_markets (the individual yes/no contracts).
For standalone markets (no parent multi-outcome event), the per-outcome detail is on the main_market directly and sub_markets is empty. For multi-outcome events, per-outcome detail lives on sub_markets[] and the main_market's outcomes, news_effect, and market_snapshot are null. Discriminate via sub_markets.length.
main_market fields
| Field | Type | Notes |
|---|---|---|
| market_id | string | Stable identifier for the parent Polymarket event. |
| market_url | string | null | Link to the event on Polymarket. |
| market_title | string | Human-readable event title. |
| outcomes | object | null | Populated for standalone markets; null for multi-outcome events. |
| news_effect | object | null | Populated for standalone markets; null for multi-outcome events. |
| market_snapshot | object | null | Populated for standalone markets; null for multi-outcome events. |
| thin_liquidity | boolean | null | true when the market has thin order-book depth. Useful for filtering out low-liquidity matches. null when liquidity data is unavailable. |
| momentum | object | null | See the momentum tag section below. |
market_relationship fields
| Field | Type | Notes |
|---|---|---|
| bucket | string | Relevance level: low, moderate, or high. |
| summary | string | Natural-language sentence summarising how the news relates to this market. |
The news_effect block
| Field | Type | Notes |
|---|---|---|
| affected_outcome | string | YES or NO: which outcome the event appears to bear on. |
| effect | string | supports or opposes. Whether the news appears consistent with or contrary to the referenced outcome. Never a buy/sell direction. |
| relevance_bucket | string | low, moderate, or high. How strongly the event relates to this specific market. |
| rationale | string | null | Natural-language sentence. Phrasing convention: "Markets appear to interpret X as supportive of YES because...". Null for low-bucket items. |
The interpretive fields
Several fields in the schema are interpretive: aggregate_event_relevance at the event level and relevance_bucket at the per-market level. These represent estimated relevance levels and are explicitly not probabilities, expected returns, confidence levels, or trading signals.
The values are simple levels (low, moderate, high) rather than numeric scores, by design. Levels keep you from reading too much into a 0.7-vs-0.8 score that doesn't exist, and leave the precise weighting to you.
The market_snapshot block
A snapshot of the market at the moment the event was processed, included for reference and mapping only. The note field says so explicitly. Do not treat it as a live price feed.
| Field | Type | Notes |
|---|---|---|
| yes_ask / no_ask | number | null | Best ask on each side at processing time, as an implied probability (0–1). null means no usable price was found; don't derive it from the opposite side. |
| yes_ask_source / no_ask_source | string | null | How each side resolved: ask (CLOB orderbook), ws (price-stream tick), or null (no price found). |
| volume_24h | number | null | Trailing 24-hour traded volume, in USD. |
| total_volume | number | null | All-time traded volume, in USD. |
| yes_tick_age_seconds / no_tick_age_seconds | integer | null | Seconds since the most recent price tick on each side, computed at serve time, so you can judge how fresh the snapshot is right now. |
The momentum tag
Each sub-market (or standalone main_market) may carry a momentum object. It flags whether the related market visibly movedaround the event, inside our latency window, by more than this category's threshold, marking a higher signal-to-noise subset of the feed. It is explicitly descriptive, not predictive: it says the market reacted, not that any position would profit.
| Field | Type | Notes |
|---|---|---|
| momentum.passed | boolean | true if the related market moved past this category's gate threshold within our window. |
| momentum.pre_move_pp | number | null | The signed move, in percentage points of implied probability, between event time and processing time. |
| momentum.criteria | string | null | The literal rule evaluated, e.g. ANY |+1.8pp| >= 0.5. |
| momentum.config | string | null | The gate config version that produced the verdict (e.g. v4). |
The whole momentum object is null until the gate logs the event (about a minute after publish), or when no live price existed at event time. To consume only the tagged subset, filter on momentum.passed === true. What it is not: not a probability, not an expected return, not an accuracy or win-rate claim, not a trading signal.
Versioning
Breaking changes ship under a new URL prefix; non-breaking additions ship in-place. Additive changes you should expect to see ship without a version bump: new optional fields on existing objects, new credibility tiers, new venue identifiers. Build tolerant clients that ignore unknown fields.
What Vera is not
Repeating from Overview because it bears repeating in the same place a developer reads the schema for the first time: the output is informational and interpretive. It is not investment advice, not a trading signal, and not a recommendation. The interpretive fields are simple low / moderate / high levels. Build accordingly.