{
  "openapi": "3.0.1",
  "info": {
    "title": "Sports Odds Arbitrage & Value Bet Finder",
    "description": "Compare live and pre-match odds across Pinnacle, Bovada, BetRivers and Unibet. Best price per outcome, Pinnacle fair odds, surebets with stake split, +EV value bets. NFL, NBA, MLB, NHL, soccer, tennis, UFC, boxing. No proxy.",
    "version": "1.0",
    "x-build-id": "hFHWL4HGD2DJBteGv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/normdata~sports-odds-arbitrage-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-normdata-sports-odds-arbitrage-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/normdata~sports-odds-arbitrage-scraper/runs": {
      "post": {
        "operationId": "runs-sync-normdata-sports-odds-arbitrage-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/normdata~sports-odds-arbitrage-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-normdata-sports-odds-arbitrage-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": {
          "maxItems": {
            "title": "Maximum games",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many games. Leave empty for no limit (every game the books share). The Apify Free plan is always capped at 10."
          },
          "bookmakers": {
            "title": "Bookmakers to compare",
            "type": "array",
            "description": "The books whose odds are compared side by side. Pinnacle is the sharp reference used for fair odds and value bets, so keep it in. BetRivers and Unibet are priced on Kambi but set their own odds, so both are worth comparing.",
            "items": {
              "type": "string",
              "enum": [
                "pinnacle",
                "bovada",
                "betrivers",
                "unibet"
              ],
              "enumTitles": [
                "Pinnacle",
                "Bovada",
                "BetRivers",
                "Unibet"
              ]
            },
            "default": [
              "pinnacle",
              "bovada",
              "betrivers",
              "unibet"
            ]
          },
          "betriversState": {
            "title": "BetRivers state",
            "enum": [
              "nj",
              "pa",
              "ny",
              "il",
              "mi",
              "oh",
              "az",
              "co",
              "in",
              "va",
              "md",
              "la",
              "wv",
              "on"
            ],
            "type": "string",
            "description": "Where you bet at BetRivers. Odds are the same in every state; the state sets which games are offered (some states ban college or in-state teams) and where the links point.",
            "default": "nj"
          },
          "unibetCountry": {
            "title": "Unibet country",
            "enum": [
              "uk",
              "se",
              "dk",
              "nl",
              "be",
              "ca"
            ],
            "type": "string",
            "description": "Where you bet at Unibet. Odds are the same in every country; the country sets the game menu and where the links point.",
            "default": "uk"
          },
          "minBookmakers": {
            "title": "Minimum bookmakers per game",
            "minimum": 1,
            "type": "integer",
            "description": "Only games priced by at least this many of your books. 2 is the least that lets you compare.",
            "default": 2
          },
          "sports": {
            "title": "Sports",
            "type": "array",
            "description": "Only these sports. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "american_football",
                "basketball",
                "baseball",
                "ice_hockey",
                "soccer",
                "tennis",
                "mma",
                "boxing"
              ],
              "enumTitles": [
                "American Football (NFL, NCAAF, CFL)",
                "Basketball (NBA, WNBA, NCAAB, EuroLeague)",
                "Baseball (MLB, KBO, NPB)",
                "Ice Hockey (NHL, AHL, SHL, KHL)",
                "Soccer",
                "Tennis (ATP, WTA, Challenger)",
                "UFC / MMA",
                "Boxing"
              ]
            }
          },
          "leagues": {
            "title": "Leagues or countries",
            "type": "array",
            "description": "Only games whose league name (at any of the books) contains one of these, e.g. \"NFL\", \"NBA\", \"Premier League\", \"ATP\", \"England\". Leave empty for every league.",
            "items": {
              "type": "string"
            }
          },
          "teams": {
            "title": "Teams or players",
            "type": "array",
            "description": "Only games with one of these teams or players, e.g. \"Chiefs\", \"Real Madrid\", \"Sinner\". Whole words; accents and case do not matter.",
            "items": {
              "type": "string"
            }
          },
          "eventStatus": {
            "title": "Game status",
            "enum": [
              "all",
              "upcoming",
              "live"
            ],
            "type": "string",
            "description": "Upcoming games, games in play right now, or both. Live prices move by the second, so live arbitrage closes fast.",
            "default": "all"
          },
          "startsWithinHours": {
            "title": "Starts within (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "Only games starting in the next N hours, e.g. 24 for the next day. Live games are always included. Leave empty for every scheduled game."
          },
          "markets": {
            "title": "Markets",
            "type": "array",
            "description": "Which markets to compare. Leave empty for all: moneyline (2-way), 1X2 (3-way, soccer and hockey regulation time), spread (handicap, puck line, run line) and total (over/under).",
            "items": {
              "type": "string",
              "enum": [
                "moneyline",
                "moneyline_3way",
                "spread",
                "total"
              ],
              "enumTitles": [
                "Moneyline (2-way)",
                "1X2 / 3-way moneyline",
                "Spread / handicap",
                "Total (over/under)"
              ]
            }
          },
          "alternateLines": {
            "title": "Include alternate lines",
            "type": "boolean",
            "description": "Also compare Pinnacle alternate spreads and totals wherever another book prices the same line. More lines, more chances to find an edge.",
            "default": true
          },
          "onlyArbitrage": {
            "title": "Only games with an arbitrage",
            "type": "boolean",
            "description": "Keep only games where backing every outcome at the best price locks in a profit (surebets).",
            "default": false
          },
          "minArbitrageProfit": {
            "title": "Minimum arbitrage profit (%)",
            "minimum": 0,
            "type": "number",
            "description": "Ignore arbitrages paying less than this, e.g. 1 for 1% or more.",
            "default": 0
          },
          "onlyValueBets": {
            "title": "Only games with a value bet",
            "type": "boolean",
            "description": "Keep only games where a book pays more than the fair odds (Pinnacle price with its margin removed), i.e. positive expected value (+EV).",
            "default": false
          },
          "minValueEdge": {
            "title": "Minimum value edge (%)",
            "minimum": 0,
            "type": "number",
            "description": "How far above the fair odds a price must be to count as a value bet, e.g. 2 for 2% or more.",
            "default": 2
          },
          "sortBy": {
            "title": "Sort games by",
            "enum": [
              "startTime",
              "arbitrage",
              "value"
            ],
            "type": "string",
            "description": "Order of the rows.",
            "default": "startTime"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}