# Options-Implied Odds (`options_probability`)

> Risk-neutral expiry probabilities above or below a price or inside a range, plus implied 68% and 90% ranges. Derived from options forwards and volatility, with smile adjustment where quoted — not calibrated real-world forecasts.

- Category: Options
- MCP tool: `options_probability`
- REST: `GET /options/probability/{currency}`
- x402 price: $0.01 per call (USDC on Base)
- HTML: https://www.f1ow.com/docs/tools/options_probability

## What it does

Risk-neutral probabilities implied by crypto options at one expiry: chance of settling above/below a price or inside a range, expected 68%/90% ranges, lognormal at that expiry's ATM IV and forward plus a smile-adjusted value within quoted strikes. Market-implied odds, not calibrated forecasts.

## Parameters

| Name | Type | In | Required | Description |
| --- | --- | --- | --- | --- |
| `currency` | string | path | yes | Underlying symbol, e.g. "BTC". |
| `expiry` | string | query | no | "next" (first expiry ≥ 1 day, default), "2026-12-25" or "25DEC26". |
| `price` | number | query | no | Price to get P(above)/P(below) for. |
| `range_low` | number | query | no | Range lower bound. |
| `range_high` | number | query | no | Range upper bound. |

## Call it

### cURL

```bash
curl "https://mcp.f1ow.com/v1/options/probability/BTC?expiry=next&range_low=65000&range_high=80000" \
  -H "Authorization: Bearer $F1OW_API_KEY"
```

### MCP

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "options_probability",
    "arguments": {
      "currency": "BTC",
      "expiry": "next",
      "range_low": 65000,
      "range_high": 80000
    }
  }
}
```

### TypeScript

```ts
const res = await fetch("https://mcp.f1ow.com/v1/options/probability/BTC?expiry=next&range_low=65000&range_high=80000", {
  headers: { Authorization: `Bearer ${process.env.F1OW_API_KEY}` },
});
const data = await res.json(); // the tool's result as JSON, typed in the OpenAPI spec
console.log(data);
```

### Python

```python
import os, requests

res = requests.get(
    "https://mcp.f1ow.com/v1/options/probability/BTC?expiry=next&range_low=65000&range_high=80000",
    headers={"Authorization": f"Bearer {os.environ['F1OW_API_KEY']}"},
)
data = res.json()  # the tool's result as JSON, typed in the OpenAPI spec
print(data)
```

### WebSocket

```jsonc
// wss://mcp.f1ow.com/v1/ws — subprotocol "jsonrpc-2.0", Authorization: Bearer <key>
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "options_probability",
    "arguments": {
      "currency": "BTC",
      "expiry": "next",
      "range_low": 65000,
      "range_high": 80000
    }
  }
}

// Or push a fresh result whenever it changes (minimum interval 15 s)
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "subscriptions/subscribe",
  "params": {
    "name": "options_probability",
    "arguments": {
      "currency": "BTC",
      "expiry": "next",
      "range_low": 65000,
      "range_high": 80000
    },
    "intervalSeconds": 60
  }
}
```

### x402

```bash
# No account: the first call answers 402 with a PAYMENT-REQUIRED challenge;
# an x402 client pays it in USDC on Base and retries.
curl "https://mcp.f1ow.com/x402/v1/options/probability/BTC?expiry=next&range_low=65000&range_high=80000"
```

## Sample response

Captured 2026-11-13. The JSON is what REST and WebSocket return and the `structuredContent` of an MCP call (trimmed):

```json
{
  "atmIvPct": 47.57,
  "between": {
    "high": 80000,
    "lognormal": 0.985,
    "low": 65000,
    "smileAdjusted": 0.962
  },
  "days": 1,
  "expiry": "2026-11-14T08:00:00Z",
  "forwardUsd": 68603.35,
  "meta": {
    "ageSeconds": 2,
    "observedAt": "2026-11-13T08:05:40Z",
    "provider": "Deribit",
    "underlying": "BTC"
  },
  "model": "risk-neutral lognormal at expiry ATM IV and forward; smile-adjusted digital within quoted strikes",
  "prices": [],
  "quantiles": [
    {
      "cumulative": 0.05,
      "price": 65835.67
    },
    {
      "cumulative": 0.16,
      "price": 66908.28
    },
    {
      "cumulative": 0.5,
      "price": 68582.18
    },
    {
      "cumulative": 0.84,
      "price": 70297.95
    },
    {
      "cumulative": 0.95,
      "price": 71443.25
    }
  ],
  "quotedStrikeRange": {
    "high": 83000,
    "low": 63000
  },
  "generatedAt": "2026-11-13T08:05:40Z"
}
```

Over MCP the text report a model reads comes with it:

```text
=== BTC options expiry probabilities — Deribit ===
Observed 2026-11-13T08:05:40Z (2s ago) | spot index $68615.64
Expiry 14 Nov 2026 08:00 UTC (1.0d) | forward $68603.35 (Deribit, reported) | ATM IV 47.6% of that expiry (calculated; not DVOL)
Model: lognormal P(S_T > K) = N(d2) at the forward and ATM IV; smile-adjusted = N(d2(σ(K))) − vega·dσ/dK (Breeden–Litzenberger digital) within quoted strikes $63000.00–$83000.00.
Expected range at expiry (lognormal): 68% $66908.28 – $70297.95 | 90% $65835.67 – $71443.25 | median $68582.18
  between $65000.00 and $80000.00: 98% (lognormal) | 96% smile-adjusted
Risk-neutral odds priced into options (they include risk premia), not real-world or calibrated forecasts; P(touch before expiry) is higher than P(finish beyond).
```

## Related tools

- [Options Chain](https://www.f1ow.com/docs/tools/options_chain) — Calls and puts by strike and expiry: quotes, mark implied volatility, open interest and volume. Reported data is separated from calculated metrics, with coverage and thin-market caveats.
- [Implied Volatility](https://www.f1ow.com/docs/tools/options_volatility) — ATM volatility, term structure, implied move size, 25-delta skew and IV versus realized volatility. BTC/ETH volatility-index history adds context. What options price for the size of a move — not its direction.
- [Options Positioning](https://www.f1ow.com/docs/tools/options_positioning) — Put/call open interest, strike and expiry concentrations, expiring notional, theoretical max pain and recent option trades. One venue; aggregate open interest does not reveal who is long or short, and max pain is not a forecast.
- [Gamma & Hedge Scenarios](https://www.f1ow.com/docs/tools/options_gamma) — Modeled gamma exposure, walls, flip levels and an options regime, with price, time and volatility what-ifs. Dealer hedge ladders depend on an explicit positioning scenario — theoretical sensitivity, not observed dealer orders.
