# VoxOdds

> Live prediction-market odds from Polymarket and Kalshi. Search markets and follow their price history, ask a question in plain English and get the odds, check a bookmaker's price for value, quote what an amount really buys once fees and order-book depth are counted, and see which venue is cheaper for the same outcome. Also VoxOdds' research signals, strategy backtests, research notes and an audited scoreboard of AI forecasts against the market. No account or API key required.

App · 15 actions. Web page: https://docs.lodol.com/docs/integrations/voxodds

## Actions

### Ask a question

Ask in plain English, such as 'Will Bitcoin dip to $77,500 in October?', and get the odds from the one market that answers it. VoxOdds will not guess: when several markets fit about equally well it returns them as candidates instead, so check 'matched' before using the odds. No API key required.

**Inputs**

- Question (`question`, text, required): The question, in plain English. Name the person, event and year: a specific question matches a single market more often.

**Outputs**

- `analysis_url` (text): The matched market on VoxOdds.
- `answer` (text): VoxOdds' answer in a sentence.
- `candidates` (list): The markets that fitted when none won outright: pass one's ID to Get a market.
- `market_id` (text): The matched market's ID. Null when not matched.
- `match_status` (text): matched, ambiguous or low_confidence.
- `matched` (true/false): True when VoxOdds settled on exactly one market. False means 'outcomes' is empty and 'candidates' lists the markets that fitted.
- `outcomes` (list): Each outcome's probability. Empty when not matched.
- `platform` (text): Where it trades: polymarket or kalshi.
- `question` (text): The matched market's question. Null when not matched.
- `reason` (text): Why no single market was chosen. Null when matched.
- `search_url` (text): A VoxOdds search for the question when nothing matched.
- `trade_url` (text): A link to trade it. Null when not matched.

**Example output**

```json
{
  "analysis_url": "https://voxodds.com/market/898415",
  "answer": "According to prediction markets, the current odds are: Yes: 0%, No: 100%. Volume: $14 in the last 24 hours.",
  "candidates": [],
  "market_id": "898415",
  "match_status": "matched",
  "matched": true,
  "outcomes": [
    {
      "name": "Yes",
      "probability_pct": 0.1
    }
  ],
  "platform": "polymarket",
  "question": "Will Charles Leclerc be the 2026 F1 Drivers' Champion?",
  "reason": null,
  "search_url": null,
  "trade_url": "https://voxodds.com/go/polymarket/2026-f1-drivers-champion?src=answer"
}
```

### Check a bet

Check a bookmaker's price before you bet: VoxOdds finds the prediction market for the event and compares the odds you were offered with the market's probability, giving the expected value per $100, the break-even odds and a verdict. Leave the odds empty to get just the fair price. No API key required.

**Inputs**

- Event (`event`, text, required): What the bet is on, in plain words. Be specific: VoxOdds refuses to judge when several markets fit.
- Your side (`side`, text): Whether you are betting it happens (Yes) or not (No). One of: `Yes`, `No`. Default: `Yes`.
- Odds offered (`odds`, text): The bookmaker's odds, written any common way: decimal (2.5), American (+150 or -200) or fractional (3/1). Leave it empty for the fair price alone.

**Outputs**

- `break_even_decimal_odds` (number): The lowest decimal odds worth taking.
- `candidates` (list): The markets that fitted when none won outright.
- `checked_at` (text): When the check ran (ISO 8601).
- `edge_points` (number): Market probability minus implied probability, in percentage points. Positive is in your favour.
- `event` (text): The event checked.
- `expected_value_per_100` (number): Expected profit or loss per $100 staked.
- `fair_decimal_odds` (number): The decimal odds that probability is worth.
- `kelly_fraction` (number): The Kelly stake as a fraction of bankroll (0 when no edge).
- `market_found` (true/false): True when VoxOdds matched the event to one market. False means no verdict: see 'candidates'.
- `market_probability_pct` (number): The market's probability for the side, 0 to 100.
- `market_question` (text): The market used as the reference.
- `market_url` (text): The reference market on VoxOdds.
- `offered_american_odds` (number): The odds offered, as American odds.
- `offered_decimal_odds` (number): The odds offered, as decimal odds.
- `offered_implied_probability_pct` (number): The probability the offered odds imply, 0 to 100.
- `quarter_kelly_fraction` (number): A quarter of that: a common, more cautious stake.
- `side` (text): The side checked.
- `verdict` (text): VoxOdds' verdict, such as clear_value_bet, clear_bad_bet, reference_only (no odds given) or no_reference (no market found).
- `verdict_detail` (text): The verdict explained in a sentence or two.

**Example output**

```json
{
  "break_even_decimal_odds": 1000.0,
  "candidates": [],
  "checked_at": "2026-10-15T21:42:22.773144+00:00",
  "edge_points": -39.9,
  "event": "Charles Leclerc 2026 F1 champion",
  "expected_value_per_100": -99.75,
  "fair_decimal_odds": 1000.0,
  "kelly_fraction": 0.0,
  "market_found": true,
  "market_probability_pct": 0.1,
  "market_question": "Will Charles Leclerc be the 2026 F1 Drivers' Champion?",
  "market_url": "https://voxodds.com/market/898415",
  "offered_american_odds": 150.0,
  "offered_decimal_odds": 2.5,
  "offered_implied_probability_pct": 40.0,
  "quarter_kelly_fraction": 0.0,
  "side": "Yes",
  "verdict": "clear_bad_bet",
  "verdict_detail": "Your book prices Yes at 2.50 (40.0% implied). The real-money prediction market says 0.1%, so break-even is 1000.00. You are paying 39.90pp over the true probability \u2014 -99.75 expected per 100 staked."
}
```

### Compare Polymarket and Kalshi

Quote the same bet on Polymarket and on Kalshi, fees and order-book depth included, and see which is cheaper and by how much. VoxOdds only names a winner when a person has checked the two contracts settle the same way; otherwise you get both quotes and the reasons they may differ. No API key required.

**Inputs**

- Polymarket market ID (`polymarket_id`, text, required): The Polymarket market ID, a number such as 898415. Find the best prices returns it for every matched outcome.
- Kalshi ticker (`kalshi_ticker`, text, required): The matching Kalshi ticker, such as KXF1-26-CL. Find the best prices returns it too.
- Side (`side`, text): Which side of the market to buy: Yes or No. Yes by default. One of: `Yes`, `No`. Default: `Yes`.
- Amount to spend (USD) (`amount_usd`, number): How many dollars to spend, fees included, from $1 to $100,000. The quote walks the live order book, so a bigger amount can get a worse average price. $100 by default. From 1 to 100000. Default: `100`.

**Outputs**

- `amount_usd` (number): The amount compared.
- `best_platform` (text): The cheaper venue. Null when not comparable.
- `best_price_with_fees` (number): Its average price per share, fees included.
- `blockers` (list): Why the venues could not be ranked.
- `comparable` (true/false): True when VoxOdds could rank the two venues. False means read 'blockers'.
- `extra_payout_if_wins_usd` (number): How much more it pays out if the side wins.
- `kalshi` (object): What the amount buys on one venue right now.
- `match_status` (text): verified_equivalent, non_equivalent or unverified.
- `note` (text): VoxOdds' caveat about the comparison.
- `observations` (list): Differences VoxOdds noticed between the contracts.
- `outcome` (text): The outcome both contracts pay on, when checked.
- `polymarket` (object): What the amount buys on one venue right now.
- `price_advantage_pct` (number): That saving as a percentage of the dearer price.
- `review_evidence` (text): Why the reviewer judged the contracts the same.
- `same_contract` (true/false): True when a person has checked both contracts settle the same way.
- `savings_per_share` (number): How much less each share costs there, in dollars.
- `side` (text): The side compared.

**Example output**

```json
{
  "amount_usd": 100.0,
  "best_platform": "polymarket",
  "best_price_with_fees": 0.001963,
  "blockers": [],
  "comparable": true,
  "extra_payout_if_wins_usd": 41597.35,
  "kalshi": {
    "amount_usd": 100.0,
    "available": true,
    "average_price": 0.01,
    "average_price_with_fees": 0.010694,
    "best_ask": 0.01,
    "best_bid": null,
    "closes_at": "2026-12-22T15:00:00Z",
    "decimal_odds": 93.51,
    "fees_usd": 6.49,
    "fully_filled": true,
    "market_id": "KXF1-26-CL",
    "note": "Size-aware order-book quote with estimated taker fee; venue rounding and cross-contract rule equivalence require confirmation.",
    "payout_if_wins_usd": 9351.0,
    "platform": "kalshi",
    "profit_if_wins_usd": 9251.0,
    "question": "Will Charles Leclerc win the F1 Drivers Championship?",
    "retrieved_at": "2026-10-15T21:42:24.101034+00:00",
    "rules": "If Charles Leclerc wins the F1 Drivers Championship, then the market resolves to Yes.\n\nKalshi is not affiliated, associated, authorized, endorsed by, or in any way officially connected with the Governing League. All trademarks, logos, and brand names are the property of their respective owners.\n\nThis market will close and expire after a title holder is declared.",
    "shares": 9351.0,
    "side": "Yes",
    "total_cost_usd": 100.0,
    "trade_url": "https://kalshi.com/markets/KXF1-26-CL",
    "unfilled_usd": 0.0,
    "worst_price": 0.01
  },
  "match_status": "verified_equivalent",
  "note": "Compared using verified equivalent rules, current depth, and estimated taker fees.",
  "observations": [
    "venue close/expiry metadata difference: 399.0 hours"
  ],
  "outcome": "Charles Leclerc is the 2026 Formula 1 Drivers' Champion",
  "polymarket": {
    "amount_usd": 100.0,
    "available": true,
    "average_price": 0.001906,
    "average_price_with_fees": 0.001963,
    "best_ask": 0.001,
    "best_bid": null,
    "closes_at": "2026-12-06T00:00:00Z",
    "decimal_odds": 509.483473,
    "fees_usd": 2.91,
    "fully_filled": true,
    "market_id": "898415",
    "note": "Size-aware order-book quote with estimated taker fee; cross-contract rule equivalence is not assumed.",
    "payout_if_wins_usd": 50948.35,
    "platform": "polymarket",
    "profit_if_wins_usd": 50848.35,
    "question": "Will Charles Leclerc be the 2026 F1 Drivers' Champion?",
    "retrieved_at": "2026-10-15T21:42:24.280168+00:00",
    "rules": "This market will resolve according to the listed driver that finishes 1st in the driver standings for the 2026 F1 season.\n\nThis market will resolve as soon as the official results of the final scheduled race of the 2026 F1 season are known.\n\nIf multiple drivers tie for first place in the drivers standings, this market will resolve according to the tiebreak procedure used by F1 to determine the...",
    "shares": 50948.3473,
    "side": "Yes",
    "total_cost_usd": 100.0,
    "trade_url": "https://polymarket.com/event/will-charles-leclerc-be-the-2026-f1-drivers-champion",
    "unfilled_usd": 0.0,
    "worst_price": 0.002
  },
  "price_advantage_pct": 81.64,
  "review_evidence": "Both rule sets resolve Yes iff Charles Leclerc wins the 2026 F1 Drivers' Championship. Both templates exactly match the fingerprint-pinned Lewis Hamilton family anchor; the 16-day metadata difference is administrative.",
  "same_contract": true,
  "savings_per_share": 0.008731,
  "side": "Yes"
}
```

### Find the best prices

Rank every outcome that trades on both Polymarket and Kalshi by where it is cheaper to buy right now, with fees and order-book depth counted for the amount you choose. Only outcomes a person has checked are the same contract on both venues are included. No API key required.

**Inputs**

- Amount to spend (USD) (`amount_usd`, number): How many dollars to spend, fees included, from $1 to $100,000. The quote walks the live order book, so a bigger amount can get a worse average price. $100 by default. From 1 to 100000. Default: `100`.
- Outcome group (`outcome_group`, text): Only outcomes in this group, such as the 2028 Democratic nomination. Leave it empty for all.
- Side (`side`, text): Only Yes or only No. Either side by default. One of: `any` (Either side), `Yes`, `No`. Default: `any`.

**Outputs**

- `count` (number): How many outcomes came back.
- `generated_at` (text): When the prices were read (ISO 8601).
- `opportunities` (list): The outcomes, biggest saving first.
- `outcome_groups` (list): Every outcome group and how much of it is quotable.
- `pairs_scanned` (number): How many matched pairs VoxOdds checked.

**Example output**

```json
{
  "count": 1,
  "generated_at": "2026-10-15T21:41:51.872420+00:00",
  "opportunities": [
    {
      "amount_usd": 100.0,
      "best_platform": "polymarket",
      "best_price_with_fees": 0.001963,
      "extra_payout_if_wins_usd": 41597.35,
      "id": "vx-82db1dc49c2e5f",
      "kalshi": {
        "average_price_with_fees": 0.010694,
        "fees_usd": 6.49,
        "shares": 9351.0,
        "total_cost_usd": 100.0,
        "worst_price": 0.01
      },
      "kalshi_ticker": "KXF1-26-CL",
      "outcome": "Charles Leclerc is the 2026 Formula 1 Drivers' Champion",
      "outcome_group": "f1_2026_champion",
      "outcome_group_name": "F1 2026 Champion",
      "polymarket": {
        "average_price_with_fees": 0.001963,
        "fees_usd": 2.91,
        "shares": 50948.3473,
        "total_cost_usd": 100.0,
        "worst_price": 0.002
      },
      "polymarket_id": "898415",
      "price_advantage_pct": 81.64,
      "reviewed_on": "2026-08-02",
      "savings_per_share": 0.008731,
      "share_url": "https://voxodds.com/opportunities/vx-82db1dc49c2e5f?amount_usd=100",
      "side": "Yes"
    }
  ],
  "outcome_groups": [
    {
      "id": "f1_2026_champion",
      "matched_pairs": 3,
      "name": "F1 2026 Champion",
      "quotable_sides": 3
    },
    {
      "id": "democratic_nominee_2028",
      "matched_pairs": 11,
      "name": "Democratic Nominee 2028",
      "quotable_sides": 0
    },
    {
      "id": "republican_nominee_2028",
      "matched_pairs": 8,
      "name": "Republican Nominee 2028",
      "quotable_sides": 0
    }
  ],
  "pairs_scanned": 22
}
```

### Get a market

Get one prediction market with its current odds and its hourly price history over the last days, ready to chart or to check how far the odds have moved. No API key required.

**Inputs**

- Market ID (`market_id`, text, required): The VoxOdds market ID, a number such as 5170739. Search markets and List trending markets return it as 'id'.

**Outputs**

- `category` (text): Politics, Crypto, Sports, Geopolitics or Economics. Null when VoxOdds has not filed it.
- `community_votes` (list): VoxOdds' community vote on each outcome. Often empty.
- `days_left` (number): Days until the market closes.
- `end_date` (text): When the market closes (ISO 8601). Null when not reported.
- `id` (text): The VoxOdds market ID: what Get a market, Get a market summary and Get a price quote (for Polymarket) take.
- `insight_count` (number): How many community insights VoxOdds holds on the market.
- `liquidity` (number): Dollars resting in the order book. Null when not reported.
- `outcomes` (list): Every outcome with its current price and probability.
- `polymarket_url` (text): The market on Polymarket.
- `price_history` (list): Hourly snapshots of the prices, oldest first.
- `price_history_count` (number): How many snapshots the history holds.
- `question` (text): The market's question.
- `slug` (text): The market's short web name on Polymarket. Null when not reported.
- `trading_quality` (text): VoxOdds' grade for how cleanly the market could be traded: Cleaner, Watch, Fragile or Closed/stale.
- `trading_quality_note` (text): VoxOdds' one-line reason for the grade.
- `trading_quality_score` (number): The score behind that grade, 0 to 100. Higher is cleaner.
- `updated_at` (text): When VoxOdds last refreshed the prices. Null when not reported.
- `volume_24h` (number): Dollars traded in the last 24 hours.
- `volume_total` (number): Dollars traded since the market opened. Null when not reported.
- `voxodds_url` (text): The market's page on VoxOdds.
- `warning_flags` (list): Risk flags VoxOdds raised, such as 'extreme price'.

**Example output**

```json
{
  "category": "Crypto",
  "community_votes": [],
  "days_left": 16,
  "end_date": null,
  "id": "5170739",
  "insight_count": 0,
  "liquidity": null,
  "outcomes": [
    {
      "name": "Yes",
      "price": 0.375,
      "probability_pct": 37.5
    }
  ],
  "polymarket_url": "https://polymarket.com/event/will-bitcoin-dip-to-77pt5k-in-october-2026?via=soft-dev-fz-llc",
  "price_history": [
    {
      "first_outcome_probability_pct": 51.5,
      "outcomes": [
        {
          "name": "Yes",
          "price": 0.515,
          "probability_pct": 51.5
        }
      ],
      "timestamp": "2026-10-15T14:19:29.269053+00:00",
      "volume_24h": 81544.586759
    }
  ],
  "price_history_count": 1,
  "question": "Will Bitcoin dip to $77,500 in October?",
  "slug": null,
  "trading_quality": "Cleaner",
  "trading_quality_note": "Better depth and less extreme pricing for research.",
  "trading_quality_score": 77.5,
  "updated_at": null,
  "volume_24h": 220686.426515,
  "volume_total": null,
  "voxodds_url": "https://voxodds.com/market/5170739",
  "warning_flags": []
}
```

### Get a market summary

Get a short, ready-to-paste summary of one market in Markdown: the question, the odds, the money traded and links to trade it. Drop it straight into Slack, Notion or an email. No API key required.

**Inputs**

- Market ID (`market_id`, text, required): The VoxOdds market ID, a number such as 5170739. Search markets and List trending markets return it as 'id'.

**Outputs**

- `markdown` (text): The summary in Markdown, with VoxOdds' attribution.
- `market_id` (text): The market summarised.
- `question` (text): The market's question, read from the summary.
- `voxodds_url` (text): The market's page on VoxOdds.

**Example output**

```json
{
  "markdown": "## Will Bitcoin dip to $77,500 in October?\n\n**Current Prediction Market Odds:**\n- **Yes**: 38%\n- **No**: 62%\n\nVolume 24h: $220,686 | Category: Crypto\n\n\n\n**Trade this market:**\n- [Polymarket](https://polymarket.com/event/will-bitcoin-dip-to-77pt5k-in-october-2026?via=soft-dev-fz-llc)\n- [Kalshi](https://kalshi.com/markets)\n\n**Full analysis & community insights:**...",
  "market_id": "5170739",
  "question": "Will Bitcoin dip to $77,500 in October?",
  "voxodds_url": "https://voxodds.com/market/5170739"
}
```

### Get a price quote

Find out what a dollar amount really buys on one Polymarket or Kalshi market right now: VoxOdds walks the live order book and counts the fees, so you get the true average price, the shares, the payout if you win and whether the book is deep enough. No API key required.

**Inputs**

- Platform (`platform`, text, required): Where the market trades. One of: `polymarket`, `kalshi`.
- Market ID or ticker (`market_id`, text, required): A Polymarket market ID (a number such as 898415, the 'id' Search markets returns) or a Kalshi ticker (such as KXF1-26-CL, the 'kalshi_ticker' Find the best prices returns).
- Side (`side`, text): Which side of the market to buy: Yes or No. Yes by default. One of: `Yes`, `No`. Default: `Yes`.
- Amount to spend (USD) (`amount_usd`, number): How many dollars to spend, fees included, from $1 to $100,000. The quote walks the live order book, so a bigger amount can get a worse average price. $100 by default. From 1 to 100000. Default: `100`.

**Outputs**

- `amount_usd` (number): The amount asked for.
- `available` (true/false): True when the order book had something to sell on this side. False means no quote: read 'note' for why.
- `average_price` (number): The average price per share before fees, in dollars.
- `average_price_with_fees` (number): The average price per share with fees counted: the number to compare venues on.
- `best_ask` (number): The cheapest price a seller is asking. Null when nobody is.
- `best_bid` (number): The best price a buyer is offering. Null when nobody is.
- `closes_at` (text): When the market closes (ISO 8601).
- `decimal_odds` (number): The fill expressed as bookmaker-style decimal odds, fees included, so it compares directly with a sportsbook's price.
- `fees_usd` (number): VoxOdds' estimate of the venue's trading fees.
- `fully_filled` (true/false): Whether the order book was deep enough to spend all of it.
- `market_id` (text): The market quoted: a number on Polymarket, a ticker on Kalshi.
- `note` (text): VoxOdds' caveat about the quote, or why there is none.
- `payout_if_wins_usd` (number): What the shares pay out if the side wins. Null when nothing fills.
- `platform` (text): polymarket or kalshi.
- `profit_if_wins_usd` (number): The payout minus what was spent. Null when nothing fills.
- `question` (text): The market's question, as the venue words it.
- `retrieved_at` (text): When the order book was read (ISO 8601).
- `rules` (text): The venue's resolution rules, verbatim.
- `shares` (number): How many shares the money buys. Each pays $1 if the side wins.
- `side` (text): The side quoted: Yes or No.
- `total_cost_usd` (number): What would actually be spent, fees included.
- `trade_url` (text): The market on the venue.
- `unfilled_usd` (number): The part of the amount the order book could not take.
- `worst_price` (number): The highest price paid for any share in the fill.

**Example output**

```json
{
  "amount_usd": 100.0,
  "available": true,
  "average_price": 0.001906,
  "average_price_with_fees": 0.001963,
  "best_ask": 0.001,
  "best_bid": null,
  "closes_at": "2026-12-06T00:00:00Z",
  "decimal_odds": 509.483473,
  "fees_usd": 2.91,
  "fully_filled": true,
  "market_id": "898415",
  "note": "Size-aware order-book quote with estimated taker fee; cross-contract rule equivalence is not assumed.",
  "payout_if_wins_usd": 50948.35,
  "platform": "polymarket",
  "profit_if_wins_usd": 50848.35,
  "question": "Will Charles Leclerc be the 2026 F1 Drivers' Champion?",
  "retrieved_at": "2026-10-15T21:42:23.559399+00:00",
  "rules": "This market will resolve according to the listed driver that finishes 1st in the driver standings for the 2026 F1 season.\n\nThis market will resolve as soon as the official results of the final scheduled race of the 2026 F1 season are known.\n\nIf multiple drivers tie for first place in the drivers standings, this market will resolve according to the tiebreak procedure used by F1 to determine the...",
  "shares": 50948.3473,
  "side": "Yes",
  "total_cost_usd": 100.0,
  "trade_url": "https://polymarket.com/event/will-charles-leclerc-be-the-2026-f1-drivers-champion",
  "unfilled_usd": 0.0,
  "worst_price": 0.002
}
```

### Get a research note

Get one VoxOdds research note in full: the thesis, the checks it is waiting on, the price levels to reassess at, its sources and the rules for sizing a position. No API key required.

**Inputs**

- Research note (`note_id`, text, required): The note to get. Pick one from the list, or use the 'id' List research notes returns.

**Outputs**

- `alert_levels` (list): The price levels at which to reassess.
- `base_case` (text): What VoxOdds expects by default.
- `blockers` (list): What would stop VoxOdds acting on the note.
- `category` (text): The market's category.
- `confirmations` (list): What already supports the thesis.
- `end_date` (text): When the market closes (ISO 8601).
- `entry_discipline` (list): VoxOdds' rules for sizing any position.
- `id` (text): The note's ID: what Get a research note takes.
- `invalidation` (text): What would make it wrong.
- `liquidity` (number): Dollars in the order book.
- `market_id` (text): The market's ID.
- `market_url` (text): The market on VoxOdds.
- `next_action` (text): What to do next.
- `no_probability_pct` (number): The market's current No probability, 0 to 100.
- `reference_probability_pct` (number): The Yes probability when the note was written, 0 to 100.
- `score` (number): The thesis score, 0 to 100.
- `side` (text): The side the note researches.
- `sources` (list): Where the note's evidence comes from.
- `stage` (text): Where the note stands, such as 'Research watch'.
- `stance` (text): The note's position in a sentence.
- `thesis` (text): Why that side is worth researching.
- `title` (text): The market the note is about.
- `trading_quality` (text): VoxOdds' trading grade for the market, such as Cleaner.
- `triggers` (list): The checks the thesis is waiting on.
- `updated_at` (text): When the note last changed (ISO 8601).
- `url` (text): The note on VoxOdds.
- `volume_24h` (number): Dollars traded in the last 24 hours.
- `watch_items` (list): What to keep an eye on.
- `yes_probability_pct` (number): The market's current Yes probability, 0 to 100.

**Example output**

```json
{
  "alert_levels": [
    "YES below 58.5%: reassess whether the edge improved or the thesis broke."
  ],
  "base_case": "Base case is wait-for-confirmation: the public price alone is not enough. The setup needs rule clarity, usable depth, and a catalyst that survives primary-source review.",
  "blockers": [
    "Skip if you cannot identify a concrete source, rule detail, or timing catalyst."
  ],
  "category": "Politics",
  "confirmations": [
    "Liquid 50/50 market; useful for research and news timing"
  ],
  "end_date": "2026-11-04T04:59:00Z",
  "entry_discipline": [
    "Treat this as a price discovery watch, not a blind buy signal."
  ],
  "id": "edge-2026-balance-of-power-d-senate-d-house-ddd933cdbe20",
  "invalidation": "Skip if you cannot identify a concrete source, rule detail, or timing catalyst.",
  "liquidity": 2841357.13,
  "market_id": "562828",
  "market_url": "https://voxodds.com/market/562828",
  "next_action": "Use news, rules, and surveys before taking a side",
  "no_probability_pct": 36.5,
  "reference_probability_pct": 63.5,
  "score": 81.0,
  "side": "YES",
  "sources": [
    {
      "label": "VoxOdds Edge",
      "note": "Price discovery watch, score 81/100.",
      "url": "https://voxodds.com/edge?min_edge=0&include_risky=true"
    }
  ],
  "stage": "Research watch",
  "stance": "Price discovery watch: research YES, confirm rules and depth before sizing.",
  "thesis": "YES is the side to research because VoxOdds Edge flags: Liquid 50/50 market; useful for research and news timing. Current market pricing is roughly YES 63.5% / NO 36.5% with a setup score of 81/100.",
  "title": "2026 Balance of Power: D Senate, D House",
  "trading_quality": "Cleaner",
  "triggers": [
    {
      "detail": "Read the resolution criteria before relying on the headline.",
      "label": "Rules match the thesis",
      "state": "pending"
    }
  ],
  "updated_at": "2026-10-08T05:45:02.147957+00:00",
  "url": "https://voxodds.com/investment-insights/edge-2026-balance-of-power-d-senate-d-house-ddd933cdbe20",
  "volume_24h": 221217.24,
  "watch_items": [
    "Resolution wording and official source-of-truth for the market."
  ],
  "yes_probability_pct": 63.5
}
```

### Get the forecast scoreboard

See how AI forecasts have scored against prediction-market prices on questions that have since resolved: accuracy and Brier score for each model, how often each beat the market, and the most recent scored forecasts. No API key required.

**Inputs**: None.

**Outputs**

- `ai_accuracy_pct` (number): How often the AI's favourite happened, 0 to 100.
- `ai_beats_market_pct` (number): How often the AI scored better than the market, 0 to 100.
- `ai_brier_score` (number): VoxOdds' AI's Brier score. Lower is better.
- `forecasts_scored` (number): How many AI forecasts have been scored.
- `headline` (text): The scoreboard's main finding in a sentence.
- `market_accuracy_pct` (number): How often the market's favourite happened, 0 to 100.
- `market_brier_score` (number): The market price's Brier score on the same questions.
- `markets_covered` (number): How many markets they cover.
- `methodology` (text): How the forecasts are scored.
- `models` (list): Each forecasting model's record.
- `recent_count` (number): How many recent forecasts came back.
- `recent_scores` (list): The most recently scored forecasts.
- `updated_at` (text): When the scoreboard was last updated (ISO 8601).

**Example output**

```json
{
  "ai_accuracy_pct": 73.69,
  "ai_beats_market_pct": 53.8,
  "ai_brier_score": 0.1823,
  "forecasts_scored": 6442,
  "headline": "Across 6442 scored forecasts, VoxOdds AI (Brier 0.182) trailed the market price (Brier 0.131) taken at the same moment. A sweep over every AI/market mixture weight (n=6442) finds no weight of AI improves on the price \u2014 the market alone is optimal so far.",
  "market_accuracy_pct": 81.39,
  "market_brier_score": 0.1314,
  "markets_covered": 1514,
  "methodology": "Hourly AI forecasts are stored with the contemporaneous market price (append-only receipts). At resolution every receipt is scored: Brier = (1 - probability assigned to the eventual winner)^2, for both the AI and the market price captured at the same timestamp. Lower is better. Brier is computed only for 2-outcome markets; a winner requires one outcome priced >=0.95 at resolution. No receipt is...",
  "models": [
    {
      "accuracy_pct": 81.1,
      "beats_market_pct": 50.7,
      "brier_score": 0.1247,
      "forecasts_scored": 11943,
      "market_brier_score": 0.1175,
      "model": "blend-mkt50-v1"
    }
  ],
  "recent_count": 1,
  "recent_scores": [
    {
      "actual_outcome": "Ashlyn Krueger",
      "ai_beat_market": false,
      "ai_brier_score": 0.1936,
      "ai_correct": true,
      "market_brier_score": 0.189225,
      "market_correct": true,
      "market_id": "5658632",
      "model": "gemini-3.7-flash-cal2",
      "predicted_outcome": "Ashlyn Krueger",
      "predicted_probability_pct": 56.0,
      "question": "Wuhan Tennis Open: Ashlyn Krueger vs Lanlana Tararudee",
      "scored_at": "2026-10-14T23:30:02.665627+00:00"
    }
  ],
  "updated_at": "2026-10-02T23:30:03.544731+00:00"
}
```

### Get the strategy playbook

Get VoxOdds' current playbook: which simple trading tactics its backtests say are working, which to avoid, the live markets that fit them now and the guardrails to follow. No API key required.

**Inputs**: None.

**Outputs**

- `candidate_count` (number): How many live markets fit.
- `current_candidates` (list): Live markets that fit a tactic now.
- `generated_at` (text): When the playbook was built (ISO 8601).
- `guardrails` (list): VoxOdds' rules for using the playbook.
- `headline` (text): The playbook's conclusion in a sentence.
- `next_step` (text): What VoxOdds suggests doing next.
- `strategies` (list): Every tactic tested, best first.
- `strategies_to_avoid` (list): Tactics VoxOdds says not to use right now.
- `strategy_count` (number): How many tactics were tested.
- `top_strategy` (object): One trading tactic and how it has performed.

**Example output**

```json
{
  "candidate_count": 1,
  "current_candidates": [
    {
      "category": "Sports",
      "confidence": 86.0,
      "invalidation": "Skip if you cannot identify a concrete source, rule detail, or timing catalyst.",
      "market_id": "5597174",
      "prices": "YES 50% / NO 50%",
      "risk_level": "low",
      "score": 98.9,
      "side": "Research first",
      "signal": "Liquid 50/50 market; useful for research and news timing",
      "strategy_name": "Price discovery",
      "suggested_action": "Use news, rules, and surveys before taking a side",
      "time_horizon": "Intraday to weekly",
      "title": "Shanghai Rolex Masters: Hubert Hurkacz vs Alejandro Davidovich Fokina",
      "volume_24h": 1006390.8489050003,
      "voxodds_url": "https://voxodds.com/market/5597174"
    }
  ],
  "generated_at": "2026-10-15T21:21:55.370046+00:00",
  "guardrails": [
    "Do not treat a market price as executable fair value without checking depth and spread."
  ],
  "headline": "No strategy has enough clean evidence to be a default entry rule right now.",
  "next_step": "Use Edge for research and avoid fragile markets until more snapshots accumulate.",
  "strategies": [
    {
      "average_return_points": 0.34,
      "best_return_points": 75.45,
      "description": "Bet against a move that already exceeded the threshold.",
      "hit_rate_pct": 41.0,
      "id": "mean_reversion",
      "in_plain_words": "Look for a large move, then take the other side only if the catalyst looks weak or misunderstood.",
      "losses": 151,
      "median_return_points": 0.0,
      "name": "Fade fast moves",
      "sample_trades": [
        {
          "entered_at": "2026-10-15T11:15:31.787843+00:00",
          "entry_price": 0.245,
          "exit_price": 0.9995,
          "exited_at": "2026-10-15T12:16:36.134991+00:00",
          "market_id": "5649739",
          "prior_move_points": -52.5,
          "return_points": 75.45,
          "side": "YES"
        }
      ],
      "setup": "A market moved quickly over the lookback window and still has enough volume to exit.",
      "standing": "neutral",
      "trades": 256,
      "verdict": "No clear edge in the current sample.",
      "when_to_avoid": "Do not fade if the catalyst directly settles the market or fresh volume keeps confirming the move.",
      "wins": 105,
      "worst_return_points": -61.0
    }
  ],
  "strategies_to_avoid": [
    {
      "average_return_points": 0.01,
      "best_return_points": 44.3,
      "description": "Bet against very high YES or very low YES prices over the horizon.",
      "hit_rate_pct": 12.3,
      "id": "extreme_fade",
      "in_plain_words": "Look for 85%+ or 15%- prices that may be overconfident before final resolution.",
      "losses": 2116,
      "median_return_points": 0.0,
      "name": "Fade extreme prices",
      "sample_trades": [
        {
          "entered_at": "2026-10-15T14:19:29.269053+00:00",
          "entry_price": 0.136,
          "exit_price": 0.579,
          "exited_at": "2026-10-15T15:07:45.337438+00:00",
          "market_id": "5432714",
          "prior_move_points": 6.1,
          "return_points": 44.3,
          "side": "YES"
        }
      ],
      "setup": "Market price is extreme but not actually settled.",
      "standing": "avoid",
      "trades": 2414,
      "verdict": "Avoid using this tactic as a default entry rule right now.",
      "when_to_avoid": "Do not fade near-settled markets, expiring markets, or outcomes with an official result already available.",
      "wins": 298,
      "worst_return_points": -12.45
    }
  ],
  "strategy_count": 1,
  "top_strategy": {
    "average_return_points": 0.34,
    "best_return_points": 75.45,
    "description": "Bet against a move that already exceeded the threshold.",
    "hit_rate_pct": 41.0,
    "id": "mean_reversion",
    "in_plain_words": "Look for a large move, then take the other side only if the catalyst looks weak or misunderstood.",
    "losses": 151,
    "median_return_points": 0.0,
    "name": "Fade fast moves",
    "sample_trades": [
      {
        "entered_at": "2026-10-15T11:15:31.787843+00:00",
        "entry_price": 0.245,
        "exit_price": 0.9995,
        "exited_at": "2026-10-15T12:16:36.134991+00:00",
        "market_id": "5649739",
        "prior_move_points": -52.5,
        "return_points": 75.45,
        "side": "YES"
      }
    ],
    "setup": "A market moved quickly over the lookback window and still has enough volume to exit.",
    "standing": "neutral",
    "trades": 256,
    "verdict": "No clear edge in the current sample.",
    "when_to_avoid": "Do not fade if the catalyst directly settles the market or fresh volume keeps confirming the move.",
    "wins": 105,
    "worst_return_points": -61.0
  }
}
```

### List edge signals

List VoxOdds' ranked research signals: markets where the price is moving fast, looks mispriced or is close to settling, each with a score, a risk level, what to check and what would make it wrong. For research, not a buy list. No API key required.

**Inputs**

- Maximum signals (`limit`, number): How many signals to return, 1 to 100. 30 by default. From 1 to 100. Default: `30`.
- Minimum edge (points) (`min_edge`, number): Only signals with at least this much edge after costs, in percentage points of price, 0 to 25. 1 by default; 0 includes watch-only signals. From 0 to 25. Default: `1`.
- Include risky markets (`include_risky`, true/false): Also include markets VoxOdds flags as high risk, such as thin or about-to-close ones. Off by default. Default: `false`.

**Outputs**

- `count` (number): How many signals came back.
- `disclaimer` (text): VoxOdds' caveat about the signals.
- `generated_at` (text): When the signals were computed (ISO 8601).
- `signals` (list): The signals, strongest first.
- `signals_available` (number): How many signals VoxOdds holds in all.

**Example output**

```json
{
  "count": 1,
  "disclaimer": "Signals are estimates before live fills, fees, taxes, limits, and resolution risk. Not financial advice.",
  "generated_at": "2026-10-15T21:21:48.581268+00:00",
  "signals": [
    {
      "best_platform": "polymarket",
      "category": "Sports",
      "confidence": 67.0,
      "created_at": "2026-10-15T21:21:48.581268+00:00",
      "estimated_costs_points": 0.4,
      "gross_edge_points": 28.0,
      "id": "momentum:5524116",
      "invalidation": "Invalid if no credible catalyst explains the move or if order-book depth disappears.",
      "market_id": "5524116",
      "net_edge_points": 0.0,
      "outcome_prices": [
        0.605
      ],
      "risk_flags": [
        "very close to close"
      ],
      "risk_level": "low",
      "risk_score": 33.0,
      "score": 100.0,
      "side": "YES",
      "signal": "YES moved +28.0pp across 14 recent snapshots",
      "signal_type": "momentum_watch",
      "strategy_name": "Catalyst momentum",
      "suggested_action": "Find the catalyst before chasing; skip if the move is only thin-liquidity drift",
      "time_horizon": "Hours to days",
      "title": "LoL: Cloud9 vs Karmine Corp (BO5) - Worlds Play-In",
      "volume_24h": 1364976.996101,
      "voxodds_url": "https://voxodds.com/market/5524116"
    }
  ],
  "signals_available": 202
}
```

### List research notes

List VoxOdds' public research notes: the markets it is watching, the side it is researching and why, what would prove it wrong and where the price stands now. No API key required.

**Inputs**: None.

**Outputs**

- `count` (number): How many notes came back.
- `guardrails` (list): VoxOdds' rules for using the notes.
- `notes` (list): The notes.
- `updated_at` (text): When the notes were last refreshed (ISO 8601).

**Example output**

```json
{
  "count": 1,
  "guardrails": [
    "These are research notes, not individualized financial advice."
  ],
  "notes": [
    {
      "base_case": "Base case is wait-for-confirmation: the public price alone is not enough. The setup needs rule clarity, usable depth, and a catalyst that survives primary-source review.",
      "category": "Politics",
      "confirmations": [
        "Liquid 50/50 market; useful for research and news timing"
      ],
      "end_date": "2026-11-04T04:59:00Z",
      "id": "edge-2026-balance-of-power-d-senate-d-house-ddd933cdbe20",
      "invalidation": "Skip if you cannot identify a concrete source, rule detail, or timing catalyst.",
      "liquidity": 2841357.13,
      "market_id": "562828",
      "market_url": "https://voxodds.com/market/562828",
      "next_action": "Use news, rules, and surveys before taking a side",
      "no_probability_pct": 36.5,
      "reference_probability_pct": 63.5,
      "score": 81.0,
      "side": "YES",
      "stage": "Research watch",
      "stance": "Price discovery watch: research YES, confirm rules and depth before sizing.",
      "thesis": "YES is the side to research because VoxOdds Edge flags: Liquid 50/50 market; useful for research and news timing. Current market pricing is roughly YES 63.5% / NO 36.5% with a setup score of 81/100.",
      "title": "2026 Balance of Power: D Senate, D House",
      "trading_quality": "Cleaner",
      "updated_at": "2026-10-08T05:45:02.147957+00:00",
      "url": "https://voxodds.com/investment-insights/edge-2026-balance-of-power-d-senate-d-house-ddd933cdbe20",
      "volume_24h": 221217.24,
      "watch_items": [
        "Resolution wording and official source-of-truth for the market."
      ],
      "yes_probability_pct": 63.5
    }
  ],
  "updated_at": "2026-10-15T21:41:42.420629+00:00"
}
```

### List trending markets

The 20 prediction markets with the most money traded in the last 24 hours, with their live odds: a quick read on what people are betting on right now. No API key required.

**Inputs**: None.

**Outputs**

- `count` (number): How many markets came back.
- `markets` (list): The markets, most traded first.

**Example output**

```json
{
  "count": 1,
  "markets": [
    {
      "category": null,
      "days_left": null,
      "end_date": null,
      "id": "5126779",
      "liquidity": null,
      "outcomes": [
        {
          "name": "Yes",
          "price": 0.125,
          "probability_pct": 12.5
        }
      ],
      "polymarket_url": "https://polymarket.com/event/will-indiana-enact-a-data-center-moratorium-by-december-31-2027?via=soft-dev-fz-llc",
      "question": "Will Indiana enact a data center moratorium by December 31, 2027?",
      "slug": "will-indiana-enact-a-data-center-moratorium-by-december-31-2027",
      "trading_quality": null,
      "trading_quality_note": null,
      "trading_quality_score": 60.5,
      "updated_at": null,
      "volume_24h": 2101479.8173089996,
      "volume_total": null,
      "voxodds_url": "https://voxodds.com/market/5126779",
      "warning_flags": []
    }
  ]
}
```

### Run a backtest

Test simple tactics (follow a fast move, fade a fast move, fade extreme prices) against VoxOdds' stored hourly prices and see how often each would have won. You choose how big a move counts and how long to hold. Prices only: fees and fills are not counted. No API key required.

**Inputs**

- Move measured over (hours) (`lookback_hours`, number): How many hours back a price move is measured over, 1 to 72. 6 by default. From 1 to 72. Default: `6`.
- Hold for (hours) (`horizon_hours`, number): How many hours each simulated trade is held, 1 to 168. 12 by default. From 1 to 168. Default: `12`.
- Minimum move (points) (`min_move_points`, number): How big a move has to be to count, in percentage points of price (a move from 40% to 45% is 5), 1 to 50. 5 by default. From 1 to 50. Default: `5`.
- Minimum daily volume (USD) (`min_volume`, number): Skip markets that traded less than this in the last 24 hours. $1,000 by default. At least 0. Default: `1000`.

**Outputs**

- `count` (number): How many tactics were tested.
- `disclaimer` (text): VoxOdds' caveat about the backtest.
- `generated_at` (text): When the backtest ran (ISO 8601).
- `horizon_hours` (number): The holding time used.
- `lookback_hours` (number): The move window used.
- `markets_tested` (number): How many markets had enough price history.
- `min_move_points` (number): The minimum move used.
- `min_volume` (number): The minimum daily volume used.
- `strategies` (list): Each tactic and how it would have done.

**Example output**

```json
{
  "count": 1,
  "disclaimer": "Backtest is mark-to-market on stored hourly snapshots. It excludes fees, fills, taxes, limits, and final settlement risk.",
  "generated_at": "2026-10-15T21:33:43.769528+00:00",
  "horizon_hours": 12,
  "lookback_hours": 6,
  "markets_tested": 92,
  "min_move_points": 5.0,
  "min_volume": 1000.0,
  "strategies": [
    {
      "average_return_points": 5.54,
      "best_return_points": 28.5,
      "description": "Bet against a move that already exceeded the threshold.",
      "hit_rate_pct": 73.5,
      "id": "mean_reversion",
      "in_plain_words": null,
      "losses": 9,
      "median_return_points": 4.0,
      "name": "Fade fast moves",
      "sample_trades": [
        {
          "entered_at": "2026-10-14T13:07:30.125880+00:00",
          "entry_price": 0.53,
          "exit_price": 0.245,
          "exited_at": "2026-10-15T01:00:53.200999+00:00",
          "market_id": "2589813",
          "prior_move_points": 34.5,
          "return_points": 28.5,
          "side": "NO"
        }
      ],
      "setup": null,
      "standing": null,
      "trades": 34,
      "verdict": null,
      "when_to_avoid": null,
      "wins": 25,
      "worst_return_points": -8.0
    }
  ]
}
```

### Search markets

Find prediction markets by keyword and category, with live odds from Polymarket: each outcome's price and probability, the money traded, when it closes, and VoxOdds' grade for how cleanly it could be traded. Busiest markets first. No API key required.

**Inputs**

- Search for (`query`, text): Words to look for in the market's question. Leave it empty to list the busiest markets.
- Category (`category`, text): Only markets in this category. Leave it empty for all. One of: `Politics`, `Crypto`, `Sports`, `Geopolitics`, `Economics`.
- Trading quality (`trading_quality`, text): Only markets with this VoxOdds trading grade. Open markets of every grade by default. One of: `live` (Open markets (all grades)), `clean` (Cleaner: better depth, less extreme prices), `watch` (Watch: usable, needs confirmation), `fragile` (Fragile: quotes can move or fill badly), `closed` (Closed or stale), `all` (Everything, open and closed). Default: `live`.
- Maximum markets (`limit`, number): How many markets to return, 1 to 200. 50 by default. From 1 to 200. Default: `50`.

**Outputs**

- `count` (number): How many markets came back.
- `markets` (list): The markets, busiest first.

**Example output**

```json
{
  "count": 1,
  "markets": [
    {
      "category": "Crypto",
      "days_left": 16,
      "end_date": "2026-11-01T04:00:00Z",
      "id": "5170739",
      "liquidity": 59085.076,
      "outcomes": [
        {
          "name": "Yes",
          "price": 0.375,
          "probability_pct": 37.5
        }
      ],
      "polymarket_url": "https://polymarket.com/event/will-bitcoin-dip-to-77pt5k-in-october-2026?via=soft-dev-fz-llc",
      "question": "Will Bitcoin dip to $77,500 in October?",
      "slug": "will-bitcoin-dip-to-77pt5k-in-october-2026",
      "trading_quality": "Cleaner",
      "trading_quality_note": "Better depth and less extreme pricing for research.",
      "trading_quality_score": 77.5,
      "updated_at": "2026-10-15T21:20:46.728455+00:00",
      "volume_24h": 220686.426515,
      "volume_total": 433619.51109599986,
      "voxodds_url": "https://voxodds.com/market/5170739",
      "warning_flags": []
    }
  ]
}
```
