{
  "openapi": "3.0.1",
  "info": {
    "title": "Pinnacle Sportsbook Odds Scraper",
    "description": "Scrape Pinnacle odds for any sport, league, or match: moneyline, spread, total, team totals, alternate lines, period markets and props, with bet limits, implied probability, bookmaker margin and no-vig fair odds on every row. No login, no API key, no proxy.",
    "version": "0.0",
    "x-build-id": "KVBQ9WUSmaaFYr9CA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~pinnacle-odds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-pinnacle-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/parseforge~pinnacle-odds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-pinnacle-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/parseforge~pinnacle-odds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-pinnacle-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "sports": {
            "title": "Sports",
            "type": "array",
            "description": "Pinnacle sports to read, by name or numeric id. Every league of the sport that currently has markets is read, most featured first.\n\nExamples:\n- Soccer\n- Tennis\n- Basketball\n- 29",
            "items": {
              "type": "string"
            }
          },
          "leagues": {
            "title": "Leagues",
            "type": "array",
            "description": "League ids, or a piece of a league name. Names are matched against every sport listed above, or across all active sports when no sport is given.\n\nExamples:\n- England - Premier League\n- NBA\n- 1980",
            "items": {
              "type": "string"
            }
          },
          "matchupIds": {
            "title": "Matchup IDs",
            "type": "array",
            "description": "Individual Pinnacle matchup (event) ids. Use these to re-read the same games on a schedule.\n\nExample: 1634440437",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Pinnacle URLs",
            "type": "array",
            "description": "Pinnacle match or league pages. A match page ends in the matchup id; a league page is resolved by its slug.\n\nExamples:\n- https://www.pinnacle.com/en/soccer/england-premier-league/matchups/\n- https://www.pinnacle.com/en/soccer/england-premier-league/sunderland-vs-fulham/1634440437/",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 200000,
            "type": "integer",
            "description": "Total matchups to write across every source in this run. Free Apify plans return a 10-row preview."
          },
          "maxLeaguesPerSport": {
            "title": "Leagues per sport",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap how many leagues are read from each sport, so one busy sport such as Soccer cannot use up the whole run. Leave empty to read every league with markets."
          },
          "maxMatchupsPerLeague": {
            "title": "Matchups per league",
            "minimum": 1,
            "maximum": 200000,
            "type": "integer",
            "description": "Cap how many matchups are taken from each league. Leave empty to let Maximum rows decide."
          },
          "onlyLive": {
            "title": "Live matchups only",
            "type": "boolean",
            "description": "Keep only games that are in play. With sports as the only source this switches to Pinnacle's live feed, which returns every live game of a sport in two requests instead of walking its leagues.",
            "default": false
          },
          "onlyPrematch": {
            "title": "Pre-match only",
            "type": "boolean",
            "description": "Drop games that are already in play.",
            "default": false
          },
          "includeSpecialsAsRows": {
            "title": "Include specials as their own rows",
            "type": "boolean",
            "description": "Also write prop and futures markets (Correct Score, Both Teams To Score, Regular Season Wins, Goalscorer) as separate rows. Off by default, so a row is one game.",
            "default": false
          },
          "leagueGroups": {
            "title": "Country or region",
            "type": "array",
            "description": "Keep only leagues whose group matches one of these, case-insensitive. Pinnacle groups leagues by country or confederation.\n\nExamples:\n- England\n- Spain\n- UEFA",
            "items": {
              "type": "string"
            }
          },
          "leagueNameContains": {
            "title": "League name contains",
            "type": "array",
            "description": "Keep only leagues whose name contains one of these, case-insensitive.\n\nExample: Premier",
            "items": {
              "type": "string"
            }
          },
          "teamNameContains": {
            "title": "Team or player name contains",
            "type": "array",
            "description": "Keep only matchups where a participant name (or a special's description) contains one of these, case-insensitive.\n\nExamples:\n- Arsenal\n- Djokovic",
            "items": {
              "type": "string"
            }
          },
          "startsWithinHours": {
            "title": "Starts within (hours)",
            "minimum": 1,
            "maximum": 8760,
            "type": "integer",
            "description": "Keep only matchups starting inside this many hours from now. 24 gives you today and tonight; 168 gives you the week."
          },
          "startsAfter": {
            "title": "Starts after",
            "type": "string",
            "description": "Keep only matchups starting on or after this moment (YYYY-MM-DD or a full ISO timestamp)."
          },
          "startsBefore": {
            "title": "Starts before",
            "type": "string",
            "description": "Keep only matchups starting on or before this moment (YYYY-MM-DD or a full ISO timestamp)."
          },
          "minMoneylinePrice": {
            "title": "Minimum moneyline price",
            "minimum": -100000,
            "maximum": 100000,
            "type": "integer",
            "description": "American odds floor. A matchup is kept when at least one moneyline side sits inside the band. -200 keeps out heavy favourites."
          },
          "maxMoneylinePrice": {
            "title": "Maximum moneyline price",
            "minimum": -100000,
            "maximum": 100000,
            "type": "integer",
            "description": "American odds ceiling for the same band. 500 keeps out long shots."
          },
          "maxMarginPercent": {
            "title": "Maximum bookmaker margin (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only matchups whose main moneyline holds at most this much vig. Pinnacle's top soccer books sit near 2%; a value of 3 keeps only the sharpest markets."
          },
          "minMaxStake": {
            "title": "Minimum bet limit",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Keep only matchups whose main market accepts at least this maximum stake, in the account currency. Pinnacle raises limits on the markets it is most confident in, so this filters for liquidity."
          },
          "onlyOpenMarkets": {
            "title": "Open markets only",
            "type": "boolean",
            "description": "Drop matchups whose main period is suspended or closed.",
            "default": false
          },
          "requirePrimaryMarket": {
            "title": "Require a priced main market",
            "type": "boolean",
            "description": "Drop matchups with no moneyline, spread, or total on the main period. On by default, so you never get an empty row.",
            "default": true
          },
          "oddsFormats": {
            "title": "Odds formats",
            "type": "array",
            "description": "Which price formats to write on every selection. American and decimal are the default; the rest are added as extra fields.",
            "items": {
              "type": "string",
              "enum": [
                "american",
                "decimal",
                "fractional",
                "hongKong",
                "indonesian",
                "malay"
              ],
              "enumTitles": [
                "American (-110)",
                "Decimal (1.91)",
                "Fractional (10/11)",
                "Hong Kong (0.91)",
                "Indonesian (-1.10)",
                "Malay (0.91)"
              ]
            },
            "default": [
              "american",
              "decimal"
            ]
          },
          "includeAlternateLines": {
            "title": "Alternate lines",
            "type": "boolean",
            "description": "Attach the full alternate spread and total ladder, each rung priced with its own margin and fair odds. Billed as `alternate-lines`, once per matchup that has any.",
            "default": false
          },
          "includePeriodMarkets": {
            "title": "Period markets",
            "type": "boolean",
            "description": "Attach the halves, quarters, sets, maps, or innings books, labelled per sport. Billed as `period-markets`, once per matchup that has any.",
            "default": false
          },
          "includeTeamTotals": {
            "title": "Team totals",
            "type": "boolean",
            "description": "Attach each side's own over/under book. Billed as `team-totals`, once per matchup that has any.",
            "default": false
          },
          "includeProps": {
            "title": "Props and specials",
            "type": "boolean",
            "description": "Attach the matchup's prop book: Correct Score, Both Teams To Score, Double Chance, Half-Time/Full-Time, player and team props, each with priced selections. This is the largest block by far. Billed as `prop-markets`, once per matchup that has any.",
            "default": false
          },
          "includeLiveOdds": {
            "title": "Cross-check in-play games against the live feed",
            "type": "boolean",
            "description": "Pinnacle serves its public board through a CDN, so a league page can be several minutes behind. For games in play this reads the sport's live feed as well and keeps whichever board version is newer. Measured on 8 live games, the live feed was the fresher copy 8 times out of 8. Costs two requests per sport, not per match. Billed as `live-odds`, once per match that actually got a newer board.",
            "default": false
          },
          "trackLineMovement": {
            "title": "Track line movement",
            "type": "boolean",
            "description": "Take a second odds snapshot after a hold and attach what moved: every price and handicap that changed, with direction and probability delta. Rows are written after the second snapshot. Pinnacle's public board is cached for about 15 minutes, so the hold has to outlast that cache to see anything. Billed as `line-movement`, once per row, and only when the board actually reloaded.",
            "default": false
          },
          "lineMovementDelaySecs": {
            "title": "Line movement window (seconds)",
            "minimum": 60,
            "maximum": 1800,
            "type": "integer",
            "description": "How long to hold between the two snapshots, from 60 to 1800 seconds. Pinnacle's public board is CDN-cached for about 900 seconds, so anything shorter usually returns the same board and reports no movement. 900 is the default for that reason. The window is shortened automatically if the run timeout is closer than that."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}