{"openapi":"3.1.0","info":{"title":"Pinnacle API","description":"Real-time **Pinnacle** betting markets over plain JSON: live events, full market depth, and the latest bindable prices.\n\n**Try it now** — enter your username and password: every code sample on this page is rewritten with your credentials, ready to copy and run, and the check button verifies them against the live API.\n\n<div id=\"pinc-try\"></div>\n\nDon't have an account? [Contact us](https://www.pinc000.com/) to get a free trial.\n\n## Betting flow\n\n1. **Scan** — poll `GET /sports/{sport}/odds`: teams, live scores and every main line for the whole sport in one response. Pass `?since=<last>` to receive only the events that changed between polls.\n2. **Quote** — `POST /events/{event_id}/bet-slip` returns the freshest price a bet can be placed at *right now*, with its stake limits. The polled odds can lag the bindable price by a moment, so always quote a selection before betting on it. See it yourself: quote a moving live line in a loop while polling its odds — the quote returns the new price and `line_id` (with `status: \"ODDS_CHANGE\"`) a moment before the polled odds update.\n3. **Place** — `POST /bets/straight` places the bet; rehearse with `?dryRun=true` first. Confirm with `GET /bets` and `GET /balance`.\n\n## Freshness & polling\n\nOdds endpoints return a snapshot plus a `last` cursor — a Unix timestamp in **milliseconds** marking when the data was current. Pass it back as `?since=<last>` on the next call to receive only the events that changed since then. An empty response means nothing has changed yet — that is the idle answer, not an error. The bet-slip quote is always the freshest, authoritative price for one selection.\n\n## Authentication\n\nAll endpoints use **HTTP Basic** authentication. Send on every request:\n\n`Authorization: Basic <base64 of \"username:password\">`\n\nRequests without valid credentials receive `401 Unauthorized`.\n\n## Sports\n\n| Sport | `sport` id |\n|---|---|\n| Soccer | 29 |\n| Basketball | 4 |\n| Tennis | 33 |\n| Baseball | 3 |\n| Hockey | 19 |\n| Esports | 12 |\n","version":"1.0.0","x-logo":{"url":"https://pinc000.github.io/pinc000.png","altText":"pinc000","href":"https://www.pinc000.com/"}},"servers":[{"url":"https://api.pinc000.com","description":"Production"}],"paths":{"/sports/{sport}/odds":{"get":{"tags":["Markets"],"summary":"Live odds for a sport","description":"Everything on offer for the sport in one call: each event's teams,\nleague, start time, live score, and its spreads, totals and moneylines.\n\nThis is the endpoint to poll. Odds are grouped league → event → period;\neach line carries the price and the ids you need to quote\n(`/events/{event_id}/bet-slip`) or place (`POST /bets/straight`) a bet on\nit. Prices are decimal by default; `oddsFormat=American` converts.\n\nThe response carries `last` — a Unix timestamp in **milliseconds** marking\nwhen this data was current. Pass it back as `?since=<last>` on the next\ncall to receive only the events that changed after that moment; an empty\n`leagues` list is the idle answer (nothing changed), not an error. The\nvery first request for a sport may return few or no events for a moment\nwhile its live data loads — poll again.","operationId":"sport_odds_sports__sport__odds_get","security":[{"HTTPBasic":[]}],"parameters":[{"name":"sport","in":"path","required":true,"schema":{"$ref":"#/components/schemas/Sport","description":"Numeric sport id.\n\n| Sport | `sport` id |\n|---|---|\n| Soccer | 29 |\n| Basketball | 4 |\n| Tennis | 33 |\n| Baseball | 3 |\n| Hockey | 19 |\n| Esports | 12 |\n"},"description":"Numeric sport id.\n\n| Sport | `sport` id |\n|---|---|\n| Soccer | 29 |\n| Basketball | 4 |\n| Tennis | 33 |\n| Baseball | 3 |\n| Hockey | 19 |\n| Esports | 12 |\n"},{"name":"oddsFormat","in":"query","required":false,"schema":{"$ref":"#/components/schemas/OddsFormat","description":"Format of the returned prices. Prices are Decimal by default; American is converted exactly, the remaining formats currently fall back to Decimal.","default":"Decimal"},"description":"Format of the returned prices. Prices are Decimal by default; American is converted exactly, the remaining formats currently fall back to Decimal."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unix timestamp in **milliseconds** — the moment your data was current, i.e. the `last` value from your previous response. When set, the response contains only what changed after that moment; an empty response means nothing has changed yet (the idle answer, not an error). Omit it to receive a full snapshot.","title":"Since"},"description":"Unix timestamp in **milliseconds** — the moment your data was current, i.e. the `last` value from your previous response. When set, the response contains only what changed after that moment; an empty response means nothing has changed yet (the idle answer, not an error). Omit it to receive a full snapshot."},{"name":"isLive","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Set to 1 to return only events that are live right now.","title":"Islive"},"description":"Set to 1 to return only events that are live right now."},{"name":"eventIds","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict the response to these event ids (repeat the parameter or send a comma-separated list).","title":"Eventids"},"description":"Restrict the response to these event ids (repeat the parameter or send a comma-separated list)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OddsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports/29/odds'"},{"lang":"Shell","label":"curl — incremental","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports/29/odds?since=1753190000000'"}]}},"/sports/{sport}/events":{"get":{"tags":["Markets"],"summary":"Live events for a sport","description":"The sport's events without their odds: id, start time, teams and live\nstatus, grouped by league.\n\n`/sports/{sport}/odds` already carries all of this — this lighter list\nexists for clients ported from the official fixtures API and for checking\nwhat is on offer without pulling the prices.\n\nThe response carries `last` — a Unix timestamp in **milliseconds** marking\nwhen this data was current. Pass it back as `?since=<last>` on the next\ncall to receive only the events that changed after that moment; an empty\n`league` list is the idle answer (nothing changed), not an error. The very\nfirst request for a sport may return few or no events for a moment while\nits live data loads — poll again.","operationId":"sport_events_sports__sport__events_get","security":[{"HTTPBasic":[]}],"parameters":[{"name":"sport","in":"path","required":true,"schema":{"$ref":"#/components/schemas/Sport","description":"Numeric sport id.\n\n| Sport | `sport` id |\n|---|---|\n| Soccer | 29 |\n| Basketball | 4 |\n| Tennis | 33 |\n| Baseball | 3 |\n| Hockey | 19 |\n| Esports | 12 |\n"},"description":"Numeric sport id.\n\n| Sport | `sport` id |\n|---|---|\n| Soccer | 29 |\n| Basketball | 4 |\n| Tennis | 33 |\n| Baseball | 3 |\n| Hockey | 19 |\n| Esports | 12 |\n"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unix timestamp in **milliseconds** — the moment your data was current, i.e. the `last` value from your previous response. When set, the response contains only what changed after that moment; an empty response means nothing has changed yet (the idle answer, not an error). Omit it to receive a full snapshot.","title":"Since"},"description":"Unix timestamp in **milliseconds** — the moment your data was current, i.e. the `last` value from your previous response. When set, the response contains only what changed after that moment; an empty response means nothing has changed yet (the idle answer, not an error). Omit it to receive a full snapshot."},{"name":"isLive","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Set to 1 to return only events that are live right now.","title":"Islive"},"description":"Set to 1 to return only events that are live right now."},{"name":"eventIds","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict the response to these event ids (repeat the parameter or send a comma-separated list).","title":"Eventids"},"description":"Restrict the response to these event ids (repeat the parameter or send a comma-separated list)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixturesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports/29/events'"},{"lang":"Shell","label":"curl — incremental","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports/29/events?since=1753190000000'"}]}},"/balance":{"get":{"tags":["Account"],"summary":"Account balance","description":"The current balance of your betting account.\n\n`availableBalance` is the amount you can stake right now, in\n`currency` units; `outstandingTransactions` and `givenCredit` are included\nwhen available. Returns `503` if the balance cannot be fetched at this\nmoment — retry shortly.","operationId":"balance_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientBalance"}}}}},"security":[{"HTTPBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/balance'"}]}},"/bets/straight":{"post":{"tags":["Betting"],"summary":"Place a straight bet","description":"Place a single straight bet.\n\nSend the market coordinates of one selection (`eventId`, `periodNumber`,\n`betType` plus `team`/`side`/`handicap`), the `lineId` (and `altLineId` for\nan alternate line) from `/sports/{sport}/odds`, and your `stake`. The\nselection is re-priced at the freshest bindable price before placement; a\nstale or closed line returns `PROCESSED_WITH_ERROR` without any wager. On\nsuccess `status` is `ACCEPTED` and `betId` identifies the wager.\n\n**This endpoint spends real money.** Pass `?dryRun=true` to exercise the\nfull validate-and-price path and see exactly what would be placed without\nsubmitting the wager — the recommended first call for any integration.","operationId":"place_straight_bet_bets_straight_post","security":[{"HTTPBasic":[]}],"parameters":[{"name":"dryRun","in":"query","required":false,"schema":{"type":"boolean","description":"When true, run the full validate-and-price path and return what would be placed WITHOUT submitting the wager. Defaults to false: a real bet is placed and your account is debited.","default":false,"title":"Dryrun"},"description":"When true, run the full validate-and-price path and return what would be placed WITHOUT submitting the wager. Defaults to false: a real bet is placed and your account is debited."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StraightBetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StraightBetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"# dryRun=true — remove to place the bet for real\ncurl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"sportId\": 29, \"eventId\": 1620849621,\n       \"betType\": \"MONEYLINE\", \"team\": \"TEAM1\",\n       \"lineId\": 3251987654, \"stake\": 10}' \\\n  'https://api.pinc000.com/bets/straight?dryRun=true'"}]}},"/bets":{"get":{"tags":["Betting"],"summary":"List placed bets","description":"The straight bets your account has placed.\n\nEach entry carries the bet id, status, market coordinates, stake and price;\nany additional fields reported for a bet are passed through unchanged.\nReturns `503` if the list cannot be fetched at this moment — retry shortly.","operationId":"bets_bets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetsResponse"}}}}},"security":[{"HTTPBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/bets'"}]}},"/sports":{"get":{"tags":["Markets"],"summary":"List sports","description":"The available sports: each one's numeric id (the `{sport}` value the\nother endpoints take) and name, plus whether it currently has events on\noffer and how many.","operationId":"sports_sports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SportInfo"},"type":"array","title":"Response Sports Sports Get"}}}}},"security":[{"HTTPBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports'"}]}},"/events/{event_id}/markets":{"get":{"tags":["Markets"],"summary":"Full market set for an event","description":"Every market offered for one event: all alternate handicap and total\nlines, team totals, the corners and bookings markets, and the specials\n(correct score, both teams to score, goalscorer, half-time/full-time, …).\n\nSend an event id from `/sports/{sport}/odds`. Market depth loads on\ndemand, so the first request for a new event may take a few seconds;\nsubsequent requests return immediately. `404` means the event could not be\nresolved — pass `?sport=<id>` (or request the sport's odds first) and check\nthe event is still on offer.","operationId":"event_markets_events__event_id__markets_get","security":[{"HTTPBasic":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Sport"},{"type":"null"}],"description":"The event's sport id. Optional when the sport's odds have already been requested this session; pass it to resolve the event directly.","title":"Sport"},"description":"The event's sport id. Optional when the sport's odds have already been requested this session; pass it to resolve the event directly."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoreBets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/events/1620849621/markets'"}]}},"/events/{event_id}/bet-slip":{"post":{"tags":["Betting"],"summary":"Quote the latest bindable price for a selection","description":"Quote the latest bindable price for one selection.\n\nSend the selection's coordinates — market kind, side, line and line id —\nexactly as they appear in `/sports/{sport}/odds` or\n`/events/{event_id}/markets`. You get back the freshest price a bet can\ncurrently be placed at, together with the stake limits and a status\n(`OK`, `ODDS_CHANGE`, or unavailable).\n`404` means the event or the selection is not currently on offer.\n\n**This quote is the freshest price in the API**, ahead of the polled\n`/sports/{sport}/odds` on a moving market — and you can watch that\nyourself: quote a live selection in a loop while polling its odds. The\nmoment the market moves, the quote returns the new price and a new\n`line_id` with `status: \"ODDS_CHANGE\"` (the line you referenced is no\nlonger the current one); the polled odds catch up a moment later. That is\nwhy the flow is poll → quote → place: the quote is the price your bet\nwill actually bind to.","operationId":"price_events__event_id__bet_slip_post","security":[{"HTTPBasic":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/_MoneylineReq"},{"$ref":"#/components/schemas/_HandicapReq"},{"$ref":"#/components/schemas/_TotalReq"},{"$ref":"#/components/schemas/_TeamTotalReq"},{"$ref":"#/components/schemas/_SpecialReq"}],"discriminator":{"propertyName":"market","mapping":{"moneyline":"#/components/schemas/_MoneylineReq","handicap":"#/components/schemas/_HandicapReq","total":"#/components/schemas/_TotalReq","team_total":"#/components/schemas/_TeamTotalReq","special":"#/components/schemas/_SpecialReq"}},"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectionOdds"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"market\": \"moneyline\", \"side\": \"home\",\n       \"line_id\": 3251987654}' \\\n  'https://api.pinc000.com/events/1620849621/bet-slip'"},{"lang":"Shell","label":"curl — see the freshness","source":"# On a moving live market the quote shows the new price\n# and line_id BEFORE the polled odds do. Run both against\n# the same live event and compare line_id:\ncurl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  'https://api.pinc000.com/sports/29/odds?eventIds=1620849621'\ncurl -u '{{PINC_USER}}:{{PINC_PASS}}' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"market\": \"moneyline\", \"side\": \"home\",\n       \"line_id\": 3251987654}' \\\n  'https://api.pinc000.com/events/1620849621/bet-slip'"}]}}},"components":{"schemas":{"BetType":{"type":"string","enum":["MONEYLINE","SPREAD","TOTAL_POINTS","TEAM_TOTAL_POINTS"],"title":"BetType","description":"The market kind of a straight bet."},"BetsResponse":{"properties":{"straightBets":{"items":{"$ref":"#/components/schemas/PlacedBet"},"type":"array","title":"Straightbets"}},"type":"object","required":["straightBets"],"title":"BetsResponse","description":"The straight bets your account has placed."},"ClientBalance":{"properties":{"availableBalance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Availablebalance","description":"The amount available to stake right now, in `currency` units."},"outstandingTransactions":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Outstandingtransactions","description":"The total amount currently tied up in unsettled bets."},"givenCredit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Givencredit","description":"Credit extended to the account, if any."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"ISO 4217 currency code all amounts are denominated in, e.g. `\"EUR\"`."}},"type":"object","title":"ClientBalance","description":"Your betting account's balance. All amounts are in `currency` units;\nfields the account does not report are omitted."},"FillType":{"type":"string","enum":["NORMAL","FILLANDKILL","FILLMAXLIMIT"],"title":"FillType","description":"How to fill a bet whose available stake is below the request."},"Fixture":{"properties":{"id":{"type":"integer","title":"Id","description":"The event id — use it with `/events/{event_id}/markets`,\n`/events/{event_id}/bet-slip` and `POST /bets/straight`."},"parentId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parentid"},"starts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts","description":"Scheduled start, ISO-8601 UTC, e.g. `\"2020-03-31T18:00:00Z\"`."},"home":{"type":"string","title":"Home","description":"Home team/contestant name."},"away":{"type":"string","title":"Away","description":"Away team/contestant name."},"rotNum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rotnum"},"liveStatus":{"type":"integer","title":"Livestatus","description":"0 = no live betting, 1 = live event, 2 = live on another event."},"status":{"type":"string","title":"Status","description":"`\"O\"` = open for betting.","default":"O"}},"type":"object","required":["id","home","away","liveStatus"],"title":"Fixture","description":"One event on offer: its id, start time, teams and live status."},"FixturesLeague":{"properties":{"id":{"type":"integer","title":"Id","description":"League id."},"name":{"type":"string","title":"Name","description":"League name, e.g. `\"England - Premier League\"`."},"events":{"items":{"$ref":"#/components/schemas/Fixture"},"type":"array","title":"Events"}},"type":"object","required":["id","name","events"],"title":"FixturesLeague","description":"One league and its events."},"FixturesResponse":{"properties":{"sportId":{"type":"integer","title":"Sportid","description":"The requested sport id."},"last":{"type":"integer","title":"Last","description":"Unix timestamp in **milliseconds** — the moment this data was current.\nPass it back as `?since=<last>` on the next call to receive only changes\nafter that moment; an empty response then means nothing changed (idle, not\nan error)."},"league":{"items":{"$ref":"#/components/schemas/FixturesLeague"},"type":"array","title":"League","description":"The leagues carrying events. Empty when polling with `?since=` and\nnothing has changed."}},"type":"object","required":["sportId","last","league"],"title":"FixturesResponse","description":"Events on offer for one sport, grouped by league."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Moneyline":{"properties":{"home":{"type":"number","title":"Home"},"draw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw"},"away":{"type":"number","title":"Away"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"}},"type":"object","required":["home","draw","away","line_id"],"title":"Moneyline"},"MoreBets":{"properties":{"event_id":{"type":"integer","title":"Event Id"},"goals":{"anyOf":[{"$ref":"#/components/schemas/MoreBetsEvent"},{"type":"null"}]},"corners":{"anyOf":[{"$ref":"#/components/schemas/MoreBetsEvent"},{"type":"null"}]},"bookings":{"anyOf":[{"$ref":"#/components/schemas/MoreBetsEvent"},{"type":"null"}]}},"type":"object","required":["event_id","goals","corners","bookings"],"title":"MoreBets","description":"The full market set for one requested event.\n\n`goals` is the requested event; `corners`/`bookings` are its sibling\nevents (each with its own event id). Any of the three may be null when\nthat market group is not offered."},"MoreBetsEvent":{"properties":{"id":{"type":"integer","title":"Id"},"sport_id":{"type":"integer","title":"Sport Id"},"home":{"type":"string","title":"Home"},"away":{"type":"string","title":"Away"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"periods":{"items":{"$ref":"#/components/schemas/MoreBetsPeriod"},"type":"array","title":"Periods"}},"type":"object","required":["id","sport_id","home","away","category","periods"],"title":"MoreBetsEvent","description":"One market group of an event's full market set (Goals, Corners or\nBookings), with every period's lines."},"MoreBetsPeriod":{"properties":{"number":{"type":"integer","title":"Number"},"moneyline":{"anyOf":[{"$ref":"#/components/schemas/Moneyline"},{"type":"null"}]},"handicaps":{"items":{"$ref":"#/components/schemas/Spread"},"type":"array","title":"Handicaps"},"totals":{"items":{"$ref":"#/components/schemas/Total"},"type":"array","title":"Totals"},"team_totals_home":{"items":{"$ref":"#/components/schemas/Total"},"type":"array","title":"Team Totals Home"},"team_totals_away":{"items":{"$ref":"#/components/schemas/Total"},"type":"array","title":"Team Totals Away"},"specials":{"items":{"$ref":"#/components/schemas/Special"},"type":"array","title":"Specials"}},"type":"object","required":["number","moneyline","handicaps","totals","team_totals_home","team_totals_away","specials"],"title":"MoreBetsPeriod","description":"All of one child event's markets for a single period (0=match, 1=1st\nhalf, 2=2nd half)."},"OddsEvent":{"properties":{"id":{"type":"integer","title":"Id","description":"The event id — use it with `/events/{event_id}/markets`,\n`/events/{event_id}/bet-slip` and `POST /bets/straight`."},"home":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home","description":"Home team/contestant name."},"away":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away","description":"Away team/contestant name."},"starts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts","description":"Scheduled start, ISO-8601 UTC, e.g. `\"2020-03-31T18:00:00Z\"`."},"homeScore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Homescore","description":"Current home score; present only while the event is live."},"awayScore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Awayscore","description":"Current away score; present only while the event is live."},"periods":{"items":{"$ref":"#/components/schemas/OddsPeriod"},"type":"array","title":"Periods"}},"type":"object","required":["id","periods"],"title":"OddsEvent","description":"One event: teams, start time, live score and its odds per period —\neverything needed to pick a selection and quote or place it."},"OddsFormat":{"type":"string","enum":["American","Decimal","HongKong","Indonesian","Malay"],"title":"OddsFormat","description":"Price format for odds and quotes. Decimal is the native format;\nAmerican is converted exactly; the remaining formats currently fall back\nto Decimal."},"OddsLeague":{"properties":{"id":{"type":"integer","title":"Id","description":"League id."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"League name, e.g. `\"England - Premier League\"`."},"events":{"items":{"$ref":"#/components/schemas/OddsEvent"},"type":"array","title":"Events"}},"type":"object","required":["id","events"],"title":"OddsLeague","description":"One league and its events' odds."},"OddsMoneyline":{"properties":{"home":{"type":"number","title":"Home"},"away":{"type":"number","title":"Away"},"draw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw","description":"Present only when a draw price is offered (3-way markets)."}},"type":"object","required":["home","away"],"title":"OddsMoneyline","description":"The moneyline (1X2 / win) market prices."},"OddsPeriod":{"properties":{"lineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lineid","description":"Line id to send when quoting or placing a bet on this period's main\nlines."},"number":{"type":"integer","title":"Number","description":"Period number: 0 = whole match, 1 = 1st half, ..."},"cutoff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cutoff","description":"Wagering cut-off, ISO-8601 UTC."},"status":{"type":"integer","title":"Status","description":"1 = open for betting.","default":1},"spreads":{"items":{"$ref":"#/components/schemas/OddsSpread"},"type":"array","title":"Spreads"},"moneyline":{"anyOf":[{"$ref":"#/components/schemas/OddsMoneyline"},{"type":"null"}]},"totals":{"items":{"$ref":"#/components/schemas/OddsTotal"},"type":"array","title":"Totals"}},"type":"object","required":["number"],"title":"OddsPeriod","description":"All lines for one betting period of an event."},"OddsResponse":{"properties":{"sportId":{"type":"integer","title":"Sportid","description":"The requested sport id."},"last":{"type":"integer","title":"Last","description":"Unix timestamp in **milliseconds** — the moment this data was current.\nPass it back as `?since=<last>` on the next call to receive only changes\nafter that moment; an empty response then means nothing changed (idle, not\nan error)."},"leagues":{"items":{"$ref":"#/components/schemas/OddsLeague"},"type":"array","title":"Leagues","description":"The leagues carrying events. Empty when polling with `?since=` and\nnothing has changed."}},"type":"object","required":["sportId","last","leagues"],"title":"OddsResponse","description":"Live odds for one sport, grouped league → event → period."},"OddsSpread":{"properties":{"altLineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Altlineid","description":"Line id of an alternate line; absent on the main line."},"hdp":{"type":"number","title":"Hdp","description":"Home handicap; the away side takes the negation."},"home":{"type":"number","title":"Home","description":"Price for the home side."},"away":{"type":"number","title":"Away","description":"Price for the away side."}},"type":"object","required":["hdp","home","away"],"title":"OddsSpread","description":"A handicap (spread) line: back `home` at `hdp` or `away` at `-hdp`."},"OddsTotal":{"properties":{"altLineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Altlineid","description":"Line id of an alternate line; absent on the main line."},"points":{"type":"number","title":"Points","description":"The over/under threshold."},"over":{"type":"number","title":"Over","description":"Price for over."},"under":{"type":"number","title":"Under","description":"Price for under."}},"type":"object","required":["points","over","under"],"title":"OddsTotal","description":"A totals (over/under) line at `points`."},"OverUnder":{"type":"string","enum":["OVER","UNDER"],"title":"OverUnder","description":"`side` for totals / team totals."},"PlacedBet":{"properties":{"betId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Betid","description":"The bet's id."},"wagerNumber":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wagernumber"},"betStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Betstatus","description":"e.g. `ACCEPTED`, `PENDING_ACCEPTANCE`, `WON`, `LOST`."},"betType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bettype"},"sportId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sportid"},"leagueId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Leagueid"},"eventId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Eventid"},"placedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placedat","description":"When the bet was placed, ISO-8601 UTC."},"periodNumber":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Periodnumber"},"team1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team1"},"team2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team2"},"stake":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stake","description":"The staked amount, in your account currency."},"win":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win"},"risk":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Risk"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"The odds the bet was filled at."}},"additionalProperties":true,"type":"object","title":"PlacedBet","description":"One placed bet. The common fields are typed below; any additional\nfields reported for a bet are passed through unchanged, so nothing is\nlost."},"SelectionOdds":{"properties":{"status":{"type":"string","title":"Status","default":""},"odds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Odds"},"lineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lineid"},"altLineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Altlineid"},"minStake":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minstake"},"maxStake":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxstake"},"maxStakeWin":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxstakewin"},"maxPayout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxpayout"},"originalOdds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Originalodds"},"lastOdds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lastodds"},"betType":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bettype"},"betTypeDisp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bettypedisp"},"periodNum":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Periodnum"},"handicap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Handicap"},"eventId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Eventid"},"homeTeam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hometeam"},"awayTeam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Awayteam"},"selection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selection"},"contestantName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contestantname"},"eventName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eventname"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"inplay":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inplay"}},"additionalProperties":true,"type":"object","title":"SelectionOdds","description":"The freshest bindable quote for one selection.\n\n`odds` is the decimal price a bet can currently be placed at; `status` is\n\"OK\" (the line you referenced is current), \"ODDS_CHANGE\" (the market moved\noff the line you referenced — `odds` and `line_id` already carry the new,\nbindable price, ahead of the polled odds) or \"UNAVAILABLE\" (suspended).\n`line_id` is the current price id and `alt_line_id` the stable\nalternate-line id (0 for a main line); `min_stake` / `max_stake` bound the\nwager. Any additional fields reported for the quote are passed through\nunchanged, so nothing is lost."},"Special":{"properties":{"selection_id":{"type":"integer","title":"Selection Id"},"name":{"type":"string","title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"bet_type":{"type":"string","title":"Bet Type"},"period":{"type":"integer","title":"Period"},"max_stake":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Stake"},"selections":{"items":{"$ref":"#/components/schemas/SpecialSelection"},"type":"array","title":"Selections"}},"type":"object","required":["selection_id","name","category","bet_type","period","max_stake","selections"],"title":"Special","description":"A self-describing exotic market: correct score, both teams to score,\ndouble chance, goalscorer, HT/FT, winning margin, odd/even, etc. Each one\ncarries its own name and the list of pickable outcomes."},"SpecialSelection":{"properties":{"id":{"type":"integer","title":"Id"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"name":{"type":"string","title":"Name"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"handicap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Handicap"}},"type":"object","required":["id","line_id","name","price","handicap"],"title":"SpecialSelection","description":"One pickable outcome inside a `Special` market."},"Sport":{"type":"integer","enum":[29,3,33,4,19,12],"title":"Sport","x-enum-descriptions":["Soccer","Baseball","Tennis","Basketball","Hockey","Esports"],"x-enum-varnames":["SOCCER","BASEBALL","TENNIS","BASKETBALL","HOCKEY","ESPORTS"]},"SportInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"The numeric sport id — the `{sport}` value in the other endpoints."},"name":{"type":"string","title":"Name","description":"The sport's name, e.g. `\"Soccer\"`."},"has_offerings":{"type":"boolean","title":"Has Offerings","description":"Whether the sport currently has events on offer."},"event_count":{"type":"integer","title":"Event Count","description":"The number of events currently on offer."}},"type":"object","required":["id","name","has_offerings","event_count"],"title":"SportInfo","description":"One sport: the numeric id the `/sports/{sport}/...` paths take, its\nname, and how many events it currently has on offer."},"Spread":{"properties":{"hdp":{"type":"number","title":"Hdp"},"home":{"type":"number","title":"Home"},"away":{"type":"number","title":"Away"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"main":{"type":"boolean","title":"Main"}},"type":"object","required":["hdp","home","away","line_id","main"],"title":"Spread"},"StraightBetRequest":{"properties":{"oddsFormat":{"$ref":"#/components/schemas/OddsFormat","description":"Price format the response's `price` is expressed in.","default":"Decimal"},"uniqueRequestId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uniquerequestid","description":"Idempotency key for this placement; a UUID is minted when absent."},"acceptBetterLine":{"type":"boolean","title":"Acceptbetterline","description":"Accept the bet when the line has moved in your favour.","default":true},"stake":{"type":"number","title":"Stake","description":"Amount to bet, in your account currency. `winRiskStake` says whether\nit is the amount to win or to risk."},"winRiskStake":{"$ref":"#/components/schemas/WinRiskType","description":"Whether `stake` is the amount to WIN or the amount to RISK.","default":"RISK"},"lineId":{"type":"integer","title":"Lineid","description":"The line id from `/sports/{sport}/odds` (the period's `lineId`)."},"altLineId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Altlineid","description":"The alternate line's id (`altLineId` on the spread/total), when betting\nan alternate line."},"fillType":{"anyOf":[{"$ref":"#/components/schemas/FillType"},{"type":"null"}],"description":"How to fill when the available stake is below the request."},"sportId":{"type":"integer","title":"Sportid","description":"The event's sport id."},"eventId":{"type":"integer","title":"Eventid","description":"The event id."},"periodNumber":{"type":"integer","title":"Periodnumber","description":"Betting period: 0 = whole match, 1 = 1st half, ...","default":0},"betType":{"$ref":"#/components/schemas/BetType","description":"The market kind."},"team":{"anyOf":[{"$ref":"#/components/schemas/TeamSide"},{"type":"null"}],"description":"The picked side for moneyline / spread / team total."},"side":{"anyOf":[{"$ref":"#/components/schemas/OverUnder"},{"type":"null"}],"description":"OVER or UNDER for totals / team totals."},"handicap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Handicap","description":"The spread handicap or the total's points, as shown in the odds."}},"type":"object","required":["stake","lineId","sportId","eventId","betType"],"title":"StraightBetRequest","description":"A straight bet: one selection identified by its market coordinates\n(`eventId` / `periodNumber` / `betType` + `team` / `side` / `handicap`)\nplus the `lineId` (and `altLineId` for an alternate line) from\n`/sports/{sport}/odds`, and the `stake`. The selection is re-priced at the\nfreshest bindable price before placement."},"StraightBetResponse":{"properties":{"status":{"type":"string","title":"Status","description":"`ACCEPTED` or `PROCESSED_WITH_ERROR`."},"errorCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errorcode","description":"Why the bet was not placed, e.g. `LINE_UNAVAILABLE`."},"uniqueRequestId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uniquerequestid","description":"The idempotency key of this placement."},"betId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Betid","description":"The placed bet's id; set on acceptance."},"betStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Betstatus","description":"e.g. `ACCEPTED`, `PENDING_ACCEPTANCE` — or `DRY_RUN` for a simulated\nplacement."},"betterLineWasAccepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Betterlinewasaccepted"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"The odds the bet was (or would be) filled at."},"dryRun":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dryrun","description":"True when the placement was simulated (`?dryRun=true`) — no wager was\nsubmitted."}},"type":"object","required":["status"],"title":"StraightBetResponse","description":"The placement result. `status` is `ACCEPTED` when the bet was placed\n(then `betId` / `betStatus` identify it), `PROCESSED_WITH_ERROR` otherwise\n(then `errorCode` explains); `price` echoes the filled odds."},"TeamSide":{"type":"string","enum":["TEAM1","TEAM2","DRAW"],"title":"TeamSide","description":"`team` for moneyline / spread / team-total picks. TEAM1 = home,\nTEAM2 = away."},"Total":{"properties":{"points":{"type":"number","title":"Points"},"over":{"type":"number","title":"Over"},"under":{"type":"number","title":"Under"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"main":{"type":"boolean","title":"Main"}},"type":"object","required":["points","over","under","line_id","main"],"title":"Total"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WinRiskType":{"type":"string","enum":["WIN","RISK"],"title":"WinRiskType","description":"Whether `stake` is the amount to win or the amount to risk."},"_HandicapReq":{"properties":{"market":{"type":"string","const":"handicap","title":"Market"},"period":{"type":"integer","title":"Period","default":0},"side":{"type":"string","enum":["home","away"],"title":"Side"},"hdp":{"type":"number","title":"Hdp"},"line_id":{"type":"integer","title":"Line Id"}},"type":"object","required":["market","side","hdp","line_id"],"title":"_HandicapReq"},"_MoneylineReq":{"properties":{"market":{"type":"string","const":"moneyline","title":"Market"},"period":{"type":"integer","title":"Period","default":0},"side":{"type":"string","enum":["home","away","draw"],"title":"Side"},"line_id":{"type":"integer","title":"Line Id"}},"type":"object","required":["market","side","line_id"],"title":"_MoneylineReq"},"_SpecialReq":{"properties":{"market":{"type":"string","const":"special","title":"Market"},"period":{"type":"integer","title":"Period","default":0},"market_id":{"type":"integer","title":"Market Id"},"contestant_id":{"type":"integer","title":"Contestant Id"},"line_id":{"type":"integer","title":"Line Id"}},"type":"object","required":["market","market_id","contestant_id","line_id"],"title":"_SpecialReq"},"_TeamTotalReq":{"properties":{"market":{"type":"string","const":"team_total","title":"Market"},"period":{"type":"integer","title":"Period","default":0},"team":{"type":"string","enum":["home","away"],"title":"Team"},"side":{"type":"string","enum":["over","under"],"title":"Side"},"points":{"type":"number","title":"Points"},"line_id":{"type":"integer","title":"Line Id"}},"type":"object","required":["market","team","side","points","line_id"],"title":"_TeamTotalReq"},"_TotalReq":{"properties":{"market":{"type":"string","const":"total","title":"Market"},"period":{"type":"integer","title":"Period","default":0},"side":{"type":"string","enum":["over","under"],"title":"Side"},"points":{"type":"number","title":"Points"},"line_id":{"type":"integer","title":"Line Id"}},"type":"object","required":["market","side","points","line_id"],"title":"_TotalReq"}},"securitySchemes":{"HTTPBasic":{"type":"http","scheme":"basic"}}},"tags":[{"name":"Markets","description":"Live odds with teams and scores in one call (`/sports/{sport}/odds` is the endpoint to poll — each response carries a `last` freshness timestamp (epoch ms) you pass back as `?since=` to receive only what changed), plus the full market set for any single event."},{"name":"Betting","description":"Quote the latest bindable price for a selection, place straight bets and list the bets you placed. **`POST /bets/straight` places a real bet and debits your account unless you pass `?dryRun=true`.**"},{"name":"Account","description":"Your account: the available balance and its currency."}]}