---
title: "Returns one sportsbook's player props for a sport, in that book's own line format."
method: GET
path: "/api/v1/{sport}/props/{book}"
tags: ["Player props"]
---

# Returns one sportsbook's player props for a sport, in that book's own line format.

`GET /api/v1/{sport}/props/{book}`

## Request

- Base URL: `https://api.owlsinsight.com`
- URL: `https://api.owlsinsight.com/api/v1/{sport}/props/{book}`
- Auth: HTTP bearer

Returns one sportsbook's player props for a sport, in that book's own line format.

BetMGM returns a flat props array per game keyed by fixtureId; the other books wrap props in a books array like the merged /props board.

FanDuel props mix over/under markets (both prices) with yes-only markets such as anytime touchdown or goal scorer, first goal scorer, double-double and N+ milestones (underPrice null). alternateLines hold a player's other lines: alternate-line rungs at their over line (175+ yards is 174.5) and 2+/3+ scorer ladders at the rung number (2 means 2 or more).

Bet365 player props are retired from this route; Bet365 raw markets are served by its v2 source endpoint.

## Path parameters

- `sport` string, required
- `book` string, required

## Query parameters

- `game_id` string
- `player` string
- `category` string

## Response `200`

OK

- PropsResponse
  - `data` GameProps[]
    - `awayTeam` string
    - `books` BookProps[]
      - `event_link` string
      - `key` string
      - `lastUpdate` string
      - `props` PlayerProp[]
        - `alternateLines` PropAlternateLine[]
          - `line` number, double
          - `odds` number, double
        - `category` string
        - `categoryRaw` string: The raw upstream stat/unit string, present ONLY when `category` is `'unknown'`. Lets you identify a market we have not mapped yet without re-deriving it from the sportsbook, and tell an unmapped market apart from a genuinely uncategorisable one. Added Jul 2026.
        - `lastUpdate` string
        - `line` number, double: Threshold value as published by the upstream sportsbook. Interpretation depends on `marketStructure`. As of the DraftKings mapper passthrough change (May 2026), DK's `milestoneValue` is no longer rebased to the "industry-standard 0.5" — it is passed through verbatim. Consumers that previously assumed `line === 0.5` for "1+" markets should read `marketStructure` and treat `milestone` markets as "Nth+ where N = line".
        - `liquidity` object: Exchange liquidity. A UNION across books — which fields are present depends on which book produced the prop: * Kalshi — `volume`, `volume24h`, `openInterest`, `bidSize`, `askSize` (contracts). * Polymarket — `amount`, `volume` (USD). * Novig — `volume` plus the two order books below. ⚠️ Novig's `overBook`/`underBook` levels are NOT shaped like `Outcome.liquidity` on the main-markets feed. Here `price` is a raw implied probability (0–1) and size is `qty` (CENTS) with a `qtyDollars` convenience already computed. There, `price` is American odds and size is `size` (also cents, no companion field). Same venue, two surfaces, two shapes — the props side is deliberate raw pass-through.
          - `amount` number, double
          - `askSize` number, double
          - `bidSize` number, double
          - `openInterest` number, double
          - `overBook` PropOrderBook: One side of a Novig player-prop order book.
            - `asks` PropOrderBookLevel[]: Present but empty in practice — Novig ladders are bids-only.
              - …
            - `bids` PropOrderBookLevel[]: Best bid first.
              - …
          - `underBook` PropOrderBook: One side of a Novig player-prop order book.
            - `asks` PropOrderBookLevel[]: Present but empty in practice — Novig ladders are bids-only.
              - …
            - `bids` PropOrderBookLevel[]: Best bid first.
              - …
          - `volume` number, double
          - `volume24h` number, double
        - `marketStructure` string: Market structure as published by the upstream sportsbook. Tells the consumer how to interpret `line`, `overPrice`, and `underPrice` together. Populated from upstream signals — not inferred client-side. - `over_under`: Both Over and Under selections published with a continuous line (e.g. strikeouts 5.5). Standard interpretation. - `milestone`: Upstream provides an explicit threshold count (e.g. DK's `milestoneValue: 1` = "1+ of category"). `line` is the threshold value verbatim. `underPrice` is always null. - `single_sided`: Only one side published (typically Over for rare-event props). The missing side is `null`, not inferred. - `pick_one`: Multi-selection market where each selection is one participant's Yes price (e.g. anytime touchdown scorer). ABSENT DOES NOT MEAN `over_under`. Treat a missing value as UNKNOWN; see {@link PlayerProp.marketStructure} for why defaulting it is a settlement bug.
        - `overPrice` number, double: American odds for the over. On EXCHANGE books (currently `kalshi`) this is the venue's own ASK — the price a buyer actually pays — as of Sep 2026. It previously carried the bid/ask MIDPOINT, which nobody can trade at: measured across 40 live kalshi markets the published number beat the takeable one on 40 of 40, median 3.5c and worst case 48c quoted against 94c payable, so cross-book comparisons showed edges that had no counterparty. Read {@link overPriceBasis} / {@link underPriceBasis} to see which side each price came from.
        - `overPriceBasis` string: Which side of the book {@link overPrice} came from. Set only by exchange books, where the distinction is real: * `takeable` — the venue's ask: transactable now. * `midpoint` — no ask was resting, so this is the bid/ask midpoint. An estimate of fair value, NOT a quote. Absent on traditional sportsbooks, whose posted price is takeable by construction.
        - `overPriceMid` number, double, nullable: Bid/ask MIDPOINT as American odds, for books publishing a two-sided quote. The better input to a no-vig fair line; {@link overPrice} is what you transact at. Equal to `overPrice` exactly when {@link overPriceBasis} is `midpoint`.
        - `playerName` string
        - `propId` string
        - `team` string
        - `underPrice` number, double
        - `underPriceBasis` string: Under-side counterpart of {@link overPriceBasis}. SEPARATE on purpose: a book can hold a resting ask on one side and not the other, so a single flag derived from the over side would label a midpoint under-price `takeable` — a midpoint passed off as a quote, under the one field meant to prevent that.
        - `underPriceMid` number, double, nullable: Under-side counterpart of {@link overPriceMid}.
      - `title` string
    - `commenceTime` string
    - `gameId` string
    - `homeTeam` string
    - `isLive` boolean
    - `sport` string
  - `meta` object
    - `availableBooks` string[]
    - `book` string
    - `books` object: Per-requested-book feeder liveness. Added Sep 2026. `ageSeconds` is how long since that book last PUBLISHED, not how old the price is: pollers rewrite their cache on a cadence even when no line moved. There is deliberately no aggregate status field — a book whose feeder dies drops off the board rather than ageing, so a roll-up would report healthy for a dead book.
    - `booksReturned` string[]: Books that actually contributed props to THIS response. Added Sep 2026.
    - `filters` string
    - `gamesReturned` number, double
    - `message` string
    - `propsReturned` number, double
    - `requestedBooks` string[]
    - `sport` string
    - `timestamp` string, nullable
  - `success` boolean

---

[API](https://skmtc.dev/owlsinsight/apis/owls-insight-api.md) · [All operations](https://skmtc.dev/owlsinsight/apis/owls-insight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/owlsinsight/apis/owls-insight-api/revisions/76c1ea016ff1?raw)
