{
  "openapi": "3.0.1",
  "info": {
    "title": "Underdog Fantasy Player Props Scraper - Lines & Line Moves",
    "description": "For DFS and betting models: every Underdog Higher/Lower prop as a row - player, team, stat, line, payout multiplier, price, implied probability, start time. 5,607 pre-game lines, 11 leagues, one request (2026-09-22). Monitoring returns only lines that moved, with the earlier values.",
    "version": "0.1",
    "x-build-id": "FyonhHezvjPCtoOUG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~underdog-player-props-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-underdog-player-props-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/neverempty~underdog-player-props-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-underdog-player-props-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/neverempty~underdog-player-props-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-underdog-player-props-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": "Only these leagues",
            "type": "array",
            "description": "Leave empty for every league on the board. On 2026-09-22 the board carried MLB 2105, NFL 1432, CFB 868, CS 389, WNBA 244, Tennis 237, MMA 102, NHL 89, Valorant 79, LoL 40 and F1 (season) 22 lines. Which leagues are live depends on the day.",
            "items": {
              "type": "string",
              "enum": [
                "NFL",
                "CFB",
                "MLB",
                "NHL",
                "WNBA",
                "TENNIS",
                "MMA",
                "CS",
                "LOL",
                "VAL",
                "F1SZN"
              ],
              "enumTitles": [
                "NFL",
                "College Football",
                "MLB",
                "NHL (season-long)",
                "WNBA",
                "Tennis",
                "MMA",
                "Counter-Strike",
                "League of Legends",
                "Valorant",
                "Formula 1 (season-long)"
              ]
            },
            "default": []
          },
          "players": {
            "title": "Only these players",
            "type": "array",
            "description": "Keep a line only if the player's name contains one of these (case-insensitive, partial). Example: Bijan Robinson, Mahomes.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "stats": {
            "title": "Only these stats",
            "type": "array",
            "description": "Keep a line only if the stat name or Underdog's stat code contains one of these (case-insensitive, partial). Examples: Receiving Yards, receiving_yds, Home Runs, Kills on Maps 1+2. The board carried 108 distinct stats on 2026-09-22.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "teams": {
            "title": "Only these teams or matchups",
            "type": "array",
            "description": "Keep a line only if the player's team, the opponent, or the matchup title contains one of these (case-insensitive, partial). Examples: Packers, ATL @ GB, Fnatic.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxLines": {
            "title": "Maximum lines to return",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "How many rows this run may return. Reading the board is free; only the rows you receive are charged. When more lines match than this, a free row says how many were left, and the lines that were not returned are not remembered, so the next run offers them again.",
            "default": 500
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only lines that changed",
            "type": "boolean",
            "description": "Off = return the board as it stands now. On = remember the exact line, payout multipliers, prices, odds and status already returned for this input and, on later runs, return a line again only when one of them has actually changed - with the previous value, the first value ever seen and the difference in the same row. Measured on 2026-09-22: 9 minutes apart, only 174 of 5,542 lines (3.1%) had changed; back-to-back runs on the same board changed 2 lines, then 1.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clear the remembered values for this exact input before the run, so every line counts as new again.",
            "default": false
          },
          "onlyLineMoves": {
            "title": "Only lines whose number moved",
            "type": "boolean",
            "description": "Monitoring mode only. Drop changes where only the payout multiplier, price, odds or status moved, and keep the ones where the line itself moved (for example 24.5 to 25.5). Lines seen for the first time are kept. A change held back this way is not recorded as delivered, so the line comes back when its number does move.",
            "default": false
          },
          "minLineMove": {
            "title": "Minimum line move",
            "minimum": 0,
            "maximum": 1000,
            "type": "number",
            "description": "Monitoring mode only. Keep a line only if it has moved at least this far from the value returned last time, in either direction - Underdog lines usually move in steps of 0.5 or 1. 0 = no limit. Lines with no previous value are kept, because unknown is not the same as unmoved. A line held back because it has not moved far enough is not recorded as delivered, so its movement keeps adding up until it passes this number.",
            "default": 0
          },
          "minPayoutMultiplierMove": {
            "title": "Minimum payout multiplier move",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Monitoring mode only. Keep a line only if the Higher or Lower payout multiplier has moved at least this much since last time, in either direction. Multipliers move in small steps, so 0.05 is already a real move. 0 = no limit. A line held back because it has not moved far enough is not recorded as delivered, so its movement keeps adding up until it passes this number.",
            "default": 0
          },
          "minPayoutMultiplier": {
            "title": "Minimum payout multiplier",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Keep a line only if Higher or Lower pays at least this multiplier. 0 = no limit. On 2026-09-22 multipliers ran from 0.60 to 19.82, and 3,483 of 9,122 sides were the standard 1.0.",
            "default": 0
          },
          "maxPayoutMultiplier": {
            "title": "Maximum payout multiplier",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Keep a line only if Higher or Lower pays at most this multiplier. 0 = no limit.",
            "default": 0
          },
          "onlyBoostedLines": {
            "title": "Only lines that are not 1.0x",
            "type": "boolean",
            "description": "Keep only lines where at least one side pays a multiplier other than the standard 1.0 - Underdog's alternate and boosted picks.",
            "default": false
          },
          "onlyStandardLines": {
            "title": "Only standard 1.0x lines",
            "type": "boolean",
            "description": "Keep only lines where every side offered pays the standard 1.0 multiplier.",
            "default": false
          },
          "onlyBothSides": {
            "title": "Only lines that offer both Higher and Lower",
            "type": "boolean",
            "description": "Drop lines that offer one side only. On 2026-09-22, 2,092 of 5,607 lines offered a single side - 2,076 Higher only and 16 Lower only.",
            "default": false
          },
          "startsWithinHours": {
            "title": "Only games starting within this many hours",
            "minimum": 0,
            "maximum": 8760,
            "type": "integer",
            "description": "Keep a line only if its game starts within this many hours from now. 0 = no limit. Lines with no start time (Underdog's season-long props, for example NHL regular-season totals) are kept.",
            "default": 0
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep a line only if one (Any) or all (All) of these appear in the player, team, opponent, matchup, stat name, prop title, league, competition or position.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Any = at least one keyword. All = every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop a line if any of these appear in the same fields.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "On by default. Underdog's public feed answered HTTP 200 from 11 of 12 Apify datacentre addresses tested on 2026-09-22 and 403 from one, so a refused request is retried from a different address. Turning this off makes the run use Apify's shared address directly, which is refused more often.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}