{
  "openapi": "3.0.1",
  "info": {
    "title": "BestFightOdds MMA Odds Scraper",
    "description": "UFC and MMA betting odds from BestFightOdds: every sportsbook's moneyline and props, consensus opening and closing lines back to 2008, and full timestamped line movement.",
    "version": "0.1",
    "x-build-id": "n8hfPEPCoIXrZxVRa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/artsiom_k~bestfightodds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-artsiom_k-bestfightodds-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/artsiom_k~bestfightodds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-artsiom_k-bestfightodds-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/artsiom_k~bestfightodds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-artsiom_k-bestfightodds-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": {
          "entityType": {
            "title": "Data type",
            "enum": [
              "odds",
              "lineHistory",
              "fighters"
            ],
            "type": "string",
            "description": "\"odds\": one row per side of a market per fight, with every listed sportsbook's price, the best price and the consensus opening and closing line. \"lineHistory\": one row per recorded price change, per sportsbook and for the consensus. \"fighters\": one row per fighter with every fight's opening odds and closing range.",
            "default": "odds"
          },
          "promotions": {
            "title": "Promotions",
            "type": "array",
            "description": "Promotions to scrape. Empty = every promotion BestFightOdds covers.",
            "items": {
              "type": "string",
              "enum": [
                "ufc",
                "dwcs",
                "pfl",
                "bellator",
                "one",
                "rizin",
                "lfa",
                "cage-warriors",
                "ksw",
                "oktagon",
                "bkfc",
                "cffc",
                "aca",
                "brave",
                "uae-warriors",
                "invicta",
                "efc",
                "karate-combat",
                "strikeforce"
              ],
              "enumTitles": [
                "UFC",
                "Dana White's Contender Series",
                "PFL",
                "Bellator",
                "ONE Championship",
                "Rizin",
                "LFA",
                "Cage Warriors",
                "KSW",
                "Oktagon",
                "Bare Knuckle FC",
                "Cage Fury FC",
                "ACA",
                "Brave CF",
                "UAE Warriors",
                "Invicta FC",
                "EFC",
                "Karate Combat",
                "Strikeforce"
              ]
            },
            "default": [
              "ufc"
            ]
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Optional BestFightOdds event pages (https://www.bestfightodds.com/events/ufc-edmonton-4403) or fighter pages (.../fighters/jon-jones-819). When set, they replace the promotion and date selection.",
            "items": {
              "type": "string"
            }
          },
          "dateFrom": {
            "title": "Events from (YYYY-MM-DD)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Only events on or after this date. Events go back to 2007; sportsbook prices per book exist from about 2021, the consensus line for every year."
          },
          "dateTo": {
            "title": "Events to (YYYY-MM-DD)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Only events on or before this date."
          },
          "includeProps": {
            "title": "Include prop markets",
            "type": "boolean",
            "description": "Odds and line history: add every prop market (method of victory, rounds over/under, goes the distance, round betting, significant strikes and more; often 50+ per fight) next to the moneyline.",
            "default": false
          },
          "consensus": {
            "title": "Consensus opening and closing line",
            "enum": [
              "moneyline",
              "all",
              "none"
            ],
            "type": "string",
            "description": "Odds only: add the consensus (average of books) opening and closing price, when it opened and last moved, its range and how often it moved. One extra request per row, so for props it is slow (about 1 to 2 minutes per event). For events before about 2021 it is the only price there is.",
            "default": "moneyline"
          },
          "historyBooks": {
            "title": "Line history for",
            "enum": [
              "all",
              "consensus",
              "books"
            ],
            "type": "string",
            "description": "Line history only: the consensus line, each sportsbook's own line, or both.",
            "default": "all"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after pushing this many rows. Defaults to 50 - a fast, cheap preview. Set to null for everything in your selection.",
            "default": 50
          },
          "mode": {
            "title": "Incremental mode",
            "enum": [
              "auto",
              "full",
              "incremental"
            ],
            "type": "string",
            "description": "Odds only. \"incremental\" returns only rows that are new or whose prices moved since the last complete run; \"full\" returns everything. \"auto\" is incremental when Max results is cleared and an earlier run exists.",
            "default": "auto"
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Requests in flight at once. The site starts refusing requests above about 10.",
            "default": 6
          },
          "impersonate": {
            "title": "TLS impersonation target",
            "enum": [
              "chrome",
              "firefox",
              "safari"
            ],
            "type": "string",
            "description": "Browser TLS fingerprint. Change only if requests are blocked.",
            "default": "chrome"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings. Not needed in testing.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}