No.
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.
For more details on how to place a bet see Getting Started
One can use parentId
from the Get Fixtures to group associated events to the "parent" event.
A few facts that can help:
- We have different events for pregame and live, that can be distinguished by liveStatus.
- Parent events are pre-game events (liveStatus=0 or liveStatus=2) and don't have parentId set.
- Live events (liveStatus=1) will always have parentId set.
- 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.
Example:
{
"sportId": 29,
"last": 148671597,
"league": [
{
"id": 2331,
"name": "Norway - 1st Division",
"events": [
{
"id": 837721686,
"starts": "2018-04-10T17:00:00Z",
"home": "Viking Fk",
"away": "Mjondalen",
"rotNum": "6751",
"liveStatus": 1,
"status": "O",
"parlayRestriction": 2,
"parentId": 834342247,
"altTeaser": false
},
{
"id": 834342247,
"starts": "2018-04-10T17:00:00Z",
"home": "Viking Fk",
"away": "Mjondalen",
"rotNum": "6751",
"liveStatus": 2,
"status": "I",
"parlayRestriction": 2,
"altTeaser": false
}
]
},
{
"id": 6816,
"name": "Norway - 1st Division Corners",
"events": [
{
"id": 837721684,
"starts": "2018-04-10T17:00:00Z",
"home": "Viking Fk (Corners)",
"away": "Mjondalen (Corners)",
"rotNum": "6751",
"liveStatus": 1,
"status": "O",
"parlayRestriction": 1,
"parentId": 834342247,
"altTeaser": false
},
{
"id": 837721615,
"starts": "2018-04-10T17:00:00Z",
"home": "Viking Fk (Corners)",
"away": "Mjondalen (Corners)",
"rotNum": "6751",
"liveStatus": 2,
"status": "I",
"parlayRestriction": 1,
"parentId": 834342247,
"altTeaser": false
}
]
}
]
}
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)
Introduction of parentid
eliminates a need for rotation numbers.
Please note that in the next version of /fixtures
, the rotNum
property will be decommissioned.
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.
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.
Props and futures market are offered as specials, you would need to call /fixtures/special
and odds/special
to get the markets.
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.
{
"id": 1065232780,
...
"event": {
"id": 1051780418,
"periodNumber": 1,
"home": "Malta",
"away": "Norway"
},
...
},
A straight market ( moneyline
, spreads
, totals
, teamtotal
) in a period is open for betting if in Get Odds response all these is true:
- Period
status
= 1 - Market is priced.
- Period has
cutoff
is in the future.
Example: When the moneyline
market is not offered, the whole object will be missing. It's the same for other market types.
{
"lineId": 527557614,
"number": 1,
"cutoff": "2018-06-30T21:00:00Z",
"maxSpread": 250,
"maxTotal": 250,
"status": 1,
"spreads": [
{
"hdp": -0.25,
"home": 140,
"away": -172
}
],
"totals": [
{
"points": 0.75,
"over": -128,
"under": 107
}
]
}
Please note that for live events, odds change quite frequently as well as the period status
.
Due to these frequent changes, it’s possible that you will be getting status NOT_EXISTS
in the Get Line response more often than for the pre-game events.
A special market is open for betting if:
- Special event
status
is"O"
or"I"
. See Get Special Fixtures. - Market is priced. See Get Special Odds .
- Special event
cutoff
is in the future. See Get Special Fixtures.
Bets placed on events with live delay are treated differently than other bets. They get betId
assigned only once they are ACCEPTED
.
The only way to find out the status
of such a bet is by querying /bets?uniqueRequestIds
:
/bets?uniqueRequestIds=86a90ab9-fca1-4703-a11c-ce329a85584e
As long as the bet is in PENDING_ACCEPTANCE
, the response would be:
{
"straightBets": [
{
"uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e",
"betStatus": "PENDING_ACCEPTANCE"
}
]
}
NOTE: Status can change from PENDING_ACCEPTANCE
to NOT_ACCEPTED
or ACCEPTED
If the bet was NOT_ACCEPTED
, the response would be:
{
"straightBets": [
{
"uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e",
"betStatus": "NOT_ACCEPTED"
}
]
}
If the bet was ACCEPTED
, the response includes the full bet details:
{
"straightBets": [
{
"betId": 800110193,
"uniqueRequestId": "86a90ab9-fca1-4703-a11c-ce329a85584e",
"wagerNumber": 1,
"placedAt": "2017-12-20T21:57:22Z",
"betStatus": "ACCEPTED",
"betType": "MONEYLINE",
"win": 2519.25,
"risk": 11991.63,
"oddsFormat": "AMERICAN",
"updateSequence": 175277412,
"sportId": 29,
"leagueId": 5595,
"eventId": 799939900,
"price": -476,
"teamName": "Universitario",
"team1": "Universitario",
"team2": "Club Petrolero",
"periodNumber": 0,
"isLive": "TRUE"
}
]
}
We apply live delay of around 6 seconds, so the first call to /bets
should be 6 seconds after placing a bet.
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.
Please also note that the RUNNING
bet list does not return any live delay bets that are PENDING_ACCEPTANCE
or NOT_ACCEPTED
.
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.
Please check our fair use policy
How do I make sure my links to www.pinnacle.com are tracking correctly?
Please ensure that any links back to www.pinnacle.com are tagged with your tracking link. Your tracking links are available from your affiliate account accessed at http://affiliates.pinnacle.com
A correct tracking link will have the format: http://affiliates.pinnacle.com/processing/clickthrgh.asp?btag=a_numbersb_numbers
Get Odds
and Get Fixtures
snapshot calls are cached for 60 seconds.
Get Odds
and Get Fixtures
delta calls are not cached.
Can I link directly to the relevant odds pages on www.pinnacle.com (deep linking)?
Yes. To link directly to our odds pages, please contact [email protected]
Get Sports
and Get Leagues
operations have the hasOfferings
property that indicates availability of the markets.
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.
All times are GMT.
Please use Get Settled Fixtures
to find out if the event's period was settled or if the event was deleted.
- Call the snapshot /odds (without the since parameter) - this would return cached odds snapshot
- Call the delta /odds (with the
since
parameter, from the snapshot response) - to get all the changes since the snapshot.
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.
Example:
- Snapshot call returns period
number
=1 and periodnumber
=0 , and both of them havemoneyline
andspreads
odds. - Subsequent, Delta call returns just period 1 with the
moneyline
andtotals
=> 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
To be compliant with the security requirements API supports only TLS 1.2 (preferably ) and TLS 1.1.
Access to Esports is blocked and requires special authorization. To get the access please contact [email protected] and explain your business case.
These are possible reasons:
- Not sending correct
periodNumber
,eventid
,leagueid
orsportId
It is not a rare situation that the actual match is offered with more than one event.
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.
-
Period
cutoff
date time is in the past. -
Selection has no prices at the moment.
-
Not sending correct
handicap
,team
orside
-
Period
status
=2 , offline
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
{
"id": 933912855,
"periods": [
{
"number": 0,
"status": 5,
"settlementId": 3637379,
"settledAt": "2018-12-24T02:12:06.707Z",
"team1Score": 0,
"team2Score": 0
}
]
},
If you get any unexpected error upon calling a place bet operation, that does NOT mean that your bet was not placed.
You must check if the bet was placed by calling the bets?uniqueRequestIds={comma separated uniqueRequestIds}
.
If you have a retry logic, make sure you reuse the same uniqueRequestId in the place bet request.
For more details on how uniqueRequestId works, please check Deduplication.
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.
/odds
operation returns max volume limits.
To calculate the max risk from the max volume , for a price in decimal odds format, you can use this formula:
If price > 2 then:
maxRisk = maxVolume
, otherwise when price < 2:
maxRisk = maxVolume/(price - 1)
When /odds
return this moneyline offering
{
"lineId": 242220498,
"number": 1,
"cutoff": "2019-08-30T21:00:00Z",
"maxMoneyline": 250,
"status": 1,
"moneyline": {
"home": 1.819,
"away": 2.03
}
}
Max volume is 250. Home team max risk is 305. Away team max risk is 250.
If a client would need to know the maximum round robin stake, one would need to calculate it based on selected round robin options. In /v2/line/parlay endpoint we return the needed parameters.
4 steps to calculate it:
-
maxRiskStakeBasedOnMaxTotalRisk=
maxRoundRobinTotalRisk
/SUM (numberOfBets
), where SUM (numberOfBets
) is sum of numberOfBets for all selected round robin options. -
maxRiskStakeBasedOnMaxTotalWin =
maxRoundRobinTotalWin
/ SUM (unroundedDecimalOdds
- 1) , where SUM (unroundedDecimalOdds
- 1) is sum of unroundedDecimalOdds-1 for all selected round robin options. -
maxRoundRobinRiskStake = Min(maxRiskStakeBasedOnMaxTotalRisk, maxRiskStakeBasedOnMaxTotalWin)
-
maxRoundRobinRiskStake = round(maxRoundRobinRiskStake) , round to 2 decimal place, away from zero.