> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinn.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Dropping odds

> Spot odds that shorten — the sharp-money signal — using the full Pinnacle odds history.

A **dropping odd** is an outcome whose decimal price **drops** (shortens) meaningfully over time — e.g. a home win going from **2.50 to 2.10**. A shorter price means a **rising implied probability**: money is coming in on that side. Since Pinnacle is the sharpest book, these moves often signal **market information** (injury, lineup, a steam move).

## Why it's a signal

* **Informed money**: at Pinnacle a sharp drop reflects large/informed stakes, not noise.
* **Positive CLV**: betting *before* the price shortens further beats the close (see [true odds](/en/concepts/true-odds)).
* **Live timing**: in‑play, dropping odds react to match events within seconds.

## Detecting them with apinn

Every [`/api/odds?full_history=1`](/en/api-reference/introduction) call returns **all snapshots** of an event (each timestamped), with raw `odds1/odds0/odds2` **and** devig `todds1/0/2`. Compare the **opening** (first snapshot) to the **current** value:

<Steps>
  <Step title="List live matches">
    ```bash theme={null}
    curl "https://api.apinn.io/api/fixtures?sport_id=29&live=1" -H "X-API-Key: YOUR_KEY"
    ```
  </Step>

  <Step title="Fetch the odds history">
    ```bash theme={null}
    curl "https://api.apinn.io/api/odds?event_id=1632003656&full_history=1&main_lines_only=1&market=moneyline" \
      -H "X-API-Key: YOUR_KEY"
    ```
  </Step>

  <Step title="Compute the drop per outcome">
    `drop% = (open − current) / open × 100` — keep drops ≥ your threshold.
  </Step>
</Steps>

```python Python theme={null}
import requests

BASE, H = "https://api.apinn.io", {"X-API-Key": "YOUR_KEY"}
THRESHOLD = 8      # minimum % drop
event_id = 1632003656

hist = requests.get(f"{BASE}/api/odds",
    params={"event_id": event_id, "full_history": 1,
            "main_lines_only": 1, "market": "moneyline"}, headers=H).json()

# snapshots sorted by timestamp ; open = first, current = last
snaps = sorted(hist, key=lambda r: r["timestamp"])
if snaps:
    open_, now = snaps[0], snaps[-1]
    for k, label in [("odds1", "home"), ("odds0", "draw"), ("odds2", "away")]:
        o, n = open_.get(k), now.get(k)
        if o and n:
            drop = (o - n) / o * 100
            if drop >= THRESHOLD:
                print(f"⬇ {label}: {o:.2f} → {n:.2f}  (−{drop:.1f}%)")
```

<Info>
  Prefer the **`todds`** fields (margin removed) for a cleaner signal: the drop then reflects the move in **fair probability**, not the vig.
</Info>

## Best practices

* **Bound the odds** (e.g. 1.30–6.00): ignore noisy extremes.
* **Window**: since the open (underlying move) or over the **last N minutes** (live reaction).
* **Real-time**: for sub‑second, listen to the [SSE stream](/en/concepts/streaming) instead of polling.
* **Inverse**: *rising odds* (prices drifting out) signal money **leaving** a side.

## Build it in one prompt

Don't want to code? Paste our ready‑made prompt into Claude and it builds the dropping-odds monitor for you — see **[Build with Claude](/en/build-with-claude)**.
