{
  "openapi": "3.0.1",
  "info": {
    "title": "TheLines Scraper - NFL & NBA Odds, Player Props",
    "description": "Scrape TheLines.com for NFL and NBA odds, NBA player props with the best sportsbook and price, Super Bowl and MVP futures boards, sportsbook promo codes and betting news. No proxy or login needed.",
    "version": "0.1",
    "x-build-id": "ISR9m8tVveTEHKWLW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~thelines-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-thelines-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~thelines-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-thelines-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~thelines-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-thelines-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": {
          "datasets": {
            "title": "What to scrape",
            "type": "array",
            "description": "Which parts of TheLines to collect. Matchups and player props carry the odds; odds boards carry futures; reviews carry sportsbook bonuses.",
            "items": {
              "type": "string",
              "enum": [
                "matchups",
                "playerProps",
                "oddsPages",
                "articles",
                "reviews",
                "categories"
              ],
              "enumTitles": [
                "Matchup previews (NBA + NFL game lines and team stats)",
                "Player props (NBA prop lines with best book and price)",
                "Odds boards (300+ futures and award pages)",
                "Articles (betting news, picks and analysis)",
                "Sportsbook reviews (bonus codes, offers, eligible states)",
                "Category archives (which posts a section lists)"
              ]
            },
            "default": [
              "matchups"
            ]
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Scrape these exact TheLines URLs instead of discovering pages from the sitemaps. The page type is detected from the URL.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many dataset rows. Free Apify accounts are capped at 10 rows.",
            "default": 50
          },
          "sports": {
            "title": "Sports",
            "type": "array",
            "description": "Limit matchups and player props to these leagues. TheLines only publishes structured matchup pages for NBA and NFL.",
            "items": {
              "type": "string",
              "enum": [
                "nba",
                "nfl"
              ],
              "enumTitles": [
                "NBA",
                "NFL"
              ]
            }
          },
          "dateFrom": {
            "title": "Games on or after",
            "type": "string",
            "description": "Keep only games played on or after this date (YYYY-MM-DD). Read from the game URL, so no page is fetched to check it."
          },
          "dateTo": {
            "title": "Games on or before",
            "type": "string",
            "description": "Keep only games played on or before this date (YYYY-MM-DD)."
          },
          "teams": {
            "title": "Team abbreviations",
            "type": "array",
            "description": "Keep only games involving these teams, by the abbreviation in the URL — for example PHI, WAS, SEA, NE.",
            "items": {
              "type": "string"
            }
          },
          "propMarkets": {
            "title": "Prop markets",
            "type": "array",
            "description": "Keep only these player-prop markets. These six are the markets TheLines publishes on NBA prop pages; leave empty for all of them.",
            "items": {
              "type": "string",
              "enum": [
                "points",
                "rebounds",
                "assists",
                "three_pointers_made",
                "points_assists",
                "points_rebounds_assists"
              ],
              "enumTitles": [
                "Points",
                "Rebounds",
                "Assists",
                "3-pointers made",
                "Points + assists",
                "Points + rebounds + assists"
              ]
            }
          },
          "bookmakers": {
            "title": "Bookmakers",
            "type": "array",
            "description": "Keep only props whose best price comes from these books — FanDuel, DraftKings, BetMGM, Caesars, BetRivers, Fanatics, SugarHouse and others.",
            "items": {
              "type": "string"
            }
          },
          "minOdds": {
            "title": "Minimum American odds",
            "minimum": -100000,
            "maximum": 100000,
            "type": "integer",
            "description": "Drop props priced below this. Use -150 to exclude heavy favourites."
          },
          "maxOdds": {
            "title": "Maximum American odds",
            "minimum": -100000,
            "maximum": 100000,
            "type": "integer",
            "description": "Drop props priced above this. Use 200 to exclude long shots."
          },
          "minPropLine": {
            "title": "Minimum prop line",
            "minimum": -1000,
            "maximum": 1000,
            "type": "number",
            "description": "Drop props whose line is below this number."
          },
          "maxPropLine": {
            "title": "Maximum prop line",
            "minimum": -1000,
            "maximum": 1000,
            "type": "number",
            "description": "Drop props whose line is above this number."
          },
          "onlyHighlightedPicks": {
            "title": "Only TheLines' highlighted picks",
            "type": "boolean",
            "description": "Keep only the prop rows TheLines highlights on the page as its own pick.",
            "default": false
          },
          "flattenPlayerProps": {
            "title": "One row per prop",
            "type": "boolean",
            "description": "Write each over and under as its own row instead of nesting every prop inside one row per game. Charged per prop row.",
            "default": false
          },
          "oddsSections": {
            "title": "Odds board sections",
            "type": "array",
            "description": "Limit odds boards to these URL sections — nfl, nba, mlb, nhl, golf, world-cup, march-madness, horse-racing, election, ncaa-basketball and more.",
            "items": {
              "type": "string"
            }
          },
          "flattenOddsTables": {
            "title": "One row per odds selection",
            "type": "boolean",
            "description": "Write each team, player or entrant on an odds board as its own row instead of nesting the whole board in one row.",
            "default": false
          },
          "reviewSections": {
            "title": "Review verticals",
            "type": "array",
            "description": "Limit reviews to these verticals.",
            "items": {
              "type": "string",
              "enum": [
                "betting",
                "casino",
                "prediction-markets",
                "sportsbooks"
              ],
              "enumTitles": [
                "Sportsbooks (/betting/)",
                "Casino and sweepstakes",
                "Prediction markets",
                "Sportsbook hubs"
              ]
            }
          },
          "categorySlugs": {
            "title": "Category slugs",
            "type": "array",
            "description": "Limit category archives to URLs containing these fragments — for example nfl, college-football, states/ohio.",
            "items": {
              "type": "string"
            }
          },
          "publishedAfter": {
            "title": "Published on or after",
            "type": "string",
            "description": "Keep only articles published on or after this date (YYYY-MM-DD)."
          },
          "publishedBefore": {
            "title": "Published on or before",
            "type": "string",
            "description": "Keep only articles published on or before this date (YYYY-MM-DD)."
          },
          "authors": {
            "title": "Authors",
            "type": "array",
            "description": "Keep only articles by these authors, matched exactly against the byline.",
            "items": {
              "type": "string"
            }
          },
          "titleContains": {
            "title": "Title contains",
            "type": "array",
            "description": "Keep only pages whose headline or category contains one of these phrases.",
            "items": {
              "type": "string"
            }
          },
          "locales": {
            "title": "Site editions",
            "type": "array",
            "description": "TheLines publishes a US, UK and Canadian edition. Matchup and player-prop pages exist only on the US edition.",
            "items": {
              "type": "string",
              "enum": [
                "us",
                "uk",
                "ca"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Canada"
              ]
            },
            "default": [
              "us"
            ]
          },
          "includePlayerStats": {
            "title": "Player stats",
            "type": "boolean",
            "description": "Usage%, minutes, scoring and shooting splits for the featured players. Charged per row that carries the block.",
            "default": false
          },
          "includeTeamStats": {
            "title": "Season profile",
            "type": "boolean",
            "description": "Record, scoring, efficiency, tempo, ratings, turnovers and rebounding for both teams.",
            "default": false
          },
          "includeTrends": {
            "title": "Trends and form",
            "type": "boolean",
            "description": "Last-5 and last-10 form, ATS records and over/under records.",
            "default": false
          },
          "includeRestTravel": {
            "title": "Rest and travel",
            "type": "boolean",
            "description": "Days since last game, back-to-backs, travel miles, time-zone changes and schedule strength.",
            "default": false
          },
          "includeHeadToHead": {
            "title": "Head-to-head history",
            "type": "boolean",
            "description": "Previous meetings, last result, average margin and the series ATS record.",
            "default": false
          },
          "includeInjuries": {
            "title": "Injury and availability report",
            "type": "boolean",
            "description": "Ruled out, questionable, practice participation and the rotation minutes at stake.",
            "default": false
          },
          "includeQuarterSplits": {
            "title": "Quarter and half splits",
            "type": "boolean",
            "description": "Scoring by quarter and by half for both teams.",
            "default": false
          },
          "includeAnalysis": {
            "title": "Written analysis",
            "type": "boolean",
            "description": "TheLines' own preview prose, picks and betting takeaways for the game.",
            "default": false
          },
          "includePromoOffers": {
            "title": "Competing promo offers",
            "type": "boolean",
            "description": "On review pages, the comparison table of rival sportsbook bonuses.",
            "default": false
          },
          "includeArticleContent": {
            "title": "Full article text",
            "type": "boolean",
            "description": "The complete body text of articles and reviews as Markdown.",
            "default": false
          },
          "includeRawTables": {
            "title": "Raw tables",
            "type": "boolean",
            "description": "Every table on the page exactly as published, with its headers, rows and section heading. Use this when a page carries something the typed fields do not cover.",
            "default": false
          },
          "sortBy": {
            "title": "Sort results",
            "enum": [
              "none",
              "gameDate:asc",
              "gameDate:desc",
              "datePublished:desc",
              "datePublished:asc",
              "american:desc",
              "american:asc",
              "impliedProbability:desc",
              "line:desc"
            ],
            "type": "string",
            "description": "Order rows before writing them. Sorting buffers the whole result set, so it is slower than the default stream.",
            "default": "none"
          },
          "maxConcurrency": {
            "title": "Concurrent requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many pages to fetch at once. TheLines serves 12 in parallel without throttling.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for one page before retrying it.",
            "default": 30
          },
          "maxRequestRetries": {
            "title": "Retries per page",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "How many times to retry a failed page. Retries are also bounded by the run timeout, so a slow upstream cannot consume the whole run.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}