Pinnacle API (0.1.0)

Download OpenAPI specification:

Live events, full market depth, and the latest bindable prices.

The Pinnacle API gives you real-time sports betting markets: live events, full market depth, and the latest bindable prices — served over clean, typed JSON and grouped into a small, predictable set of endpoints.

The surface mirrors the well-known Pinnacle line API, so if you have integrated against it before the request and response shapes will feel familiar:

  • Odds — live spreads, totals and moneylines for a sport (/v4/odds).
  • Fixtures — the events and leagues on offer for a sport (/v3/fixtures).
  • In-Running — live game state (period and elapsed clock) for started events (/v2/inrunning).
  • Client — your funded-account balance (/v1/client/balance).
  • Markets — richer, event-scoped helpers: list sports, browse a sport's live events with their main markets, expand the full market set for one event, and fetch the latest bindable price for a single selection.

Polling model

The odds and fixtures endpoints use a long-poll delta model. Each response carries a last version cursor; pass it back as ?since=<last> on the next call and you receive only what has changed. When nothing has advanced, the list comes back empty — that is the idle response, not an error.

Authentication

Every request must be authenticated with HTTP Basic credentials — the username and password issued to you by pinc000. Send them on every call using the standard Authorization: Basic <base64(username:password)> header; most HTTP clients do this for you when you supply a username and password.

Requests without valid credentials receive 401 Unauthorized. In the interactive docs, click Authorize and enter your credentials to try the endpoints directly from this page.

If you need credentials, or believe yours have been compromised, contact pinc000 to have them issued or rotated.

Odds

Live spreads, totals and moneylines for a sport, with a long-poll delta cursor.

Live odds for a sport

Live odds for a sport, OddsResponse (Odds_Straight_V4)-shaped.

The core endpoint: reads the warm OddsBook and projects each event's periods into spreads/totals/moneyline. last is the book's per-sport version cursor — poll with ?since=last for the long-poll delta model (empty leagues while nothing has changed). Prices are decimal; oddsFormat=American converts.

Authorizations:
HTTPBasic
query Parameters
sportId
required
integer (Sportid)
oddsFormat
string (OddsFormat)
Default: "Decimal"
Enum: "American" "Decimal" "HongKong" "Indonesian" "Malay"

oddsFormat query values (per the official /odds docs). We serve Decimal (our native price) and convert to American; the others fall back to Decimal.

Since (integer) or Since (null) (Since)
Islive (integer) or Islive (null) (Islive)
Array of Eventids (strings) or Eventids (null) (Eventids)

Responses

Response samples

Content type
application/json
{
  • "sportId": 0,
  • "last": 0,
  • "leagues": [
    ]
}

Price a single line

The current price + line id for one selection, GetLineResponse-shaped.

Resolves the market coordinate against the warm book, then quotes it via the bet-slip path — so the returned lineId/altLineId and price are exactly what POST /v4/bets/straight will bind to (the freshest bindable price, ahead of the streamed feed). status is NOT_EXISTS when the line is not on offer.

Authorizations:
HTTPBasic
query Parameters
sportId
required
integer (Sportid)
eventId
required
integer (Eventid)
betType
required
string (BetType)
Enum: "MONEYLINE" "SPREAD" "TOTAL_POINTS" "TEAM_TOTAL_POINTS"

betType for a straight bet / line lookup (official values).

periodNumber
integer (Periodnumber)
Default: 0
TeamSide (string) or Team (null) (Team)
OverUnder (string) or Side (null) (Side)
Handicap (number) or Handicap (null) (Handicap)
oddsFormat
string (OddsFormat)
Default: "Decimal"
Enum: "American" "Decimal" "HongKong" "Indonesian" "Malay"

oddsFormat query values (per the official /odds docs). We serve Decimal (our native price) and convert to American; the others fall back to Decimal.

Responses

Response samples

Content type
application/json
{
  • "status": "string",
  • "price": 0,
  • "lineId": 0,
  • "altLineId": 0,
  • "minRiskStake": 0,
  • "maxRiskStake": 0,
  • "minWinStake": 0,
  • "maxWinStake": 0,
  • "maxPayout": 0,
  • "effectiveAsOf": "string"
}

Fixtures

The events and leagues currently on offer for a sport.

Fixtures for a sport

Events (leagues + fixtures) for a sport, FixturesResponse-shaped.

Reads the same warm book as /sports/{sport}/events; the first call for a cold sport warms it and may return few/no events until it fills. last is the book's live version cursor — poll again with ?since=last; when nothing has advanced the league list comes back empty (the long-poll idle response).

Authorizations:
HTTPBasic
query Parameters
sportId
required
integer (Sportid)
Since (integer) or Since (null) (Since)
Islive (integer) or Islive (null) (Islive)
Array of Eventids (strings) or Eventids (null) (Eventids)

Responses

Response samples

Content type
application/json
{
  • "sportId": 0,
  • "last": 0,
  • "league": [
    ]
}

Leagues for a sport

Leagues currently on offer for a sport, LeaguesResponse-shaped.

Derived from the same warm book as /v3/fixtures: every league carrying at least one event in the feed, with its live event count. Warms a cold sport on the first call (few/no leagues until it fills).

Authorizations:
HTTPBasic
query Parameters
sportId
required
integer (Sportid)

Responses

Response samples

Content type
application/json
{
  • "sportId": 0,
  • "leagues": [
    ]
}

Betting periods for a sport

The betting periods a sport currently offers, PeriodsResponse-shaped.

Derived from the distinct period numbers present in the warm book (0=Match, 1=1st half, …) with best-effort descriptions. Not the full provider period dictionary — only the periods actually on offer right now.

Authorizations:
HTTPBasic
query Parameters
sportId
required
integer (Sportid)

Responses

Response samples

Content type
application/json
{
  • "sportId": 0,
  • "periods": [
    ]
}

In-Running

Live game state (period and elapsed clock) for started events.

Live game state

Live game states across the sports whose feeds are already warm, InRunningResponse-shaped. Reports only started sports — it never opens a new feed — so it is a cheap read over whatever /v4/odds//sports already warmed. state/elapsed are derived best-effort from the live period label + clock.

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
{
  • "sports": [
    ]
}

Client

Your funded-account details, such as the available balance.

Account balance

Current funded-account balance, ClientBalanceResponse-shaped.

availableBalance / currency come straight from the Pinnacle account-balance call; outstandingTransactions / givenCredit are surfaced only when the provider payload carries them.

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
{
  • "availableBalance": 0,
  • "outstandingTransactions": 0,
  • "givenCredit": 0,
  • "currency": "string"
}

Account balance (v2 alias)

Alias of /v1/client/balance at the v2 path — identical payload, for clients pinned to the newer version string.

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
{
  • "availableBalance": 0,
  • "outstandingTransactions": 0,
  • "givenCredit": 0,
  • "currency": "string"
}

Markets

Browse sports and their live events, expand the full market set for one event, and price a single selection.

List sports

List the sports and whether each currently has events on offer.

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List a sport's live events

Return the latest feed for a sport: every event currently on, each with its main markets (moneyline, handicap, totals).

Authorizations:
HTTPBasic
path Parameters
sport
required
integer (Sport)
Enum: 29 3 33 4 19 12

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Full market set for an event

Return every market for one event: all alternate handicap and total lines, team totals, the corners and bookings markets, and the specials (correct score, both teams to score, goalscorer, half-time/full-time, …). Depth is fetched on demand, so the first request for a new event may take a moment.

Authorizations:
HTTPBasic
path Parameters
event_id
required
integer (Event Id)

Responses

Response samples

Content type
application/json
{
  • "event_id": 0,
  • "goals": {
    },
  • "corners": {
    },
  • "bookings": {
    }
}

Price a single selection

The latest bindable price for one selection.

Pick a market from the events or more-bets structure and send the selection (market, side, line and line id). The returned price is the freshest one — slightly ahead of the streamed feed — with stake limits and a status.

Authorizations:
HTTPBasic
path Parameters
event_id
required
integer (Event Id)
Request Body schema: application/json
required
market
required
string (Market)
Value: "moneyline"
period
integer (Period)
Default: 0
side
required
string (Side)
Enum: "home" "away" "draw"
line_id
required
integer (Line Id)

Responses

Request samples

Content type
application/json
Example
{
  • "market": "moneyline",
  • "period": 0,
  • "side": "home",
  • "line_id": 0
}

Response samples

Content type
application/json
{
  • "status": "",
  • "odds": 0,
  • "lineId": 0,
  • "altLineId": 0,
  • "minStake": 0,
  • "maxStake": 0,
  • "maxStakeWin": 0,
  • "maxPayout": 0,
  • "originalOdds": 0,
  • "lastOdds": 0,
  • "betType": 0,
  • "betTypeDisp": "string",
  • "periodNum": 0,
  • "handicap": 0,
  • "eventId": 0,
  • "homeTeam": "string",
  • "awayTeam": "string",
  • "selection": "string",
  • "contestantName": "string",
  • "eventName": "string",
  • "category": "string",
  • "inplay": true
}

Betting

Place a straight bet

Place a single straight bet, PlaceStraightBetRequest/...ResponseV4-shaped.

Builds the selection from the body, RE-PRICES it via the bet-slip path (the authoritative bindable price, ahead of the feed), then places it through the provider buy. A stale/closed line comes back as PROCESSED_WITH_ERROR without a placement attempt.

SAFETY: a real call spends money and debits the funded account. Pass ?dryRun=true to run the FULL build-and-price path and return what would be sent WITHOUT placing a wager — the way to smoke-test this endpoint. A live placement needs owner sign-off and a funded account.

Authorizations:
HTTPBasic
query Parameters
dryRun
boolean (Dryrun)
Default: false
Request Body schema: application/json
required
oddsFormat
string (OddsFormat)
Default: "Decimal"
Enum: "American" "Decimal" "HongKong" "Indonesian" "Malay"

oddsFormat query values (per the official /odds docs). We serve Decimal (our native price) and convert to American; the others fall back to Decimal.

Uniquerequestid (string) or Uniquerequestid (null) (Uniquerequestid)
acceptBetterLine
boolean (Acceptbetterline)
Default: true
stake
required
number (Stake)
winRiskStake
string (WinRiskType)
Default: "RISK"
Enum: "WIN" "RISK"

Whether stake is the amount to win or to risk.

lineId
required
integer (Lineid)
Altlineid (integer) or Altlineid (null) (Altlineid)
FillType (string) or null
sportId
required
integer (Sportid)
eventId
required
integer (Eventid)
periodNumber
integer (Periodnumber)
Default: 0
betType
required
string (BetType)
Enum: "MONEYLINE" "SPREAD" "TOTAL_POINTS" "TEAM_TOTAL_POINTS"

betType for a straight bet / line lookup (official values).

TeamSide (string) or null
OverUnder (string) or null
Handicap (number) or Handicap (null) (Handicap)

Responses

Request samples

Content type
application/json
{
  • "oddsFormat": "American",
  • "uniqueRequestId": "string",
  • "acceptBetterLine": true,
  • "stake": 0,
  • "winRiskStake": "WIN",
  • "lineId": 0,
  • "altLineId": 0,
  • "fillType": "NORMAL",
  • "sportId": 0,
  • "eventId": 0,
  • "periodNumber": 0,
  • "betType": "MONEYLINE",
  • "team": "TEAM1",
  • "side": "OVER",
  • "handicap": 0
}

Response samples

Content type
application/json
{
  • "status": "string",
  • "errorCode": "string",
  • "uniqueRequestId": "string",
  • "betId": 0,
  • "betStatus": "string",
  • "betterLineWasAccepted": true,
  • "price": 0,
  • "dryRun": true
}

List placed bets

The account's placed bets, GetBetsResponse-shaped, from the provider my-bets. Field mapping is best-effort (unknown provider keys are preserved on each entry rather than dropped).

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
{
  • "straightBets": [
    ]
}

List placed bets (v1 alias)

Alias of /v4/bets at the v1 path — identical payload.

Authorizations:
HTTPBasic

Responses

Response samples

Content type
application/json
{
  • "straightBets": [
    ]
}