# Covers.com Scraper - NFL, NBA & MLB Odds + Consensus (`parseforge/covers-scraper`) Actor

Scrape Covers.com odds for 12 leagues from up to nine sportsbooks. Public betting percentages, line movement history, player prop projections with EV, injury reports, futures, and computed hold, fair value and arbitrage. No proxy.

- **URL**: https://apify.com/parseforge/covers-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Covers.com Scraper - NFL, NBA & MLB Odds, Consensus and Line Movement

**Scrape NFL odds, NBA odds, MLB odds and college football odds for 12 leagues, from up to nine sportsbooks at once — plus the public betting percentages Covers is known for.** Every game comes back with each book's opening and current number, the best price on the board, how far the line has moved, what share of the public is on each side, and the market maths already done: hold, no-vig fair value and arbitrage. No login, no API key, **no proxy**. Export to CSV, JSON, Excel, or XML.

Odds APIs charge a monthly subscription and quote one blended price per game. This reads the same public Covers pages your browser does, keeps every book's number separate so you can shop the line, and adds the two things an odds feed never has: **who the public is betting**, and **Covers' own player-prop projections with an EV figure attached**.

| Who uses it | What they scrape Covers.com for |
|---|---|
| Bettors and handicappers | Line shopping across nine books, and fading a public that is 70% on one side |
| Quant and model builders | Timestamped line movement per book, to study how a number actually travelled |
| Odds and media sites | A normalised feed of moneylines, spreads and totals for 12 leagues |
| Prop bettors | Covers' projection, the gap to the posted line, an EV percentage and a star rating |
| Affiliate and content teams | Live numbers for comparison pages, with each book's deep link attached |
| Data scientists | Labelled market data: implied probability, hold, no-vig fair price, arbitrage edge |

### What it does

This Actor collects the Covers.com betting board for a league and returns each game as one row. Every row carries:

- 🧾 **The game:** both clubs with their full name, abbreviation, crest, conference and — for MLB — both starting pitchers with their throwing hand and ERA.
- 📊 **Every book's line:** DraftKings, FanDuel, BetMGM, Caesars, bet365, BetRivers, Fanatics, theScore Bet and Hard Rock Bet, each with its moneyline, spread and total, in American, decimal *and* fractional at once.
- 🛒 **Line shopping, solved:** the best price and the best number on each side, with the book that has it named, plus that book's deep link.
- 📈 **Movement:** the opening number, the current consensus number, and how far each has travelled.
- 🧮 **Market maths already done:** implied probability, per-book hold, no-vig fair probability and fair price, and whether the board is an arbitrage — computed across all three legs on soccer, and always with both sides matched at the *same* number.
- 🚩 **Bad quotes flagged, not hidden:** a book contradicting itself, or sitting far off the rest of the board, is delivered with `isCoherent: false` and kept out of the best-price and fair-value columns.
- ⏱️ **A last-updated stamp per book**, so you can tell a stale price from a live one.
- ⚽ **Three-way markets** for soccer, with the draw priced and de-vigged properly.
- 🥊 **UFC fight cards** as their own rows, with each book's price on both fighters.

Turn on the optional blocks and each row also carries the **public betting consensus**, the **timestamped line-movement series**, **player prop projections with EV**, the **matchup hub** (records, head to head, last ten, lineups, umpire) and the **injury report**. Futures come back as extra rows.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

### What you can do with Covers.com data

**🛒 Shop every line before you bet.**

One row already names the book with the best price on each side and the best number on each spread and total, so the comparison is a column, not a workflow.

**👥 Fade the public.**

Covers publishes what share of picks sits on each side. Set **Minimum consensus (%)** to 70 and you get only the lopsided games — and you can read three different crowds: everyone, the profitable cappers, and the sharpest 10%. They disagree more often than you would expect, and that disagreement is the signal.

**🕰️ Study how a number actually moved.**

The line-movement block returns every timestamped price change, per book, across the moneyline, spread and total — not a daily snapshot. A single game routinely carries 300+ points across nine books.

**🎯 Find props with an edge already priced.**

The projections block is Covers' own model, not a book's number: the projected stat, the gap to the posted line, an EV percentage, a 1-5 star rating and a written rationale. Filter to **Minimum prop EV (%)** and keep only the ones worth reading.

**⚖️ Hunt arbitrage and low-hold markets.**

Turn on **Only arbitrage games**, or set **Maximum hold (%)** to 2 to keep only the sharpest markets on the board.

**🌍 Read a different sportsbook market from anywhere.**

Covers renders a different set of books per country and per US state. This Actor passes the market as a parameter, so a US board reads the same from Buenos Aires as from New Jersey — **and it needs no proxy to do it**. Setting the state to `ny` even swaps in the prediction markets Polymarket and Underdog.

### Leagues covered

| League | Board | Derivative scopes | Consensus | Prop projections |
|---|---|---|---|---|
| NFL | Moneyline, spread, total | Halves, quarters | ✅ | ✅ |
| NCAA Football | Moneyline, spread, total | Halves, quarters | ✅ | — |
| CFL | Moneyline, spread, total | Halves, quarters | ✅ | — |
| NBA | Moneyline, spread, total | Halves, quarters | ✅ | ✅ |
| NCAA Basketball | Moneyline, spread, total | Halves | ✅ | — |
| WNBA | Moneyline, spread, total | Halves, quarters | ✅ | — |
| MLB | Moneyline, spread, total | First 5 innings | ✅ | ✅ |
| NHL | Moneyline, spread, total | Periods | ✅ | ✅ |
| MLS | Three-way, total | Halves | — | — |
| English Premier League | Three-way, total | Halves | — | — |
| UEFA Champions League | Three-way, total | Halves | — | — |
| UFC / MMA | Fight moneyline | — | — | — |

A league out of season has no board; the Actor says so and moves on rather than failing. Asking for a scope a sport does not offer — quarters on a baseball board — is skipped with a warning instead of silently returning the full game.

**Derivative boards are thinner than the full game, and honestly so.** Covers renders one market at a time on a half or a quarter, so the Actor makes one request per market and merges them. Where a market simply is not posted — NFL first-half moneylines, most weeks — that market is absent from the row rather than present and empty, and the scope is only charged when it returns something.

### Input

| Field | What it does |
|---|---|
| **Leagues** | Which boards to read. Default MLB. |
| **Sportsbook market** | Country whose books to show. `us` gives ~nine books, `ca` eight, `gb` four. |
| **State or province** | `ny`, `nj`, `pa`, `on`… Changes which books are legal to display. |
| **Odds scopes** | Full game, halves, quarters, periods, or first five innings. |
| **Teams** | Keep only games involving these clubs, by abbreviation or name. |
| **Date from / Date to** | Trim the forward slate to a window. |
| **Sportsbooks** | Keep only these books; best price and hold are recomputed over them. |
| **Minimum books quoting** | Skip thinly-priced games. |
| **Maximum hold (%)** | Keep only markets tighter than this margin. |
| **Only arbitrage games** | Keep only boards where the best prices add up to under 100%. |
| **Minimum consensus (%)** | Keep only games the public is lopsided on. |
| **Consensus segments** | The public, the money leaders, or the top 10% of cappers. |
| **Minimum prop star rating / EV (%)** | Keep only games holding a prop that good, and trim the prop list to it. |
| **Optional data blocks** | Six checkboxes, all off by default. |
| **Maximum games** | Stop after this many rows. |

#### Filters read blocks you have not bought

The filters run on the **complete** row, before the optional blocks are dropped. So you can filter on consensus, or on prop EV, without paying for those columns in the output: the Actor fetches what the filter needs, decides, and then delivers only what you asked for. "Give me games where the public is 70% on one side, but do not send me the consensus block" costs exactly one board scan more than the plain run.

### Output

One row per game per scope. With every optional block off, a row looks like this — trimmed here, the real row carries every book:

```json
{
  "league": "mlb",
  "leagueLabel": "MLB",
  "gameId": "369617",
  "scopeLabel": "Full Game",
  "matchup": "BOS @ MIA",
  "startTime": "2026-08-25T22:40:00.000Z",
  "startTimeEt": "Today, 18:40",
  "status": "scheduled",
  "away": {
    "abbr": "BOS", "name": "Boston Red Sox", "conference": "American League",
    "startingPitcher": "P. Tolle", "pitcherHand": "L", "pitcherEra": 3.08
  },
  "home": {
    "abbr": "MIA", "name": "Miami Marlins", "conference": "National League",
    "startingPitcher": "T. Phillips", "pitcherHand": "R", "pitcherEra": 4.64
  },
  "moneyline": {
    "opening": { "away": { "price": -160, "decimal": 1.63, "fractional": "5/8" } },
    "books": [
      {
        "book": "BetMGM", "bookSlug": "betmgm",
        "lastUpdated": "2026-08-25T20:03:43.000Z",
        "away": { "price": -150, "decimal": 1.67, "impliedProbability": 0.6 },
        "home": { "price": 125, "decimal": 2.25, "impliedProbability": 0.44444 },
        "holdPercent": 4.444,
        "deepLinkAway": "/go/b?q[0].LId=19108267&q[0].SId=136068157"
      }
    ],
    "best": {
      "away": { "price": -140, "book": "bet365" },
      "home": { "price": 135, "book": "Caesars" }
    },
    "booksQuoting": 9,
    "lowestHoldPercent": 1.623,
    "fairProbabilityAway": 0.58369,
    "fairPriceAway": -137,
    "isArbitrage": false,
    "priceMovementAway": 20
  },
  "spread": { "consensusLine": -1.5, "lineMovement": 0, "best": { "away": { "price": 125, "line": -1.5, "book": "Hard Rock Bet" } } },
  "total":  { "consensusLine": 7,    "lineMovement": -0.5, "best": { "away": { "price": 115, "line": 7, "book": "theScore Bet" } } },
  "booksQuoting": 9,
  "countryCode": "us",
  "matchupUrl": "https://www.covers.com/sport/baseball/mlb/matchup/369617"
}
```

With the optional blocks on, the same row also carries:

```json
{
  "consensus": [
    { "market": "sides", "segment": "overall", "awayPercent": 68, "homePercent": 32,
      "awayPicks": 352, "homePicks": 167, "totalPicks": 519 }
  ],
  "lineHistory": [
    { "book": "BetMGM", "market": "moneyline", "updatedAt": "2026-08-25T19:43:00.000Z",
      "awayPrice": -135, "homePrice": 115 }
  ],
  "playerProps": [
    { "player": "S. Torkelson", "position": "1B", "team": "Detroit Tigers",
      "market": "TOTAL RBIS", "line": 0.5, "projection": 0.5, "difference": 0,
      "evPercent": 19.13, "starRating": 4,
      "analysis": "When estimating his home run ability, Spencer Torkelson ranks in the 93rd percentile…",
      "bestBook": "bet365", "bestPrice": 275, "bestSide": "over" }
  ],
  "matchupDetail": {
    "awayRecord": "78-53", "homeRecord": "61-70",
    "awayUnitsWon": 1102, "homeUnitsWon": -1808,
    "headToHead": [ { "date": "Aug 24, '26", "opponent": "MIA", "moneyline": -116, "moneylineTeam": "BOS", "overUnder": "u7.5" } ],
    "awayLastTen": [], "awayNextThree": [], "awayLineup": [],
    "seriesRecords": [ { "game": "Game 1", "overall": "25-18", "afterWin": "12-7", "afterLoss": "13-11" } ],
    "umpire": "Paul Clemons", "umpireOverUnderRecord": "9-12", "umpireRunsPerGame": 9.05
  },
  "injuries": [
    { "player": "V. Mesa Jr.", "position": "RF", "team": "Tampa Bay Rays",
      "status": "Ten Day IL - Hamstring", "injury": "Hamstring", "date": "Aug 18, '26" }
  ]
}
```

Futures come back as their own rows:

```json
{
  "league": "mlb", "market": "World Series", "selection": "LA Dodgers",
  "openingPrice": 300, "bestPrice": 170, "bestBook": "DraftKings",
  "impliedProbability": 0.37037, "payoutPer100": 170,
  "books": [ { "book": "FanDuel", "price": 160 }, { "book": "DraftKings", "price": 170 } ]
}
```

#### Two things the maths refuses to fake

**Arbitrage is only claimed where both sides share a number.** Taking the best price on each side regardless of handicap would pair an away +3 against a home -1.5 and report a 15% edge that does not exist. Fair value and arbitrage are computed at the consensus line, and `pricedAtLine` names it so you can audit the figure. Line shopping still shows you the genuinely best quote on each side, price and number together, from one book rather than two.

**A quote a book will not stand behind is excluded from the maths.** Every sportsbook prices both sides above 100% implied — that margin is the business. A book whose own two sides add up to *less* than 100%, or that sits far from where every other book has the game, is publishing something stale or mis-mapped. Measured on one UFC card, that pattern faked an arbitrage on 12 of 27 fights. Those quotes still arrive in the `books` array, marked `isCoherent: false` and counted in `booksQuotedIncoherent`; they simply do not win a best-price column.

**Rows with no market at all are not delivered.** Covers lists a full fight card and a full slate before the books price them. A row that is two names and nothing else is not an odds board, so it is skipped rather than sold — on one UFC card that was 38 of 65 rows.

#### Fields that are only there when the sport has them

The Actor does not pad rows with dead columns. `spread` is absent on soccer, `threeway` is absent everywhere else, `startingPitcher` is MLB-only, and `umpire` appears only on a baseball matchup hub. A block you did not turn on is not present at all, rather than present and null.

### Pricing

Pay per event, so a cheap run stays cheap:

| Event | Price | When it fires |
|---|---|---|
| Actor start | $0.03 | Once per run |
| League board scanned | $0.01 | Once per league |
| **Game with full odds board** | **$0.007** | **Per game — the main row** |
| Derivative board scanned | $0.008 | Per extra scope that returns lines |
| Line movement history | $0.004 | Per game, when movement is returned |
| Public betting consensus | $0.003 | Per game, when consensus is returned |
| Player prop projections | $0.006 | Per game, when props are returned |
| Matchup hub detail | $0.005 | Per game, when the hub is returned |
| League injury report | $0.008 | Once per league, when injuries are returned |
| Futures selection | $0.002 | Per futures row |

**The optional events are charged only when they arrive with data.** A game with no consensus published, or no props posted, is delivered without that block and without that charge.

**Why $7 per 1,000 games.** The other Covers scraper on the Store charges **$10 per 1,000** for a single flat result and none of the blocks above. This is 30% cheaper for a row that carries every book's number, both other markets, the computed fair value, and — when you want them — consensus, movement, projections and the hub. The Actor runs HTTP-only with no proxy and no browser, which is what makes that price hold up.

### Notes and limits

- **Forward board only.** Covers publishes upcoming and in-progress games. There is no historical archive here; the date filters trim the current slate rather than reaching back. Line *movement*, on the other hand, does reach back — to the market's opening price.
- **Times are Eastern.** `startTime` is a proper UTC timestamp when Covers publishes the game in its schema.org block (today's slate); otherwise it is derived from the on-page label, which is always kept verbatim in `startTimeEt`.
- **Consensus is joined by team pair**, because the consensus board keys games by a different id than the odds board. On the rare occasion two clubs meet twice in a day, both games receive both consensus rows.
- **Soccer has no matchup hub**, so `matchupUrl` is null there and the matchup block returns nothing for those leagues.
- **Covers serves anonymous traffic without rate limiting.** Twenty parallel requests all returned 200 in testing, which is why this Actor ships with no proxy configuration at all — and why your run does not pay for one.
- **Measured cost.** A default run — one league, the plain board — costs about **$0.025 per 1,000 games** in platform usage. That is the margin behind the $7 price, and it is what lets the optional blocks stay cheap.

### FAQ

**Do I need a proxy?**
No. Covers accepts the sportsbook market as a query parameter on every page, so the Actor reads a US, Canadian or UK board from wherever it happens to run.

**Can I get closing lines for finished games?**
You get the last published board and the full movement series up to it. Covers replaces a finished game's board with its result, so run the Actor before kick-off if you need the close.

**Why did a league return nothing?**
It is out of season, or its board is not up yet. The log says which. NBA and NCAA Basketball are empty through the summer.

**Which leagues have the consensus block?**
NFL, NBA, NHL, MLB, NCAAF, NCAAB, CFL and WNBA. Covers does not publish consensus for soccer or UFC.

**How do I keep runs small while testing?**
Set **Maximum games** to 5 and leave the optional blocks off. That is two requests and five rows.

### Legal

This Actor collects data that Covers.com publishes publicly, without logging in and without circumventing any access control. You are responsible for using the output in line with Covers' terms and with the law that applies to you. Betting odds and public consensus are factual market data, not betting advice.

# Actor input Schema

## `leagues` (type: `array`):

Leagues to pull the Covers board for. Every league returns the same schema; UFC returns fight rows instead of game rows.

## `countryCode` (type: `string`):

Covers shows a different set of sportsbooks per market, and honours this as a query parameter — so a US board can be read from anywhere with no proxy. US returns roughly nine books, Canada eight, the UK four.

## `stateProvince` (type: `string`):

Two-letter US state or Canadian province, e.g. ny, nj, pa, on. Changes which books are legal to show — New York swaps in the prediction markets Polymarket and Underdog. Leave empty for the national board.

## `oddsScopes` (type: `array`):

Which board to read. Full Game is the main line. Derivatives are sport-specific: halves and quarters for football and basketball, periods for hockey, first five innings for baseball. A scope a sport does not offer is skipped with a warning.

## `teams` (type: `array`):

Keep only games involving these teams. Accepts an abbreviation (BOS) or any part of the club name (Red Sox). Leave empty for the whole board.

## `dateFrom` (type: `string`):

Earliest start date to keep, as YYYY-MM-DD. Covers publishes the forward board only, so this trims the slate rather than reaching back.

## `dateTo` (type: `string`):

Latest start date to keep, as YYYY-MM-DD.

## `books` (type: `array`):

Keep quotes from these books only, e.g. DraftKings, FanDuel, BetMGM, bet365, Caesars. Best price and hold are recomputed over the books you keep. Leave empty for every book in the market.

## `minBooksQuoting` (type: `integer`):

Drop games priced by fewer than this many sportsbooks. Useful for skipping the half-priced fringe of a big slate.

## `maxHoldPercent` (type: `number`):

Keep only games where at least one market's cheapest book holds no more than this margin. 4.5 is a normal main line; below 2 is sharp.

## `onlyArbitrage` (type: `boolean`):

Keep only games where the best price on both sides, across all books in this market, adds up to under 100%.

## `minConsensusPercent` (type: `integer`):

Keep only games where public money is at least this lopsided, e.g. 70. Fetches the consensus board even when you are not buying the consensus block.

## `consensusSide` (type: `string`):

Which side the consensus threshold applies to.

## `minPropStarRating` (type: `integer`):

Keep only games holding at least one prop Covers rates this highly, out of 5, and trim the prop list to those. Fetches the projections board even when you are not buying it.

## `minPropEvPercent` (type: `number`):

Same idea against Covers' expected-value figure, e.g. 5 keeps props with 5% edge or better.

## `includeBookBreakdown` (type: `boolean`):

Keep the per-book array on each market. Turn this off for a compact row that still carries the best price, the consensus number, hold and fair value.

## `includeLineHistory` (type: `boolean`):

Every timestamped price change, per sportsbook, for the moneyline, spread and total. One request per game.

## `includeConsensus` (type: `boolean`):

Covers' signature block: the percentage of picks on each side and on over/under, with the pick counts. NFL, NBA, NHL, MLB, NCAAF, NCAAB, CFL and WNBA only.

## `consensusSegments` (type: `array`):

Which crowd to read. Overall is everyone, Team Money Leaders is the profitable cappers, Top 10% is the sharpest tenth — and they routinely disagree with the public.

## `includePlayerProps` (type: `boolean`):

Covers' own model projection for each player prop, with the gap to the posted line, an EV percentage, a star rating, a written rationale and the best price across books. MLB, NFL, NBA and NHL only.

## `includeMatchupDetail` (type: `boolean`):

Season records with units won, both teams' last ten with closing numbers, head to head, next three fixtures, series splits, projected lineups and — for MLB — the plate umpire's own over/under record. One request per game.

## `includeInjuries` (type: `boolean`):

The league injury list, attached to each game and filtered to the two clubs playing.

## `includeFutures` (type: `boolean`):

Championship, conference and division futures for each league, as extra rows: every selection with its opening number and a price per sportsbook.

## `maxLineHistoryPoints` (type: `integer`):

Cap on how far back the movement series goes for each book and market. Lower it to keep rows small.

## `maxItems` (type: `integer`):

Stop after this many game rows. Leave empty for the whole board.

## `maxConcurrency` (type: `integer`):

How many games to enrich at once. Covers serves anonymous traffic without rate limiting, so 6 is comfortable.

## Actor input object example

```json
{
  "leagues": [
    "mlb"
  ],
  "countryCode": "us",
  "oddsScopes": [
    "full-game"
  ],
  "teams": [],
  "books": [],
  "onlyArbitrage": false,
  "consensusSide": "either",
  "includeBookBreakdown": true,
  "includeLineHistory": false,
  "includeConsensus": false,
  "consensusSegments": [
    "overall"
  ],
  "includePlayerProps": false,
  "includeMatchupDetail": false,
  "includeInjuries": false,
  "includeFutures": false,
  "maxLineHistoryPoints": 60,
  "maxItems": 50,
  "maxConcurrency": 6
}
```

# Actor output Schema

## `games` (type: `string`):

One row per game per scope: both clubs, kick-off, every book's quote, the best price on each side and the computed fair value.

## `futures` (type: `string`):

Championship, conference and division selections with their opening number and a price per sportsbook. Present when the Futures block is enabled.

## `fights` (type: `string`):

One row per fight with each book's price on both fighters. Present when the UFC league is selected.

## `results` (type: `string`):

Every collected row in one feed, ready for CSV, JSON, Excel or XML export.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leagues": [
        "mlb"
    ],
    "countryCode": "us",
    "stateProvince": "",
    "oddsScopes": [
        "full-game"
    ],
    "teams": [],
    "dateFrom": "",
    "dateTo": "",
    "books": [],
    "minBooksQuoting": 0,
    "maxHoldPercent": 0,
    "minConsensusPercent": 0,
    "minPropStarRating": 0,
    "minPropEvPercent": 0,
    "consensusSegments": [
        "overall"
    ],
    "maxLineHistoryPoints": 60,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/covers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "leagues": ["mlb"],
    "countryCode": "us",
    "stateProvince": "",
    "oddsScopes": ["full-game"],
    "teams": [],
    "dateFrom": "",
    "dateTo": "",
    "books": [],
    "minBooksQuoting": 0,
    "maxHoldPercent": 0,
    "minConsensusPercent": 0,
    "minPropStarRating": 0,
    "minPropEvPercent": 0,
    "consensusSegments": ["overall"],
    "maxLineHistoryPoints": 60,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/covers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leagues": [
    "mlb"
  ],
  "countryCode": "us",
  "stateProvince": "",
  "oddsScopes": [
    "full-game"
  ],
  "teams": [],
  "dateFrom": "",
  "dateTo": "",
  "books": [],
  "minBooksQuoting": 0,
  "maxHoldPercent": 0,
  "minConsensusPercent": 0,
  "minPropStarRating": 0,
  "minPropEvPercent": 0,
  "consensusSegments": [
    "overall"
  ],
  "maxLineHistoryPoints": 60,
  "maxItems": 50
}' |
apify call parseforge/covers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/covers-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/by0ztUH4QGEvm6mDP/builds/IJa0L7stwGj1jboYX/openapi.json
