{
  "openapi": "3.0.1",
  "info": {
    "title": "Sports Betting Odds Scraper — NFL, NBA, Soccer, Tennis & Props",
    "description": "Keyless sports odds API: live odds and pre-match odds from Pinnacle and Bovada — moneyline, spreads, totals, specials, player props, de-vigged fair odds, line movement, odds comparison. NFL, College Football, MLB, NBA, NHL, UFC, tennis and soccer odds (Premier League, La Liga, Champions League).",
    "version": "0.3",
    "x-build-id": "vg9zpwaDI1vKjnhzs"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zhorex~sports-odds-aggregator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zhorex-sports-odds-aggregator",
        "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/zhorex~sports-odds-aggregator/runs": {
      "post": {
        "operationId": "runs-sync-zhorex-sports-odds-aggregator",
        "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/zhorex~sports-odds-aggregator/run-sync": {
      "post": {
        "operationId": "run-sync-zhorex-sports-odds-aggregator",
        "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",
            "type": "array",
            "description": "Pick the leagues you want. Each one sets its sport AND filters that sport to its own league, so NFL + NBA + NHL returns only NFL, NBA and NHL games — no Euroleague or KHL taking the slots. Prefilled with NFL, NBA and NHL. With Leagues set, the Sports and League filter fields below are not used; leave Leagues empty to use them instead (soccer, tennis and every other sport). API calls and saved Tasks that omit this field run Sports + League filter exactly as before. NCAAF is US college football (Bovada files it as 'College Football', Pinnacle as 'NCAA', Kambi as 'NCAAF'); NFL and NCAAF together share American football's maxEventsPerSport (and NBA and WNBA basketball's): the book's own order decides which gets the slots, and the run status says when one of them got none. NBA means the NBA only — not the G League, the Summer League or NBA 2K games. Why no soccer or tennis league here: the books label them in ways a league pick cannot separate — Bovada calls the Premier League of 15+ countries plain 'Premier League' and labels tennis by tournament — so for those use Sports + League filter and check the `league` column. NCAA basketball is left out until it can be checked on the books' own lists (Pinnacle's basketball list also carries 'Philippines - NCAA').",
            "items": {
              "type": "string",
              "enum": [
                "NFL",
                "NCAAF",
                "NBA",
                "WNBA",
                "NHL",
                "MLB"
              ],
              "enumTitles": [
                "NFL",
                "NCAAF — US college football",
                "NBA",
                "WNBA",
                "NHL",
                "MLB"
              ]
            },
            "default": []
          },
          "books": {
            "title": "Sportsbooks",
            "type": "array",
            "description": "Pick one or more. <b>Bovada</b> (prefilled): major US offshore book, keyless. <b>Pinnacle</b>: the sharp reference price — add it next to Bovada to compare the same games. <b>Kambi</b>: Unibet + Paf. <b>Smarkets</b>: a betting exchange, no bookmaker margin (h2h/spreads/totals only). <b>Bet365</b>: under repair (0 events). API calls and saved Tasks that omit this field keep the long-standing default, Pinnacle. Details: Bovada is keyless JSON with no login, cookie or signature and answers in 1-13 s for every sport (measured 2026-09-10). <b>Pinnacle</b> is the canonical sharp-line book and the reference price for +EV work — add it alongside Bovada for cross-book best-price comparison (no-vig fair odds are a separate add-on, includeFairOdds, and work on either book). One caveat measured 2026-09-10: Pinnacle's soccer feed is a 50 MB document that takes 93-233 s through a datacenter proxy, so pair Pinnacle with a leagueFilter or a lighter sport rather than asking it for all of soccer. <b>Kambi</b> covers Unibet and Paf from one public feed and keeps the run alive if any single book closes its doors. Its ice hockey list carries only regulation-time lines, so hockey is read from Unibet's page for each fixture (full-game moneyline, puck line and total, overtime included): one request per fixture, at most 30 per run. <b>Smarkets</b> is the one EXCHANGE here — people betting against each other, so its price carries no bookmaker margin (measured 2026-09-23: its 1X2 back prices summed to 100.61% against a bookmaker's 104-108%). Its rows carry the money resting behind each price, so you can tell a real quote from a two-unit ghost, and with includeFairOdds on it anchors the fair price of any fixture your other books also cover. It carries h2h, spreads and totals only — no player props, corners, halves or team totals — and not every sport has all three: h2h comes back on all 11 sports (the three-way 1X2 on soccer and rugby, the two-way moneyline everywhere else), spreads and totals on soccer, American football, basketball, baseball and NHL ice hockey (measured 2026-09-28: the exchange lists the full-game puck line and total beside its regulation-time ones, and only the full-game ones come back), spreads only on rugby. Tennis, cricket, MMA and esports are h2h only — their handicaps and totals on this exchange are a different bet (sets rather than games) and are skipped rather than mislabelled, as are ice hockey's regulation-time handicap and total; the run status names the sport and the missing markets. One caveat for price comparison: an exchange earns commission on net winnings rather than margin in the price, so an exchange back price is GROSS of it — at 2%, a winning 1u bet at 2.78 nets 2.7444. <b>Bet365</b> is temporarily UNDER REPAIR (their public mobile-web endpoints changed; selecting it right now returns 0 events). US books (DraftKings / FanDuel / BetMGM) are intentionally out of scope: they need US residential proxy.",
            "items": {
              "type": "string",
              "enum": [
                "pinnacle",
                "bet365",
                "kambi",
                "bovada",
                "smarkets"
              ],
              "enumTitles": [
                "Pinnacle — sharp reference book",
                "Bet365 — UNDER REPAIR (returns 0 events)",
                "Kambi — Unibet + Paf from one feed",
                "Bovada — a major US offshore book",
                "Smarkets — betting EXCHANGE, no bookmaker margin (h2h/spreads/totals only)"
              ]
            },
            "default": [
              "pinnacle"
            ]
          },
          "sports": {
            "title": "Sports (used when Leagues is empty)",
            "type": "array",
            "description": "Used only when Leagues above is empty — with Leagues set, this field is ignored. These are top-level categories, not leagues: each book lists its leagues in its own order and maxEventsPerSport takes the first ones, so 'basketball' at a small cap can return Euroleague and no NBA game — pick the league in Leagues, or name it in League filter. API calls and saved Tasks that omit this field keep the long-standing default, soccer + tennis. Details: Measured on Bovada 2026-09-10 with the default cap of 15 events: american_football_intl 15 events / 90 rows, all NFL (College Football and CFL sit behind them in the same feed); soccer 15 / 105 (Premier League first, 1,477 pre-match fixtures available); tennis 15 / 66 but the window is thin between tournaments; baseball only 5 MLB fixtures and a same-day window. Measured 2026-09-28: ice_hockey 15 / 90, all NHL preseason games (no book labels the NHL preseason; it is filed as plain NHL — Kambi does label its AHL preseason 'AHL Preseason'); basketball 15 / 90 with NO NBA game among them — Euro Cup, WNBA and Euroleague come first in the feed, ahead of 17 NBA games — so for the NBA set leagueFilter [\"NBA\"] (the run status says when the cap filled up before a sport's main league). On Pinnacle the shelf is different — soccer is by far the deepest (1,266 fixtures) and tennis runs year-round, but see the note on Pinnacle's soccer payload size under Sportsbooks. Empty selections waste a run budget — if a sport comes back with nothing, the run status says so explicitly.",
            "items": {
              "type": "string",
              "enum": [
                "soccer",
                "tennis",
                "basketball",
                "ice_hockey",
                "mma",
                "baseball",
                "american_football_intl",
                "rugby_union",
                "rugby_league",
                "cricket",
                "esports"
              ],
              "enumTitles": [
                "Soccer (Premier League…)",
                "Tennis (ATP, WTA, Challenger, ITF)",
                "Basketball (NBA, WNBA, Euroleague… — set leagueFilter [\"NBA\"] for the NBA)",
                "Ice hockey (NHL, KHL, SHL, Liiga… — set leagueFilter [\"NHL\"] for the NHL)",
                "MMA (UFC…)",
                "Baseball (MLB…)",
                "American football (NFL, College Football, CFL)",
                "Rugby union",
                "Rugby league",
                "Cricket",
                "Esports"
              ]
            },
            "default": [
              "soccer",
              "tennis"
            ]
          },
          "leagueFilter": {
            "title": "League filter (optional; used when Leagues is empty)",
            "type": "array",
            "description": "Not used on a run with Leagues. Optional league names / codes to whitelist (e.g. 'NBA', 'NHL', 'College Football', 'UEFA', 'ATP'). Empty = all leagues for the chosen sports. Case-insensitive match against the book's own league label: a term is found anywhere in the label ('liga' finds 'Bundesliga'), except a league code typed in capitals (2-5 letters or digits, e.g. NBA, NHL, NCAA), which has to start a word of it — so NBA matches 'NBA' and 'NBA Preseason' but not 'WNBA' (it did until 28 Sep 2026), and NCAA still matches 'NCAAF'. The filter applies to every sport in the run.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "marketTypes": {
            "title": "Market types",
            "type": "array",
            "description": "h2h (moneyline), spreads and totals bill $0.01 a row pre-match ($0.025 live); specials and player_props come from Pinnacle and bill $0.05 a row. Which betting markets to extract per event. 'h2h' (moneyline) is the canonical sharp market. 'spreads' (handicap) and 'totals' (over/under) drive most EV-modelling pipelines. 'specials' enables Pinnacle's futures / yes-no / first-team-to-score / exact-totals / team-props markets and its over/under player props (premium $0.05 tier — thousands per sport in soccer, a few hundred in NFL, so use maxEventsPerSport to control volume). 'player_props' is Pinnacle's per-game player props — over/unders in basketball, ice hockey and NFL (one row per player, stat and side), yes/no 'To Score' bets in soccer, where playerName and propStat are null — each row carrying the game's teams, playerName, propStat and parentEventId (premium $0.05 tier, the same event as specials; with both selected a prop comes back once, as player_props). Pinnacle lists them game by game — on 7 Oct 2026, 161 in ice hockey (NHL) and 30 in basketball (NBA preseason) — and a run that finds none says so in its status and bills nothing for them. Each prop counts as one event against maxEventsPerSport (on Pinnacle, games and props are capped separately), and Pinnacle interleaves props across the slate: on 28 Sep 2026 it listed 205 WNBA props over 4 games, and a cap of 8 returned 8 props from all 4 games. 'first_half_*' is the first half (first set in tennis, first 5 innings in baseball) on Pinnacle and, where listed, Bovada; it is not returned for ice hockey (periods, not halves) or esports (Pinnacle's first part is map 1).",
            "items": {
              "type": "string",
              "enum": [
                "h2h",
                "spreads",
                "totals",
                "first_half_h2h",
                "first_half_spreads",
                "first_half_totals",
                "specials",
                "player_props",
                "team_totals"
              ]
            },
            "default": [
              "h2h",
              "spreads",
              "totals"
            ]
          },
          "maxEventsPerSport": {
            "title": "Max events per sport (hard cap)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on events per (book, sport) — NFL and NCAAF share American football's. About 6 rows per event with h2h + spreads + totals. The form is prefilled with 8: on the books' own feeds saved 24-28 Sep 2026, Bovada's NFL, NBA and NHL at 8 games each came to 144 rows, about $1.49 a run with the per-run fee, so a first run fits inside Apify's $5 free credit with room for two more. API calls and saved Tasks that omit this field keep the long-standing default of 50 — across two deep sports that is ~$5.4 per run. A Pinnacle player prop counts as one event here, capped apart from the games, and Pinnacle interleaves props across the slate: on 28 Sep 2026 it listed 205 WNBA props over 4 games, and a cap of 8 returned 8 of them, from all 4 games.",
            "default": 50
          },
          "includeFairOdds": {
            "title": "No-vig fair odds (+ edge when Pinnacle or Smarkets is also selected) — $0.05 per enriched row",
            "type": "boolean",
            "description": "Paid add-on, off by default: $0.05 (fair-odds-enrichment) for each row that gets a fair price, on top of that row's own price. Adds noVigFairPrice, noVigProb and overround — the price with the book's margin removed. With 2+ books including pinnacle or smarkets, each enriched row also gets <code>edgePct</code>: how far its price is above (+) or below (−) the no-vig price the sharp book quoted for the same fixture, market and line, with sharpFairPrice and sharpSource — plus crossBookMarginPct, the market's margin at the best price per outcome across your books. Pre-match prices only: in-play rows carry neither. With one book, or without pinnacle or smarkets, you get the fair price and no edge. Same event and price, no extra request. Details: the fair price is computed per market line, the standard baseline for spotting +EV prices at softer books and for model calibration; this event has been billed since 8 Aug 2026. The sharp reference is the Smarkets exchange when it quotes the whole market (same outcomes, same lines), otherwise Pinnacle's own de-vig; a book is never compared with itself, exchange rows carry no edge, and a market neither sharp book quotes in full keeps edgePct null rather than a guess. In crossBookMarginPct an exchange price counts net of its 2% commission on winnings. Every number is as read in this run: a book's feed can lag (Bovada's coupon is cached by its CDN), so re-check a price before acting on it. <b>With \"smarkets\" among your books</b>, the fair price of any fixture the exchange also quotes is taken FROM the exchange (which has no bookmaker margin) instead of from that book's own de-vig, and every enriched row says which it got in <code>noVigSource</code>. That changes the number, never the bill: only rows that already carried a fair price are re-anchored, so the count of charged fair-odds-enrichment events is identical either way.",
            "default": false
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "pre_match_only",
              "live_only",
              "pre_match_and_live"
            ],
            "type": "string",
            "description": "'pre_match_only' (default) returns scheduled fixtures and is the cheapest, most-common workflow (5-15 min cadence). 'live_only' returns in-play markets — premium pricing tier; use with scheduled runs at ≤5 min cadence. 'pre_match_and_live' covers both, useful for arb finders that want to compare scheduled vs in-play lines.",
            "default": "pre_match_only"
          },
          "includeLineMovement": {
            "title": "Add line movement (free)",
            "type": "boolean",
            "description": "Adds movement fields to every snapshot by comparing the price to the last one this account's runs saw for the same market-outcome: previousPrice, priceChange, priceChangePct, impliedProbChange, moveDirection (shortened / drifted / unchanged), secondsSincePreviousPrice, plus firstSeenPrice and moveSinceFirstSeen for movement since the first observation. Free — it reuses the state the dedup window already keeps, so there is no extra request and no extra charge. Fields appear from your SECOND run of a market onward (the first run has nothing to compare to).",
            "default": true
          },
          "includeBestPriceFlag": {
            "title": "Flag best price across books",
            "type": "boolean",
            "description": "When ≥2 books are selected, set isBestPriceAcrossBooks on the row with the best price for each (fixture, market, outcome, line) — only where at least two of your books quote that same outcome and line (on a tie, every tied row is flagged). Rows no other book quoted stay false.",
            "default": true
          },
          "includeAlternateLines": {
            "title": "Include alternate lines (more rows, more cost)",
            "type": "boolean",
            "description": "Pinnacle and Smarkets. Off by default. On Smarkets, off means one line per market per fixture — the rung the exchange itself prices closest to 50/50, which is what \"the line\" means on an order book — and on means every rung this Actor scanned (up to 9 around the ladder's own centre), with isAlternate set on all but that one. When on, the whole alternate ladder is returned — every extra handicap and total, not just the primary line (e.g. spread -1.5 / -1.0 / -0.5 alongside the main one). It costs no extra request, but it multiplies BILLED rows, and HOW MUCH depends on how many events you take. Measured 2026-08-07: across a full pre-match sweep it is about ×1.7 (×1.66 soccer, ×2.59 tennis, ×3.24 basketball, ×1.58 baseball, ×1.00 ice hockey), but with maxEventsPerSport=10 the same run went 42 → 354 rows, i.e. ×8.4 — the fewer events you take, the larger the share that is ladder. Check your first run's row count before scaling up. Rows carry `isAlternate` so you can filter, and `marketKey` so two rungs at the same line stay distinguishable.",
            "default": false
          },
          "deduplicationWindowSeconds": {
            "title": "Dedup window (seconds)",
            "minimum": 0,
            "maximum": 3600,
            "type": "integer",
            "description": "Suppress a snapshot whose price has not changed since the row was last DELIVERED — keeps PPE cost down on cron runs where most lines are stable. Set to 0 to disable and emit every snapshot. The window runs from the last delivery, not from the previous run (a suppressed run does not restart the clock), so an unchanged price is billed again each time the window elapses: on a */5 Schedule, 3600 (the maximum) bills an unchanged row on about 1 run in 12, 600 on 1 in 3, 360 on 1 in 2, and the default 30 on every run. A changed price is always delivered and billed.",
            "default": 30
          },
          "priceFormat": {
            "title": "Price format",
            "enum": [
              "decimal",
              "american",
              "fractional"
            ],
            "type": "string",
            "description": "`price` is always decimal; `priceAmerican` and `priceFractional` are always included too — this selector has no effect on the output.",
            "default": "decimal"
          },
          "cookieStrings": {
            "title": "Optional per-book cookie strings",
            "type": "object",
            "description": "Optional. Object keyed by book name ({ 'bet365': '...', 'pinnacle': '...' }) with raw cookie headers from your browser DevTools to raise per-IP rate limits on heavy runs. NOT required for typical workloads — both books work anonymously."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave this as it comes. The default (Apify Proxy, automatic selection) uses datacenter IPs, which is the right cost/quality point for both books — residential burns roughly 20x the proxy cost with no quality lift. Do NOT set apifyProxyGroups to \"DATACENTER\": that is not a real Apify group name and the run will refuse to start. If the run log shows repeated \"unhealthy (code=403)\" lines and a sport comes back empty, the exit range is being blocked by the book — switch apifyProxyGroups to [\"RESIDENTIAL\"] for that run.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}