{
  "openapi": "3.0.1",
  "info": {
    "title": "Unibet Odds Scraper - Kambi Betting Odds & Data API",
    "description": "Scrape Unibet (Kambi) sportsbook odds for 34 sports: 1X2, totals, Asian lines, player props, live scores and outrights, with bookmaker margin and no-vig fair odds computed on every row.",
    "version": "0.0",
    "x-build-id": "DGAjDtwerzQVrk8IY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~unibet-kambi-odds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-unibet-kambi-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/parseforge~unibet-kambi-odds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-unibet-kambi-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/parseforge~unibet-kambi-odds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-unibet-kambi-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "leagues": {
            "title": "Leagues or competition URLs",
            "type": "array",
            "description": "Kambi term paths or Unibet URLs to collect. A path is sport/country/league; drop segments to widen it.\n\nExamples:\n- football/england/premier_league\n- football/spain\n- https://www.unibet.co.uk/betting/odds/football/italy/serie-a\n- tennis/atp",
            "items": {
              "type": "string"
            }
          },
          "sports": {
            "title": "Whole sports",
            "type": "array",
            "description": "Collect every upcoming event of a sport across all countries. Heavier than a league path: football returns around 270 events per request.",
            "items": {
              "type": "string",
              "enum": [
                "football",
                "tennis",
                "basketball",
                "ice_hockey",
                "american_football",
                "baseball",
                "cricket",
                "golf",
                "darts",
                "snooker",
                "rugby_union",
                "rugby_league",
                "boxing",
                "ufc_mma",
                "esports",
                "table_tennis",
                "motorsports",
                "formula_1",
                "cycling",
                "handball",
                "volleyball",
                "australian_rules",
                "field_hockey",
                "gaelic_sports",
                "lacrosse",
                "winter_sports",
                "trotting",
                "chess",
                "surfing",
                "politics",
                "tv___novelty",
                "wwe_pro_wrestling",
                "olympic_games",
                "esports_basketball"
              ],
              "enumTitles": [
                "Football",
                "Tennis",
                "Basketball",
                "Ice Hockey",
                "American Football",
                "Baseball",
                "Cricket",
                "Golf",
                "Darts",
                "Snooker",
                "Rugby Union",
                "Rugby League",
                "Boxing",
                "UFC / MMA",
                "Esports",
                "Table Tennis",
                "Motorsports",
                "Formula 1",
                "Cycling",
                "Handball",
                "Volleyball",
                "Australian Rules",
                "Field Hockey",
                "Gaelic Sports",
                "Lacrosse",
                "Winter Sports",
                "Trotting",
                "Chess",
                "Surfing",
                "Politics",
                "TV & Novelty",
                "WWE / Pro Wrestling",
                "Olympic Games",
                "Esports Basketball"
              ]
            }
          },
          "eventIds": {
            "title": "Event IDs or event URLs",
            "type": "array",
            "description": "Individual Kambi event IDs, or Unibet event URLs that end in one. Each is fetched with its complete market board.\n\nExample: 1028072730",
            "items": {
              "type": "string"
            }
          },
          "liveOnly": {
            "title": "In-play events only",
            "type": "boolean",
            "description": "Read the live feed instead of the scheduled listings: every event currently in play, with its score and match clock.",
            "default": false
          },
          "includeOutrights": {
            "title": "Include outright / futures markets",
            "type": "boolean",
            "description": "Also collect the competition-level markets of each league you asked for - winner, top scorer, season finishing position. These rows are billed as Outright market, not as Event.",
            "default": false
          },
          "offering": {
            "title": "Kambi offering",
            "enum": [
              "ub",
              "kambi"
            ],
            "type": "string",
            "description": "Which Kambi offering to price against. `ub` is the Unibet book; `kambi` is the platform-wide offering and carries a slightly wider tree.",
            "default": "ub"
          },
          "market": {
            "title": "Market (jurisdiction)",
            "enum": [
              "GB",
              "SE",
              "NL",
              "BE",
              "DK",
              "FI",
              "NO",
              "RO",
              "IT",
              "ES",
              "DE",
              "US",
              "CA",
              "AU",
              "IN",
              "BR"
            ],
            "type": "string",
            "description": "The licensed market whose price list to read. Measured on one Premier League fixture: NL quoted 6.00 on the home side where AU quoted 5.40.",
            "default": "GB"
          },
          "language": {
            "title": "Language",
            "enum": [
              "en_GB",
              "en_US",
              "sv_SE",
              "da_DK",
              "fi_FI",
              "nl_NL",
              "fr_FR",
              "de_DE",
              "it_IT",
              "es_ES",
              "pt_PT",
              "ro_RO",
              "hu_HU",
              "et_EE",
              "pl_PL"
            ],
            "type": "string",
            "description": "Localises team names, market names and outcome labels. Every row also carries the English label, so a translated run stays joinable.",
            "default": "en_GB"
          },
          "listMarketCategory": {
            "title": "Second market on the base row",
            "enum": [
              "",
              "12579",
              "12580",
              "11942",
              "12220",
              "11929",
              "12319",
              "16819",
              "11927",
              "11928",
              "11930",
              "11931",
              "19260",
              "19261",
              "18899",
              "18919",
              "11980"
            ],
            "type": "string",
            "description": "The base row always carries the main market. This picks the second one the listing returns. Leave empty for the book's default pairing (Full Time plus Total Goals).",
            "default": ""
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Total rows to write across every source in this run. Free Apify plans return a 10-row preview."
          },
          "maxEventsPerLeague": {
            "title": "Events per league",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap the events taken from each league or sport so one busy competition cannot use up the whole run. Leave empty to let Maximum rows decide."
          },
          "maxMarketsPerEvent": {
            "title": "Markets per event",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap the markets kept on each row. The main market is always kept first. A big football fixture carries close to 400 markets, so this is worth setting when you turn on the full board."
          },
          "searchTerms": {
            "title": "Must contain any of",
            "type": "array",
            "description": "Keep only events whose name, teams, players, league or country contain at least one of these terms. Case-insensitive.\n\nExample: Arsenal",
            "items": {
              "type": "string"
            }
          },
          "excludeTerms": {
            "title": "Must not contain",
            "type": "array",
            "description": "Drop events whose name, teams, players, league or country contain any of these terms. Case-insensitive.\n\nExample: Esports",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries or regions",
            "type": "array",
            "description": "Keep only events whose country node matches. Use Kambi term keys such as england, spain, czech_republic. Useful when you point the Actor at a whole sport.",
            "items": {
              "type": "string"
            }
          },
          "eventStates": {
            "title": "Event state",
            "type": "array",
            "description": "Keep only events in these states. Leave empty for both.",
            "items": {
              "type": "string",
              "enum": [
                "NOT_STARTED",
                "STARTED"
              ],
              "enumTitles": [
                "Not started (pre-match)",
                "Started (in play)"
              ]
            }
          },
          "excludeLive": {
            "title": "Exclude in-play events",
            "type": "boolean",
            "description": "Drop events that have already started. Pre-match prices only.",
            "default": false
          },
          "startsAfter": {
            "title": "Starts after",
            "type": "string",
            "description": "Keep only events kicking off at or after this moment. ISO date or date-time, UTC.\n\nExample: 2026-09-01T00:00:00Z"
          },
          "startsBefore": {
            "title": "Starts before",
            "type": "string",
            "description": "Keep only events kicking off at or before this moment. ISO date or date-time, UTC."
          },
          "startsWithinHours": {
            "title": "Starts within (hours)",
            "minimum": 1,
            "maximum": 8760,
            "type": "integer",
            "description": "Keep only events starting within this many hours from now. Ignored when Starts before is set."
          },
          "minMarketCount": {
            "title": "Minimum markets on the event",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep only events the book prices deeply. A Premier League fixture carries around 380 markets; an obscure fixture carries one."
          },
          "maxMarketCount": {
            "title": "Maximum markets on the event",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep only events at or below this market count."
          },
          "minOdds": {
            "title": "Minimum decimal odds",
            "minimum": 1,
            "maximum": 10000,
            "type": "number",
            "description": "Keep only events where at least one returned outcome is priced at or above this decimal price.\n\nExample: 2.5"
          },
          "maxOdds": {
            "title": "Maximum decimal odds",
            "minimum": 1,
            "maximum": 10000,
            "type": "number",
            "description": "Keep only events where at least one returned outcome is priced at or below this decimal price.\n\nExample: 1.8"
          },
          "minFavouriteOdds": {
            "title": "Minimum favourite price",
            "minimum": 1,
            "maximum": 10000,
            "type": "number",
            "description": "Keep only events whose shortest price is at or above this. Filters out the walkovers.\n\nExample: 1.5"
          },
          "maxFavouriteOdds": {
            "title": "Maximum favourite price",
            "minimum": 1,
            "maximum": 10000,
            "type": "number",
            "description": "Keep only events whose shortest price is at or below this. Filters out the coin flips.\n\nExample: 2.2"
          },
          "maxBookmakerMargin": {
            "title": "Maximum bookmaker margin (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Keep only events whose main market is priced tighter than this percentage. The margin is computed from the odds returned, so this works without buying the value analysis.\n\nExample: 5.5"
          },
          "requireBetBuilder": {
            "title": "Only bet-builder events",
            "type": "boolean",
            "description": "Keep only events tagged BET_BUILDER by the book.",
            "default": false
          },
          "requireStreaming": {
            "title": "Only streamed events",
            "type": "boolean",
            "description": "Keep only events tagged as streamed on web or mobile.",
            "default": false
          },
          "requireCashOut": {
            "title": "Only cash-out events",
            "type": "boolean",
            "description": "Keep only events whose main market has cash out enabled.",
            "default": false
          },
          "requireOfferedLive": {
            "title": "Only events offered in-play",
            "type": "boolean",
            "description": "Keep only events the book will also price once they start.",
            "default": false
          },
          "marketCriteria": {
            "title": "Keep only these markets",
            "type": "array",
            "description": "Keep only markets whose name contains one of these terms, on both the base row and the full board. Case-insensitive.\n\nExamples:\n- Total Goals\n- Asian Handicap\n- Anytime Goalscorer",
            "items": {
              "type": "string"
            }
          },
          "betOfferTypes": {
            "title": "Keep only these market types",
            "type": "array",
            "description": "Keep only markets of these Kambi bet-offer types. Case-insensitive substring match.\n\nExamples:\n- Match\n- Over/Under\n- Player Occurrence Line\n- Correct Score",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort rows by",
            "enum": [
              "start",
              "favouriteOdds",
              "marketCount",
              "margin",
              "league",
              "none"
            ],
            "type": "string",
            "description": "Ordering applied before the row cap, so it decides which events survive Maximum rows.",
            "default": "start"
          },
          "sortOrder": {
            "title": "Sort direction",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string",
            "description": "Ascending or descending.",
            "default": "asc"
          },
          "includeAllMarkets": {
            "title": "Full market board",
            "type": "boolean",
            "description": "Fetch every market the book prices on each event and add them as `allMarkets` - up to about 430 per football fixture, including player props, Asian lines, corners and cards. One extra request per event. Pre-match only in practice: once a fixture goes live Kambi moves its board onto a push channel and this endpoint can return nothing, in which case you are not billed. Billed as Full market board.",
            "default": false
          },
          "includeLiveData": {
            "title": "Live score and match clock",
            "type": "boolean",
            "description": "Add `liveData` with the running score, match clock, period, and the live statistics the book publishes - corners, yellow and red cards, set scores. Only in-play events carry it. Billed as Live data.",
            "default": false
          },
          "includeBetBuilder": {
            "title": "Bet builder pre-packs",
            "type": "boolean",
            "description": "Add `betBuilder` with the book's ready-made same-game multiples, their combined price and their legs. Uses the same per-event request as the full market board, so ticking this alone also bills Full market board. Billed as Bet builder.",
            "default": false
          },
          "includeValueAnalysis": {
            "title": "Value analysis (margin, no-vig fair odds)",
            "type": "boolean",
            "description": "Add `valueAnalysis`: bookmaker margin, payout, vig-free fair probability and fair price per outcome, favourite and longshot, how competitive the market is, and how many minutes ago the price last moved. Computed from the odds on the row. Billed as Value analysis.",
            "default": false
          },
          "compareMarkets": {
            "title": "Compare price across jurisdictions",
            "type": "boolean",
            "description": "Re-price each event in the other Kambi markets you list below and add `marketComparison` with the best price per outcome, the spread, and an arbitrage flag when the best prices together imply a book under 100%. Billed as Market comparison.",
            "default": false
          },
          "comparisonMarkets": {
            "title": "Jurisdictions to compare against",
            "type": "array",
            "description": "Which markets to re-price in. Up to six, and the one you are already scraping is skipped. Defaults to Sweden, Netherlands and Australia, the three that diverged most in testing.",
            "items": {
              "type": "string",
              "enum": [
                "GB",
                "SE",
                "NL",
                "BE",
                "DK",
                "FI",
                "NO",
                "RO",
                "IT",
                "ES",
                "DE",
                "US",
                "CA",
                "AU",
                "IN",
                "BR"
              ],
              "enumTitles": [
                "United Kingdom",
                "Sweden",
                "Netherlands",
                "Belgium",
                "Denmark",
                "Finland",
                "Norway",
                "Romania",
                "Italy",
                "Spain",
                "Germany",
                "United States",
                "Canada",
                "Australia",
                "India",
                "Brazil"
              ]
            }
          },
          "includeParticipants": {
            "title": "Participant list",
            "type": "boolean",
            "description": "Add `participants` with each team, player or runner, its Kambi ID, home flag and scratched flag. Free - it rides on the request the row already made.",
            "default": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}