├── FairUsePolicy.md ├── GettingStarted.md ├── README.md ├── FAQ.md └── APIChangelog.md /FairUsePolicy.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # Fair Use Policy 5 | 6 | 7 | This API is protected by copyright laws and is provided only to our players, partners and affiliates. 8 | 9 | The use of this resource is subject to our "Fair Use Policy" which is set out below. 10 | 11 | Use of the API constitutes your agreement to this policy. You understand and agree that at our sole discretion, and without prior notice, we may block access to our site if we believe that your use of our site has violated or is inconsistent with this Fair Use Policy. 12 | 13 | We may at any time, and at our sole discretion, modify this Fair Use Policy, with or without prior notice. Any such modification will be effective immediately upon public posting. Your continued use of our APIs and this site following such modification constitutes your acceptance of the modified terms in this Fair Use Policy. 14 | 15 | 16 | 17 | ### Fair usage 18 | 19 | Fair usage 20 | The API is provided to clients on a case-by-case basis. The API usage must be proportionate to client use case as determined by Pinnacle. 21 | Unless explicitly agreed in writing by Pinnacle, the commercial usage of the API will lead to the permanent suspension of your access. 22 | 23 | You will not attempt, nor encourage others to: 24 | - interfere with, disrupt, or disable any API features; 25 | - use the API for commercial purposes without a written agreement with Pinnacle; 26 | - sell, rent, lease, sublicense, redistribute, or syndicate the API to any third party without prior written approval from Pinnacle. 27 | 28 | 29 | -------------------------------------------------------------------------------- /GettingStarted.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Getting Started 4 | 5 | ##### Step 1 - Get Approval to Access the API 6 | 7 | Please note that Pinnacle API is not available to all customers. To request the access please contact [Pinnacle Solution]( 8 | https://www.pinnaclesolution.com/en/contact-us). 9 | 10 | 11 | ##### Step 2 - Get a List of Offered Sports and Leagues 12 | 13 | You would need to get the list of sports from the Get Sports operation. If you are interested in particular leagues, you can get all sports leagues by calling the Get Leagues operation. 14 | 15 | ##### Step 3 - Place Bet 16 | 17 | To place a bet, please check the below section [How to place a bet](#How_to_Place_a_Bet). 18 | 19 | ##### Step 4 - Get Bets 20 | 21 | To check the status of the placed bet, you need to call Get Bets operation. The recommended way is to use `betIds` query parameter. 22 | 23 | 24 | 25 | ## How to Place a Bet 26 | 27 | #### Straight Bet 28 | 29 | ##### Step 1 - Call Get Fixtures operation 30 | 31 | This will return the list of events that are currently offered. To get updates, use delta requests (with since parameter) 32 | 33 | 34 | ##### Step 2 - Call Get Odds operation 35 | 36 | This will return the list of odds that are currently offered. To get updates, use delta requests (with since parameter) 37 | 38 | 39 | ##### Step 3 (Optional) - Get Line 40 | 41 | Call Get Line operation if you need exact limits or if you are interested in a specific line. Please note that the limits in the Get Odds response are general. 42 | 43 | ##### Step 4 - Place Bet 44 | 45 | To place a bet you need to call Place Bet operation. 46 | 47 | 48 | 49 | Table shows how to do mapping of Get Odds operation response to Place Bet and Get Line request. 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
ParameterGet Odds response parameter
sportIdsportId
leagueIdLeague Type -> id
eventIdEvent Type -> id
periodNumberPeriod Type -> number
team 74 |

Depends on selected odds from:

· Spread Type
· Moneyline Type
· Team Total Points

check the value in the corresponding Get Leagues Response -> League Type -> homeTeamType and set the appropriate value.

75 |

Example 1:

Given:
    homeTeamType="Team1"
When:
    Selected odds is Spread Type -> away
Then:
    team=Team2

Example 2:

76 |

When:
    Selected odds is Moneyline Type -> draw
Then:
    team=Draw

Example 3:

Given:
    homeTeamType="Team2"
When:
    Selected odds is Team Total Points Type -> away
Then:
    team=Team1

77 |
handicapSpread Type -> hdp
Total Points Type -> points
Team Total Points Type -> Total Points Type -> points
lineIdPeriod Type -> lineId
altLineIdSpread Type ->altLineId
Total Points Type -> altLineId

93 | 94 | **IMPORTANT**: 95 | Make sure you use both the `lineId` and `altLineId` from the Get Line or Get Odds response when placing a bet. 96 | If you the price was for alternate line and you omit to set the `altLineId` parameter in the place bet request, the bet will be placed on the main line. 97 | 98 | 99 | 100 | #### Parlay Bet 101 | 102 | ##### Step 1 – Call Get Fixtures operation 103 | 104 | This will return the list of events that are currently offered. To get updates use delta requests (with since parameter) 105 | 106 | ##### Step 2 – Call Get Odds operation 107 | 108 | This will return the list of odds that are currently offered. To get updates use delta requests (with since parameter) 109 | 110 | ##### Step 3 – Call Get Parlay Lines operation 111 | 112 | For each event and bet type you want to bet on, construct a Leg object for Get Parlay Lines call and submit your request using: 113 | POST /line/parlay 114 | -> If response contains Invalid Legs – remove them and resubmit the request 115 | -> If response has status = ‘VALID’ – place parlay bet request can be created 116 | 117 | ##### Step 4 – Call Place Parlay Bet 118 | 119 | Construct a list of legs using lineId values from Get Parlay Lines response and specify roundRobbinOptions out of those returned in Get Parlay Lines response. 120 | 121 | 122 | #### Teaser Bet 123 | 124 | ##### Step 1 – Call Get Teaser Groups operation 125 | 126 | This will return the list of teasers by group containing all the details for each teaser. For example; the minimum/maximum number of legs, payout combinations for the chosen teaser and leagues for each teaser. 127 | 128 | ##### Step 2 – Call Get Teaser Odds operation 129 | 130 | This will return the list of adjusted points that are currently offered for the given teaser. 131 | 132 | ##### Step 3 (Optional) – Call Get Teaser Lines operation 133 | 134 | Prior to submitting a teaser bet you can call this endpoint to validate your proposed bet, calculate the effective minimum/maximum win/risk bet limits, as well as get the price you will receive for the bet without actually placing a bet. 135 | 136 | ##### Step 4 – Call Place Teaser Bet operation 137 | 138 | Using the information obtained from the previous steps, build and place your bet. 139 | 140 | #### Special Bet 141 | 142 | ##### Step 1 – Call Get Special Fixtures operation 143 | 144 | This will return the list of specials that are currently offered. To get updates use delta requests (with since parameter) 145 | 146 | ##### Step 2 – Call Get Special Odds operation 147 | 148 | This will return the list of special odds that are currently offered. To get updates use delta requests (with since parameter) 149 | 150 | ##### Step 3 (Optional) - Call Get Special Lines operation 151 | 152 | Prior to submitting a special bet, you can call this endpoint to validate your proposed bet, calculate the effective minimum/maximum win/risk bet limits, as well as get the price you will receive for the bet without actually placing a bet. 153 | 154 | ##### Step 4 – Call Place Special Bet operation 155 | 156 | Using the information obtained from the previous steps, build and place your bet. 157 | 158 | 159 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # Overview 5 | 6 | Pinnacle API is a RESTful service for betting all bet types on all sports. 7 | ``` 8 | api.pinnacle.com 9 | ``` 10 | Access to Pinnacle API suite has been closed for the general public since July 23rd, 2025. We offer bespoke data services for select high value bettors & commercial partnerships. We also support academics and pregame handicapping projects. To apply for access please write a short description of your use case to api@pinnacle.com. Our team will get back to you with options. 11 | 12 | #### Authentication 13 | 14 | 15 | The API uses HTTP Basic access authentication. Always use HTTPS to access the API. 16 | 17 | You need to send HTTP Request header like this: 18 | ``` 19 | Authorization: Basic 20 | ``` 21 | 22 | Example: 23 | 24 | ``` 25 | Authorization: Basic U03MyOT23YbzMDc6d3c3O1DQ1 26 | ``` 27 | 28 | 29 | Please note that in order to access Pinnacle API, you must have a funded account. 30 | 31 | #### Data Formats 32 | 33 | Pinnacle API supports only JSON format. 34 | HTTP header `Accept` must be set: 35 | ``` 36 | Accept: application/json 37 | ``` 38 | POST HTTP Request must have JSON body content and `Content-Type` HTTP header must be set: 39 | 40 | ``` 41 | Content-Type: application/json 42 | ``` 43 | 44 | #### Compression 45 | 46 | Pinnacle API supports HTTP compression. We strongly recommend using compression as it would give the best performance. 47 | 48 | Please make sure to set the `User-Agent` HTTP header or compression might not work. 49 | 50 | #### Date Time Format 51 | 52 | All dates and times are in GMT time zone, ISO 8601 format 53 | 54 | #### Deduplication 55 | 56 | When a client issues a network request, it is always possible for the request to timeout or return an error status code indicating that the bet may not have been accepted. This opens up the possibility of the same request being sent more than once, which could create duplicate bets. Deduplication is a technique to avoid creating these duplicates when retrying a create request. We do the deduplication automatically for you. 57 | 58 | If the bet is accepted, we store the `uniqueRequestId` in the system for 30 min. If you try again within that time range to place a bet with the same `uniqueRequestId`, you will get the appropriate error. 59 | 60 | All place bet requests support deduplication. 61 | 62 | 63 | 64 | 65 | ## API Reference 66 | 67 | ##### Customer API 68 | 69 | [v1](https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/pinnacleapi/openapi-specification/master/customerapi-oas.yaml&nocors) - Current 70 | 71 | ##### Lines API 72 | 73 | **[v2](https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/pinnacleapi/openapi-specification/master/linesapi-oas.yaml&nocors)** - Current 74 | 75 | ##### Bets API 76 | 77 | **[v3](https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/pinnacleapi/openapi-specification/master/betsapi-oas.yaml&nocors)** - Deprecated 78 | 79 | **[v4](https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/pinnacleapi/openapi-specification/master/betsapi.v4-oas.yaml&nocors)** - Current 80 | 81 | 82 | 83 | ### Rules 84 | 85 | 1. Delta and snapshot calls are supported in `/fixtures`, `/fixtures/special` , `/odds` and `/odds/special` endpoints. Delta calls return changes since the provided `since` value. For delta calls, `since` parameter must not be set to 0 or 1, it must always be the value of the `last` property from the previous response. Snapshot calls return the current state, `since` parameter must not be provided for snapshot calls. 86 | 87 | 2. Always issue a snapshot call first, then proceed with delta calls. This yields faster response times and smaller payloads, so your client will receive odds and fixture updates more quickly. 88 | 89 | 3. The client must not call the `/odds` or `/fixture` eendpoints in a loop for each sport, league, or fixture. If you’re interested in certain leagues only, include all their IDs in the `leagueIds` pparameter in a single call. Likewise, if you need specific events, include all their IDs in the `eventIds` parameter together. 90 | 91 | 4. For the `/sports` call: requests must be limited to once every 60 minutes. The list of sports rarely changes, and the “active events” count is obsolete functionality that will eventually be removed. 92 | 93 | 5. The client must not call the `/line` endpoint in a loop. This endpoint exists solely to check a price prior to placing a bet. 94 | 95 | 6. IP Restrictions: Access to the entire API is restricted to a maximum of 2 distinct IP addresses per client. 96 | 97 | ### Rate Limiting 98 | 99 | All API endpoints that expose odds data are subject to strict rate limiting: 100 | 101 | - /v1/odds 102 | 103 | - /v1/odds/special 104 | 105 | - /v1/odds/parlay 106 | 107 | - /v2/odds 108 | 109 | - /v1/line 110 | 111 | - /v1/line/special 112 | 113 | - /v1/line/parlay 114 | 115 | 116 | **Request Rate Limit**: 1 request per 2 minutes, per endpoint, per sportId. 117 | Requests exceeding the allowed rate will result in 429 HTTP error: 118 | 119 | ``` http 120 | 121 | HTTP/1.1 429 Too Many Requests 122 | Content-Type: application/json 123 | { 124 | "code": "TOO_MANY_REQUESTS", 125 | "message": "Notice of Excessive Request Activity" 126 | } 127 | ``` 128 | 129 | **Example** 130 | ``` 131 | 2025-10-14T18:00:00Z  /v1/odds?sportId=29 200 OK 132 | 2025-10-14T18:00:01Z  /v1/odds?sportId=15 200 OK 133 | 2025-10-14T18:00:02Z  /v1/odds?sportId=3 200 OK 134 | 2025-10-14T18:01:02Z  /v1/odds?sportId=29&since=3301748841 429 Too Many Requests 135 | ... 136 | 2025-10-14T18:02:01Z /v1/odds?sportId=29&since=3301748841 200 OK 137 | 2025-10-14T18:02:02Z  /v1/odds?sportId=15&since=3301749826 200 OK 138 | 2025-10-14T18:02:03Z  /v1/odds?sportId=3&since=33017511801 200 OK 139 | ... 140 | 2025-10-14T18:04:02Z /v1/odds?sportId=29&since=3301748841 200 OK 141 | 2025-10-14T18:04:03Z  /v1/odds?sportId=15&leagueIds=4347&leagueIds=889&since=3301742786 200 OK 142 | 2025-10-14T18:04:04Z  /v1/odds?sportId=3&since=33017511801 200 OK 143 | ``` 144 | 145 | 146 | # More ... 147 | 148 | [Getting Started](GettingStarted.md) 149 | 150 | [API Change Log](APIChangelog.md) 151 | 152 | [FAQ](FAQ.md) 153 | 154 | [Fair Use Policy](FairUsePolicy.md) 155 | 156 | 157 | # Disclaimer 158 | 159 | Pinnacle is not liable for use of the API for any purpose. The API is provided on an “as is” and “as available” basis, without warranties of any kind, either expressed or implied, including, without limitation, implied warranties of merchantability and fitness for a particular purpose or non-infringement. 160 | 161 | 162 | -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # FAQ 5 | ### Is home team always team1? 6 | No. 7 | 8 | When placing a bet you must specify `team` , if it's team1/team2 that you are placing a bet on. In `/odds` and `/fixtures` operations, teams are referred to as home/away. The mapping between home/away and team1/team2 is specified in the `/leagues` response in `homeTeamType` property. 9 | For more details on how to place a bet see [Getting Started](https://github.com/pinnacleapi/pinnacleapi-documentation/blob/master/GettingStarted.md) 10 | 11 | 12 | 13 | 14 | ### How to find associated events? 15 | 16 | One can use `parentId` from the [Get Fixtures](https://pinnacleapi.github.io/linesapi#operation/Fixtures_V1_Get) to group associated events to the "parent" event. 17 | 18 | A few facts that can help: 19 | 20 | - We have different events for pregame and live, that can be distinguished by liveStatus. 21 | - Parent events are pre-game events (liveStatus=0 or liveStatus=2) and don't have parentId set. 22 | - Live events (liveStatus=1) will always have parentId set. 23 | - In some cases, we may have more than one event associated with the parent event. This happens if the events have different resultingUnit or if multiple events are required in order to offer alternative odds. 24 | 25 | 26 | Example: 27 | 28 | ``` json 29 | { 30 | "sportId": 29, 31 | "last": 148671597, 32 | "league": [ 33 | { 34 | "id": 2331, 35 | "name": "Norway - 1st Division", 36 | "events": [ 37 | { 38 | "id": 837721686, 39 | "starts": "2018-04-10T17:00:00Z", 40 | "home": "Viking Fk", 41 | "away": "Mjondalen", 42 | "rotNum": "6751", 43 | "liveStatus": 1, 44 | "status": "O", 45 | "parlayRestriction": 2, 46 | "parentId": 834342247, 47 | "altTeaser": false 48 | }, 49 | { 50 | "id": 834342247, 51 | "starts": "2018-04-10T17:00:00Z", 52 | "home": "Viking Fk", 53 | "away": "Mjondalen", 54 | "rotNum": "6751", 55 | "liveStatus": 2, 56 | "status": "I", 57 | "parlayRestriction": 2, 58 | "altTeaser": false 59 | } 60 | ] 61 | }, 62 | { 63 | "id": 6816, 64 | "name": "Norway - 1st Division Corners", 65 | "events": [ 66 | { 67 | "id": 837721684, 68 | "starts": "2018-04-10T17:00:00Z", 69 | "home": "Viking Fk (Corners)", 70 | "away": "Mjondalen (Corners)", 71 | "rotNum": "6751", 72 | "liveStatus": 1, 73 | "status": "O", 74 | "parlayRestriction": 1, 75 | "parentId": 834342247, 76 | "altTeaser": false 77 | }, 78 | { 79 | "id": 837721615, 80 | "starts": "2018-04-10T17:00:00Z", 81 | "home": "Viking Fk (Corners)", 82 | "away": "Mjondalen (Corners)", 83 | "rotNum": "6751", 84 | "liveStatus": 2, 85 | "status": "I", 86 | "parlayRestriction": 1, 87 | "parentId": 834342247, 88 | "altTeaser": false 89 | } 90 | ] 91 | } 92 | ] 93 | } 94 | ``` 95 | 96 | There is a pre-game parent event id 834342247, that has associated live event id 837721686, but also 2 corner events in different league - one live event (837721684), while the other one for pre-game (837721615) 97 | 98 | Introduction of `parentid` eliminates a need for rotation numbers. 99 | Please note that in the next version of `/fixtures`, the `rotNum` property will be decommissioned. 100 | 101 | 102 | ### How to handle duplicated parent events? 103 | If a parent event was created with the wrong information in the immutable properties (participant names, league , ...), a new parent event will be created with the correct information. 104 | When the client detects a duplicate, by default can always use the event with the greater identifier value and in addition, monitor settled fixtures endpoint and discard the one that’s deleted or settled. 105 | 106 | ### How to find props and futures markets? 107 | 108 | Props and futures market are offered as specials, you would need to call `/fixtures/special` and `odds/special` to get the markets. 109 | Special has `event` object that specifies the details of the associated event that you can use to link back to the event from the `/fixtures` endpoint. 110 | 111 | ```json 112 | { 113 | "id": 1065232780, 114 | ... 115 | "event": { 116 | "id": 1051780418, 117 | "periodNumber": 1, 118 | "home": "Malta", 119 | "away": "Norway" 120 | }, 121 | ... 122 | }, 123 | ``` 124 | 125 | ### When is the market open for betting? 126 | 127 | A straight market ( `moneyline` , `spreads`, `totals`, `teamtotal` ) in a period is open for betting if in [Get Odds](https://pinnacleapi.github.io/linesapi#tag/Odds) response all these is true: 128 | 1. Period `status` = 1 129 | 2. Market is priced. 130 | 3. Period has `cutoff` is in the future. 131 | 132 | 133 | Example: When the `moneyline` market is not offered, the whole object will be missing. It's the same for other market types. 134 | ```json 135 | { 136 | "lineId": 527557614, 137 | "number": 1, 138 | "cutoff": "2018-06-30T21:00:00Z", 139 | "maxSpread": 250, 140 | "maxTotal": 250, 141 | "status": 1, 142 | "spreads": [ 143 | { 144 | "hdp": -0.25, 145 | "home": 140, 146 | "away": -172 147 | } 148 | ], 149 | "totals": [ 150 | { 151 | "points": 0.75, 152 | "over": -128, 153 | "under": 107 154 | } 155 | ] 156 | } 157 | 158 | ``` 159 | 160 | 161 | 162 | Please note that for live events, odds change quite frequently as well as the period `status`. 163 | Due to these frequent changes, it’s possible that you will be getting status `NOT_EXISTS` in the [Get Line](https://pinnacleapi.github.io/linesapi#operation/Line_Straight_V1_Get) response more often than for the pre-game events. 164 | 165 | A special market is open for betting if: 166 | 167 | 1. Special event `status` is `"O"` or `"I"`. See [Get Special Fixtures](https://pinnacleapi.github.io/linesapi#operation/Fixtures_Special_V1_Get). 168 | 2. Market is priced. See [Get Special Odds](https://pinnacleapi.github.io/linesapi#operation/Odds_Special_V1_Get) . 169 | 3. Special event `cutoff` is in the future. See [Get Special Fixtures](https://pinnacleapi.github.io/linesapi#operation/Fixtures_Special_V1_Get). 170 | 171 | ### How to place a bet on live events? 172 | 173 | Bets placed on events with live delay are treated differently than other bets. They get `betId` assigned only once they are `ACCEPTED`. 174 | 175 | 176 | The only way to find out the `status` of such a bet is by querying `/bets?uniqueRequestIds`: 177 | 178 | `/bets?uniqueRequestIds=86a90ab9-fca1-4703-a11c-ce329a85584e` 179 | 180 | As long as the bet is in `PENDING_ACCEPTANCE`, the response would be: 181 | 182 | ```json 183 | { 184 | "straightBets": [ 185 | { 186 | "uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e", 187 | "betStatus": "PENDING_ACCEPTANCE" 188 | } 189 | ] 190 | } 191 | 192 | ``` 193 | 194 | 195 | 196 | NOTE: Status can change from `PENDING_ACCEPTANCE` to `NOT_ACCEPTED` or `ACCEPTED` 197 | 198 | 199 | If the bet was `NOT_ACCEPTED`, the response would be: 200 | 201 | ```json 202 | 203 | { 204 | "straightBets": [ 205 | { 206 | "uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e", 207 | "betStatus": "NOT_ACCEPTED" 208 | } 209 | ] 210 | } 211 | 212 | 213 | ``` 214 | 215 | If the bet was `ACCEPTED`, the response includes the full bet details: 216 | 217 | ```json 218 | 219 | { 220 | "straightBets": [ 221 | { 222 | "betId": 800110193, 223 | "uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e", 224 | "wagerNumber": 1, 225 | "placedAt": "2017-12-20T21:57:22Z", 226 | "betStatus": "ACCEPTED", 227 | "betType": "MONEYLINE", 228 | "win": 2519.25, 229 | "risk": 11991.63, 230 | "oddsFormat": "AMERICAN", 231 | "updateSequence": 175277412, 232 | "sportId": 29, 233 | "leagueId": 5595, 234 | "eventId": 799939900, 235 | "price": -476, 236 | "teamName": "Universitario", 237 | "team1": "Universitario", 238 | "team2": "Club Petrolero", 239 | "periodNumber": 0, 240 | "isLive": "TRUE" 241 | } 242 | ] 243 | } 244 | 245 | ``` 246 | 247 | We apply live delay of around 6 seconds, so the first call to `/bets` should be 6 seconds after placing a bet. 248 | 249 | 30 minutes after placing a bet, we will stop returning a response for provided uniqueRequestId. This is due to cache cleanup to maintain optimal performance. 250 | 251 | Please also note that the `RUNNING` bet list does not return any live delay bets that are `PENDING_ACCEPTANCE` or `NOT_ACCEPTED`. 252 | 253 | 254 | 255 | 256 | ### How do I get access to the API as an affiliate? 257 | 258 | In order to access the API as an affiliate, you are required to send 5 new funded signups from the previous 3 months. If you are unable to refer 5 new funded signups from the previous 3-month period, access to the API may be rescinded. 259 | 260 | ### How often can I refresh your odds? 261 | 262 | Please check our fair use policy 263 | 264 | ### How do I make sure my links to www.pinnacle.com are tracking correctly? 265 | 266 | Please ensure that any links back to www.pinnacle.com are tagged with your tracking link. 267 | Your tracking links are available from your affiliate account accessed at http://affiliates.pinnacle.com 268 | 269 | A correct tracking link will have the format: http://affiliates.pinnacle.com/processing/clickthrgh.asp?btag=a_numbersb_numbers 270 | 271 | ### Do you cache responses? For how long? 272 | 273 | `Get Odds` and `Get Fixtures` snapshot calls are cached for 60 seconds. 274 | `Get Odds` and `Get Fixtures` delta calls are not cached. 275 | 276 | ### Can I link directly to the relevant odds pages on www.pinnacle.com (deep linking)? 277 | 278 | Yes. To link directly to our odds pages, please contact customerservice@pinnacle.com 279 | 280 | ### How can I return only those sports and leagues which have data? 281 | 282 | `Get Sports` and `Get Leagues` operations have the `hasOfferings` property that indicates availability of the markets. 283 | 284 | ### How do you calculate maximum bet amounts for currencies other than USD? 285 | 286 | We follow oanda.com, and update our exchange rates every 24 hours. Please note that for non-USD currencies, we round them to the largest integer less-than or equal-to the specified decimal number resulting from currency conversion. For example, a maximum bet amount of £345.23 would be rounded down to £345. 287 | 288 | ### What time zone is used for the API? 289 | 290 | All times are GMT. 291 | 292 | ### How can I know if an event is deleted or settled? 293 | 294 | Please use `Get Settled Fixtures` to find out if the event's period was settled or if the event was deleted. 295 | 296 | 297 | ### How to get odds changes? 298 | 299 | 1) Call the snapshot /odds (without the since parameter) - this would return cached odds snapshot 300 | 2) Call the delta /odds (with the `since` parameter, from the snapshot response) - to get all the changes since the snapshot. 301 | 302 | Delta response has only changed periods, with all the markets that are currently offered. For example, if we offer period 0 and period 1 odds on an event and there was a change in one of the markets in period 1, the delta call will have only period 1 with all the markets that we currently offer, not just the changed markets, and the period 0 will not be in the delta response. 303 | 304 | Example: 305 | 306 | 1) Snapshot call returns period `number`=1 and period `number`=0 , and both of them have `moneyline` and `spreads` odds. 307 | 2) Subsequent, Delta call returns just period 1 with the `moneyline` and `totals` 308 | 309 | => This means that the period `number`=0 did not have any changes, and on the period `number`=1 , the `spreads` is not offered anymore while the `totals` are offered now and the `moneyline` may have new prices 310 | 311 | ### What TLS (Transport Layer Security) versions are supported? 312 | 313 | To be compliant with the security requirements API supports only TLS 1.2 (preferably ) and TLS 1.1. 314 | 315 | 316 | ### Why am I getting denied access on Esports? 317 | Access to Esports is blocked and requires special authorization. To get the access please contact b2b@pinnacle.com and explain your business case. 318 | 319 | ### Why am I getting `NOT_EXISTS` when calling `/line` operation? 320 | 321 | These are possible reasons: 322 | 323 | 1) Not sending correct `periodNumber`, `eventid` , `leagueid` or `sportId` 324 | 325 | It is not a rare situation that the actual match is offered with more than one event. 326 | Different periods of the same actual match can be offered with the different events - period 0 can be offered in `eventid` X and period 1 can be offered on `eventid` Y. It may also happen that for the same `periodNumber` we offer `MONEYLINE` on `eventid` X but `TOTAL` on `eventid` Y. 327 | 328 | 329 | 2) Period `cutoff` date time is in the past. 330 | 331 | 3) Selection has no prices at the moment. 332 | 333 | 4) Not sending correct `handicap`, `team` or `side` 334 | 335 | 5) Period `status`=2 , offline 336 | 337 | ### How to detect deleted events? 338 | Sometimes an event can be deleted from the system, in such a case, since `/fixtures` would not return deleted events, the event will be returned in `/fixtures/settled` with the period `number`=0 and `status`=5 339 | 340 | ```json 341 | { 342 | "id": 933912855, 343 | "periods": [ 344 | { 345 | "number": 0, 346 | "status": 5, 347 | "settlementId": 3637379, 348 | "settledAt": "2018-12-24T02:12:06.707Z", 349 | "team1Score": 0, 350 | "team2Score": 0 351 | } 352 | ] 353 | }, 354 | 355 | ``` 356 | ### How to handle unexpected error when placing a bet? 357 | If you get any unexpected error upon calling a place bet operation, that does NOT mean that your bet was not placed. 358 | You must check if the bet was placed by calling the [`bets?uniqueRequestIds={comma separated uniqueRequestIds}`](https://pinnacleapi.github.io/betsapi#operation/Bets_GetBetsByTypeV3). 359 | If you have a retry logic, make sure you reuse the same uniqueRequestId in the place bet request. 360 | For more details on how uniqueRequestId works, please check [Deduplication](https://github.com/pinnacleapi/pinnacleapi-documentation#deduplication). 361 | 362 | ### How to handle RESUBMIT_REQUEST error when placing a bet? 363 | This error can occur when trading logic is updating internal parameters. It's not an error on your side , neither is it an API error. Please continue to resubmit your wager until you receive a different response. 364 | 365 | 366 | 367 | 368 | ### How to calculate max risk from the max volume limits in `/odds`? 369 | 370 | `/odds` operation returns max volume limits. 371 | 372 | To calculate the max risk from the max volume , for a price in decimal odds format, you can use this formula: 373 | 374 | If price > 2 then: 375 | ``` 376 | maxRisk = maxVolume 377 | ``` 378 | , otherwise when price < 2: 379 | ``` 380 | maxRisk = maxVolume/(price - 1) 381 | 382 | ``` 383 | 384 | 385 | 386 | ##### Example: 387 | 388 | When `/odds` return this moneyline offering 389 | ```json 390 | { 391 | "lineId": 242220498, 392 | "number": 1, 393 | "cutoff": "2019-08-30T21:00:00Z", 394 | "maxMoneyline": 250, 395 | "status": 1, 396 | "moneyline": { 397 | "home": 1.819, 398 | "away": 2.03 399 | } 400 | } 401 | 402 | ``` 403 | Max volume is 250. 404 | Home team max risk is 305. 405 | Away team max risk is 250. 406 | 407 | ### How to calculate round robin max stake? 408 | 409 | If a client would need to know the maximum round robin stake, one would need to calculate it based on selected round robin options. 410 | In /v2/line/parlay endpoint we return the needed parameters. 411 | 412 | 4 steps to calculate it: 413 | 414 | 1) maxRiskStakeBasedOnMaxTotalRisk= `maxRoundRobinTotalRisk`/SUM (`numberOfBets`), where 415 | SUM (`numberOfBets`) is sum of numberOfBets for all selected round robin options. 416 | 417 | 2) maxRiskStakeBasedOnMaxTotalWin = `maxRoundRobinTotalWin` / SUM (`unroundedDecimalOdds`- 1) , where SUM (`unroundedDecimalOdds`- 1) is sum of unroundedDecimalOdds-1 for all selected round robin options. 418 | 419 | 3) maxRoundRobinRiskStake = Min(maxRiskStakeBasedOnMaxTotalRisk, maxRiskStakeBasedOnMaxTotalWin) 420 | 421 | 4) **maxRoundRobinRiskStake** = round(maxRoundRobinRiskStake) , round to 2 decimal place, away from zero. 422 | 423 | -------------------------------------------------------------------------------- /APIChangelog.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # **API Changelog** 5 | 6 | 7 | 8 | ## October 13, 2025 9 | 1. FEATURE: Introduced the /v2/odds endpoint with support for team total alternate lines. 10 | Only the team total data mode has changed; all other aspects of the response model remain unchanged. 11 | 12 | 2. DEPRECATED: /v1/odds endpoint. End of Life: January 1, 2026. 13 | 14 | 3. FEATURE: Released Bets API v4. The main change: place-bet responses no longer include full bet details. 15 | 16 | 4. DEPRECATED: Bets API v3. End of Life: January 1, 2026. 17 | 18 | ## July 23, 2025 19 | 1. Rate limiting rules are updated. 20 | 21 | ## November 4, 2024 - Customer API 22 | 1. DEPRECATED -`/v1/translations` endpoint has been deprecated and this feature no longer supported. 23 | 24 | ## October 7, 2024 - Lines API 25 | 1. DEPRECATED -`/v1/inrunning` endpoint has been deprecated and this feature no longer supported. 26 | 27 | ## April 19, 2024 - Lines API 28 | 29 | 1. FEATURE - Documented property `max` in the /odds/special response. This property exposes contestant specific limits. 30 | 31 | ## November 18, 2022 - Lines API 32 | 33 | Historically we have offered Soccer Extra Time markets as distinct events with names like: “France (To Advance)”, “England (ET ONLY)”, “Brazil (PEN)”, “China (1st TEN PEN)”, “Spain (To Win Final)”. All of these markets are now offered as Periods of the [parent event live event](FAQ.md#how-to-find-associated-events). 34 | 35 | Special Note: Goals and Red Cards occurring in Extra Time are only returned in Period 3! 36 | 37 | - Period 3 is Extra Time 38 | - Period 6 is Penalty Shootout 39 | - Period 7 1st Ten Shootout Pen 40 | - Period 8 is To Qualify 41 | - Period 39 is To Win Final 42 | 43 | Consumers can expect to see Spread, Moneyline, Total and Team Totals priced in Period 3. Only Moneyline in Periods 6, 8, 39. Only Total in Period 7. 44 | 45 | 46 | Sample Responses: 47 |
48 | Get Fixtures 49 | 50 | ```json 51 | { 52 | "sportId": 29, 53 | "last": 442452738, 54 | "league": [ 55 | { 56 | "id": 218153, 57 | "name": "Zanzibar - Mapinduzi Cup", 58 | "events": [ 59 | { 60 | "id": 1563271322, 61 | "starts": "2022-11-17T13:30:00Z", 62 | "home": "TeamA", 63 | "away": "TeamB", 64 | "rotNum": "99552", 65 | "liveStatus": 2, 66 | "status": "O", 67 | "parlayRestriction": 2, 68 | "altTeaser": false, 69 | "resultingUnit": "Regular", 70 | "version": 442452541 71 | }, 72 | { 73 | "id": 1563271334, 74 | "starts": "2022-11-17T13:30:00Z", 75 | "home": "TeamA", 76 | "away": "TeamB", 77 | "rotNum": "99556", 78 | "liveStatus": 1, 79 | "status": "O", 80 | "parlayRestriction": 1, 81 | "parentId": 1563271322, 82 | "altTeaser": false, 83 | "resultingUnit": "Regular", 84 | "version": 442452738 85 | } 86 | ] 87 | } 88 | ] 89 | } 90 | 91 | ``` 92 | 93 |
94 |
95 | Get In-Running 96 | 97 | ```json 98 | { 99 | "sports": [ 100 | { 101 | "id": 29, 102 | "leagues": [ 103 | { 104 | "id": 218153, 105 | "events": [ 106 | { 107 | "id": 1563271334, 108 | "state": 3, 109 | "elapsed": 23 110 | } 111 | ] 112 | } 113 | ] 114 | } 115 | ] 116 | } 117 | 118 | ``` 119 | 120 |
121 |
122 | Get Odds 123 | 124 | ```json 125 | { 126 | "sportId": 29, 127 | "last": 1912670245, 128 | "leagues": [ 129 | { 130 | "id": 218153, 131 | "events": [ 132 | { 133 | "id": 1563271334, 134 | "awayScore": 1.0, 135 | "homeScore": 1.0, 136 | "awayRedCards": 1, 137 | "homeRedCards": 0, 138 | "periods": [ 139 | { 140 | "lineId": 1912670188, 141 | "number": 8, 142 | "cutoff": "2022-11-17T17:45:51.367Z", 143 | "maxMoneyline": 100.0, 144 | "status": 1, 145 | "moneylineUpdatedAt": "2022-11-17T14:34:49.527Z", 146 | "moneyline": { 147 | "home": -322.0, 148 | "away": 212.0 149 | } 150 | }, 151 | { 152 | "lineId": 1912670213, 153 | "number": 3, 154 | "cutoff": "2022-11-17T17:46:01.913Z", 155 | "maxSpread": 100.0, 156 | "maxMoneyline": 100.0, 157 | "maxTotal": 100.0, 158 | "status": 1, 159 | "spreadUpdatedAt": "2022-11-17T14:34:51.603Z", 160 | "moneylineUpdatedAt": "2022-11-17T14:34:51.603Z", 161 | "totalUpdatedAt": "2022-11-17T14:34:51.603Z", 162 | "spreads": [ 163 | { 164 | "hdp": -0.25, 165 | "home": -127.0, 166 | "away": -109.0 167 | }, 168 | { 169 | "altLineId": 30710204111, 170 | "hdp": -1.0, 171 | "home": 404.0, 172 | "away": -823.0, 173 | "max": 100.0 174 | }, 175 | { 176 | "altLineId": 30710204112, 177 | "hdp": -0.75, 178 | "home": 195.0, 179 | "away": -306.0, 180 | "max": 100.0 181 | }, 182 | { 183 | "altLineId": 30710204113, 184 | "hdp": -0.5, 185 | "home": 129.0, 186 | "away": -185.0, 187 | "max": 100.0 188 | }, 189 | { 190 | "altLineId": 30710204114, 191 | "hdp": 0.0, 192 | "home": -407.0, 193 | "away": 250.0, 194 | "max": 100.0 195 | }, 196 | { 197 | "altLineId": 30710204115, 198 | "hdp": 0.25, 199 | "home": -724.0, 200 | "away": 371.0, 201 | "max": 100.0 202 | } 203 | ], 204 | "moneyline": { 205 | "home": 130.0, 206 | "away": 497.0, 207 | "draw": -109.0 208 | }, 209 | "totals": [ 210 | { 211 | "points": 0.75, 212 | "over": -115.0, 213 | "under": -121.0 214 | }, 215 | { 216 | "altLineId": 30710204123, 217 | "points": 0.5, 218 | "over": -170.0, 219 | "under": 119.0, 220 | "max": 100.0 221 | }, 222 | { 223 | "altLineId": 30710204124, 224 | "points": 1.0, 225 | "over": 157.0, 226 | "under": -231.0, 227 | "max": 100.0 228 | }, 229 | { 230 | "altLineId": 30710204125, 231 | "points": 1.25, 232 | "over": 218.0, 233 | "under": -350.0, 234 | "max": 100.0 235 | }, 236 | { 237 | "altLineId": 30710204126, 238 | "points": 1.5, 239 | "over": 276.0, 240 | "under": -477.0, 241 | "max": 100.0 242 | } 243 | ], 244 | "homeScore": 0.0, 245 | "awayScore": 0.0, 246 | "awayRedCards": 1, 247 | "homeRedCards": 0 248 | }, 249 | { 250 | "lineId": 1912670245, 251 | "number": 0, 252 | "cutoff": "2022-11-17T17:45:41.93Z", 253 | "maxSpread": 250.0, 254 | "maxMoneyline": 125.0, 255 | "maxTotal": 250.0, 256 | "maxTeamTotal": 100.0, 257 | "status": 1, 258 | "spreadUpdatedAt": "2022-11-17T14:34:53.463Z", 259 | "moneylineUpdatedAt": "2022-11-17T14:34:53.463Z", 260 | "totalUpdatedAt": "2022-11-17T14:34:53.463Z", 261 | "teamTotalUpdatedAt": "2022-11-17T14:34:53.463Z", 262 | "spreads": [ 263 | { 264 | "hdp": -0.25, 265 | "home": 106.0, 266 | "away": -145.0 267 | }, 268 | { 269 | "altLineId": 30710204552, 270 | "hdp": -0.75, 271 | "home": 287.0, 272 | "away": -487.0, 273 | "max": 250.0 274 | }, 275 | { 276 | "altLineId": 30710204553, 277 | "hdp": -0.5, 278 | "home": 183.0, 279 | "away": -271.0, 280 | "max": 250.0 281 | }, 282 | { 283 | "altLineId": 30710204554, 284 | "hdp": 0.0, 285 | "home": -488.0, 286 | "away": 294.0, 287 | "max": 250.0 288 | } 289 | ], 290 | "moneyline": { 291 | "home": 185.0, 292 | "away": 725.0, 293 | "draw": -181.0 294 | }, 295 | "totals": [ 296 | { 297 | "points": 2.5, 298 | "over": 113.0, 299 | "under": -155.0 300 | }, 301 | { 302 | "altLineId": 30710204564, 303 | "points": 2.75, 304 | "over": 173.0, 305 | "under": -254.0, 306 | "max": 250.0 307 | }, 308 | { 309 | "altLineId": 30710204565, 310 | "points": 3.0, 311 | "over": 369.0, 312 | "under": -693.0, 313 | "max": 250.0 314 | } 315 | ], 316 | "teamTotal": { 317 | "home": { 318 | "points": 1.5, 319 | "over": 157.0, 320 | "under": -222.0 321 | }, 322 | "away": { 323 | "points": 1.5, 324 | "over": 494.0, 325 | "under": -973.0 326 | } 327 | }, 328 | "homeScore": 1.0, 329 | "awayScore": 1.0, 330 | "awayRedCards": 1, 331 | "homeRedCards": 0 332 | } 333 | ] 334 | } 335 | ] 336 | } 337 | ] 338 | } 339 | 340 | ``` 341 | 342 |
343 | 344 | ## October 7, 2022 - Lines API 345 | 346 | #### 1. DEPRECATED - Properties team1ScoreSets/team2ScoreSets are deprecated. 347 | 348 | As a part of the tennis changes from September 12, 2022, properties `team1ScoreSets` and`team2ScoreSets` in `/fixtures/settled` endpoint are deprecated. 349 | 350 | The score for tennis matches works the same as for other sports, properties `team1Score` and`team2Score` show the score depending on the `resultingUnit` (`Games` or `Sets`) coming from the `/fixtures` endpoint. 351 | 352 | 353 | ## September 12, 2022 - Lines API 354 | 355 | #### 1. IMPROVEMENT - Tennis events trading. 356 | 357 | Old Tennis markets are offered with the `Regular` `resultingUnit`, except for the Set Handicaps markets which have `Sets` `resultingUnit`. The Set Handicaps markets events had the resulting unit and the handicap points in the team names and are offered as Moneylines. 358 | The rest of the markets are not explicit as to whether or not they use the number of Sets or Games won by each player to determine their result. 359 | New tennis events will start using proper `resultingUnit` and the Sets Handicaps markets will have handicap points removed from the team names and offered as spread markets. 360 | 361 | 362 | In addition to the above changes to convey the 'resultingUnit' for each market, in Live we have historically offered all markets in Period 0 with the description of the Period in the Team Names. 363 | This has changed to use the period `number` of two events (one for each `resultingUnit`), see Example 2. 364 | The descriptions for Tennis Periods can be found with this call `/v1/periods?sportId=33`. 365 | 366 | 367 | ##### Example 1. Prematch Fixtures 368 | 369 |
370 | Old fixtures snippet 371 | 372 | ```json 373 | 374 | { 375 | "id": 1504081918, 376 | "starts": "2022-02-28T19:45:00Z", 377 | "home": "Ana Konjuh", 378 | "away": "Katie Boulter", 379 | "rotNum": "8909", 380 | "liveStatus": 0, 381 | "status": "O", 382 | "parlayRestriction": 2, 383 | "altTeaser": false, 384 | "resultingUnit": "Regular", 385 | "version": 400671698 386 | }, 387 | { 388 | "id": 1504082301, 389 | "starts": "2022-02-28T19:45:00Z", 390 | "home": "Ana Konjuh (-1.5 Sets)", 391 | "away": "Katie Boulter (+1.5 Sets)", 392 | "rotNum": "8909", 393 | "liveStatus": 0, 394 | "status": "O", 395 | "parlayRestriction": 2, 396 | "parentId": 1504081918, 397 | "altTeaser": false, 398 | "resultingUnit": "Sets", 399 | "version": 400671702 400 | }, 401 | { 402 | "id": 1504082299, 403 | "starts": "2022-02-28T20:00:00Z", 404 | "home": "Ana Konjuh (+1.5 Sets)", 405 | "away": "Katie Boulter (-1.5 Sets)", 406 | "rotNum": "8909", 407 | "liveStatus": 0, 408 | "status": "O", 409 | "parlayRestriction": 2, 410 | "parentId": 1504081918, 411 | "altTeaser": false, 412 | "resultingUnit": "Sets", 413 | "version": 400675277 414 | } 415 | ``` 416 | 417 |
418 | 419 |
420 | Old odds snippet 421 | 422 | ```json 423 | { 424 | "id": 1504081918, 425 | "periods": [ 426 | { 427 | "lineId": 1601650790, 428 | "number": 0, 429 | "cutoff": "2022-02-28T19:45:00Z", 430 | "maxSpread": 2500.0, 431 | "maxMoneyline": 2500.0, 432 | "maxTotal": 1250.0, 433 | "maxTeamTotal": 500.0, 434 | "status": 1, 435 | "spreadUpdatedAt": "2022-02-28T18:07:50.317Z", 436 | "moneylineUpdatedAt": "2022-02-28T18:33:07.623Z", 437 | "totalUpdatedAt": "2022-02-28T18:03:52.817Z", 438 | "teamTotalUpdatedAt": "2022-02-28T18:03:52.877Z", 439 | "spreads": [ 440 | { 441 | "hdp": -3.5, 442 | "home": -113.0, 443 | "away": -105.0 444 | }, 445 | { 446 | "altLineId": 24528340045, 447 | "hdp": -2.5, 448 | "home": -144.0, 449 | "away": 121.0, 450 | "max": 2500.0 451 | }, 452 | { 453 | "altLineId": 24528340047, 454 | "hdp": -3.0, 455 | "home": -130.0, 456 | "away": 109.0, 457 | "max": 2500.0 458 | }, 459 | { 460 | "altLineId": 24528340049, 461 | "hdp": -4.0, 462 | "home": 108.0, 463 | "away": -128.0, 464 | "max": 2500.0 465 | }, 466 | { 467 | "altLineId": 24528340051, 468 | "hdp": -4.5, 469 | "home": 128.0, 470 | "away": -153.0, 471 | "max": 2500.0 472 | } 473 | ], 474 | "moneyline": { 475 | "home": -210.0, 476 | "away": 184.0 477 | }, 478 | "totals": [ 479 | { 480 | "points": 20.5, 481 | "over": -118.0, 482 | "under": -101.0 483 | }, 484 | { 485 | "altLineId": 24528340044, 486 | "points": 21.5, 487 | "over": 105.0, 488 | "under": -125.0, 489 | "max": 1250.0 490 | }, 491 | { 492 | "altLineId": 24528340046, 493 | "points": 21.0, 494 | "over": -104.0, 495 | "under": -114.0, 496 | "max": 1250.0 497 | }, 498 | { 499 | "altLineId": 24528340048, 500 | "points": 20.0, 501 | "over": -138.0, 502 | "under": 116.0, 503 | "max": 1250.0 504 | }, 505 | { 506 | "altLineId": 24528340050, 507 | "points": 19.5, 508 | "over": -153.0, 509 | "under": 128.0, 510 | "max": 1250.0 511 | } 512 | ], 513 | "teamTotal": { 514 | "home": { 515 | "points": 12.5, 516 | "over": 116.0, 517 | "under": -138.0 518 | }, 519 | "away": { 520 | "points": 10.5, 521 | "over": -121.0, 522 | "under": 102.0 523 | } 524 | } 525 | }, 526 | { 527 | "lineId": 1601670164, 528 | "number": 1, 529 | "cutoff": "2022-02-28T19:45:00Z", 530 | "maxMoneyline": 500.0, 531 | "status": 1, 532 | "moneylineUpdatedAt": "2022-02-28T18:58:10.25Z", 533 | "moneyline": { 534 | "home": -182.0, 535 | "away": 155.0 536 | } 537 | } 538 | ] 539 | }, 540 | { 541 | "id": 1504082301, 542 | "periods": [ 543 | { 544 | "lineId": 1601619622, 545 | "number": 0, 546 | "cutoff": "2022-02-28T19:45:00Z", 547 | "maxMoneyline": 1250.0, 548 | "status": 1, 549 | "moneylineUpdatedAt": "2022-02-28T17:35:58.32Z", 550 | "moneyline": { 551 | "home": 107.0, 552 | "away": -122.0 553 | } 554 | } 555 | ] 556 | } 557 | ``` 558 | 559 |
560 | 561 | New way shows the match using the new structure where the `resultingUnit` are explicit: 562 | 563 |
564 | New fixtures snippet 565 | 566 | ```json 567 | { 568 | "sportId": 33, 569 | "last": 440033657, 570 | "league": [ 571 | { 572 | "id": 2957, 573 | "name": "ATP Paris - R1", 574 | "events": [ 575 | { 576 | "id": 1562180480, 577 | "starts": "2022-10-31T20:30:00Z", 578 | "home": "Sebastian Korda", 579 | "away": "Alex De Minaur", 580 | "rotNum": "8325", 581 | "liveStatus": 0, 582 | "status": "O", 583 | "parlayRestriction": 2, 584 | "altTeaser": false, 585 | "resultingUnit": "Sets", 586 | "version": 440033645 587 | }, 588 | { 589 | "id": 1562180497, 590 | "starts": "2022-10-31T20:30:00Z", 591 | "home": "Sebastian Korda (Games)", 592 | "away": "Alex De Minaur (Games)", 593 | "rotNum": "8325", 594 | "liveStatus": 0, 595 | "status": "O", 596 | "parlayRestriction": 2, 597 | "parentId": 1562180480, 598 | "altTeaser": false, 599 | "resultingUnit": "Games", 600 | "version": 440033657 601 | } 602 | ] 603 | } 604 | ] 605 | } 606 | ``` 607 | 608 |
609 | 610 |
611 | New odds snippet 612 | 613 | ```json 614 | { 615 | "sportId": 33, 616 | "last": 1894932080, 617 | "leagues": [ 618 | { 619 | "id": 2957, 620 | "events": [ 621 | { 622 | "id": 1562180480, 623 | "periods": [ 624 | { 625 | "lineId": 1894801784, 626 | "number": 1, 627 | "cutoff": "2022-10-31T20:30:00Z", 628 | "maxMoneyline": 3000.0, 629 | "status": 1, 630 | "moneylineUpdatedAt": "2022-10-31T17:03:51.87Z", 631 | "moneyline": { 632 | "home": -130.0, 633 | "away": 109.0 634 | } 635 | }, 636 | { 637 | "lineId": 1894801790, 638 | "number": 2, 639 | "cutoff": "2022-10-31T20:30:00Z", 640 | "maxMoneyline": 3000.0, 641 | "status": 1, 642 | "moneylineUpdatedAt": "2022-10-31T17:03:51.933Z", 643 | "moneyline": { 644 | "home": -131.0, 645 | "away": 110.0 646 | } 647 | }, 648 | { 649 | "lineId": 1894932080, 650 | "number": 0, 651 | "cutoff": "2022-10-31T20:30:00Z", 652 | "maxSpread": 3000.0, 653 | "maxMoneyline": 4000.0, 654 | "maxTotal": 3000.0, 655 | "status": 1, 656 | "spreadUpdatedAt": "2022-10-31T19:33:13.17Z", 657 | "moneylineUpdatedAt": "2022-10-31T19:33:13.17Z", 658 | "totalUpdatedAt": "2022-10-31T19:33:13.17Z", 659 | "spreads": [ 660 | { 661 | "hdp": -1.5, 662 | "home": 185.0, 663 | "away": -215.0 664 | }, 665 | { 666 | "altLineId": 30378223926, 667 | "hdp": 1.5, 668 | "home": -342.0, 669 | "away": 284.0, 670 | "max": 3000.0 671 | } 672 | ], 673 | "moneyline": { 674 | "home": -138.0, 675 | "away": 122.0 676 | }, 677 | "totals": [ 678 | { 679 | "points": 2.5, 680 | "over": 125.0, 681 | "under": -149.0 682 | } 683 | ] 684 | } 685 | ] 686 | }, 687 | { 688 | "id": 1562180497, 689 | "periods": [ 690 | { 691 | "lineId": 1894801794, 692 | "number": 1, 693 | "cutoff": "2022-10-31T20:30:00Z", 694 | "maxMoneyline": 3000.0, 695 | "status": 1, 696 | "moneylineUpdatedAt": "2022-10-31T17:03:52.12Z", 697 | "moneyline": { 698 | "home": -130.0, 699 | "away": 109.0 700 | } 701 | }, 702 | { 703 | "lineId": 1894801795, 704 | "number": 2, 705 | "cutoff": "2022-10-31T20:30:00Z", 706 | "maxMoneyline": 3000.0, 707 | "status": 1, 708 | "moneylineUpdatedAt": "2022-10-31T17:03:52.153Z", 709 | "moneyline": { 710 | "home": -131.0, 711 | "away": 110.0 712 | } 713 | }, 714 | { 715 | "lineId": 1894801797, 716 | "number": 0, 717 | "cutoff": "2022-10-31T20:30:00Z", 718 | "maxSpread": 3000.0, 719 | "maxTotal": 3000.0, 720 | "status": 1, 721 | "spreadUpdatedAt": "2022-10-31T17:03:52.183Z", 722 | "totalUpdatedAt": "2022-10-31T17:03:52.26Z", 723 | "spreads": [ 724 | { 725 | "hdp": -1.5, 726 | "home": -111.0, 727 | "away": -103.0 728 | }, 729 | { 730 | "altLineId": 30375816407, 731 | "hdp": -2.5, 732 | "home": 110.0, 733 | "away": -126.0, 734 | "max": 3000.0 735 | }, 736 | { 737 | "altLineId": 30375816409, 738 | "hdp": -2.0, 739 | "home": -100.0, 740 | "away": -114.0, 741 | "max": 3000.0 742 | }, 743 | { 744 | "altLineId": 30375816411, 745 | "hdp": -1.0, 746 | "home": -120.0, 747 | "away": 105.0, 748 | "max": 3000.0 749 | }, 750 | { 751 | "altLineId": 30375816413, 752 | "hdp": -0.5, 753 | "home": -130.0, 754 | "away": 113.0, 755 | "max": 3000.0 756 | } 757 | ], 758 | "totals": [ 759 | { 760 | "points": 22.5, 761 | "over": -106.0, 762 | "under": -112.0 763 | }, 764 | { 765 | "altLineId": 30375816408, 766 | "points": 21.5, 767 | "over": -139.0, 768 | "under": 116.0, 769 | "max": 3000.0 770 | }, 771 | { 772 | "altLineId": 30375816410, 773 | "points": 22.0, 774 | "over": -122.0, 775 | "under": 102.0, 776 | "max": 3000.0 777 | }, 778 | { 779 | "altLineId": 30375816412, 780 | "points": 23.0, 781 | "over": 105.0, 782 | "under": -125.0, 783 | "max": 3000.0 784 | }, 785 | { 786 | "altLineId": 30375816414, 787 | "points": 23.5, 788 | "over": 116.0, 789 | "under": -138.0, 790 | "max": 3000.0 791 | } 792 | ] 793 | } 794 | ] 795 | } 796 | ] 797 | } 798 | ] 799 | } 800 | ``` 801 |
802 | 803 | 804 | 805 | ##### Example 2. Live Fixtures 806 | 807 | 808 |
809 | Old fixtures snipet (with `Regular` `resultingUnit` and period descriptions in `home" and `away`) 810 | 811 | ```json 812 | { 813 | "id": 1504322998, 814 | "starts": "2022-02-28T21:30:00Z", 815 | "home": "Ana Konjuh", 816 | "away": "Katie Boulter", 817 | "rotNum": "10909", 818 | "liveStatus": 1, 819 | "status": "O", 820 | "parlayRestriction": 1, 821 | "parentId": 1504081918, 822 | "altTeaser": false, 823 | "resultingUnit": "Regular", 824 | "version": 400699030 825 | }, 826 | { 827 | "id": 1504325436, 828 | "starts": "2022-02-28T21:30:00Z", 829 | "home": "Ana Konjuh To Win Set 1", 830 | "away": "Katie Boulter To Win Set 1", 831 | "rotNum": "10909", 832 | "liveStatus": 1, 833 | "status": "O", 834 | "parlayRestriction": 1, 835 | "parentId": 1504081918, 836 | "altTeaser": false, 837 | "resultingUnit": "Regular", 838 | "version": 400699034 839 | }, 840 | { 841 | "id": 1504325437, 842 | "starts": "2022-02-28T21:30:00Z", 843 | "home": "Ana Konjuh To Win Set 2", 844 | "away": "Katie Boulter To Win Set 2", 845 | "rotNum": "10909", 846 | "liveStatus": 1, 847 | "status": "O", 848 | "parlayRestriction": 1, 849 | "parentId": 1504081918, 850 | "altTeaser": false, 851 | "resultingUnit": "Regular", 852 | "version": 400699035 853 | }, 854 | { 855 | "id": 1504328314, 856 | "starts": "2022-02-28T21:30:00Z", 857 | "home": "Ana Konjuh Game 4 of Set 1", 858 | "away": "Katie Boulter Game 4 of Set 1", 859 | "rotNum": "10909", 860 | "liveStatus": 1, 861 | "status": "O", 862 | "parlayRestriction": 1, 863 | "parentId": 1504081918, 864 | "altTeaser": false, 865 | "resultingUnit": "Regular", 866 | "version": 400699036 867 | }, 868 | { 869 | "id": 1504329654, 870 | "starts": "2022-02-28T21:30:00Z", 871 | "home": "Ana Konjuh Game 5 of Set 1", 872 | "away": "Katie Boulter Game 5 of Set 1", 873 | "rotNum": "10909", 874 | "liveStatus": 1, 875 | "status": "O", 876 | "parlayRestriction": 1, 877 | "parentId": 1504081918, 878 | "altTeaser": false, 879 | "resultingUnit": "Regular", 880 | "version": 400699188 881 | }, 882 | { 883 | "id": 1504330259, 884 | "starts": "2022-02-28T21:30:00Z", 885 | "home": "Ana Konjuh Game 6 of Set 1", 886 | "away": "Katie Boulter Game 6 of Set 1", 887 | "rotNum": "10909", 888 | "liveStatus": 1, 889 | "status": "O", 890 | "parlayRestriction": 1, 891 | "parentId": 1504081918, 892 | "altTeaser": false, 893 | "resultingUnit": "Regular", 894 | "version": 400699733 895 | }, 896 | { 897 | "id": 1504334716, 898 | "starts": "2022-02-28T21:30:00Z", 899 | "home": "Ana Konjuh Game 7 of Set 1", 900 | "away": "Katie Boulter Game 7 of Set 1", 901 | "rotNum": "10909", 902 | "liveStatus": 1, 903 | "status": "O", 904 | "parlayRestriction": 1, 905 | "parentId": 1504081918, 906 | "altTeaser": false, 907 | "resultingUnit": "Regular", 908 | "version": 400700547 909 | }, 910 | { 911 | "id": 1504340108, 912 | "starts": "2022-02-28T21:30:00Z", 913 | "home": "Ana Konjuh Game 8 of Set 1", 914 | "away": "Katie Boulter Game 8 of Set 1", 915 | "rotNum": "10909", 916 | "liveStatus": 1, 917 | "status": "O", 918 | "parlayRestriction": 1, 919 | "parentId": 1504081918, 920 | "altTeaser": false, 921 | "resultingUnit": "Regular", 922 | "version": 400700999 923 | } 924 | ] 925 | } 926 | ``` 927 |
928 | 929 | 930 |
931 | Old odds snipet 932 | 933 | ```json 934 | { 935 | "id": 1504322998, 936 | "periods": [ 937 | { 938 | "lineId": 1601797796, 939 | "number": 0, 940 | "cutoff": "2022-03-01T03:30:00Z", 941 | "maxSpread": 3600.0, 942 | "maxMoneyline": 3000.0, 943 | "maxTotal": 3600.0, 944 | "status": 1, 945 | "spreadUpdatedAt": "2022-02-28T21:35:38.637Z", 946 | "moneylineUpdatedAt": "2022-02-28T21:35:38.623Z", 947 | "totalUpdatedAt": "2022-02-28T21:35:38.67Z", 948 | "spreads": [ 949 | { 950 | "hdp": -4.5, 951 | "home": -115.0, 952 | "away": -104.0 953 | }, 954 | { 955 | "altLineId": 24531258705, 956 | "hdp": -5.5, 957 | "home": 141.0, 958 | "away": -171.0, 959 | "max": 3600.0 960 | }, 961 | { 962 | "altLineId": 24531258711, 963 | "hdp": -3.5, 964 | "home": -185.0, 965 | "away": 153.0, 966 | "max": 3600.0 967 | } 968 | ], 969 | "moneyline": { 970 | "home": -346.0, 971 | "away": 297.0 972 | }, 973 | "totals": [ 974 | { 975 | "points": 20.5, 976 | "over": -110.0, 977 | "under": -109.0 978 | }, 979 | { 980 | "altLineId": 24531258704, 981 | "points": 19.5, 982 | "over": -154.0, 983 | "under": 127.0, 984 | "max": 3600.0 985 | }, 986 | { 987 | "altLineId": 24531258710, 988 | "points": 21.5, 989 | "over": 110.0, 990 | "under": -134.0, 991 | "max": 3600.0 992 | } 993 | ] 994 | } 995 | ] 996 | }, 997 | { 998 | "id": 1504334716, 999 | "periods": [ 1000 | { 1001 | "lineId": 1601795550, 1002 | "number": 0, 1003 | "cutoff": "2022-03-01T03:30:00Z", 1004 | "status": 1, 1005 | "moneylineUpdatedAt": "2022-02-28T21:31:54.81Z" 1006 | "moneyline": { 1007 | "home": -275.0, 1008 | "away": 240.0 1009 | } 1010 | ] 1011 | }, 1012 | { 1013 | "id": 1504334716, 1014 | "periods": [ 1015 | { 1016 | "lineId": 1504340108, 1017 | "number": 0, 1018 | "cutoff": "2022-03-01T03:30:00Z", 1019 | "status": 1, 1020 | "moneylineUpdatedAt": "2022-02-28T21:28:28.387Z" 1021 | "moneyline": { 1022 | "home": -125.0, 1023 | "away": 102.0 1024 | } 1025 | ] 1026 | }, 1027 | { 1028 | "id": 1504325436, 1029 | "periods": [ 1030 | { 1031 | "lineId": 1601797789, 1032 | "number": 0, 1033 | "cutoff": "2022-03-01T03:30:00Z", 1034 | "maxMoneyline": 1800.0, 1035 | "status": 1, 1036 | "moneylineUpdatedAt": "2022-02-28T21:35:38.59Z", 1037 | "moneyline": { 1038 | "home": -431.0, 1039 | "away": 369.0 1040 | } 1041 | } 1042 | ] 1043 | }, 1044 | { 1045 | "id": 1504325437, 1046 | "periods": [ 1047 | { 1048 | "lineId": 1601797791, 1049 | "number": 0, 1050 | "cutoff": "2022-03-01T03:30:00Z", 1051 | "maxMoneyline": 2700.0, 1052 | "status": 1, 1053 | "moneylineUpdatedAt": "2022-02-28T21:35:38.607Z", 1054 | "moneyline": { 1055 | "home": -218.0, 1056 | "away": 187.0 1057 | } 1058 | } 1059 | ] 1060 | } 1061 | ``` 1062 |
1063 | 1064 | 1065 | New way shows the match using the new structure where the `resultingUnit` are explicit and odds are offered on multiple periods ( not just period 0): 1066 |
1067 | New fixtures snipet 1068 | 1069 | ```json 1070 | { 1071 | "sportId": 33, 1072 | "last": 440033657, 1073 | "league": [ 1074 | { 1075 | "id": 2957, 1076 | "name": "ATP Paris - R1", 1077 | "events": [ 1078 | { 1079 | "id": 1562180480, 1080 | "starts": "2022-10-31T20:30:00Z", 1081 | "home": "Sebastian Korda", 1082 | "away": "Alex De Minaur", 1083 | "rotNum": "8325", 1084 | "liveStatus": 0, 1085 | "status": "O", 1086 | "parlayRestriction": 2, 1087 | "altTeaser": false, 1088 | "resultingUnit": "Sets", 1089 | "version": 440033645 1090 | }, 1091 | { 1092 | "id": 1562180497, 1093 | "starts": "2022-10-31T20:30:00Z", 1094 | "home": "Sebastian Korda (Games)", 1095 | "away": "Alex De Minaur (Games)", 1096 | "rotNum": "8325", 1097 | "liveStatus": 0, 1098 | "status": "O", 1099 | "parlayRestriction": 2, 1100 | "parentId": 1562180480, 1101 | "altTeaser": false, 1102 | "resultingUnit": "Games", 1103 | "version": 440033657 1104 | } 1105 | ] 1106 | } 1107 | ] 1108 | } 1109 | ``` 1110 |
1111 | 1112 | 1113 |
1114 | New odds snipet 1115 | 1116 | ```json 1117 | { 1118 | "sportId": 33, 1119 | "last": 1894932080, 1120 | "leagues": [ 1121 | { 1122 | "id": 2957, 1123 | "events": [ 1124 | { 1125 | "id": 1562180480, 1126 | "periods": [ 1127 | { 1128 | "lineId": 1894801784, 1129 | "number": 1, 1130 | "cutoff": "2022-10-31T20:30:00Z", 1131 | "maxMoneyline": 3000.0, 1132 | "status": 1, 1133 | "moneylineUpdatedAt": "2022-10-31T17:03:51.87Z", 1134 | "moneyline": { 1135 | "home": -130.0, 1136 | "away": 109.0 1137 | } 1138 | }, 1139 | { 1140 | "lineId": 1894801790, 1141 | "number": 2, 1142 | "cutoff": "2022-10-31T20:30:00Z", 1143 | "maxMoneyline": 3000.0, 1144 | "status": 1, 1145 | "moneylineUpdatedAt": "2022-10-31T17:03:51.933Z", 1146 | "moneyline": { 1147 | "home": -131.0, 1148 | "away": 110.0 1149 | } 1150 | }, 1151 | { 1152 | "lineId": 1894932080, 1153 | "number": 0, 1154 | "cutoff": "2022-10-31T20:30:00Z", 1155 | "maxSpread": 3000.0, 1156 | "maxMoneyline": 4000.0, 1157 | "maxTotal": 3000.0, 1158 | "status": 1, 1159 | "spreadUpdatedAt": "2022-10-31T19:33:13.17Z", 1160 | "moneylineUpdatedAt": "2022-10-31T19:33:13.17Z", 1161 | "totalUpdatedAt": "2022-10-31T19:33:13.17Z", 1162 | "spreads": [ 1163 | { 1164 | "hdp": -1.5, 1165 | "home": 185.0, 1166 | "away": -215.0 1167 | }, 1168 | { 1169 | "altLineId": 30378223926, 1170 | "hdp": 1.5, 1171 | "home": -342.0, 1172 | "away": 284.0, 1173 | "max": 3000.0 1174 | } 1175 | ], 1176 | "moneyline": { 1177 | "home": -138.0, 1178 | "away": 122.0 1179 | }, 1180 | "totals": [ 1181 | { 1182 | "points": 2.5, 1183 | "over": 125.0, 1184 | "under": -149.0 1185 | } 1186 | ] 1187 | } 1188 | ] 1189 | }, 1190 | { 1191 | "id": 1562180497, 1192 | "periods": [ 1193 | { 1194 | "lineId": 1894801794, 1195 | "number": 1, 1196 | "cutoff": "2022-10-31T20:30:00Z", 1197 | "maxMoneyline": 3000.0, 1198 | "status": 1, 1199 | "moneylineUpdatedAt": "2022-10-31T17:03:52.12Z", 1200 | "moneyline": { 1201 | "home": -130.0, 1202 | "away": 109.0 1203 | } 1204 | }, 1205 | { 1206 | "lineId": 1894801795, 1207 | "number": 2, 1208 | "cutoff": "2022-10-31T20:30:00Z", 1209 | "maxMoneyline": 3000.0, 1210 | "status": 1, 1211 | "moneylineUpdatedAt": "2022-10-31T17:03:52.153Z", 1212 | "moneyline": { 1213 | "home": -131.0, 1214 | "away": 110.0 1215 | } 1216 | }, 1217 | { 1218 | "lineId": 1894801797, 1219 | "number": 0, 1220 | "cutoff": "2022-10-31T20:30:00Z", 1221 | "maxSpread": 3000.0, 1222 | "maxTotal": 3000.0, 1223 | "status": 1, 1224 | "spreadUpdatedAt": "2022-10-31T17:03:52.183Z", 1225 | "totalUpdatedAt": "2022-10-31T17:03:52.26Z", 1226 | "spreads": [ 1227 | { 1228 | "hdp": -1.5, 1229 | "home": -111.0, 1230 | "away": -103.0 1231 | }, 1232 | { 1233 | "altLineId": 30375816407, 1234 | "hdp": -2.5, 1235 | "home": 110.0, 1236 | "away": -126.0, 1237 | "max": 3000.0 1238 | }, 1239 | { 1240 | "altLineId": 30375816409, 1241 | "hdp": -2.0, 1242 | "home": -100.0, 1243 | "away": -114.0, 1244 | "max": 3000.0 1245 | }, 1246 | { 1247 | "altLineId": 30375816411, 1248 | "hdp": -1.0, 1249 | "home": -120.0, 1250 | "away": 105.0, 1251 | "max": 3000.0 1252 | }, 1253 | { 1254 | "altLineId": 30375816413, 1255 | "hdp": -0.5, 1256 | "home": -130.0, 1257 | "away": 113.0, 1258 | "max": 3000.0 1259 | } 1260 | ], 1261 | "totals": [ 1262 | { 1263 | "points": 22.5, 1264 | "over": -106.0, 1265 | "under": -112.0 1266 | }, 1267 | { 1268 | "altLineId": 30375816408, 1269 | "points": 21.5, 1270 | "over": -139.0, 1271 | "under": 116.0, 1272 | "max": 3000.0 1273 | }, 1274 | { 1275 | "altLineId": 30375816410, 1276 | "points": 22.0, 1277 | "over": -122.0, 1278 | "under": 102.0, 1279 | "max": 3000.0 1280 | }, 1281 | { 1282 | "altLineId": 30375816412, 1283 | "points": 23.0, 1284 | "over": 105.0, 1285 | "under": -125.0, 1286 | "max": 3000.0 1287 | }, 1288 | { 1289 | "altLineId": 30375816414, 1290 | "points": 23.5, 1291 | "over": 116.0, 1292 | "under": -138.0, 1293 | "max": 3000.0 1294 | } 1295 | ] 1296 | } 1297 | ] 1298 | } 1299 | ] 1300 | } 1301 | ] 1302 | } 1303 | ``` 1304 |
1305 | 1306 | 1307 | 1308 | ## August 16, 2022 - Lines API 1309 | ##### 1. FEATURE - New period level properties for score and red cards in `/odds` response. Supported only for Match (number=0) and Extra Time (number=3). 1310 | 1311 | 1312 | ## May 31, 2022 - Bets API 1313 | ##### 1. FEATURE - New property `resultingUnit` in `/bets` response. 1314 | 1315 | ## April 18, 2022 1316 | 1317 | 1318 | New call [rate limit](https://github.com/pinnacleapi/pinnacleapi-documentation#rate-limits) logic. 1319 | 1320 | 1321 | ## February 9, 2022 - Lines API 1322 | ##### 1. FEATURE - New properties `moneylineUpdatedAt`, `spreadUpdatedAt`, `totalUpdatedAt` and `teamTotalUpdatedAt` in the `/v1/odds` and `/v1/odds/teaser` response. 1323 | 1324 | ## February 18, 2021 1325 | ##### 1. FEATURE - Added new property `max` in the `/v1/odds` response, to return alternate market specific limits. 1326 | ##### 2. FEATURE - Added new endpoint `/v2/line/parlay` to support round robin limits. 1327 | ##### 3. DEPRECATED - `/v1/line/parlay` and `/v1/bets/parlay` are deprecated, please switch to `/v2/line/parlay` and `/v2/bets/parlay` by March 18th 2021. Transition to `/v2/bets/parlay` version is seamless, there are no data contract changes. Transition to `/v2/line/parlay` version requires small changes for parlay bets and a bit more for round robin bets . 1328 | 1329 | 1330 | 1331 | ## November 16, 2020 1332 | 1333 | ##### 1. FEATURE - New property `contestants` in the `/v1/fixtures/special/settled` response, to return individual contestant outcomes. 1334 | 1335 | ## November 2, 2020 1336 | 1337 | ##### 1. FEATURE - New properties `betStatus2` and `legBetStatus2` in the `/v3/bets` response. 1338 | New properties are added to the straight and the parlay bets to support Asian handicap half won and half lost settlement. 1339 | 1340 | ## March 25, 2019 1341 | 1342 | `api.pinnaclesports.com` will not be supported after April 15, 2019. Please use `api.pinnacle.com` instead. 1343 | 1344 | 1345 | 1346 | ## December 18, 2018 - Lines API 1347 | 1348 | ##### 1. FEATURE - New property `liveStatus` in the `/v1/fixtures/special` response. 1349 | Pinnacle will start offering live betting on specials soon, firstly on Esports. This property was introduce so that clients can differentiate live from pregame specials. Please note that live delay will be applied to betting on live specials. 1350 | 1351 | #### 2. IMPROVEMENT - All live events must have `parentId`. 1352 | When `parentId` was introduced we could not guarantee that all live events would have `parentId` set. In time we were able to consolidate the data and be able to guarantee that. 1353 | 1354 | 1355 | ## December 5, 2018 - Bets API 1356 | 1357 | ##### 1. FEATURE - New property `eventStartTime` for straight and special bets in the `/v3/bets` response. 1358 | 1359 | 1360 | ## October 17, 2018 - Lines API 1361 | 1362 | ##### 1. FEATURE - Added `handicap` parameter to `line/special`. 1363 | As contestant's handicap is a mutable property, it may happened that `line/special` returns `status`:`SUCCESS`, but with the different `handicap` from the one that client had at the moment of calling the `line/special`. Now one can specify `handicap` parameter in the request and if the contestant's handicap changed, it would return `status`:`NOT_EXISTS`. This way `line/special` is more aligned to how `/line` works. 1364 | 1365 | 1366 | ## July 17, 2018 - Bets API 1367 | 1368 | ##### 1. FEATURE - New properties `TeaserId` and `TeaserGroupId` for teaser bets in the `/bets` response. 1369 | 1370 | ##### 2. FEATURE - Bet object added to the `bets/parlay` , `bets/teaser` and `bets/special` response. 1371 | 1372 | ## June 7, 2018 - Bets API 1373 | 1374 | ##### 1# FEATURE - New properties `price` and `finalPrice` for teaser bets in the `/bets` response. 1375 | The `price` will be populated for all teaser bets and will be the original price on the time of placement. 1376 | 1377 | The `finalPrice` will be populated only for `WON` bets and will indicate the price of bet resulting. It might be different from original price if one or more legs were pushed or canceled. 1378 | 1379 | 1380 | ## June 6, 2018 - Lines API 1381 | 1382 | ##### 1. FEATURE - New property `resultingUnit` in the `/fixtures` response. 1383 | 1384 | `resultingUnit` specifies based on what unit the event will be resulted, e.g. corners, bookings 1385 | 1386 | ##### 2. FEATURE - New property `status` in the `/odds` and `/odds/parlay/` response. 1387 | 1388 | `status` specifies whether the period is online or offline for betting 1389 | 1390 | To determine if an event is open for betting, previously, clients were supposed to check the event status in /fixtures response. 1391 | Now you just need to check the `status` on the period. 1392 | This would allow clients to speed up the decision-making process as there is no more need to frequently check the `/fixtures`. 1393 | 1394 | ##### 3. FEATURE - New property `altHdp` in the `/odds/teaser` response. 1395 | 1396 | `altHdp` specifies whether the spread is offered with the alternative handicap. Events with alternative teaser handicaps may vary from the teaser definition in `/teaser/groups` 1397 | 1398 | 1399 | ## March 6, 2018 - Lines API 1400 | 1401 | ##### 1. FEATURE - New property `parentId ` in the `/fixtures` response. 1402 | 1403 | `parentId` can be used to group associated events to the "parent" pre-game event, like in the example below: 1404 | ``` json 1405 | { 1406 | "sportId": 29, 1407 | "last": 148671597, 1408 | "league": [ 1409 | { 1410 | "id": 2331, 1411 | "name": "Norway - 1st Division", 1412 | "events": [ 1413 | { 1414 | "id": 837721686, 1415 | "starts": "2018-04-10T17:00:00Z", 1416 | "home": "Viking Fk", 1417 | "away": "Mjondalen", 1418 | "rotNum": "6751", 1419 | "liveStatus": 1, 1420 | "status": "O", 1421 | "parlayRestriction": 2, 1422 | "parentId": 834342247, 1423 | "altTeaser": false 1424 | }, 1425 | { 1426 | "id": 834342247, 1427 | "starts": "2018-04-10T17:00:00Z", 1428 | "home": "Viking Fk", 1429 | "away": "Mjondalen", 1430 | "rotNum": "6751", 1431 | "liveStatus": 2, 1432 | "status": "I", 1433 | "parlayRestriction": 2, 1434 | "altTeaser": false 1435 | } 1436 | ] 1437 | }, 1438 | { 1439 | "id": 6816, 1440 | "name": "Norway - 1st Division Corners", 1441 | "events": [ 1442 | { 1443 | "id": 837721684, 1444 | "starts": "2018-04-10T17:00:00Z", 1445 | "home": "Viking Fk (Corners)", 1446 | "away": "Mjondalen (Corners)", 1447 | "rotNum": "6751", 1448 | "liveStatus": 1, 1449 | "status": "O", 1450 | "parlayRestriction": 1, 1451 | "parentId": 834342247, 1452 | "altTeaser": false 1453 | }, 1454 | { 1455 | "id": 837721615, 1456 | "starts": "2018-04-10T17:00:00Z", 1457 | "home": "Viking Fk (Corners)", 1458 | "away": "Mjondalen (Corners)", 1459 | "rotNum": "6751", 1460 | "liveStatus": 2, 1461 | "status": "I", 1462 | "parlayRestriction": 1, 1463 | "parentId": 834342247, 1464 | "altTeaser": false 1465 | } 1466 | ] 1467 | } 1468 | ] 1469 | } 1470 | ``` 1471 | 1472 | There is a pre-game parent event id 834342247, that has associated live event id 837721686, but also 2 corner events in different leagues, one for live betting (837721684), while the other one is for pre-game (837721615) 1473 | 1474 | Introduction of parentid eliminates the need for rotation numbers. 1475 | 1476 | Please note that in the next version of `/fixtures`, the `rotNum` property will be decomissioned. 1477 | 1478 | 1479 | ## January 4, 2018 - Lines API 1480 | 1481 | ##### 1. BUGFIX When contestant line is no longer offered, delta `/odds/special` calls will return contestant line with null price 1482 | ##### 2. BUGFIX `line/special` incorrectly returns successful response for offline events and when `cutoff` is in the past 1483 | ##### 3. BUGFIX `line/special` returns {"status": "OFFLINE"} when a `price` is not set 1484 | ##### 4. BUGFIX `/fixtures/settled` for tennis sometimes returns negative value for `team1ScoreSets` and `team2ScoreSets` fields 1485 | 1486 | 1487 | ## December 21, 2017 - Lines API 1488 | ##### BUGFIX - 1. `v1/fixtures/special` eventId filtering not working 1489 | 1490 | 1491 | ## October 11, 2017 - Bets API 1492 | 1493 | Most important changes: 1494 | * New property `fillType` gives more flexibility to the client when specifying stake amount. 1495 | * When betting on events with live delay, `betid` is not in the response 1496 | * Client has to use uniqueRequestId to check if the bet was accepted or not, by calling v2/bets?uniqueRequestIds={,}. 1497 | * For danger zone live betting, we still return `betId` in the response. 1498 | * In the case of a successful place bet call, we now return bet object. 1499 | * Status `NOT_ACCEPTED` is introduced as a replacement of `REJECTED`. 1500 | 1501 | For more details, see https://pinnacleapi.github.io/betsapi#operation/Bets_StraightV2 1502 | 1503 | ##### 1. FEATURE - New operation `/v2/bets/straight` 1504 | 1505 | ##### 2. BUGFIX - Place bet operations return proper error in case of zero stake. 1506 | 1507 | ##### 3. DECOMMISSIONING - `/v1/bets/place` will be decommissioned January 15, 2018. Please migrate to /v2/bets/straight 1508 | 1509 | ##### 4. DECOMMISSIONING - `/v1/bets` will be decommissioned January 15, 2018. Please migrate to /v2/bets 1510 | 1511 | 1512 | --------------------------------------------------------------------------------