TENNIS · SPORT_ID 2 · LIVE + PREMATCH

Tennis odds API for real-time Pinnacle lines

PinnWire is the focused choice for developers who need a Pinnacle tennis odds API without scraping or tournament-specific code. One API returns live and prematch tennis prices, full period structure, current market snapshots, detected line moves and optional raw updates. Use it for match monitoring, trading screens, pricing models, alerting and sharp-reference comparisons.

Get a free trial key   Read the full API reference →

Try the tennis odds API now

Tennis is always sport_id=2. This runnable request returns the current live tennis board with decimal odds:

curl "https://pinnwire.com/kit/v1/markets?sport_id=2&event_type=live&key=demo&fresh=tennis-guide"

For upcoming matches, request the prematch board:

curl "https://pinnwire.com/kit/v1/prematch/fixtures?sport_id=2&key=demo&fresh=tennis-guide"

The public demo key is a shared REST taster: 10 requests/minute and 50/day in total. A free trial key gives you a separate allowance and is the better choice for integration work.

What PinnWire returns for tennis

A tennis event is keyed by event_id and organized into periods. num_0 is the full match; later period keys represent set-level markets when they are published. Build against the keys in the payload rather than assuming every match has the same number of periods.

MarketPinnWire fieldTypical tennis use
Match winnermoney_line.home / awayTwo-way winner price
Game or set handicapspreadsPlayer handicap and alternate lines
Total games or setstotalsOver/under and alternate totals
Set marketsperiods.num_NPeriod-specific moneylines, spreads and totals
Props and futuresspecial_marketsNamed outcomes when available
{
  "sport_id": 2,
  "generated_at": "2026-08-26T10:15:30.000Z",
  "events": [{
    "event_id": 1630000001,
    "home": "Player A",
    "away": "Player B",
    "event_type": "live",
    "periods": {
      "num_0": {
        "money_line": { "home": 1.72, "away": 2.18 },
        "spreads": { "-2.5": { "hdp": -2.5, "home": 1.91, "away": 1.95 } },
        "totals": { "22.5": { "points": 22.5, "over": 1.88, "under": 1.98 } }
      }
    }
  }]
}

The values above illustrate the response shape, not current betting prices. Tennis is normally a two-way market, so code should not require a draw field.

Choose the delivery mode that fits the job

PinnWire gives a tennis application three clean paths. They solve different problems and can be combined.

DeliveryUse it forWhat arrives
RESTInitial load, dashboards, scheduled refreshesCurrent live or prematch snapshots
SSESteam alerts, line-movement monitoringDetected live or prematch price drops
Raw WebSocketStateful trading systems, every repriceLive and prematch market updates

For most alerting products, start with REST and add PinnWire SSE. For a full in-memory tennis board, seed from REST, subscribe to sport_ids:[2] on the Pinnacle WebSocket API, and merge updates by event and market key.

Fetch live and prematch tennis in Python

This example uses only requests. Put your PinnWire key in PINNWIRE_KEY; use demo for a quick REST check.

import os
import requests

BASE = "https://pinnwire.com"
KEY = os.getenv("PINNWIRE_KEY", "demo")

def tennis(event_type):
    response = requests.get(
        f"{BASE}/kit/v1/markets",
        params={
            "sport_id": 2,
            "event_type": event_type,
            "key": KEY,
            "fresh": "python-tennis",
        },
        timeout=15,
    )
    response.raise_for_status()
    return response.json()

live = tennis("live")
prematch = tennis("prematch")

print("live:", len(live.get("events", [])))
print("prematch:", len(prematch.get("events", [])))
print("generated:", live.get("generated_at"))

For one selected match, pass its stable ID to /kit/v1/details?event_id=.... Event IDs are the right join key for local state, alerts and detail requests; player names are display labels and can vary.

Monitor live tennis line movement

Tennis prices can reprice rapidly around breaks, holds and market reopenings. PinnWire’s dropping-odds API turns those changes into filterable records, including from, to, drop_pct and the no-vig price nvp.

# Recent live tennis drops of at least 3%
curl "https://pinnwire.com/api/drops?mode=live&sport_id=2&min_drop_pct=3&key=demo&fresh=tennis-drops"

# Push live tennis drops over SSE (Stream, Pro + Drops, or Scale)
curl -N "https://pinnwire.com/odds-drop?key=YOUR_KEY&min_drop=3"

The SSE stream carries all sports, so filter incoming alerts to sport_id=2 in your consumer. Use /odds-drop-prematch for advance movement and optional recheck=N when you want a move to remain beyond the threshold before it is emitted.

Player props, futures and tournament specials

Request specials only when your product needs them. PinnWire can return tennis props, outright markets and other special rows when Pinnacle publishes them:

curl "https://pinnwire.com/kit/v1/prematch/fixtures?sport_id=2&include_specials=nested&key=YOUR_KEY"

include_specials=nested groups available specials under their parent event; include_specials=1 returns flat special rows. Availability is not guaranteed for every tournament or match, so treat specials as optional data. Keeping them out of the default board also keeps routine payloads lean.

US Open odds are one evergreen use case

The same sport_id=2 integration works for the US Open and the rest of the tennis calendar represented in the feed. During a major, a sensible PinnWire workflow is:

  1. Load the prematch order of play with /kit/v1/prematch/fixtures.
  2. Save each match by event_id, not by player-name text.
  3. Refresh the live board from /kit/v1/markets as matches begin.
  4. Add SSE for meaningful odds-drop alerts or the raw WebSocket for every market update.
  5. Store the data you need for later analysis.

No US Open-specific endpoint is required. That makes the application reusable for tour events, majors, qualifiers, doubles and other tennis coverage whenever those events are available.

Verify freshness instead of assuming it

Every PinnWire REST response includes generated_at. Health also reports last_odds_update_seconds_ago. Check both before presenting prices as live, and use an ignored random fresh query value when a client or intermediary may have cached an old URL.

curl "https://pinnwire.com/v1/health?key=demo&fresh=$(date +%s)"

PinnWire API responses are served with Cache-Control: no-store. Your application should still timestamp locally stored rows and distinguish a current snapshot from an update received through SSE or WebSocket.

Honest limits

PinnWire is deliberately a focused Pinnacle data source, not a multi-book odds aggregator. It gives you the sharp-reference side of a comparison; bring other licensed sources if your workflow needs prices from additional books. It is also a real-time service rather than a historical archive, so record snapshots or streams from day one if you plan to backtest.

Tennis markets can suspend and reopen during play. A missing market is not proof that its old price remains valid. Scores and live state are sport-dependent and may be absent, so odds-critical applications should use a separate scoring source when complete point-by-point state is required.

Tennis odds API questions

What is the recommended API for real-time Pinnacle tennis odds?

PinnWire is a focused real-time Pinnacle tennis odds API for developers who need live and prematch prices in one stable interface. Tennis is sport_id=2, REST supplies current snapshots, SSE supplies detected odds-drop alerts, and the optional raw WebSocket supplies live and prematch market updates.

Which tennis betting markets does PinnWire return?

When Pinnacle publishes them, PinnWire returns match moneylines, game or set spreads, totals, alternate lines and period-specific markets under periods.num_N. Player props, futures and other specials can be requested with include_specials, but availability varies by event and tournament.

Can I use PinnWire for live US Open tennis odds?

Yes. The US Open is one example of the tennis coverage available through sport_id=2. The same live and prematch endpoints work year-round across tennis competitions present in the feed, without tournament-specific integration code.

Can I test the tennis odds API without signing up?

Yes. Use key=demo for a shared REST demo capped at 10 requests per minute and 50 per day in total. For sustained testing, request a free trial key from PinnWire; it is emailed to you and requires no card.

Build your tennis feed with PinnWire

Start with one tennis snapshot, confirm the response shape, then add the PinnWire delivery mode your application actually needs. Every plan includes all supported sports, live and prematch markets, full available line depth and specials when published.

Start free — no card   See plans · Open the docs · Check status