---
title: "Returns a player's recent form for one prop category: the actual value from each recent game and, when a line is supplied, the hit rate, streak and average measured against it. The line can be a number, or closing to grade each game against the line a named sportsbook had captured at that game's start."
method: GET
path: "/api/v1/{sport}/props/trends"
tags: ["Player props"]
---

# Returns a player's recent form for one prop category: the actual value from each recent game and, when a line is supplied, the hit rate, streak and average measured against it. The line can be a number, or closing to grade each game against the line a named sportsbook had captured at that game's start.

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

## Request

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

Returns a player's recent form for one prop category: the actual value from each recent game and, when a line is supplied, the hit rate, streak and average measured against it. The line can be a number, or closing to grade each game against the line a named sportsbook had captured at that game's start.

409 with matchedNames in the body when the name covers two different players, rather than pooling them into one trend. On a 200, meta.matchedNames lists the stored spellings the games came from; more than one means two spellings normalized to the same key, so check them before trusting the aggregate.

overRate is null, not 0, when no game in the window resolved. decided is its denominator and excludes pushes and unresolved games. streak runs from the most recent game and stops at the first unresolved game.

A numeric line is graded as over/under on every game, including integer lines, because a caller-supplied threshold is unambiguous. With line=closing each game is graded against the main line the book had captured at game start; every captured rung is listed under closing with isMain per rung, a game with no main rung is no_closing_line and one with several is multiple_closing_lines. A line captured in play is never treated as a close; meta.closingPhase records that only game-start captures were used.

meta.closingTruncated true means the rung fetch hit its cap and games past the cut read as no_closing_line; re-query with a smaller window. meta.gamesAvailable is a floor, not a count, when meta.gamesAvailableCapped is true.

Provisional grades are included by default; each game carries final and meta.provisional counts them. Grading is enabled sport by sport, so a player on a sport where it is not enabled has no games to return.

## Path parameters

- `sport` string, required

## Query parameters

- `player` string, required
- `category` string, required
- `line` string
- `book` string
- `window` string
- `confirmed_only` string

## Response `200`

OK

- PropTrendsResponse
  - `data` object
    - `average` number, double, nullable
    - `book` string
    - `category` string
    - `decided` number, double: The hit-rate denominator. Excludes pushes AND unresolved games.
    - `games` PropTrendGame[]
      - `actual` number, double, nullable
      - `closing` object[]: Present with `line: "closing"`: every rung the book had captured at game start (commence captures only — an archive row is an in-play line, never a close). The game-level `verdict` comes from the rung with `isMain: true`; alternates are the ladder and never decide. With no main rung the game is `no_closing_line`; with more than one (rare) it is `multiple_closing_lines`.
        - `isMain` boolean
        - `line` number, double
        - `ungradableReason` string: Why a prop could not be graded. Never a verdict — always a stated reason.
        - `verdict` string
      - `eventId` string
      - `final` boolean
      - `gameDate` string
      - `status` string
      - `ungradableReason` string: Why a prop could not be graded. Never a verdict — always a stated reason.
      - `verdict` string
    - `gamesReturned` number, double
    - `line` unknown
    - `overRate` number, double, nullable: overs / decided. NULL when nothing resolved — zero decided games is not a 0% hit rate, so do not render a null as "0%".
    - `overs` number, double
    - `player` string
    - `pushes` number, double
    - `streak` object, nullable: Consecutive run from the most recent game. Stops at the first unresolved game.
      - `length` number, double
      - `side` string
    - `unders` number, double
  - `meta` object
    - `checks` string[]
    - `closingPhase` string: With `line: "closing"`: always `"commence"` — archive captures are excluded.
    - `closingTruncated` boolean: With `line: "closing"`: true if the rung fetch hit its cap; games past the cut read as no_closing_line, so re-query with a smaller window.
    - `confirmedOnly` boolean
    - `gamesAvailable` number, double: Rows the lookback could see. A FLOOR when `gamesAvailableCapped` is true.
    - `gamesAvailableCapped` boolean
    - `matchedNames` string[]: The stored spelling(s) the returned games came from. MORE THAN ONE means the name matched two distinct spellings that normalize identically — check them before trusting the aggregate, because it may pool two different people.
    - `note` string
    - `provisional` number, double: Games in the lookback still marked provisional.
    - `sport` string
    - `timestamp` string
    - `ungradable` number, double
    - `window` number, double
  - `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)
