{
  "openapi": "3.0.1",
  "info": {
    "title": "Betano Odds Scraper — Live + All Markets, 14 Countries",
    "description": "Scrape Betano betting odds from 14 country books at $3 per 1,000 events: pre-match and in-play with score and clock, 600+ markets per game · the same match priced across countries · changed-odds-only monitoring · decimal, fractional and American prices.",
    "version": "0.1",
    "x-build-id": "ZNMKJhhbpkjfSeEW6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~betano-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-betano-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/blackfalcondata~betano-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-betano-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/blackfalcondata~betano-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-betano-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": {
          "country": {
            "title": "🌍 Country book",
            "enum": [
              "DE",
              "BR",
              "PT",
              "RO",
              "DK",
              "CZ",
              "BG",
              "PE",
              "AR",
              "CL",
              "EC",
              "NG",
              "GH",
              "CA"
            ],
            "type": "string",
            "description": "Which Betano country site prices the rows. Each site is a separate book with its own odds and its own fixture list.",
            "default": "DE"
          },
          "sport": {
            "title": "🏟️ Sport",
            "enum": [
              "football",
              "tennis",
              "basketball",
              "ice-hockey",
              "handball",
              "esports",
              "baseball",
              "american-football",
              "mma",
              "boxing",
              "volleyball",
              "table-tennis",
              "darts",
              "cricket",
              "rugby-union",
              "rugby-league",
              "golf",
              "snooker",
              "futsal",
              "formula-1",
              "motorsport",
              "cycling",
              "speedway",
              "badminton",
              "winter-sports",
              "beach-volleyball",
              "motogp",
              "water-polo",
              "politics"
            ],
            "type": "string",
            "description": "One sport per run. The coupon, the league list and the market tabs are all sport specific.",
            "default": "football"
          },
          "sports": {
            "title": "🏟️ Sports (several per run)",
            "type": "array",
            "description": "Pick several sports for one run. When set it replaces the single Sport above. The coupon, league resolution, outrights and live matches are then done for each sport in turn.",
            "items": {
              "type": "string",
              "enum": [
                "football",
                "tennis",
                "basketball",
                "ice-hockey",
                "handball",
                "esports",
                "baseball",
                "american-football",
                "mma",
                "boxing",
                "volleyball",
                "table-tennis",
                "darts",
                "cricket",
                "rugby-union",
                "rugby-league",
                "golf",
                "snooker",
                "futsal",
                "formula-1",
                "motorsport",
                "cycling",
                "speedway",
                "badminton",
                "winter-sports",
                "beach-volleyball",
                "motogp",
                "water-polo",
                "politics"
              ],
              "enumTitles": [
                "Football",
                "Tennis",
                "Basketball",
                "Ice Hockey",
                "Handball",
                "Esports",
                "Baseball",
                "American Football",
                "MMA",
                "Boxing",
                "Volleyball",
                "Table Tennis",
                "Darts",
                "Cricket",
                "Rugby Union",
                "Rugby League",
                "Golf",
                "Snooker",
                "Futsal",
                "Formula 1",
                "Motorsport",
                "Cycling",
                "Speedway",
                "Badminton",
                "Winter Sports",
                "Beach Volleyball",
                "MotoGP",
                "Water Polo",
                "Politics"
              ]
            },
            "default": []
          },
          "leagues": {
            "title": "🏆 Leagues",
            "type": "array",
            "description": "Leave empty for the whole coupon (see Hours ahead). Otherwise list leagues by name (\"Premier League\", \"LaLiga\", \"Brasileirao Serie A\"), by Betano league id (\"1\", \"216\") or by pasting the league page URL. Names are matched against the chosen sport's league list on the chosen country site.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "allLeagues": {
            "title": "🗂️ Every league",
            "type": "boolean",
            "description": "Covers every league the book lists for the chosen sports, instead of only the matches starting in the next few hours. Use it to pull a whole sport rather than a time window. This is a much larger run: the Danish book alone lists 209 football leagues across 89 regions, so set Maximum events to something you actually want to pay for. Ignored when you name specific leagues, paste URLs or ask for live matches, because those are already an explicit scope.",
            "default": false
          },
          "eventUrls": {
            "title": "⚽ Event URLs or ids",
            "type": "array",
            "description": "Specific matches: paste Betano event page URLs from any country site, or bare event ids (\"90925073\"). These are fetched in addition to any leagues or coupon.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "teamUrls": {
            "title": "🏟️ Team page URLs",
            "type": "array",
            "description": "Paste Betano team page URLs from any country site. Every upcoming match of that team is returned; the site in the URL selects the book.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "searchQueries": {
            "title": "🔍 Search matches by name",
            "type": "array",
            "description": "Team, player or competition names. Each query is one lookup on the chosen country site, and every matching upcoming or live match becomes an event. Free-text names are matched by Betano's own search, so \"Man City\" and \"Manchester City\" both work.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "playerUrls": {
            "title": "🧍 Player page URLs",
            "type": "array",
            "description": "Paste Betano player page URLs from any country site. Every upcoming match of that player is returned, carrying that player's own markets: shots, assists, tackles, cards and goalscorer prices. The site in the URL selects the book.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Any Betano page URL: a league, a region, a sport, a team, a player, a coupon page, an outrights page or an event. The site in the URL selects the country book for that URL. A region URL returns every league of that region.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "hoursAhead": {
            "title": "🕒 Hours ahead",
            "enum": [
              "3",
              "12",
              "24"
            ],
            "type": "string",
            "description": "Coupon window used when no leagues, events or start URLs are given: every match of the chosen sport starting within the next 3, 12 or 24 hours.",
            "default": "24"
          },
          "daysAhead": {
            "title": "📅 Days ahead",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only matches starting within this many days from now. 0 keeps every upcoming match Betano lists. Applies to leagues, teams, regions and pasted start URLs; it does not apply to the hours-ahead coupon.",
            "default": 0
          },
          "maxEvents": {
            "title": "💯 Max events",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many events (0 = no limit). Applies across the whole run: every sport, league, coupon and URL in it shares the one budget, in the order they are listed.",
            "default": 100
          },
          "markets": {
            "title": "📊 Markets",
            "type": "array",
            "description": "\"Headline markets\" uses the odds shown on the listing (match result, over/under, both teams to score) with no extra page per event. Every other choice opens each event page: \"All markets\" returns the book’s own combined list, and the specific tabs return one market group each. You can combine them: on a large fixture the individual tabs carry markets the combined list does not, so picking \"All markets\" plus the tabs you care about returns more than \"All markets\" alone, at one extra lookup per tab.",
            "items": {
              "type": "string",
              "enum": [
                "main",
                "all",
                "popular",
                "overunder",
                "players",
                "goals",
                "corners",
                "cards",
                "handicap",
                "asian",
                "halves",
                "specials",
                "minutes",
                "stats",
                "lineups"
              ],
              "enumTitles": [
                "Headline markets (from the listing)",
                "All markets",
                "Popular",
                "Over/Under",
                "Player markets",
                "Goals",
                "Corners",
                "Cards",
                "Handicap",
                "Asian lines",
                "Half time",
                "Specials",
                "Minutes",
                "Statistics",
                "Lineup markets (per player, from the teamsheet)"
              ]
            },
            "default": [
              "main"
            ]
          },
          "liveMatches": {
            "title": "🔴 Live matches (in-play)",
            "type": "boolean",
            "description": "Also return every match of the chosen sport that is in play right now, with the current score, match clock, period and live odds. Headline markets come from the live overview; any other market choice opens each live match for all of its live markets. Comparing a live match across country books is skipped, because a second book's in-play price is already stale by the time it arrives.",
            "default": false
          },
          "compareCountries": {
            "title": "🔀 Compare with other country books",
            "type": "array",
            "description": "Also price each event's headline markets on these Betano country sites and attach them as oddsByCountry. Betano prices the same match differently per country, so this gives an in-house odds comparison. Each extra country adds one listing lookup per event.",
            "items": {
              "type": "string",
              "enum": [
                "DE",
                "BR",
                "PT",
                "RO",
                "DK",
                "CZ",
                "BG",
                "PE",
                "AR",
                "CL",
                "EC",
                "NG",
                "GH",
                "CA"
              ],
              "enumTitles": [
                "Germany",
                "Brazil",
                "Portugal",
                "Romania",
                "Denmark",
                "Czechia",
                "Bulgaria",
                "Peru",
                "Argentina",
                "Chile",
                "Ecuador",
                "Nigeria",
                "Ghana",
                "Canada, Ontario (experimental)"
              ]
            },
            "default": []
          },
          "includeOutrights": {
            "title": "🏅 Include outrights",
            "type": "boolean",
            "description": "Add competition winner markets (league winner, tournament winner) for the chosen sport as extra rows with outright: true.",
            "default": false
          },
          "includeLive": {
            "title": "🔴 Include matches already started",
            "type": "boolean",
            "description": "By default only matches that have not kicked off are returned. Turn this on to also return in-play matches with a snapshot of their current odds (isLive: true).",
            "default": false
          },
          "includeLogos": {
            "title": "🖼️ Team logos and flags",
            "type": "boolean",
            "description": "Adds team logo URLs, jersey colours, the league logo URL and the region flag URL to every event. Costs one extra lookup per country in the run. Coverage is partial: Betano publishes kit colours for most clubs, and crests mainly for national teams.",
            "default": false
          },
          "includeStats": {
            "title": "📈 Match statistics",
            "type": "boolean",
            "description": "Attaches Sportradar match statistics to every event that has them: lineups, timeline, per player numbers and more, depending on the layers you pick below. Betano publishes the Sportradar match id itself, so the two are joined on that id rather than matched by team name. Note that Sportradar publishes most layers only from around kick-off: a match days away returns the header (teams, venue, referee, competition, season) and no layers, and is not charged for statistics. Costs one extra lookup per event.",
            "default": false
          },
          "statsLayers": {
            "title": "📊 Statistics layers",
            "type": "array",
            "description": "Which statistics to attach when \"Match statistics\" is on. Each layer is one more lookup per event, so pick what you use. The match header (teams, score, status, venue, referee) always comes with the statistics and needs no layer. Lineups, timeline, player statistics and situations exist only from around kick-off; head to head, form and tables are available before the match too.",
            "items": {
              "type": "string",
              "enum": [
                "teamStats",
                "playerStats",
                "lineups",
                "timeline",
                "situations",
                "h2h",
                "form",
                "tables",
                "funfacts"
              ],
              "enumTitles": [
                "Team statistics (shots, possession, cards)",
                "Player statistics (per player numbers)",
                "Lineups and formations",
                "Timeline (goals, cards, substitutions)",
                "Match situations (attack pressure per minute)",
                "Head to head history",
                "Recent form",
                "League tables",
                "Fun facts"
              ]
            },
            "default": [
              "teamStats"
            ]
          },
          "language": {
            "title": "🗣️ Names language",
            "enum": [
              "en",
              "local"
            ],
            "type": "string",
            "description": "English market and team names where the country site offers them (Germany, Portugal, Denmark, Czechia, Peru, Argentina, Chile, Ecuador). Brazil and Romania only serve their local language; Nigeria and Ghana are English already.",
            "default": "en"
          },
          "oddsFormat": {
            "title": "🎲 Odds format",
            "enum": [
              "decimal",
              "fractional",
              "american",
              "all"
            ],
            "type": "string",
            "description": "Decimal odds are always included. Add fractional (UK) or American (US) prices, or all three.",
            "default": "decimal"
          },
          "outputMode": {
            "title": "🗂️ Output shape",
            "enum": [
              "event",
              "selection"
            ],
            "type": "string",
            "description": "\"One row per event\" nests all markets and selections inside the event (best for JSON). \"One row per selection\" flattens to a wide table with one price per row (best for CSV, Sheets and SQL).",
            "default": "event"
          },
          "compact": {
            "title": "📦 Compact output",
            "type": "boolean",
            "description": "Core fields only (event, teams, start time, league, markets). Drops the descriptive extras.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Exclude empty fields",
            "type": "boolean",
            "description": "Drop null, empty-string and empty-array fields from each record before it is saved.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode (changed odds only)",
            "type": "boolean",
            "description": "Remember every event and its prices between runs. The next run with the same settings returns only NEW events and events whose odds moved (UPDATED); unchanged events are skipped and not billed. Ideal for scheduled monitoring.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State key",
            "type": "string",
            "description": "Optional. Names the remembered universe for incremental mode. Leave empty to derive it from the country, sport, leagues, events and markets you selected."
          },
          "emitUnchanged": {
            "title": "🔁 Also return unchanged events",
            "type": "boolean",
            "description": "In incremental mode, return unchanged events as well (marked UNCHANGED) instead of skipping them.",
            "default": false
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Server Settings, Integrations, Webhooks, New Webhook."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. api.slack.com/messaging/webhooks."
          },
          "notificationLimit": {
            "title": "📊 Max events per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of events included in each notification message (1 to 20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify only new or updated",
            "type": "boolean",
            "description": "When incremental mode is on, only send notifications for NEW and UPDATED events. Has no effect outside incremental mode.",
            "default": false
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"436641234567\"). Recipient must have messaged your business number within last 24h."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n, Make, Zapier or custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\":\"Bearer ...\"})."
          },
          "appConnector": {
            "title": "Send results to a connected app",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings, API & Integrations to receive your results. Best-effort across MCP connectors as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}