X-OAuth-Client-Id header is requiredEvery external API request must identify its OAuth client.
Juice Reel developer platform
Connect a Juice Reel account with OAuth 2.0, then securely read subscriber relationships and the connected user's open or settled bets from your backend.
https://www.juicereel.com/oauth2/authorizehttps://external-api.juicereel.comOAuth 2.0
Send the user to Juice Reel to sign in and approve access. This is a browser redirect, not a server-to-server API call.
https://www.juicereel.com/oauth2/authorize| Field | Type | Description |
|---|---|---|
client_idrequired | string | Your approved OAuth client ID. |
redirect_urirequired | string | An exact redirect URI registered on the application. |
response_typerequired | string | Must be code. |
scoperequired | string | Space-delimited requested scopes. |
staterequired | string | Unpredictable value created and validated by your application. |
code_challengerequired | string | Base64url SHA-256 digest of your PKCE verifier. |
code_challenge_methodrequired | string | Must be S256. |
| Field | Type | Description |
|---|---|---|
code | string | Short-lived, single-use authorization code exchanged by your backend. |
state | string | The original state. Reject the callback if it does not exactly match your stored value. |
OAuth 2.0
Exchange the callback code for an access token and rotating refresh token. Perform this request only from your backend.
/oauth2/token| Field | Type | Description |
|---|---|---|
grant_typerequired | string | Must be authorization_code. |
coderequired | string | Code received by your redirect URI. |
redirect_urirequired | string | Must exactly match the URI used during authorization. |
code_verifierrequired | string | Original PKCE verifier used to create the challenge. |
| Field | Type | Description |
|---|---|---|
access_token | string | Bearer token used for resource requests. Store server-side. |
refresh_token | string | Single-use token used to obtain a replacement token pair. |
token_type | string | Bearer. |
expires_in | integer | Access-token lifetime in seconds; currently 3600. |
scope | string | Space-delimited scopes granted by the user. |
OAuth 2.0
Use a refresh token once to receive a new access token and a replacement refresh token.
/oauth2/token| Field | Type | Description |
|---|---|---|
grant_typerequired | string | Must be refresh_token. |
refresh_tokenrequired | string | The current unused refresh token. |
| Field | Type | Description |
|---|---|---|
access_token | string | New one-hour bearer token. |
refresh_token | string | Replacement refresh token. Discard the token used for this request. |
token_type | string | Bearer. |
expires_in | integer | Access-token lifetime in seconds. |
scope | string | Scopes retained by the authorization grant. |
OAuth 2.0
Revoke an access token or refresh-token grant when a user disconnects Juice Reel from your application.
/oauth2/revoke| Field | Type | Description |
|---|---|---|
tokenrequired | string | Access token or refresh token to revoke. |
token_type_hint | string | Optional access_token or refresh_token hint. |
| Field | Type | Description |
|---|---|---|
HTTP 200 | empty object | Revocation is idempotent and does not reveal whether the token existed. |
Account
Return the Juice Reel user ID represented by the access token.
/oauth2/me| Field | Type | Description |
|---|---|---|
juiceReelUserId | integer | Stable Juice Reel user identifier for the authorization grant. |
Subscribers
List unique users with a current, non-sandbox subscription to the connected creator.
/oauth2/subscribers/current| Field | Type | Description |
|---|---|---|
subscribers | array | Unique active subscribers, ordered by latest expiration and creation time. |
juiceReelUserId | integer | Subscriber's stable Juice Reel user ID. |
subscriptionProductId | string | null | Identifier of the purchased subscription product. |
purchaseDate | datetime | null | ISO 8601 initial purchase time. |
expiresDate | datetime | ISO 8601 expiration or renewal boundary. |
periodType | string | null | Billing period classification reported by the store. |
store | string | null | Purchase provider, such as APP_STORE, PLAY_STORE, or STRIPE. |
Bets
Return the connected user's open bets using cursor-based pagination.
/oauth2/bets/open| Field | Type | Description |
|---|---|---|
cursor | string | Opaque nextCursor from the previous response. Omit for the first page. |
| Field | Type | Description |
|---|---|---|
bets | array<Bet> | Bets in descending ID order for the connected Juice Reel user. |
nextCursor | string | null | Pass this opaque value as cursor on the next request. Null means paging is complete. |
hasMore | boolean | True when another page is available. Equivalent to nextCursor being non-null. |
bets[].id | integer | Unique Juice Reel bet identifier. |
bets[].userId | integer | Juice Reel user that owns the bet. |
bets[].oddsAmerican | number | American odds recorded for the overall bet. |
bets[].amountRisked | number | Amount staked in currencyCode. |
bets[].toWin | number | Potential profit, excluding returned stake, in currencyCode. |
bets[].netResult | number | null | Settled profit or loss. Positive is profit; negative is loss. |
bets[].result | string | null | Human-readable settlement result, such as Won, Lost, Push, or Cancelled. |
bets[].datePlaced | datetime | null | ISO 8601 timestamp when the wager was placed. |
bets[].dateClosed | datetime | null | ISO 8601 settlement timestamp. Usually null for open bets. |
bets[].isAdjustedOdds | boolean | Whether the recorded odds were manually adjusted. |
bets[].isAdjustedLine | boolean | Whether the recorded line was manually adjusted. |
bets[].adjustedRisk | number | null | Manual risk adjustment, when one exists. |
bets[].clvPct | number | null | Closing-line value percentage, when available. |
bets[].createdAt | datetime | ISO 8601 creation timestamp in Juice Reel. |
bets[].updatedAt | datetime | ISO 8601 timestamp of the last update. |
bets[].currencyCode | string | null | ISO 4217 currency code for monetary values. |
bets[].BetType | object | null | Bet classification with id and typeName, such as Straight or Parlay. |
BetType.id | integer | Unique bet-type identifier. |
BetType.typeName | string | Human-readable bet classification. |
bets[].BetStatus | object | null | Lifecycle status with id and statusName. |
BetStatus.id | integer | Unique bet-status identifier. |
BetStatus.statusName | string | Human-readable lifecycle status. |
bets[].Site | object | null | Sportsbook or platform with id and name. |
Site.id | integer | Unique Juice Reel sportsbook identifier. |
Site.name | string | Sportsbook or platform name. |
bets[].Subbets | array<Subbet> | Individual legs that make up the bet. |
Subbet.id | integer | Unique bet-leg identifier. |
Subbet.userId | integer | Juice Reel user that owns the leg. |
Subbet.subbetType | string | Market type, such as Moneyline, Spread, Total, or Player Prop. |
Subbet.position | string | null | Selected team, player, or outcome. |
Subbet.value | number | null | Selected market line or threshold. |
Subbet.oddsAmerican | number | American odds for this individual leg. |
Subbet.duration | string | null | Market duration, such as full game or first half, when available. |
Subbet.startDate | datetime | null | ISO 8601 scheduled start time for the leg. |
Subbet.wasLiveBet | boolean | Whether this leg was placed after the event began. |
Subbet.description | string | null | Normalized human-readable description. |
Subbet.scrapeDescription | string | null | Description captured from the originating sportsbook. |
Subbet.metric | string | null | Player-prop statistic, when this is a player prop. |
Subbet.createdAt | datetime | ISO 8601 leg creation timestamp. |
Subbet.updatedAt | datetime | ISO 8601 timestamp of the last leg update. |
Subbet.TruthTeam / OppTruthTeam | Team | null | Selected and opposing normalized teams. |
Team.id | integer | Unique normalized team identifier. |
Team.name | string | Canonical team name. |
Team.displayName | string | null | Display-ready team name. |
Subbet.Player / OppPlayer | Player | null | Selected and opposing normalized players. |
Player.id | integer | Unique normalized player identifier. |
Player.firstName | string | Player's first or given name. |
Player.lastName | string | Player's last or family name. |
Player.name | string | Canonical full player name. |
Player.teamId | integer | null | Normalized current team identifier. |
Player.sportId | integer | null | Normalized sport identifier. |
Player.leagueId | integer | null | Normalized league identifier. |
Player.TruthTeam | Team | null | Normalized team associated with the player. |
Subbet.Event | object | null | Normalized sporting event associated with the leg. |
Event.id | integer | Unique normalized event identifier. |
Event.name | string | null | Event or tournament name when one exists. |
Event.startDate | datetime | null | Scheduled event start in ISO 8601 format. |
Event.exactStartTime | datetime | null | Confirmed exact start time, when available. |
Event.type | string | Event classification, such as Game, Match, or Tournament. |
Event.player1Id / player2Id | integer | null | Normalized participant identifiers for head-to-head player events. |
Event.homeTeamId / awayTeamId | integer | null | Normalized home and away team identifiers. |
Event.status | string | null | Event lifecycle status, such as Scheduled, Live, or Final. |
Event.parentEventId | integer | null | Parent tournament or event identifier. |
Event.sportId | integer | null | Normalized event sport identifier. |
Event.leagueId | integer | null | Normalized event league identifier. |
Event.description | string | null | Additional event description when available. |
Event.Player1 / Player2 | EventPlayer | null | Normalized event competitors. |
EventPlayer.id | integer | Unique normalized player identifier. |
EventPlayer.firstName | string | Competitor's first or given name. |
EventPlayer.lastName | string | Competitor's last or family name. |
EventPlayer.teamId | integer | null | Competitor's normalized team identifier. |
Event.HomeTeam / AwayTeam | Team | null | Normalized home and away teams using the Team fields above. |
Event.ParentEvent | object | null | Parent tournament or event, using the same external event fields. |
Event.Sport / League | Affiliation | null | Normalized sport and league. |
Subbet.BetResult | object | null | Leg settlement result with id and name. |
BetResult.id | integer | Unique leg-result identifier. |
BetResult.name | string | Human-readable leg settlement result. |
Subbet.Sport / League | Affiliation | null | Normalized sport and league for the leg. |
Affiliation.id | integer | Unique sport or league identifier. |
Affiliation.name | string | Canonical sport or league name. |
Bets
Return the connected user's closed and cancelled bets using cursor-based pagination.
/oauth2/bets/settled| Field | Type | Description |
|---|---|---|
cursor | string | Opaque nextCursor from the previous response. Omit for the first page. |
| Field | Type | Description |
|---|---|---|
bets | array<Bet> | Bets in descending ID order for the connected Juice Reel user. |
nextCursor | string | null | Pass this opaque value as cursor on the next request. Null means paging is complete. |
hasMore | boolean | True when another page is available. Equivalent to nextCursor being non-null. |
bets[].id | integer | Unique Juice Reel bet identifier. |
bets[].userId | integer | Juice Reel user that owns the bet. |
bets[].oddsAmerican | number | American odds recorded for the overall bet. |
bets[].amountRisked | number | Amount staked in currencyCode. |
bets[].toWin | number | Potential profit, excluding returned stake, in currencyCode. |
bets[].netResult | number | null | Settled profit or loss. Positive is profit; negative is loss. |
bets[].result | string | null | Human-readable settlement result, such as Won, Lost, Push, or Cancelled. |
bets[].datePlaced | datetime | null | ISO 8601 timestamp when the wager was placed. |
bets[].dateClosed | datetime | null | ISO 8601 settlement timestamp. Usually null for open bets. |
bets[].isAdjustedOdds | boolean | Whether the recorded odds were manually adjusted. |
bets[].isAdjustedLine | boolean | Whether the recorded line was manually adjusted. |
bets[].adjustedRisk | number | null | Manual risk adjustment, when one exists. |
bets[].clvPct | number | null | Closing-line value percentage, when available. |
bets[].createdAt | datetime | ISO 8601 creation timestamp in Juice Reel. |
bets[].updatedAt | datetime | ISO 8601 timestamp of the last update. |
bets[].currencyCode | string | null | ISO 4217 currency code for monetary values. |
bets[].BetType | object | null | Bet classification with id and typeName, such as Straight or Parlay. |
BetType.id | integer | Unique bet-type identifier. |
BetType.typeName | string | Human-readable bet classification. |
bets[].BetStatus | object | null | Lifecycle status with id and statusName. |
BetStatus.id | integer | Unique bet-status identifier. |
BetStatus.statusName | string | Human-readable lifecycle status. |
bets[].Site | object | null | Sportsbook or platform with id and name. |
Site.id | integer | Unique Juice Reel sportsbook identifier. |
Site.name | string | Sportsbook or platform name. |
bets[].Subbets | array<Subbet> | Individual legs that make up the bet. |
Subbet.id | integer | Unique bet-leg identifier. |
Subbet.userId | integer | Juice Reel user that owns the leg. |
Subbet.subbetType | string | Market type, such as Moneyline, Spread, Total, or Player Prop. |
Subbet.position | string | null | Selected team, player, or outcome. |
Subbet.value | number | null | Selected market line or threshold. |
Subbet.oddsAmerican | number | American odds for this individual leg. |
Subbet.duration | string | null | Market duration, such as full game or first half, when available. |
Subbet.startDate | datetime | null | ISO 8601 scheduled start time for the leg. |
Subbet.wasLiveBet | boolean | Whether this leg was placed after the event began. |
Subbet.description | string | null | Normalized human-readable description. |
Subbet.scrapeDescription | string | null | Description captured from the originating sportsbook. |
Subbet.metric | string | null | Player-prop statistic, when this is a player prop. |
Subbet.createdAt | datetime | ISO 8601 leg creation timestamp. |
Subbet.updatedAt | datetime | ISO 8601 timestamp of the last leg update. |
Subbet.TruthTeam / OppTruthTeam | Team | null | Selected and opposing normalized teams. |
Team.id | integer | Unique normalized team identifier. |
Team.name | string | Canonical team name. |
Team.displayName | string | null | Display-ready team name. |
Subbet.Player / OppPlayer | Player | null | Selected and opposing normalized players. |
Player.id | integer | Unique normalized player identifier. |
Player.firstName | string | Player's first or given name. |
Player.lastName | string | Player's last or family name. |
Player.name | string | Canonical full player name. |
Player.teamId | integer | null | Normalized current team identifier. |
Player.sportId | integer | null | Normalized sport identifier. |
Player.leagueId | integer | null | Normalized league identifier. |
Player.TruthTeam | Team | null | Normalized team associated with the player. |
Subbet.Event | object | null | Normalized sporting event associated with the leg. |
Event.id | integer | Unique normalized event identifier. |
Event.name | string | null | Event or tournament name when one exists. |
Event.startDate | datetime | null | Scheduled event start in ISO 8601 format. |
Event.exactStartTime | datetime | null | Confirmed exact start time, when available. |
Event.type | string | Event classification, such as Game, Match, or Tournament. |
Event.player1Id / player2Id | integer | null | Normalized participant identifiers for head-to-head player events. |
Event.homeTeamId / awayTeamId | integer | null | Normalized home and away team identifiers. |
Event.status | string | null | Event lifecycle status, such as Scheduled, Live, or Final. |
Event.parentEventId | integer | null | Parent tournament or event identifier. |
Event.sportId | integer | null | Normalized event sport identifier. |
Event.leagueId | integer | null | Normalized event league identifier. |
Event.description | string | null | Additional event description when available. |
Event.Player1 / Player2 | EventPlayer | null | Normalized event competitors. |
EventPlayer.id | integer | Unique normalized player identifier. |
EventPlayer.firstName | string | Competitor's first or given name. |
EventPlayer.lastName | string | Competitor's last or family name. |
EventPlayer.teamId | integer | null | Competitor's normalized team identifier. |
Event.HomeTeam / AwayTeam | Team | null | Normalized home and away teams using the Team fields above. |
Event.ParentEvent | object | null | Parent tournament or event, using the same external event fields. |
Event.Sport / League | Affiliation | null | Normalized sport and league. |
Subbet.BetResult | object | null | Leg settlement result with id and name. |
BetResult.id | integer | Unique leg-result identifier. |
BetResult.name | string | Human-readable leg settlement result. |
Subbet.Sport / League | Affiliation | null | Normalized sport and league for the leg. |
Affiliation.id | integer | Unique sport or league identifier. |
Affiliation.name | string | Canonical sport or league name. |
Errors
Resource errors use an error field. OAuth protocol errors use error and error_description.
X-OAuth-Client-Id header is requiredEvery external API request must identify its OAuth client.
cursor is invalidThe supplied bet cursor is malformed or was not issued by Juice Reel.
invalid_request / invalid_grantOAuth form fields are malformed, the code is expired or consumed, PKCE failed, or the refresh token is invalid.
Invalid OAuth access tokenThe bearer token is missing, expired, revoked, belongs to another client, or its grant is no longer active.
invalid_clientClient ID, client secret, or HTTP Basic authentication is invalid.
The access token requires the requested scopeThe grant does not contain the scope required by this resource.
Internal server errorA transient server failure occurred. Retry idempotent GET requests with exponential backoff.