Properties
| Name | Type | Description |
|---|---|---|
| data | object | |
| meta | object | |
| success | boolean |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/owlsinsight-com/json-schema/owlsinsight-com-prop-trends-response-schema.json",
"title": "PropTrendsResponse",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/owlsinsight-com-openapi.json#/components/schemas/PropTrendsResponse",
"properties": {
"data": {
"properties": {
"average": {
"format": "double",
"type": [
"number",
"null"
]
},
"book": {
"type": "string"
},
"category": {
"type": "string"
},
"decided": {
"description": "The hit-rate denominator. Excludes pushes AND unresolved games.",
"format": "double",
"type": "number"
},
"games": {
"items": {
"$ref": "#/$defs/PropTrendGame"
},
"type": "array"
},
"gamesReturned": {
"format": "double",
"type": "number"
},
"line": {},
"overRate": {
"description": "overs / decided. NULL when nothing resolved — zero decided games is not a 0% hit\nrate, so do not render a null as \"0%\".",
"format": "double",
"type": [
"number",
"null"
]
},
"overs": {
"format": "double",
"type": "number"
},
"player": {
"type": "string"
},
"pushes": {
"format": "double",
"type": "number"
},
"streak": {
"description": "Consecutive run from the most recent game. Stops at the first unresolved game.",
"properties": {
"length": {
"format": "double",
"type": "number"
},
"side": {
"type": "string",
"x-extensible-enum": [
"over",
"under"
]
}
},
"type": [
"object",
"null"
],
"x-owls-required": [
"side",
"length"
]
},
"unders": {
"format": "double",
"type": "number"
}
},
"type": "object",
"x-owls-required": [
"player",
"category",
"line",
"gamesReturned",
"average",
"overRate",
"overs",
"unders",
"pushes",
"decided",
"streak",
"games"
]
},
"meta": {
"properties": {
"checks": {
"items": {
"type": "string"
},
"type": "array"
},
"closingPhase": {
"description": "With `line: \"closing\"`: always `\"commence\"` — archive captures are excluded.",
"type": "string",
"x-extensible-enum": [
"commence"
]
},
"closingTruncated": {
"description": "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.",
"type": "boolean"
},
"confirmedOnly": {
"type": "boolean"
},
"gamesAvailable": {
"description": "Rows the lookback could see. A FLOOR when `gamesAvailableCapped` is true.",
"format": "double",
"type": "number"
},
"gamesAvailableCapped": {
"type": "boolean"
},
"matchedNames": {
"description": "The stored spelling(s) the returned games came from. MORE THAN ONE means the name\nmatched two distinct spellings that normalize identically — check them before\ntrusting the aggregate, because it may pool two different people.",
"items": {
"type": "string"
},
"type": "array"
},
"note": {
"type": "string"
},
"provisional": {
"description": "Games in the lookback still marked provisional.",
"format": "double",
"type": "number"
},
"sport": {
"type": "string"
},
"timestamp": {
"type": "string"
},
"ungradable": {
"format": "double",
"type": "number"
},
"window": {
"format": "double",
"type": "number"
}
},
"type": "object",
"x-owls-required": [
"sport",
"window",
"confirmedOnly",
"provisional",
"gamesAvailable",
"gamesAvailableCapped",
"matchedNames",
"ungradable",
"checks",
"timestamp"
]
},
"success": {
"type": "boolean"
}
},
"type": "object",
"x-owls-required": [
"success",
"data",
"meta"
],
"$defs": {
"PropTrendGame": {
"properties": {
"actual": {
"format": "double",
"type": [
"number",
"null"
]
},
"closing": {
"description": "Present with `line: \"closing\"`: every rung the book had captured at game start\n(commence captures only — an archive row is an in-play line, never a close). The\ngame-level `verdict` comes from the rung with `isMain: true`; alternates are the\nladder and never decide. With no main rung the game is `no_closing_line`; with\nmore than one (rare) it is `multiple_closing_lines`.",
"items": {
"properties": {
"isMain": {
"type": "boolean"
},
"line": {
"format": "double",
"type": "number"
},
"ungradableReason": {
"anyOf": [
{
"$ref": "#/$defs/PropUngradableReason"
},
{
"type": "null"
}
]
},
"verdict": {
"anyOf": [
{
"$ref": "#/$defs/PropVerdict"
},
{
"type": "null"
}
]
}
},
"type": "object",
"x-owls-required": [
"line",
"isMain",
"verdict",
"ungradableReason"
]
},
"type": "array"
},
"eventId": {
"type": "string"
},
"final": {
"type": "boolean"
},
"gameDate": {
"type": "string"
},
"status": {
"type": "string"
},
"ungradableReason": {
"anyOf": [
{
"$ref": "#/$defs/PropUngradableReason"
},
{
"type": "null"
}
]
},
"verdict": {
"anyOf": [
{
"$ref": "#/$defs/PropVerdict"
},
{
"type": "null"
}
]
}
},
"type": "object",
"x-owls-required": [
"eventId",
"gameDate",
"actual",
"status",
"final",
"verdict",
"ungradableReason"
]
},
"PropUngradableReason": {
"description": "Why a prop could not be graded. Never a verdict — always a stated reason.",
"type": "string",
"x-extensible-enum": [
"ambiguous_player",
"dnp",
"multiple_closing_lines",
"no_actual_value",
"no_closing_line",
"no_stats",
"stat_not_reported",
"ungradable_structure",
"unmapped_category"
]
},
"PropVerdict": {
"type": "string",
"x-extensible-enum": [
"hit",
"miss",
"over",
"push",
"under"
]
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/owlsinsight-com-prop-trends-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.