├── 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 | | Parameter | Get Odds response parameter |
55 |
56 | | sportId |
57 | sportId |
58 |
59 |
60 | | leagueId |
61 | League Type -> id |
62 |
63 |
64 | | eventId |
65 | Event Type -> id |
66 |
67 |
68 | | periodNumber |
69 | Period Type -> number |
70 |
71 |
72 | | team |
73 |
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 | |
78 |
79 |
80 | | handicap |
81 | Spread Type -> hdp Total Points Type -> points Team Total Points Type -> Total Points Type -> points |
82 |
83 |
84 | | lineId |
85 | Period Type -> lineId |
86 |
87 |
88 | | altLineId |
89 | Spread Type ->altLineId Total Points Type -> altLineId
|
90 |
91 |
92 |
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 |
--------------------------------------------------------------------------------