{
  "openapi": "3.0.1",
  "info": {
    "title": "Fonbet Scraper - Live Sports Odds, Scores & Betting Markets",
    "description": "Scrape Fonbet (fonbet.ru) sports betting events by sport, tournament, team or URL. Extract odds across all markets, live scores, match clocks, teams, start times, promotions and sub-events including halves, corners and cards.",
    "version": "0.1",
    "x-build-id": "8AqbEg9FMGFwQtVyD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~fonbet-ru-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-fonbet-ru-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/abotapi~fonbet-ru-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-fonbet-ru-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/abotapi~fonbet-ru-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-fonbet-ru-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "search = pick sports, tournaments or teams and let the actor build the list of events. url = paste fon.bet or fonbet.ru pages (home, sport, tournament, event, live ...).",
            "default": "search"
          },
          "sports": {
            "title": "Sports",
            "type": "array",
            "description": "Only events of these sports. Leave empty for every sport. Only applies when mode = search.",
            "items": {
              "type": "string",
              "enum": [
                "football",
                "hockey",
                "tennis",
                "basketball",
                "esports",
                "table-tennis",
                "volleyball",
                "handball",
                "mix-fights",
                "boxing",
                "futsal",
                "baseball",
                "rugby",
                "floorball",
                "bandy",
                "billiard",
                "am-football",
                "australian-football",
                "cricket",
                "racing",
                "basketball-3x3",
                "darts",
                "badminton",
                "sport-2",
                "chess",
                "gaelic-football",
                "alpine-ski",
                "biathlon",
                "ski-jumping"
              ],
              "enumTitles": [
                "Football",
                "Ice hockey",
                "Tennis",
                "Basketball",
                "Esports",
                "Table tennis",
                "Volleyball",
                "Handball",
                "Martial arts",
                "Boxing",
                "Futsal",
                "Baseball",
                "Rugby",
                "Floorball",
                "Bandy",
                "Billiards",
                "American football",
                "Australian football",
                "Cricket",
                "Motorsport",
                "Basketball 3x3",
                "Darts",
                "Badminton",
                "Sport (other)",
                "Chess",
                "Gaelic sports",
                "Alpine skiing",
                "Biathlon",
                "Ski jumping"
              ]
            }
          },
          "tournaments": {
            "title": "Tournaments",
            "type": "array",
            "description": "Only events of tournaments whose name contains one of these words (for example Premier League, UEFA Nations League) or whose numeric tournament id equals one of them. Only applies when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Team or event keywords",
            "type": "array",
            "description": "Only events where a team, the event name, the tournament or the sport contains one of these words. Only applies when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "eventStatus": {
            "title": "Live or pre-match",
            "enum": [
              "all",
              "line",
              "live"
            ],
            "type": "string",
            "description": "Pre-match lists upcoming events, live lists events in play right now. Only applies when mode = search.",
            "default": "all"
          },
          "startsWithinHours": {
            "title": "Starting within (hours)",
            "minimum": 0,
            "type": "integer",
            "description": "Only pre-match events that start within this many hours from now. Live events are always kept. Leave empty or 0 for no limit. Only applies when mode = search."
          },
          "onlyTopEvents": {
            "title": "Top events only",
            "type": "boolean",
            "description": "Only the events the site features as top and top live events. Only applies when mode = search.",
            "default": false
          },
          "language": {
            "title": "Language",
            "enum": [
              "ru",
              "en"
            ],
            "type": "string",
            "description": "Language of team, tournament and market names. In URL mode, English is used when every pasted page is an /en/ link; if any pasted link is not an /en/ link, this Language setting decides.",
            "default": "ru"
          },
          "urls": {
            "title": "Page URLs",
            "type": "array",
            "description": "Paste one or more fon.bet or fonbet.ru pages: the home page, a sport (/sports/football), a tournament (/sports/football/46065), an event (/sports/football/46065/69507114), the live page (/live, /live/football) or the promotions page. Pages that list no events of their own (results, statistics, help) read the whole line. Several URLs are supported. The search fields above are ignored in this mode. Left untouched, URL mode reads one example of each supported page type.",
            "default": [
              "https://fon.bet/",
              "https://www.fonbet.ru/",
              "https://fon.bet/sports",
              "https://fon.bet/sports/football",
              "https://fon.bet/sports/football/46065",
              "https://fon.bet/sports/football/46065/69507114",
              "https://fon.bet/live",
              "https://fon.bet/live/football",
              "https://fon.bet/results",
              "https://fon.bet/statistic",
              "https://fon.bet/promos/actions",
              "https://fon.bet/apps/android",
              "https://fon.bet/sports/football?utm_source=x&utm_medium=y",
              "https://fon.bet/en/sports/football",
              "https://fon.bet/help-center/vopros-otvet",
              "https://fon.bet/sitemap.xml",
              "https://fonbet.ru/",
              "https://www.fonbet.ru/sports/football/46065/69507114"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full market detail",
            "type": "boolean",
            "description": "Fetch every event's complete market list, including the markets of its sub-events (halves, corners, cards, players ...). Turn off for one lighter row per event with the main odds only.",
            "default": true
          },
          "includeResults": {
            "title": "Final scores of past games",
            "type": "boolean",
            "description": "Also return the final result of every FINISHED game in your selection (search mode: your sports, tournaments and team terms; URL mode: sport, tournament and home pages): home and away team, final score, winner, period scores, match statistics where published, sport, league and start time, and the odds event id when the game is still on the line. One row per finished game (record type result); games not played, interrupted or still running are never returned. The live / pre-match, start-window and top-events filters apply to odds rows only. Each result row is one dataset item and counts toward Max items.",
            "default": false
          },
          "resultsDaysBack": {
            "title": "Results: days back",
            "minimum": 1,
            "maximum": 14,
            "type": "integer",
            "description": "How many days back to collect final scores (1 to 14, Moscow-time days). Only used when Final scores of past games is on.",
            "default": 2
          },
          "maxPages": {
            "title": "Max pages per run",
            "minimum": 1,
            "type": "integer",
            "description": "Optional safety stop on how many pasted pages or sport searches are read in total. This does NOT cap the run: leave it empty for unlimited pages and the run is bounded solely by Max items."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The run's single hard cap: maximum event rows across all searches. Defaults to 20 (also when the field is omitted through the API). Set 0 for unlimited. This is the only default limit; Max pages is unlimited by default and defers to this.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Connection used for requests. The standard Apify proxy (datacenter) is preselected and served the data in our checks, so no change is needed; Residential is optional. When the selected connection keeps failing, the run may move to a residential connection (with a per-run traffic budget), billed to your Apify plan.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for rows already collected there. For recurring monitoring of the same search, use Incremental changes below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes",
            "type": "boolean",
            "description": "For recurring runs, return only NEW, UPDATED and REAPPEARED events; events unchanged since the last run are not returned or billed. Each event is compared on every field (sport, tournament, event details, score, odds, sub-events) except the scrape time, the running match clock (live.timer, live.timerSeconds), event.willStartSoon, the market-list sizes (countAll) and publicPromos, which stay in the output but never count as a change. Each row gets changeType, changedFields, firstSeenAt and lastSeenAt; outside incremental mode these four fields are empty. Final-score result rows are compared on their status and final score only, are returned once per game and are never marked expired. The baseline is kept per State key; changing the sports, tournaments or pasted pages starts a new baseline unless State key is set (the final-score settings never start a new baseline).",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Incremental mode only. Optional name for this campaign's saved baseline. Leave empty to derive it from the selected sports, tournaments or pasted pages, so each distinct search keeps its own baseline."
          },
          "emitUnchanged": {
            "title": "Emit unchanged",
            "type": "boolean",
            "description": "Incremental mode only. Also return (and bill as normal rows) events whose values did not change.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired",
            "type": "boolean",
            "description": "Incremental mode only. Return an EXPIRED row for events no longer listed after Expire after missed scans complete scans (billed like any returned row). EXPIRED means the event was not in the scanned list (it started, finished or was withdrawn). Only after a complete scan: a Max items or Max pages cut, a keyword, status, start-window or top-events filter, a resume, an early stop or a failed read disables it.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after missed scans",
            "minimum": 1,
            "type": "integer",
            "description": "Incremental mode only. How many complete scans in a row must miss an event before it is reported EXPIRED.",
            "default": 1
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Extra field names (dotted for nested, e.g. odds or live.scores) that never mark a row as UPDATED and are left out of changedFields; they stay in the output. Changing this list re-bases the saved events once without reporting them as changed. live.timer, live.timerSeconds, event.willStartSoon, countAll and publicPromos are always ignored.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}