diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..b88e6b0
Binary files /dev/null and b/.DS_Store differ
diff --git a/Tutorials/.DS_Store b/Tutorials/.DS_Store
new file mode 100644
index 0000000..40990d3
Binary files /dev/null and b/Tutorials/.DS_Store differ
diff --git a/Tutorials/Task_3_tutorial/.DS_Store b/Tutorials/Task_3_tutorial/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/Tutorials/Task_3_tutorial/.DS_Store differ
diff --git a/Tutorials/Task_3_tutorial/Kalshi_API_Demo.ipynb b/Tutorials/Task_3_tutorial/Kalshi_API_Demo.ipynb
new file mode 100644
index 0000000..969912e
--- /dev/null
+++ b/Tutorials/Task_3_tutorial/Kalshi_API_Demo.ipynb
@@ -0,0 +1,2113 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Kalshi Sports Market Data for Arbitrage (Demo)"
+ ],
+ "metadata": {
+ "id": "5WWF1IC6h2hR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "PwgCyJygjaqE"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Install dependencies\n",
+ "\n",
+ "Installs the minimal Python packages used in this tutorial (`pandas`, `requests`)."
+ ],
+ "metadata": {
+ "id": "VuT49wVsx_PT"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "pOd5ipSE6r-b"
+ },
+ "outputs": [],
+ "source": [
+ "!pip -q install pandas requests\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Imports + Kalshi REST helper\n",
+ "\n",
+ "Sets up KALSHI API used for all requests in this notebook"
+ ],
+ "metadata": {
+ "id": "ujuuYUz9yBdl"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "\n",
+ "import time\n",
+ "import requests\n",
+ "import pandas as pd\n",
+ "\n",
+ "KALSHI_BASE = \"https://api.elections.kalshi.com/trade-api/v2\"\n",
+ "\n",
+ "# a small GET helper with retries\n",
+ "def get_json(path, params=None, timeout=20, retries=3):\n",
+ " \"\"\"\n",
+ " Simple GET helper with retries.\n",
+ " path can be \"/markets\" or full \"https://...\" url.\n",
+ " \"\"\"\n",
+ " url = path if path.startswith(\"http\") else f\"{KALSHI_BASE}{path}\"\n",
+ " last_err = None\n",
+ " for attempt in range(retries):\n",
+ " try:\n",
+ " r = requests.get(url, params=params, timeout=timeout)\n",
+ " r.raise_for_status()\n",
+ " return r.json()\n",
+ " except Exception as e:\n",
+ " last_err = e\n",
+ " time.sleep(1.5 * (attempt + 1))\n",
+ " raise RuntimeError(f\"GET failed after {retries} tries: {url} params={params}\\n{last_err}\")\n"
+ ],
+ "metadata": {
+ "id": "dxbQefoM7P71"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Explore “sports filters” metadata\n",
+ "\n",
+ "Fetches `/search/filters_by_sport`, which is **filter metadata**\n",
+ "Use this to discover what sport names / filter fields exist."
+ ],
+ "metadata": {
+ "id": "yrqRbRwDyFPf"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Sports filters (this is just filter metadata, not markets)\n",
+ "\n",
+ "filters = get_json(\"/search/filters_by_sport\")\n",
+ "print(\"sports ordering (first 20):\", (filters.get(\"sport_ordering\") or [])[:20])\n",
+ "\n",
+ "# Peek one sport's available filters (edit SPORT to explore)\n",
+ "SPORT = \"Football\"\n",
+ "by_sport = (filters.get(\"filters_by_sports\") or {})\n",
+ "print(f\"\\nFilters for {SPORT}:\")\n",
+ "print(by_sport.get(SPORT, {}))\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "IKTDEcCX7Tbe",
+ "outputId": "77e311c0-f92a-403c-9341-3b2faee2919b"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "sports ordering (first 20): ['All sports', 'Football', 'Basketball', 'Hockey', 'Soccer', 'Tennis', 'Golf', 'MMA', 'Baseball', 'Boxing', 'Chess', 'Cricket', 'Esports', 'Motorsport', 'Olympics']\n",
+ "\n",
+ "Filters for Football:\n",
+ "{'competitions': {'College Football': {'scopes': ['Futures', 'Awards', 'Championship', 'Conferences', 'Events']}, 'Pro Football': {'scopes': ['Games', 'Futures', '1st Half Total', '1st Quarter Spread', '1st Quarter Total', '1st Quarter Winner', 'Awards', 'Draft', 'Events']}}, 'scopes': ['Games', 'Futures', '1st Half Total', '1st Quarter Spread', '1st Quarter Total', '1st Quarter Winner', 'Awards', 'Championship', 'Draft', 'Events']}\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Understand `/series`\n",
+ "\n",
+ "Kalshi “series” are often **recurring templates**. Depending on how Kalshi categorizes series at the moment\n",
+ "\n",
+ "This cell:\n",
+ "- Pulls **all** series\n",
+ "- Prints available categories\n",
+ "- Shows whether any series are tagged as sports\n",
+ "- Displays a small DataFrame preview\n"
+ ],
+ "metadata": {
+ "id": "VFIu0jWzyMJK"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "series_all = get_json(\"/series\", params={\"include_volume\": \"true\"}).get(\"series\") or []\n",
+ "print(\"Total series returned:\", len(series_all))\n",
+ "\n",
+ "# What categories actually exist in series?\n",
+ "cats = sorted({(s.get(\"category\") or \"\").strip() for s in series_all if s.get(\"category\")})\n",
+ "print(\"Some series categories:\", cats[:30])\n",
+ "\n",
+ "sports_series = [s for s in series_all if (s.get(\"category\") or \"\").lower() == \"sports\"]\n",
+ "print(\"Series with category='sports':\", len(sports_series))\n",
+ "\n",
+ "# If you still want to inspect a few series:\n",
+ "pd.DataFrame(series_all)[[\"ticker\",\"title\",\"category\",\"volume_fp\"]].head(20) if series_all else \"No series returned.\"\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 728
+ },
+ "id": "DIJ6OdF87bFy",
+ "outputId": "fae0f7ff-8fbb-43f1-f665-9ed9d2af29ad"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Total series returned: 8109\n",
+ "Some series categories: ['Climate and Weather', 'Companies', 'Crypto', 'Economics', 'Education', 'Elections', 'Entertainment', 'Financials', 'Health', 'Mentions', 'Politics', 'Science and Technology', 'Social', 'Sports', 'Transportation', 'World']\n",
+ "Series with category='sports': 1111\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " ticker title \\\n",
+ "0 KXBORDERBILL Border bill \n",
+ "1 KXATTYGENID AG race ID \n",
+ "2 KXBELGIANPLGAME Belgian Pro League Game \n",
+ "3 KXKHMI Harris wins but loses Michigan \n",
+ "4 KXUKBANGROK Will the UK ban Grok? \n",
+ "5 KXMLSGAME Major League Soccer Game \n",
+ "6 KXCHOPIN CHOPIN \n",
+ "7 HOUSENJ5 House NJ's 5th \n",
+ "8 KXMEEKMILLAI When will Meek Mill launch his AI tool? \n",
+ "9 NEPA NEPA permitting reform bill \n",
+ "10 KXLEAVEBONDI Bondi out \n",
+ "11 KXWACAPANDTRADE Washington cap and trade program \n",
+ "12 KXSCREWWORMCOUNT SCREWWORM CASES \n",
+ "13 KXTOPSONGRECORDLUTHER Luther top song length \n",
+ "14 KXLOSEPRIMARYSENATER How many Senate Republicans will lose their pr... \n",
+ "15 KXCEOYCOMB Y Combinator CEO leaving \n",
+ "16 KXDJTBMEN Black men 2024 \n",
+ "17 KXVENEZUELALEADER2 Who will be the head of state of Venezuela on ... \n",
+ "18 FEMA States that declare natural disasters \n",
+ "19 RECNCH Reconciliation bill passes the House \n",
+ "\n",
+ " category volume_fp \n",
+ "0 Politics 852101.00 \n",
+ "1 Elections 625.00 \n",
+ "2 Sports 5357862.00 \n",
+ "3 35622.00 \n",
+ "4 Politics 70188.00 \n",
+ "5 Sports 21677235.00 \n",
+ "6 Entertainment 0.00 \n",
+ "7 Politics 1422.00 \n",
+ "8 Companies 2501.00 \n",
+ "9 Politics 0.00 \n",
+ "10 Politics 518330.00 \n",
+ "11 Politics 14056.00 \n",
+ "12 Health 17746.00 \n",
+ "13 Entertainment 6055.00 \n",
+ "14 Politics 1758.00 \n",
+ "15 Companies 15373.00 \n",
+ "16 0.00 \n",
+ "17 Politics 96657.00 \n",
+ "18 Climate and Weather 0.00 \n",
+ "19 Politics 0.00 "
+ ],
+ "text/html": [
+ "\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ticker | \n",
+ " title | \n",
+ " category | \n",
+ " volume_fp | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " KXBORDERBILL | \n",
+ " Border bill | \n",
+ " Politics | \n",
+ " 852101.00 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " KXATTYGENID | \n",
+ " AG race ID | \n",
+ " Elections | \n",
+ " 625.00 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " KXBELGIANPLGAME | \n",
+ " Belgian Pro League Game | \n",
+ " Sports | \n",
+ " 5357862.00 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " KXKHMI | \n",
+ " Harris wins but loses Michigan | \n",
+ " | \n",
+ " 35622.00 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " KXUKBANGROK | \n",
+ " Will the UK ban Grok? | \n",
+ " Politics | \n",
+ " 70188.00 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " KXMLSGAME | \n",
+ " Major League Soccer Game | \n",
+ " Sports | \n",
+ " 21677235.00 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " KXCHOPIN | \n",
+ " CHOPIN | \n",
+ " Entertainment | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " HOUSENJ5 | \n",
+ " House NJ's 5th | \n",
+ " Politics | \n",
+ " 1422.00 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " KXMEEKMILLAI | \n",
+ " When will Meek Mill launch his AI tool? | \n",
+ " Companies | \n",
+ " 2501.00 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " NEPA | \n",
+ " NEPA permitting reform bill | \n",
+ " Politics | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " KXLEAVEBONDI | \n",
+ " Bondi out | \n",
+ " Politics | \n",
+ " 518330.00 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " KXWACAPANDTRADE | \n",
+ " Washington cap and trade program | \n",
+ " Politics | \n",
+ " 14056.00 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " KXSCREWWORMCOUNT | \n",
+ " SCREWWORM CASES | \n",
+ " Health | \n",
+ " 17746.00 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " KXTOPSONGRECORDLUTHER | \n",
+ " Luther top song length | \n",
+ " Entertainment | \n",
+ " 6055.00 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " KXLOSEPRIMARYSENATER | \n",
+ " How many Senate Republicans will lose their pr... | \n",
+ " Politics | \n",
+ " 1758.00 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " KXCEOYCOMB | \n",
+ " Y Combinator CEO leaving | \n",
+ " Companies | \n",
+ " 15373.00 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " KXDJTBMEN | \n",
+ " Black men 2024 | \n",
+ " | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " KXVENEZUELALEADER2 | \n",
+ " Who will be the head of state of Venezuela on ... | \n",
+ " Politics | \n",
+ " 96657.00 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " FEMA | \n",
+ " States that declare natural disasters | \n",
+ " Climate and Weather | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " RECNCH | \n",
+ " Reconciliation bill passes the House | \n",
+ " Politics | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "summary": "{\n \"name\": \"pd\",\n \"rows\": 20,\n \"fields\": [\n {\n \"column\": \"ticker\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 20,\n \"samples\": [\n \"KXBORDERBILL\",\n \"KXVENEZUELALEADER2\",\n \"KXCEOYCOMB\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 20,\n \"samples\": [\n \"Border bill\",\n \"Who will be the head of state of Venezuela on date?\",\n \"Y Combinator CEO leaving\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 8,\n \"samples\": [\n \"Elections\",\n \"Companies\",\n \"Politics\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume_fp\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 16,\n \"samples\": [\n \"852101.00\",\n \"625.00\",\n \"21677235.00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 30
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Fetch a sport markets table\n",
+ "\n",
+ "Queries `/markets` and builds a DataFrame with the key fields you’ll likely filter on:\n",
+ "\n",
+ "- `yes_bid_dollars`, `yes_ask_dollars` (spread)\n",
+ "- `volume_fp`, `open_interest_fp`\n",
+ "- `last_price_dollars`\n",
+ "- `close_time`, etc.\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "1ke25fNnyThJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Make a \"quality filter\" view (liquidity + spread) from your df_kalshi / df_sports_like\n",
+ "import pandas as pd\n",
+ "\n",
+ "df = df_kalshi.copy() # change if your dataframe name is different\n",
+ "\n",
+ "# Numeric conversion (Kalshi returns strings sometimes)\n",
+ "for c in [\"yes_bid_dollars\",\"yes_ask_dollars\",\"last_price_dollars\",\"volume_fp\",\"open_interest_fp\"]:\n",
+ " if c in df.columns:\n",
+ " df[c] = pd.to_numeric(df[c], errors=\"coerce\")\n",
+ "\n",
+ "# Spread + midpoint\n",
+ "df[\"yes_spread\"] = df[\"yes_ask_dollars\"] - df[\"yes_bid_dollars\"]\n",
+ "df[\"yes_mid\"] = (df[\"yes_ask_dollars\"] + df[\"yes_bid_dollars\"]) / 2\n",
+ "\n",
+ "# Tradable-ish thresholds (tune these for you need)\n",
+ "MIN_VOL = 50.0\n",
+ "MIN_OI = 50.0\n",
+ "MAX_SPREAD = 0.10\n",
+ "\n",
+ "good = df[\n",
+ " ((df[\"volume_fp\"].fillna(0) >= MIN_VOL) | (df[\"open_interest_fp\"].fillna(0) >= MIN_OI)) &\n",
+ " (df[\"yes_spread\"].fillna(999) <= MAX_SPREAD) &\n",
+ " (df[\"yes_bid_dollars\"].fillna(0) > 0) & # avoid “no buyers” markets\n",
+ " (df[\"yes_ask_dollars\"].notna())\n",
+ "].copy()\n",
+ "\n",
+ "# Sort: most liquid first, then tightest spread\n",
+ "good = good.sort_values([\"volume_fp\",\"open_interest_fp\",\"yes_spread\"], ascending=[False, False, True])\n",
+ "\n",
+ "display(good[[\n",
+ " \"ticker\",\"title\",\"status\",\n",
+ " \"yes_bid_dollars\",\"yes_ask_dollars\",\"yes_spread\",\n",
+ " \"last_price_dollars\",\"volume_fp\",\"open_interest_fp\",\"close_time\"\n",
+ "]].head(50))\n",
+ "\n",
+ "print(\"Total markets in df:\", len(df))\n",
+ "print(\"Filtered 'good' markets:\", len(good))\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "utPzQkyg84cf",
+ "outputId": "a3c4a9c3-ee6d-4d55-e7e9-b30317bcf742"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " ticker \\\n",
+ "1325 KXNBASPREAD-26JAN25SACDET-DET13 \n",
+ "1552 KXATPMATCH-26JAN25SHERUU-SHE \n",
+ "659 KXATPMATCH-26JAN26ALCDE-ALC \n",
+ "1528 KXNBAMENTION-26JAN25DENMEM-INJU \n",
+ "1553 KXATPMATCH-26JAN25SHERUU-RUU \n",
+ "1286 KXNBASPREAD-26JAN25DENMEM-MEM2 \n",
+ "1306 KXNBATOTAL-26JAN25SACDET-240 \n",
+ "1326 KXNBASPREAD-26JAN25SACDET-DET10 \n",
+ "658 KXATPMATCH-26JAN26ALCDE-DE \n",
+ "1569 KXWTAMATCH-26JAN24INGSWI-ING \n",
+ "674 KXATPMATCH-26JAN26ZVETIE-ZVE \n",
+ "1285 KXNBASPREAD-26JAN25DENMEM-MEM5 \n",
+ "1530 KXNBAMENTION-26JAN25DENMEM-ELBO \n",
+ "1250 KXNBASPREAD-26JAN25TOROKC-OKC11 \n",
+ "1531 KXNBAMENTION-26JAN25DENMEM-BUZZ \n",
+ "1529 KXNBAMENTION-26JAN25DENMEM-FEDE \n",
+ "675 KXATPMATCH-26JAN26ZVETIE-TIE \n",
+ "1318 KXNBASPREAD-26JAN25SACDET-DET7 \n",
+ "1307 KXNBATOTAL-26JAN25SACDET-237 \n",
+ "1525 KXNBAMENTION-26JAN25DENMEM-PLAY \n",
+ "1310 KXNBATOTAL-26JAN25SACDET-228 \n",
+ "1554 KXWTAMATCH-26JAN25RYBMER-RYB \n",
+ "1202 KXNBATOTAL-26JAN25DALMIL-219 \n",
+ "1303 KXNBASPREAD-26JAN25NOPSAS-SAS11 \n",
+ "1257 KXNBATOTAL-26JAN25DENMEM-223 \n",
+ "1533 KXNBAMENTION-26JAN25DENMEM-ALLE \n",
+ "1208 KXNBASPREAD-26JAN25BKNLAC-LAC9 \n",
+ "1526 KXNBAMENTION-26JAN25DENMEM-MVP \n",
+ "1523 KXNBAMENTION-26JAN25DENMEM-TECH \n",
+ "1534 KXNBAMENTION-26JAN25DENMEM-ALL \n",
+ "1522 KXNBAMENTION-26JAN25DENMEM-TRAD \n",
+ "1309 KXNBATOTAL-26JAN25SACDET-231 \n",
+ "1535 KXNBAMENTION-26JAN25DENMEM-AIR \n",
+ "1524 KXNBAMENTION-26JAN25DENMEM-RETI \n",
+ "1532 KXNBAMENTION-26JAN25DENMEM-ANKL \n",
+ "1316 KXNBATOTAL-26JAN25SACDET-210 \n",
+ "1312 KXNBATOTAL-26JAN25SACDET-222 \n",
+ "1274 KXNBASPREAD-26JAN25MIAPHX-PHX5 \n",
+ "928 KXWTAMATCH-26JAN26SABJOV-JOV \n",
+ "1266 KXNBATOTAL-26JAN25NOPSAS-240 \n",
+ "1180 KXNBATOTAL-26JAN25BKNLAC-212 \n",
+ "1556 KXNBAGAME-26JAN26LALCHI-LAL \n",
+ "1191 KXNBATOTAL-26JAN25TOROKC-225 \n",
+ "1314 KXNBATOTAL-26JAN25SACDET-216 \n",
+ "614 KXWTAMATCH-26JAN26GAUSVI-GAU \n",
+ "1235 KXNBATOTAL-26JAN25MIAPHX-226 \n",
+ "1521 KXNBAMENTION-26JAN25DENMEM-TRIP \n",
+ "1313 KXNBATOTAL-26JAN25SACDET-219 \n",
+ "927 KXWTAMATCH-26JAN26SABJOV-SAB \n",
+ "1323 KXNBASPREAD-26JAN25SACDET-DET19 \n",
+ "\n",
+ " title status \\\n",
+ "1325 Detroit wins by over 13.5 Points? active \n",
+ "1552 Will Ben Shelton win the Shelton vs Ruud : Rou... active \n",
+ "659 Will Carlos Alcaraz win the Alcaraz vs de Mina... active \n",
+ "1528 What will the announcers say during Denver at ... active \n",
+ "1553 Will Casper Ruud win the Shelton vs Ruud : Rou... active \n",
+ "1286 Memphis wins by over 2.5 Points? active \n",
+ "1306 Sacramento at Detroit: Total Points active \n",
+ "1326 Detroit wins by over 10.5 Points? active \n",
+ "658 Will Alex de Minaur win the Alcaraz vs de Mina... active \n",
+ "1569 Will Maddison Inglis win the Inglis vs Swiatek... active \n",
+ "674 Will Alexander Zverev win the Zverev vs Tien :... active \n",
+ "1285 Memphis wins by over 5.5 Points? active \n",
+ "1530 What will the announcers say during Denver at ... active \n",
+ "1250 Oklahoma City wins by over 11.5 Points? active \n",
+ "1531 What will the announcers say during Denver at ... active \n",
+ "1529 What will the announcers say during Denver at ... active \n",
+ "675 Will Learner Tien win the Zverev vs Tien : Qua... active \n",
+ "1318 Detroit wins by over 7.5 Points? active \n",
+ "1307 Sacramento at Detroit: Total Points active \n",
+ "1525 What will the announcers say during Denver at ... active \n",
+ "1310 Sacramento at Detroit: Total Points active \n",
+ "1554 Will Elena Rybakina win the Rybakina vs Merten... active \n",
+ "1202 Dallas at Milwaukee: Total Points active \n",
+ "1303 San Antonio wins by over 11.5 Points? active \n",
+ "1257 Denver at Memphis: Total Points active \n",
+ "1533 What will the announcers say during Denver at ... active \n",
+ "1208 Los Angeles C wins by over 9.5 Points? active \n",
+ "1526 What will the announcers say during Denver at ... active \n",
+ "1523 What will the announcers say during Denver at ... active \n",
+ "1534 What will the announcers say during Denver at ... active \n",
+ "1522 What will the announcers say during Denver at ... active \n",
+ "1309 Sacramento at Detroit: Total Points active \n",
+ "1535 What will the announcers say during Denver at ... active \n",
+ "1524 What will the announcers say during Denver at ... active \n",
+ "1532 What will the announcers say during Denver at ... active \n",
+ "1316 Sacramento at Detroit: Total Points active \n",
+ "1312 Sacramento at Detroit: Total Points active \n",
+ "1274 Phoenix wins by over 5.5 Points? active \n",
+ "928 Will Iva Jovic win the Sabalenka vs Jovic : Qu... active \n",
+ "1266 New Orleans at San Antonio: Total Points active \n",
+ "1180 Brooklyn at Los Angeles C: Total Points active \n",
+ "1556 Los Angeles L at Chicago Winner? active \n",
+ "1191 Toronto at Oklahoma City: Total Points active \n",
+ "1314 Sacramento at Detroit: Total Points active \n",
+ "614 Will Coco Gauff win the Gauff vs Svitolina : Q... active \n",
+ "1235 Miami at Phoenix: Total Points active \n",
+ "1521 What will the announcers say during Denver at ... active \n",
+ "1313 Sacramento at Detroit: Total Points active \n",
+ "927 Will Aryna Sabalenka win the Sabalenka vs Jovi... active \n",
+ "1323 Detroit wins by over 19.5 Points? active \n",
+ "\n",
+ " yes_bid_dollars yes_ask_dollars yes_spread last_price_dollars \\\n",
+ "1325 0.52 0.57 0.05 0.54 \n",
+ "1552 0.58 0.59 0.01 0.59 \n",
+ "659 0.80 0.82 0.02 0.82 \n",
+ "1528 0.06 0.07 0.01 0.07 \n",
+ "1553 0.41 0.42 0.01 0.41 \n",
+ "1286 0.53 0.61 0.08 0.62 \n",
+ "1306 0.46 0.50 0.04 0.48 \n",
+ "1326 0.61 0.67 0.06 0.62 \n",
+ "658 0.18 0.20 0.02 0.20 \n",
+ "1569 0.02 0.04 0.02 0.02 \n",
+ "674 0.66 0.67 0.01 0.67 \n",
+ "1285 0.47 0.51 0.04 0.46 \n",
+ "1530 0.01 0.03 0.02 0.03 \n",
+ "1250 0.46 0.47 0.01 0.46 \n",
+ "1531 0.03 0.04 0.01 0.05 \n",
+ "1529 0.02 0.04 0.02 0.04 \n",
+ "675 0.34 0.35 0.01 0.35 \n",
+ "1318 0.73 0.77 0.04 0.75 \n",
+ "1307 0.53 0.61 0.08 0.55 \n",
+ "1525 0.02 0.05 0.03 0.05 \n",
+ "1310 0.73 0.79 0.06 0.81 \n",
+ "1554 0.82 0.83 0.01 0.83 \n",
+ "1202 0.46 0.55 0.09 0.55 \n",
+ "1303 0.49 0.51 0.02 0.49 \n",
+ "1257 0.42 0.47 0.05 0.42 \n",
+ "1533 0.01 0.03 0.02 0.03 \n",
+ "1208 0.45 0.48 0.03 0.48 \n",
+ "1526 0.02 0.03 0.01 0.03 \n",
+ "1523 0.01 0.03 0.02 0.03 \n",
+ "1534 0.02 0.08 0.06 0.08 \n",
+ "1522 0.01 0.04 0.03 0.01 \n",
+ "1309 0.65 0.71 0.06 0.78 \n",
+ "1535 0.01 0.03 0.02 0.03 \n",
+ "1524 0.01 0.03 0.02 0.01 \n",
+ "1532 0.01 0.04 0.03 0.04 \n",
+ "1316 0.95 0.99 0.04 0.85 \n",
+ "1312 0.84 0.91 0.07 0.90 \n",
+ "1274 0.49 0.51 0.02 0.51 \n",
+ "928 0.14 0.17 0.03 0.17 \n",
+ "1266 0.48 0.50 0.02 0.48 \n",
+ "1180 0.44 0.46 0.02 0.46 \n",
+ "1556 0.54 0.57 0.03 0.57 \n",
+ "1191 0.47 0.49 0.02 0.49 \n",
+ "1314 0.91 0.98 0.07 0.97 \n",
+ "614 0.64 0.65 0.01 0.65 \n",
+ "1235 0.47 0.48 0.01 0.47 \n",
+ "1521 0.01 0.02 0.01 0.02 \n",
+ "1313 0.91 0.94 0.03 0.94 \n",
+ "927 0.84 0.86 0.02 0.86 \n",
+ "1323 0.32 0.37 0.05 0.30 \n",
+ "\n",
+ " volume_fp open_interest_fp close_time \n",
+ "1325 115119.0 95258.0 2026-02-08T20:00:00Z \n",
+ "1552 76126.0 73044.0 2026-02-08T23:00:00Z \n",
+ "659 75231.0 75193.0 2026-02-10T00:30:00Z \n",
+ "1528 67414.0 49470.0 2026-01-26T01:30:00Z \n",
+ "1553 59366.0 58324.0 2026-02-08T23:00:00Z \n",
+ "1286 56226.0 38234.0 2026-02-08T20:30:00Z \n",
+ "1306 53419.0 37318.0 2026-02-08T20:00:00Z \n",
+ "1326 53166.0 46076.0 2026-02-08T20:00:00Z \n",
+ "658 37882.0 30262.0 2026-02-10T00:30:00Z \n",
+ "1569 35186.0 34755.0 2026-02-08T00:00:00Z \n",
+ "674 27450.0 27377.0 2026-02-10T00:30:00Z \n",
+ "1285 26294.0 15891.0 2026-02-08T20:30:00Z \n",
+ "1530 26208.0 23187.0 2026-01-26T01:30:00Z \n",
+ "1250 26189.0 23873.0 2026-02-09T00:00:00Z \n",
+ "1531 25213.0 22685.0 2026-01-26T01:30:00Z \n",
+ "1529 25189.0 21666.0 2026-01-26T01:30:00Z \n",
+ "675 24725.0 24657.0 2026-02-10T00:30:00Z \n",
+ "1318 23868.0 17909.0 2026-02-08T20:00:00Z \n",
+ "1307 21735.0 13362.0 2026-02-08T20:00:00Z \n",
+ "1525 20705.0 17505.0 2026-01-26T01:30:00Z \n",
+ "1310 18827.0 11585.0 2026-02-08T20:00:00Z \n",
+ "1554 18374.0 15719.0 2026-02-08T23:00:00Z \n",
+ "1202 17086.0 12496.0 2026-02-09T00:00:00Z \n",
+ "1303 16149.0 14110.0 2026-02-09T00:00:00Z \n",
+ "1257 15780.0 10023.0 2026-02-08T20:30:00Z \n",
+ "1533 14295.0 11366.0 2026-01-26T01:30:00Z \n",
+ "1208 14228.0 11429.0 2026-02-09T02:00:00Z \n",
+ "1526 13683.0 12070.0 2026-01-26T01:30:00Z \n",
+ "1523 13510.0 11807.0 2026-01-26T01:30:00Z \n",
+ "1534 12740.0 11622.0 2026-01-26T01:30:00Z \n",
+ "1522 12735.0 10110.0 2026-01-26T01:30:00Z \n",
+ "1309 12675.0 6882.0 2026-02-08T20:00:00Z \n",
+ "1535 12548.0 11515.0 2026-01-26T01:30:00Z \n",
+ "1524 12299.0 10294.0 2026-01-26T01:30:00Z \n",
+ "1532 11409.0 10979.0 2026-01-26T01:30:00Z \n",
+ "1316 10801.0 9498.0 2026-02-08T20:00:00Z \n",
+ "1312 9926.0 7035.0 2026-02-08T20:00:00Z \n",
+ "1274 9668.0 7053.0 2026-02-09T01:00:00Z \n",
+ "928 9057.0 7853.0 2026-02-10T00:30:00Z \n",
+ "1266 8897.0 6635.0 2026-02-09T00:00:00Z \n",
+ "1180 7987.0 6478.0 2026-02-09T02:00:00Z \n",
+ "1556 7896.0 7460.0 2026-02-10T01:00:00Z \n",
+ "1191 7725.0 5608.0 2026-02-09T00:00:00Z \n",
+ "1314 7449.0 6836.0 2026-02-08T20:00:00Z \n",
+ "614 7448.0 7133.0 2026-02-10T00:30:00Z \n",
+ "1235 7061.0 6456.0 2026-02-09T01:00:00Z \n",
+ "1521 6756.0 5970.0 2026-01-26T01:30:00Z \n",
+ "1313 6680.0 6408.0 2026-02-08T20:00:00Z \n",
+ "927 6587.0 6478.0 2026-02-10T00:30:00Z \n",
+ "1323 6465.0 3031.0 2026-02-08T20:00:00Z "
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ticker | \n",
+ " title | \n",
+ " status | \n",
+ " yes_bid_dollars | \n",
+ " yes_ask_dollars | \n",
+ " yes_spread | \n",
+ " last_price_dollars | \n",
+ " volume_fp | \n",
+ " open_interest_fp | \n",
+ " close_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1325 | \n",
+ " KXNBASPREAD-26JAN25SACDET-DET13 | \n",
+ " Detroit wins by over 13.5 Points? | \n",
+ " active | \n",
+ " 0.52 | \n",
+ " 0.57 | \n",
+ " 0.05 | \n",
+ " 0.54 | \n",
+ " 115119.0 | \n",
+ " 95258.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1552 | \n",
+ " KXATPMATCH-26JAN25SHERUU-SHE | \n",
+ " Will Ben Shelton win the Shelton vs Ruud : Rou... | \n",
+ " active | \n",
+ " 0.58 | \n",
+ " 0.59 | \n",
+ " 0.01 | \n",
+ " 0.59 | \n",
+ " 76126.0 | \n",
+ " 73044.0 | \n",
+ " 2026-02-08T23:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 659 | \n",
+ " KXATPMATCH-26JAN26ALCDE-ALC | \n",
+ " Will Carlos Alcaraz win the Alcaraz vs de Mina... | \n",
+ " active | \n",
+ " 0.80 | \n",
+ " 0.82 | \n",
+ " 0.02 | \n",
+ " 0.82 | \n",
+ " 75231.0 | \n",
+ " 75193.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1528 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-INJU | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.06 | \n",
+ " 0.07 | \n",
+ " 0.01 | \n",
+ " 0.07 | \n",
+ " 67414.0 | \n",
+ " 49470.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1553 | \n",
+ " KXATPMATCH-26JAN25SHERUU-RUU | \n",
+ " Will Casper Ruud win the Shelton vs Ruud : Rou... | \n",
+ " active | \n",
+ " 0.41 | \n",
+ " 0.42 | \n",
+ " 0.01 | \n",
+ " 0.41 | \n",
+ " 59366.0 | \n",
+ " 58324.0 | \n",
+ " 2026-02-08T23:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1286 | \n",
+ " KXNBASPREAD-26JAN25DENMEM-MEM2 | \n",
+ " Memphis wins by over 2.5 Points? | \n",
+ " active | \n",
+ " 0.53 | \n",
+ " 0.61 | \n",
+ " 0.08 | \n",
+ " 0.62 | \n",
+ " 56226.0 | \n",
+ " 38234.0 | \n",
+ " 2026-02-08T20:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1306 | \n",
+ " KXNBATOTAL-26JAN25SACDET-240 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.46 | \n",
+ " 0.50 | \n",
+ " 0.04 | \n",
+ " 0.48 | \n",
+ " 53419.0 | \n",
+ " 37318.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1326 | \n",
+ " KXNBASPREAD-26JAN25SACDET-DET10 | \n",
+ " Detroit wins by over 10.5 Points? | \n",
+ " active | \n",
+ " 0.61 | \n",
+ " 0.67 | \n",
+ " 0.06 | \n",
+ " 0.62 | \n",
+ " 53166.0 | \n",
+ " 46076.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 658 | \n",
+ " KXATPMATCH-26JAN26ALCDE-DE | \n",
+ " Will Alex de Minaur win the Alcaraz vs de Mina... | \n",
+ " active | \n",
+ " 0.18 | \n",
+ " 0.20 | \n",
+ " 0.02 | \n",
+ " 0.20 | \n",
+ " 37882.0 | \n",
+ " 30262.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1569 | \n",
+ " KXWTAMATCH-26JAN24INGSWI-ING | \n",
+ " Will Maddison Inglis win the Inglis vs Swiatek... | \n",
+ " active | \n",
+ " 0.02 | \n",
+ " 0.04 | \n",
+ " 0.02 | \n",
+ " 0.02 | \n",
+ " 35186.0 | \n",
+ " 34755.0 | \n",
+ " 2026-02-08T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 674 | \n",
+ " KXATPMATCH-26JAN26ZVETIE-ZVE | \n",
+ " Will Alexander Zverev win the Zverev vs Tien :... | \n",
+ " active | \n",
+ " 0.66 | \n",
+ " 0.67 | \n",
+ " 0.01 | \n",
+ " 0.67 | \n",
+ " 27450.0 | \n",
+ " 27377.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1285 | \n",
+ " KXNBASPREAD-26JAN25DENMEM-MEM5 | \n",
+ " Memphis wins by over 5.5 Points? | \n",
+ " active | \n",
+ " 0.47 | \n",
+ " 0.51 | \n",
+ " 0.04 | \n",
+ " 0.46 | \n",
+ " 26294.0 | \n",
+ " 15891.0 | \n",
+ " 2026-02-08T20:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1530 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-ELBO | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 0.02 | \n",
+ " 0.03 | \n",
+ " 26208.0 | \n",
+ " 23187.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1250 | \n",
+ " KXNBASPREAD-26JAN25TOROKC-OKC11 | \n",
+ " Oklahoma City wins by over 11.5 Points? | \n",
+ " active | \n",
+ " 0.46 | \n",
+ " 0.47 | \n",
+ " 0.01 | \n",
+ " 0.46 | \n",
+ " 26189.0 | \n",
+ " 23873.0 | \n",
+ " 2026-02-09T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1531 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-BUZZ | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.03 | \n",
+ " 0.04 | \n",
+ " 0.01 | \n",
+ " 0.05 | \n",
+ " 25213.0 | \n",
+ " 22685.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1529 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-FEDE | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.02 | \n",
+ " 0.04 | \n",
+ " 0.02 | \n",
+ " 0.04 | \n",
+ " 25189.0 | \n",
+ " 21666.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 675 | \n",
+ " KXATPMATCH-26JAN26ZVETIE-TIE | \n",
+ " Will Learner Tien win the Zverev vs Tien : Qua... | \n",
+ " active | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " 0.01 | \n",
+ " 0.35 | \n",
+ " 24725.0 | \n",
+ " 24657.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1318 | \n",
+ " KXNBASPREAD-26JAN25SACDET-DET7 | \n",
+ " Detroit wins by over 7.5 Points? | \n",
+ " active | \n",
+ " 0.73 | \n",
+ " 0.77 | \n",
+ " 0.04 | \n",
+ " 0.75 | \n",
+ " 23868.0 | \n",
+ " 17909.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1307 | \n",
+ " KXNBATOTAL-26JAN25SACDET-237 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.53 | \n",
+ " 0.61 | \n",
+ " 0.08 | \n",
+ " 0.55 | \n",
+ " 21735.0 | \n",
+ " 13362.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1525 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-PLAY | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.02 | \n",
+ " 0.05 | \n",
+ " 0.03 | \n",
+ " 0.05 | \n",
+ " 20705.0 | \n",
+ " 17505.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1310 | \n",
+ " KXNBATOTAL-26JAN25SACDET-228 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.73 | \n",
+ " 0.79 | \n",
+ " 0.06 | \n",
+ " 0.81 | \n",
+ " 18827.0 | \n",
+ " 11585.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1554 | \n",
+ " KXWTAMATCH-26JAN25RYBMER-RYB | \n",
+ " Will Elena Rybakina win the Rybakina vs Merten... | \n",
+ " active | \n",
+ " 0.82 | \n",
+ " 0.83 | \n",
+ " 0.01 | \n",
+ " 0.83 | \n",
+ " 18374.0 | \n",
+ " 15719.0 | \n",
+ " 2026-02-08T23:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1202 | \n",
+ " KXNBATOTAL-26JAN25DALMIL-219 | \n",
+ " Dallas at Milwaukee: Total Points | \n",
+ " active | \n",
+ " 0.46 | \n",
+ " 0.55 | \n",
+ " 0.09 | \n",
+ " 0.55 | \n",
+ " 17086.0 | \n",
+ " 12496.0 | \n",
+ " 2026-02-09T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1303 | \n",
+ " KXNBASPREAD-26JAN25NOPSAS-SAS11 | \n",
+ " San Antonio wins by over 11.5 Points? | \n",
+ " active | \n",
+ " 0.49 | \n",
+ " 0.51 | \n",
+ " 0.02 | \n",
+ " 0.49 | \n",
+ " 16149.0 | \n",
+ " 14110.0 | \n",
+ " 2026-02-09T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1257 | \n",
+ " KXNBATOTAL-26JAN25DENMEM-223 | \n",
+ " Denver at Memphis: Total Points | \n",
+ " active | \n",
+ " 0.42 | \n",
+ " 0.47 | \n",
+ " 0.05 | \n",
+ " 0.42 | \n",
+ " 15780.0 | \n",
+ " 10023.0 | \n",
+ " 2026-02-08T20:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1533 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-ALLE | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 0.02 | \n",
+ " 0.03 | \n",
+ " 14295.0 | \n",
+ " 11366.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1208 | \n",
+ " KXNBASPREAD-26JAN25BKNLAC-LAC9 | \n",
+ " Los Angeles C wins by over 9.5 Points? | \n",
+ " active | \n",
+ " 0.45 | \n",
+ " 0.48 | \n",
+ " 0.03 | \n",
+ " 0.48 | \n",
+ " 14228.0 | \n",
+ " 11429.0 | \n",
+ " 2026-02-09T02:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1526 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-MVP | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.02 | \n",
+ " 0.03 | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 13683.0 | \n",
+ " 12070.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1523 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-TECH | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 0.02 | \n",
+ " 0.03 | \n",
+ " 13510.0 | \n",
+ " 11807.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1534 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-ALL | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.02 | \n",
+ " 0.08 | \n",
+ " 0.06 | \n",
+ " 0.08 | \n",
+ " 12740.0 | \n",
+ " 11622.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1522 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-TRAD | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.04 | \n",
+ " 0.03 | \n",
+ " 0.01 | \n",
+ " 12735.0 | \n",
+ " 10110.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1309 | \n",
+ " KXNBATOTAL-26JAN25SACDET-231 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.65 | \n",
+ " 0.71 | \n",
+ " 0.06 | \n",
+ " 0.78 | \n",
+ " 12675.0 | \n",
+ " 6882.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1535 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-AIR | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 0.02 | \n",
+ " 0.03 | \n",
+ " 12548.0 | \n",
+ " 11515.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1524 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-RETI | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.03 | \n",
+ " 0.02 | \n",
+ " 0.01 | \n",
+ " 12299.0 | \n",
+ " 10294.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1532 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-ANKL | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.04 | \n",
+ " 0.03 | \n",
+ " 0.04 | \n",
+ " 11409.0 | \n",
+ " 10979.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1316 | \n",
+ " KXNBATOTAL-26JAN25SACDET-210 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.95 | \n",
+ " 0.99 | \n",
+ " 0.04 | \n",
+ " 0.85 | \n",
+ " 10801.0 | \n",
+ " 9498.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1312 | \n",
+ " KXNBATOTAL-26JAN25SACDET-222 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.84 | \n",
+ " 0.91 | \n",
+ " 0.07 | \n",
+ " 0.90 | \n",
+ " 9926.0 | \n",
+ " 7035.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1274 | \n",
+ " KXNBASPREAD-26JAN25MIAPHX-PHX5 | \n",
+ " Phoenix wins by over 5.5 Points? | \n",
+ " active | \n",
+ " 0.49 | \n",
+ " 0.51 | \n",
+ " 0.02 | \n",
+ " 0.51 | \n",
+ " 9668.0 | \n",
+ " 7053.0 | \n",
+ " 2026-02-09T01:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 928 | \n",
+ " KXWTAMATCH-26JAN26SABJOV-JOV | \n",
+ " Will Iva Jovic win the Sabalenka vs Jovic : Qu... | \n",
+ " active | \n",
+ " 0.14 | \n",
+ " 0.17 | \n",
+ " 0.03 | \n",
+ " 0.17 | \n",
+ " 9057.0 | \n",
+ " 7853.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1266 | \n",
+ " KXNBATOTAL-26JAN25NOPSAS-240 | \n",
+ " New Orleans at San Antonio: Total Points | \n",
+ " active | \n",
+ " 0.48 | \n",
+ " 0.50 | \n",
+ " 0.02 | \n",
+ " 0.48 | \n",
+ " 8897.0 | \n",
+ " 6635.0 | \n",
+ " 2026-02-09T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1180 | \n",
+ " KXNBATOTAL-26JAN25BKNLAC-212 | \n",
+ " Brooklyn at Los Angeles C: Total Points | \n",
+ " active | \n",
+ " 0.44 | \n",
+ " 0.46 | \n",
+ " 0.02 | \n",
+ " 0.46 | \n",
+ " 7987.0 | \n",
+ " 6478.0 | \n",
+ " 2026-02-09T02:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1556 | \n",
+ " KXNBAGAME-26JAN26LALCHI-LAL | \n",
+ " Los Angeles L at Chicago Winner? | \n",
+ " active | \n",
+ " 0.54 | \n",
+ " 0.57 | \n",
+ " 0.03 | \n",
+ " 0.57 | \n",
+ " 7896.0 | \n",
+ " 7460.0 | \n",
+ " 2026-02-10T01:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1191 | \n",
+ " KXNBATOTAL-26JAN25TOROKC-225 | \n",
+ " Toronto at Oklahoma City: Total Points | \n",
+ " active | \n",
+ " 0.47 | \n",
+ " 0.49 | \n",
+ " 0.02 | \n",
+ " 0.49 | \n",
+ " 7725.0 | \n",
+ " 5608.0 | \n",
+ " 2026-02-09T00:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1314 | \n",
+ " KXNBATOTAL-26JAN25SACDET-216 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.91 | \n",
+ " 0.98 | \n",
+ " 0.07 | \n",
+ " 0.97 | \n",
+ " 7449.0 | \n",
+ " 6836.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 614 | \n",
+ " KXWTAMATCH-26JAN26GAUSVI-GAU | \n",
+ " Will Coco Gauff win the Gauff vs Svitolina : Q... | \n",
+ " active | \n",
+ " 0.64 | \n",
+ " 0.65 | \n",
+ " 0.01 | \n",
+ " 0.65 | \n",
+ " 7448.0 | \n",
+ " 7133.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1235 | \n",
+ " KXNBATOTAL-26JAN25MIAPHX-226 | \n",
+ " Miami at Phoenix: Total Points | \n",
+ " active | \n",
+ " 0.47 | \n",
+ " 0.48 | \n",
+ " 0.01 | \n",
+ " 0.47 | \n",
+ " 7061.0 | \n",
+ " 6456.0 | \n",
+ " 2026-02-09T01:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1521 | \n",
+ " KXNBAMENTION-26JAN25DENMEM-TRIP | \n",
+ " What will the announcers say during Denver at ... | \n",
+ " active | \n",
+ " 0.01 | \n",
+ " 0.02 | \n",
+ " 0.01 | \n",
+ " 0.02 | \n",
+ " 6756.0 | \n",
+ " 5970.0 | \n",
+ " 2026-01-26T01:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1313 | \n",
+ " KXNBATOTAL-26JAN25SACDET-219 | \n",
+ " Sacramento at Detroit: Total Points | \n",
+ " active | \n",
+ " 0.91 | \n",
+ " 0.94 | \n",
+ " 0.03 | \n",
+ " 0.94 | \n",
+ " 6680.0 | \n",
+ " 6408.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ " | 927 | \n",
+ " KXWTAMATCH-26JAN26SABJOV-SAB | \n",
+ " Will Aryna Sabalenka win the Sabalenka vs Jovi... | \n",
+ " active | \n",
+ " 0.84 | \n",
+ " 0.86 | \n",
+ " 0.02 | \n",
+ " 0.86 | \n",
+ " 6587.0 | \n",
+ " 6478.0 | \n",
+ " 2026-02-10T00:30:00Z | \n",
+ "
\n",
+ " \n",
+ " | 1323 | \n",
+ " KXNBASPREAD-26JAN25SACDET-DET19 | \n",
+ " Detroit wins by over 19.5 Points? | \n",
+ " active | \n",
+ " 0.32 | \n",
+ " 0.37 | \n",
+ " 0.05 | \n",
+ " 0.30 | \n",
+ " 6465.0 | \n",
+ " 3031.0 | \n",
+ " 2026-02-08T20:00:00Z | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "repr_error": "0"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Total markets in df: 1570\n",
+ "Filtered 'good' markets: 276\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Live feed for specific market"
+ ],
+ "metadata": {
+ "id": "yKJpKtauyVZU"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Auto-pick an ACTIVE market, show snapshot + orderbook, then poll for 5 minutes (auto-stop), you can change the time based on your need\n",
+ "\n",
+ "import time\n",
+ "from datetime import datetime, timezone\n",
+ "from zoneinfo import ZoneInfo\n",
+ "import pandas as pd\n",
+ "\n",
+ "ET = ZoneInfo(\"America/New_York\")\n",
+ "\n",
+ "def _to_float(x):\n",
+ " try:\n",
+ " return float(x)\n",
+ " except Exception:\n",
+ " return None\n",
+ "\n",
+ "def _get_market_obj(data):\n",
+ " return data[\"market\"] if isinstance(data, dict) and \"market\" in data else data\n",
+ "\n",
+ "def _get_orderbook_obj(ob_raw):\n",
+ " return ob_raw.get(\"orderbook_fp\") or ob_raw.get(\"orderbook\") or ob_raw\n",
+ "\n",
+ "def pick_active_ticker(df, max_checks=150, sleep_sec=0.12):\n",
+ " \"\"\"\n",
+ " Picks a ticker that looks \"live\":\n",
+ " - tradable/open (when fields exist)\n",
+ " - not the empty book pattern (yes_bid==0 and yes_ask==1)\n",
+ " - orderbook has at least 1 level on YES or NO\n",
+ " \"\"\"\n",
+ " tickers = df[\"ticker\"].dropna().astype(str).unique().tolist()[:max_checks]\n",
+ "\n",
+ " for t in tickers:\n",
+ " try:\n",
+ " snap = get_json(f\"/markets/{t}\")\n",
+ " m = _get_market_obj(snap)\n",
+ "\n",
+ " # Skip closed/non-tradable if fields exist\n",
+ " if m.get(\"status\") in {\"closed\", \"settled\", \"canceled\"}:\n",
+ " continue\n",
+ " if m.get(\"is_tradable\") is False:\n",
+ " continue\n",
+ "\n",
+ " yb = _to_float(m.get(\"yes_bid_dollars\"))\n",
+ " ya = _to_float(m.get(\"yes_ask_dollars\"))\n",
+ "\n",
+ " # Filter out empty-book pattern (common in inactive markets)\n",
+ " if yb is not None and ya is not None and (yb == 0.0 and ya == 1.0):\n",
+ " continue\n",
+ "\n",
+ " ob_raw = get_json(f\"/markets/{t}/orderbook\")\n",
+ " ob = _get_orderbook_obj(ob_raw)\n",
+ " yes = ob.get(\"yes\") or ob.get(\"yes_dollars\") or []\n",
+ " no = ob.get(\"no\") or ob.get(\"no_dollars\") or []\n",
+ "\n",
+ " if (len(yes) + len(no)) > 0:\n",
+ " return t\n",
+ "\n",
+ " except Exception:\n",
+ " pass\n",
+ "\n",
+ " time.sleep(sleep_sec)\n",
+ "\n",
+ " return None\n",
+ "\n",
+ "# 1) Auto-pick an active market from `good`\n",
+ "MARKET_TICKER = pick_active_ticker(good, max_checks=200)\n",
+ "if not MARKET_TICKER:\n",
+ " # Fallback: just pick first one if nothing matched\n",
+ " MARKET_TICKER = str(good.iloc[0][\"ticker\"])\n",
+ " print(\"⚠️ Could not find an active orderbook quickly; falling back to:\", MARKET_TICKER)\n",
+ "else:\n",
+ " print(\"✅ Picked active MARKET_TICKER =\", MARKET_TICKER)\n",
+ "\n",
+ "# 2) Snapshot once\n",
+ "snap = get_json(f\"/markets/{MARKET_TICKER}\")\n",
+ "m = _get_market_obj(snap)\n",
+ "\n",
+ "print(\"\\nTitle:\", m.get(\"title\"))\n",
+ "print(\"YES bid/ask:\", m.get(\"yes_bid_dollars\"), \"/\", m.get(\"yes_ask_dollars\"))\n",
+ "print(\"NO bid/ask:\", m.get(\"no_bid_dollars\"), \"/\", m.get(\"no_ask_dollars\"))\n",
+ "print(\"Last price:\", m.get(\"last_price_dollars\"))\n",
+ "\n",
+ "# 3) Orderbook once\n",
+ "ob_raw = get_json(f\"/markets/{MARKET_TICKER}/orderbook\")\n",
+ "ob = _get_orderbook_obj(ob_raw)\n",
+ "\n",
+ "yes = ob.get(\"yes\") or ob.get(\"yes_dollars\") or []\n",
+ "no = ob.get(\"no\") or ob.get(\"no_dollars\") or []\n",
+ "\n",
+ "print(\"\\nTop YES levels:\", yes[:5])\n",
+ "print(\"Top NO levels:\", no[:5])\n",
+ "\n",
+ "# 4) Poll loop (runs for 5 minutes, then stops)\n",
+ "def poll_kalshi_market(ticker, every_sec=2.0, run_minutes=5):\n",
+ " end_ts = time.time() + run_minutes * 60\n",
+ " print(f\"\\nPolling {ticker} every {every_sec}s for ~{run_minutes} minutes...\")\n",
+ "\n",
+ " rows = []\n",
+ " while time.time() < end_ts:\n",
+ " try:\n",
+ " data = get_json(f\"/markets/{ticker}\")\n",
+ " m = _get_market_obj(data)\n",
+ "\n",
+ " now_utc = datetime.now(timezone.utc)\n",
+ " now_et = now_utc.astimezone(ET)\n",
+ "\n",
+ " row = {\n",
+ " \"ts_utc\": now_utc.isoformat(),\n",
+ " \"ts_est\": now_et.isoformat(),\n",
+ " \"yes_bid\": m.get(\"yes_bid_dollars\"),\n",
+ " \"yes_ask\": m.get(\"yes_ask_dollars\"),\n",
+ " \"last\": m.get(\"last_price_dollars\"),\n",
+ " \"volume_fp\": m.get(\"volume_fp\"),\n",
+ " \"open_interest_fp\": m.get(\"open_interest_fp\"),\n",
+ " }\n",
+ " rows.append(row)\n",
+ "\n",
+ " # Print in EST so it looks normal for you\n",
+ " tlabel = now_et.strftime(\"%H:%M:%S\")\n",
+ " print(f\"[{tlabel} EST] YES {row['yes_bid']}/{row['yes_ask']} \"\n",
+ " f\"LAST {row['last']} VOL {row['volume_fp']} OI {row['open_interest_fp']}\")\n",
+ "\n",
+ " except Exception as e:\n",
+ " # If rate-limited or transient error, just keep going\n",
+ " print(\"⚠️ poll error:\", str(e)[:120])\n",
+ "\n",
+ " remaining = end_ts - time.time()\n",
+ " if remaining <= 0:\n",
+ " break\n",
+ " time.sleep(min(every_sec, remaining))\n",
+ "\n",
+ " print(\"\\nDone. Collected\", len(rows), \"rows.\")\n",
+ " return pd.DataFrame(rows)\n",
+ "\n",
+ "df_live = poll_kalshi_market(MARKET_TICKER, every_sec=2.0, run_minutes=5)\n",
+ "df_live.tail()\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "rBFNF0-l-HIO",
+ "outputId": "ae4e748d-3336-4552-a1b9-1e94f22a6aad"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "✅ Picked active MARKET_TICKER = KXATPMATCH-26JAN25SHERUU-SHE\n",
+ "\n",
+ "Title: Will Ben Shelton win the Shelton vs Ruud : Round Of 16 match?\n",
+ "YES bid/ask: 0.6300 / 0.6400\n",
+ "NO bid/ask: 0.3600 / 0.3700\n",
+ "Last price: 0.6400\n",
+ "\n",
+ "Top YES levels: [['0.0100', '3000.00'], ['0.0200', '3198.00'], ['0.0300', '200.00'], ['0.0400', '300.00'], ['0.0500', '300.00']]\n",
+ "Top NO levels: [['0.0100', '2587.00'], ['0.0200', '800.00'], ['0.0300', '246.00'], ['0.0400', '335.00'], ['0.0500', '300.00']]\n",
+ "\n",
+ "Polling KXATPMATCH-26JAN25SHERUU-SHE every 2.0s for ~5 minutes...\n",
+ "[00:27:09 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:11 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:13 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:15 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:17 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:19 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:21 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:23 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:25 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:27 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:29 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:31 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 488117.00 OI 482180.00\n",
+ "[00:27:33 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489404.00 OI 483467.00\n",
+ "[00:27:35 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489404.00 OI 483467.00\n",
+ "[00:27:37 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489405.00 OI 483468.00\n",
+ "[00:27:39 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489405.00 OI 483468.00\n",
+ "[00:27:41 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489405.00 OI 483468.00\n",
+ "[00:27:43 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489405.00 OI 483468.00\n",
+ "[00:27:45 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489656.00 OI 483719.00\n",
+ "[00:27:47 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489656.00 OI 483719.00\n",
+ "[00:27:49 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489807.00 OI 483870.00\n",
+ "[00:27:51 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489807.00 OI 483870.00\n",
+ "[00:27:53 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489807.00 OI 483870.00\n",
+ "[00:27:55 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489807.00 OI 483870.00\n",
+ "[00:27:57 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 489807.00 OI 483870.00\n",
+ "[00:27:59 EST] YES 0.6300/0.6400 LAST 0.6400 VOL 490270.00 OI 484333.00\n",
+ "[00:28:02 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490361.00 OI 484424.00\n",
+ "[00:28:04 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490361.00 OI 484424.00\n",
+ "[00:28:06 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490361.00 OI 484424.00\n",
+ "[00:28:08 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490361.00 OI 484424.00\n",
+ "[00:28:10 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490361.00 OI 484424.00\n",
+ "[00:28:12 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490741.00 OI 484804.00\n",
+ "[00:28:14 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490741.00 OI 484804.00\n",
+ "[00:28:16 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490741.00 OI 484804.00\n",
+ "[00:28:18 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490741.00 OI 484804.00\n",
+ "[00:28:20 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490741.00 OI 484804.00\n",
+ "[00:28:22 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490753.00 OI 484816.00\n",
+ "[00:28:24 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 490813.00 OI 484876.00\n",
+ "[00:28:26 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 496384.00 OI 490447.00\n",
+ "[00:28:28 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 496528.00 OI 490591.00\n",
+ "[00:28:30 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:32 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:34 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:36 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:38 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:40 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:42 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:44 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:46 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:48 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:51 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:53 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:55 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:57 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:28:59 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:01 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:03 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:05 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:07 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:09 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:11 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:13 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:15 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:17 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:19 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497940.00 OI 492003.00\n",
+ "[00:29:21 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497978.00 OI 492041.00\n",
+ "[00:29:23 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497978.00 OI 492041.00\n",
+ "[00:29:25 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497978.00 OI 492041.00\n",
+ "[00:29:27 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 497978.00 OI 492041.00\n",
+ "[00:29:30 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498013.00 OI 492076.00\n",
+ "[00:29:32 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498013.00 OI 492076.00\n",
+ "[00:29:34 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498013.00 OI 492076.00\n",
+ "[00:29:36 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498307.00 OI 492370.00\n",
+ "[00:29:38 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498913.00 OI 492976.00\n",
+ "[00:29:40 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498913.00 OI 492976.00\n",
+ "[00:29:42 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:44 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:46 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:48 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:50 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:52 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:54 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:56 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:29:58 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:30:00 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:30:02 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:30:05 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 498943.00 OI 493006.00\n",
+ "[00:30:07 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:09 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:11 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:13 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:15 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:17 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:19 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:21 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:23 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:25 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:27 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:29 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:31 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499011.00 OI 493074.00\n",
+ "[00:30:33 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:35 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:37 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:39 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:41 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:44 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:46 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499087.00 OI 493150.00\n",
+ "[00:30:48 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 499114.00 OI 493177.00\n",
+ "[00:30:50 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500394.00 OI 494457.00\n",
+ "[00:30:52 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500394.00 OI 494457.00\n",
+ "[00:30:54 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:30:56 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:30:58 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:00 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:02 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:04 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:06 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:08 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500409.00 OI 494472.00\n",
+ "[00:31:10 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500485.00 OI 494548.00\n",
+ "[00:31:12 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500528.00 OI 494591.00\n",
+ "[00:31:14 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500528.00 OI 494591.00\n",
+ "[00:31:17 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500528.00 OI 494591.00\n",
+ "[00:31:19 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:21 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:23 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:25 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:27 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:29 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:31 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:33 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:35 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:37 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:39 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:41 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:43 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:45 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 500589.00 OI 494652.00\n",
+ "[00:31:47 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:49 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:51 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:53 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:55 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:57 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:31:59 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:32:01 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:32:03 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:32:06 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "[00:32:08 EST] YES 0.6200/0.6400 LAST 0.6400 VOL 501087.00 OI 495150.00\n",
+ "\n",
+ "Done. Collected 147 rows.\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " ts_utc ts_est \\\n",
+ "142 2026-01-26T05:31:59.907749+00:00 2026-01-26T00:31:59.907749-05:00 \n",
+ "143 2026-01-26T05:32:01.940888+00:00 2026-01-26T00:32:01.940888-05:00 \n",
+ "144 2026-01-26T05:32:03.983733+00:00 2026-01-26T00:32:03.983733-05:00 \n",
+ "145 2026-01-26T05:32:06.020696+00:00 2026-01-26T00:32:06.020696-05:00 \n",
+ "146 2026-01-26T05:32:08.061393+00:00 2026-01-26T00:32:08.061393-05:00 \n",
+ "\n",
+ " yes_bid yes_ask last volume_fp open_interest_fp \n",
+ "142 0.6200 0.6400 0.6400 501087.00 495150.00 \n",
+ "143 0.6200 0.6400 0.6400 501087.00 495150.00 \n",
+ "144 0.6200 0.6400 0.6400 501087.00 495150.00 \n",
+ "145 0.6200 0.6400 0.6400 501087.00 495150.00 \n",
+ "146 0.6200 0.6400 0.6400 501087.00 495150.00 "
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ts_utc | \n",
+ " ts_est | \n",
+ " yes_bid | \n",
+ " yes_ask | \n",
+ " last | \n",
+ " volume_fp | \n",
+ " open_interest_fp | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 142 | \n",
+ " 2026-01-26T05:31:59.907749+00:00 | \n",
+ " 2026-01-26T00:31:59.907749-05:00 | \n",
+ " 0.6200 | \n",
+ " 0.6400 | \n",
+ " 0.6400 | \n",
+ " 501087.00 | \n",
+ " 495150.00 | \n",
+ "
\n",
+ " \n",
+ " | 143 | \n",
+ " 2026-01-26T05:32:01.940888+00:00 | \n",
+ " 2026-01-26T00:32:01.940888-05:00 | \n",
+ " 0.6200 | \n",
+ " 0.6400 | \n",
+ " 0.6400 | \n",
+ " 501087.00 | \n",
+ " 495150.00 | \n",
+ "
\n",
+ " \n",
+ " | 144 | \n",
+ " 2026-01-26T05:32:03.983733+00:00 | \n",
+ " 2026-01-26T00:32:03.983733-05:00 | \n",
+ " 0.6200 | \n",
+ " 0.6400 | \n",
+ " 0.6400 | \n",
+ " 501087.00 | \n",
+ " 495150.00 | \n",
+ "
\n",
+ " \n",
+ " | 145 | \n",
+ " 2026-01-26T05:32:06.020696+00:00 | \n",
+ " 2026-01-26T00:32:06.020696-05:00 | \n",
+ " 0.6200 | \n",
+ " 0.6400 | \n",
+ " 0.6400 | \n",
+ " 501087.00 | \n",
+ " 495150.00 | \n",
+ "
\n",
+ " \n",
+ " | 146 | \n",
+ " 2026-01-26T05:32:08.061393+00:00 | \n",
+ " 2026-01-26T00:32:08.061393-05:00 | \n",
+ " 0.6200 | \n",
+ " 0.6400 | \n",
+ " 0.6400 | \n",
+ " 501087.00 | \n",
+ " 495150.00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "repr_error": "0"
+ }
+ },
+ "metadata": {},
+ "execution_count": 35
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## More Kalshi API features\n",
+ "\n",
+ "This starter kit demonstrates the **core building blocks** you need for the contest (market discovery, basic liquidity/spread filtering, and a simple live polling feed for bid/ask).\n",
+ "\n",
+ "If you need **more features beyond the base examples here** (pagination, historical data/candlesticks, order placement, positions, additional endpoints, etc.), please refer to the **official Kalshi API documentation**:\n",
+ "\n",
+ "https://docs.kalshi.com/welcome"
+ ],
+ "metadata": {
+ "id": "vuc6M-M9ldER"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Tutorials/Task_3_tutorial/Polymarket_API_Demo.ipynb b/Tutorials/Task_3_tutorial/Polymarket_API_Demo.ipynb
new file mode 100644
index 0000000..914e44a
--- /dev/null
+++ b/Tutorials/Task_3_tutorial/Polymarket_API_Demo.ipynb
@@ -0,0 +1,1202 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Polymarket Sports Market Data for Arbitrage (Demo)"
+ ],
+ "metadata": {
+ "id": "qqKjM7BonWs2"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9ZTQV-xYnRfR"
+ },
+ "source": [
+ "### Install dependencies\n",
+ "\n",
+ "Installs packages needed\n",
+ "\n",
+ "- `websocket-client` for the public WebSocket stream\n",
+ "- `pandas`, `requests` for REST calls and tables\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ef_84PIVuTVP"
+ },
+ "outputs": [],
+ "source": [
+ "!pip -q install websocket-client pandas requests\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "85xN0OvKnRfS"
+ },
+ "source": [
+ "### Imports + endpoints\n",
+ "\n",
+ "- REST bases:\n",
+ " - `GAMMA` (market metadata: sports, events, markets)\n",
+ " - `CLOB` (order book + price endpoints)\n",
+ "- `WSS_MARKET` public WebSocket channel\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "rKiIqnOlwdKt"
+ },
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "import time\n",
+ "import math\n",
+ "import requests\n",
+ "import pandas as pd\n",
+ "from datetime import datetime, timezone\n",
+ "\n",
+ "GAMMA = \"https://gamma-api.polymarket.com\"\n",
+ "CLOB = \"https://clob.polymarket.com\"\n",
+ "WSS_MARKET = \"wss://ws-subscriptions-clob.polymarket.com/ws/market\" # public market channel\n",
+ "\n",
+ "session = requests.Session()\n",
+ "session.headers.update({\"User-Agent\": \"colab-polymarket-tutorial/1.0\"})\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "VIvk0vPvnRfT"
+ },
+ "source": [
+ "### Helper utilities\n",
+ "\n",
+ "Defines helpers:\n",
+ "\n",
+ "- `get_json(...)`: GET with retries\n",
+ "- `maybe_json_list(...)`: Gamma sometimes returns arrays as JSON-encoded strings; this makes them consistent\n",
+ "- `ts_utc()`: convenience timestamp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "WtAG7zfewfT1"
+ },
+ "outputs": [],
+ "source": [
+ "def get_json(url: str, params: dict | None = None, timeout: int = 20, retries: int = 3):\n",
+ " last_err = None\n",
+ " for attempt in range(retries):\n",
+ " try:\n",
+ " r = session.get(url, params=params, timeout=timeout)\n",
+ " r.raise_for_status()\n",
+ " return r.json()\n",
+ " except Exception as e:\n",
+ " last_err = e\n",
+ " time.sleep(1.5 * (attempt + 1))\n",
+ " raise RuntimeError(f\"GET failed after {retries} tries: {url} params={params}\\n{last_err}\")\n",
+ "\n",
+ "def maybe_json_list(x):\n",
+ " \"\"\"Gamma sometimes returns arrays as JSON-encoded strings; handle both.\"\"\"\n",
+ " if x is None:\n",
+ " return None\n",
+ " if isinstance(x, list):\n",
+ " return x\n",
+ " if isinstance(x, str):\n",
+ " try:\n",
+ " v = json.loads(x)\n",
+ " return v if isinstance(v, list) else x\n",
+ " except Exception:\n",
+ " return x\n",
+ " return x\n",
+ "\n",
+ "def ts_utc():\n",
+ " return int(datetime.now(timezone.utc).timestamp())\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QSlXdqdBnRfT"
+ },
+ "source": [
+ "### List available sports / leagues (Gamma)\n",
+ "\n",
+ "Calls `GET /sports` from Gamma and shows the first rows as a DataFrame.\n",
+ "\n",
+ "This is where you can pick `series_id` ."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 677
+ },
+ "id": "mGDLa7JswlOJ",
+ "outputId": "604ffadb-7fe8-4a69-a55c-e7bb3eccf43c"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "summary": "{\n \"name\": \"df_sports\",\n \"rows\": 127,\n \"fields\": [\n {\n \"column\": \"id\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 36,\n \"min\": 1,\n \"max\": 128,\n \"num_unique_values\": 127,\n \"samples\": [\n 28,\n 113,\n 83\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sport\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 127,\n \"samples\": [\n \"uef\",\n \"cru19wc\",\n \"dehl\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"image\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 90,\n \"samples\": [\n \"https://polymarket-upload.s3.us-east-2.amazonaws.com/wta-logo-41f331bdf1.png\",\n \"https://polymarket-upload.s3.us-east-2.amazonaws.com/sud.png\",\n \"https://polymarket-upload.s3.us-east-2.amazonaws.com/rocket-league-0c26a313e4.jpg\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"resolution\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 96,\n \"samples\": [\n \"https://liquipedia.net/starcraft2/Main_Page\",\n \"https://theahl.com/stats/schedule\",\n \"https://www.hokej.cz/tipsport-extraliga\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ordering\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"away\",\n \"home\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tags\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 119,\n \"samples\": [\n \"1,64,102756,100639\",\n \"1,100639,517,102949\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"series\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 127,\n \"samples\": [\n \"10243\",\n \"10907\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"createdAt\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 94,\n \"samples\": [\n \"2025-11-21T15:51:37.085249Z\",\n \"2025-11-21T15:51:24.659144Z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}",
+ "type": "dataframe",
+ "variable_name": "df_sports"
+ },
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " id | \n",
+ " sport | \n",
+ " image | \n",
+ " resolution | \n",
+ " ordering | \n",
+ " tags | \n",
+ " series | \n",
+ " createdAt | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " ncaab | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.ncaa.com/march-madness-live/bracket | \n",
+ " home | \n",
+ " 1,100149,100639 | \n",
+ " 39 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " epl | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.premierleague.com/ | \n",
+ " home | \n",
+ " 1,82,306,100639,100350 | \n",
+ " 10188 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " lal | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.laliga.com/en-GB | \n",
+ " home | \n",
+ " 1,780,100639,100350 | \n",
+ " 10193 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 95 | \n",
+ " acn | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.cafonline.com/caf-africa-cup-of-na... | \n",
+ " home | \n",
+ " 1,102974 | \n",
+ " 10786 | \n",
+ " 2025-12-18T19:19:31.18134Z | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " ipl | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.iplt20.com/ | \n",
+ " home | \n",
+ " 1,101977,100639,517,518 | \n",
+ " 44 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " wnba | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.wnba.com/ | \n",
+ " away | \n",
+ " 1,100639,100254 | \n",
+ " 10105 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " bun | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.bundesliga.com/en/bundesliga | \n",
+ " home | \n",
+ " 1,1494,100639,100350 | \n",
+ " 10194 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " mlb | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.mlb.com/ | \n",
+ " away | \n",
+ " 1,100639,100381 | \n",
+ " 3 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 9 | \n",
+ " cfb | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.ncaa.com/ | \n",
+ " away | \n",
+ " 1,100351,100639 | \n",
+ " 10210 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10 | \n",
+ " nfl | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.nfl.com/ | \n",
+ " away | \n",
+ " 1,450,100639 | \n",
+ " 10187 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 11 | \n",
+ " fl1 | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://ligue1.com/en | \n",
+ " home | \n",
+ " 1,100639,102070,100350 | \n",
+ " 10195 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 12 | \n",
+ " sea | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.legaseriea.it/en | \n",
+ " home | \n",
+ " 1,100639,101962,100350 | \n",
+ " 10203 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 13 | \n",
+ " ucl | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.uefa.com/uefachampionsleague/ | \n",
+ " home | \n",
+ " 1,100977,100639,1234,100350 | \n",
+ " 10204 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 15 | \n",
+ " afc | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.the-afc.com/en/home.html | \n",
+ " home | \n",
+ " 1,100639,100350,101680 | \n",
+ " 10241 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 16 | \n",
+ " ofc | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.oceaniafootball.com/ | \n",
+ " home | \n",
+ " 1,100639,100350,102566 | \n",
+ " 10294 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 17 | \n",
+ " fif | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.fifa.com/en | \n",
+ " home | \n",
+ " 1,100639,100350,102539 | \n",
+ " 10238 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 18 | \n",
+ " ere | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://eredivisie.eu/competition/ | \n",
+ " home | \n",
+ " 1,100639,100350,101735 | \n",
+ " 10286 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 19 | \n",
+ " arg | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.afa.com.ar/ | \n",
+ " home | \n",
+ " 1,100639,100350,102561 | \n",
+ " 10285 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 20 | \n",
+ " itc | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.legaseriea.it/en/coppa-italia | \n",
+ " home | \n",
+ " 1,100639,100350,102008 | \n",
+ " 10287 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 21 | \n",
+ " mex | \n",
+ " https://polymarket-upload.s3.us-east-2.amazona... | \n",
+ " https://www.ligamx.net/ | \n",
+ " home | \n",
+ " 1,100639,100350,102448 | \n",
+ " 10290 | \n",
+ " 2025-11-05T19:27:45.399303Z | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "text/plain": [
+ " id sport image \\\n",
+ "0 1 ncaab https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "1 2 epl https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "2 3 lal https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "3 95 acn https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "4 5 ipl https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "5 6 wnba https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "6 7 bun https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "7 8 mlb https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "8 9 cfb https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "9 10 nfl https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "10 11 fl1 https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "11 12 sea https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "12 13 ucl https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "13 15 afc https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "14 16 ofc https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "15 17 fif https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "16 18 ere https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "17 19 arg https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "18 20 itc https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "19 21 mex https://polymarket-upload.s3.us-east-2.amazona... \n",
+ "\n",
+ " resolution ordering \\\n",
+ "0 https://www.ncaa.com/march-madness-live/bracket home \n",
+ "1 https://www.premierleague.com/ home \n",
+ "2 https://www.laliga.com/en-GB home \n",
+ "3 https://www.cafonline.com/caf-africa-cup-of-na... home \n",
+ "4 https://www.iplt20.com/ home \n",
+ "5 https://www.wnba.com/ away \n",
+ "6 https://www.bundesliga.com/en/bundesliga home \n",
+ "7 https://www.mlb.com/ away \n",
+ "8 https://www.ncaa.com/ away \n",
+ "9 https://www.nfl.com/ away \n",
+ "10 https://ligue1.com/en home \n",
+ "11 https://www.legaseriea.it/en home \n",
+ "12 https://www.uefa.com/uefachampionsleague/ home \n",
+ "13 https://www.the-afc.com/en/home.html home \n",
+ "14 https://www.oceaniafootball.com/ home \n",
+ "15 https://www.fifa.com/en home \n",
+ "16 https://eredivisie.eu/competition/ home \n",
+ "17 https://www.afa.com.ar/ home \n",
+ "18 https://www.legaseriea.it/en/coppa-italia home \n",
+ "19 https://www.ligamx.net/ home \n",
+ "\n",
+ " tags series createdAt \n",
+ "0 1,100149,100639 39 2025-11-05T19:27:45.399303Z \n",
+ "1 1,82,306,100639,100350 10188 2025-11-05T19:27:45.399303Z \n",
+ "2 1,780,100639,100350 10193 2025-11-05T19:27:45.399303Z \n",
+ "3 1,102974 10786 2025-12-18T19:19:31.18134Z \n",
+ "4 1,101977,100639,517,518 44 2025-11-05T19:27:45.399303Z \n",
+ "5 1,100639,100254 10105 2025-11-05T19:27:45.399303Z \n",
+ "6 1,1494,100639,100350 10194 2025-11-05T19:27:45.399303Z \n",
+ "7 1,100639,100381 3 2025-11-05T19:27:45.399303Z \n",
+ "8 1,100351,100639 10210 2025-11-05T19:27:45.399303Z \n",
+ "9 1,450,100639 10187 2025-11-05T19:27:45.399303Z \n",
+ "10 1,100639,102070,100350 10195 2025-11-05T19:27:45.399303Z \n",
+ "11 1,100639,101962,100350 10203 2025-11-05T19:27:45.399303Z \n",
+ "12 1,100977,100639,1234,100350 10204 2025-11-05T19:27:45.399303Z \n",
+ "13 1,100639,100350,101680 10241 2025-11-05T19:27:45.399303Z \n",
+ "14 1,100639,100350,102566 10294 2025-11-05T19:27:45.399303Z \n",
+ "15 1,100639,100350,102539 10238 2025-11-05T19:27:45.399303Z \n",
+ "16 1,100639,100350,101735 10286 2025-11-05T19:27:45.399303Z \n",
+ "17 1,100639,100350,102561 10285 2025-11-05T19:27:45.399303Z \n",
+ "18 1,100639,100350,102008 10287 2025-11-05T19:27:45.399303Z \n",
+ "19 1,100639,100350,102448 10290 2025-11-05T19:27:45.399303Z "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sports = get_json(f\"{GAMMA}/sports\") # official endpoint\n",
+ "df_sports = pd.DataFrame(sports)\n",
+ "df_sports.head(20)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "voZnpCaAnRfT"
+ },
+ "source": [
+ "### Fetch events for a chosen series\n",
+ "\n",
+ "Calls `GET /events` with parameters like:\n",
+ "\n",
+ "- `series_id`\n",
+ "- `active=true`\n",
+ "- `closed=false`\n",
+ "- `limit=...`\n",
+ "\n",
+ "Then builds `df_events` (event title, start time, number of markets)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 112
+ },
+ "id": "quiE8IHGwqHa",
+ "outputId": "2ebedfc5-007b-4fed-894b-b8f90bd75def"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "summary": "{\n \"name\": \"df_events\",\n \"rows\": 2,\n \"fields\": [\n {\n \"column\": \"event_id\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"174407\",\n \"174405\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Rams vs. Seahawks\",\n \"Patriots vs. Broncos\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"startTime\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"2026-01-25T23:30:00Z\",\n \"2026-01-25T20:00:00Z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"num_markets\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 9,\n \"min\": 59,\n \"max\": 73,\n \"num_unique_values\": 2,\n \"samples\": [\n 59,\n 73\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}",
+ "type": "dataframe",
+ "variable_name": "df_events"
+ },
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " event_id | \n",
+ " title | \n",
+ " startTime | \n",
+ " num_markets | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 174405 | \n",
+ " Patriots vs. Broncos | \n",
+ " 2026-01-25T20:00:00Z | \n",
+ " 73 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 174407 | \n",
+ " Rams vs. Seahawks | \n",
+ " 2026-01-25T23:30:00Z | \n",
+ " 59 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "text/plain": [
+ " event_id title startTime num_markets\n",
+ "0 174405 Patriots vs. Broncos 2026-01-25T20:00:00Z 73\n",
+ "1 174407 Rams vs. Seahawks 2026-01-25T23:30:00Z 59"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Pick a league/series from df_sports (edit this for different series)\n",
+ "SERIES_ID = 10187\n",
+ "\n",
+ "params = {\n",
+ " \"series_id\": SERIES_ID,\n",
+ " \"active\": \"true\",\n",
+ " \"closed\": \"false\",\n",
+ " \"limit\": 10\n",
+ "}\n",
+ "events = get_json(f\"{GAMMA}/events\", params=params)\n",
+ "\n",
+ "# NOTICE if empty\n",
+ "if not events:\n",
+ " print(f\"⚠️ No active/open events found for series_id={SERIES_ID}.\")\n",
+ " print(\"Try a different series_id from df_sports, or remove filters (active/closed) to broaden results.\")\n",
+ " df_events = pd.DataFrame(columns=[\"event_id\", \"title\", \"startTime\", \"num_markets\"])\n",
+ "else:\n",
+ " df_events = pd.DataFrame([{\n",
+ " \"event_id\": e.get(\"id\"),\n",
+ " \"title\": e.get(\"title\"),\n",
+ " \"startTime\": e.get(\"startTime\"),\n",
+ " \"num_markets\": len(e.get(\"markets\", []) or []),\n",
+ " } for e in events])\n",
+ "\n",
+ "df_events\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QvISj1qfnRfU"
+ },
+ "source": [
+ "### Extract outcomes + CLOB token IDs for specific market\n",
+ "\n",
+ "Chooses an event that has at least one market, then grabs the first market.\n",
+ "\n",
+ "Prints:\n",
+ "- event title\n",
+ "- market question\n",
+ "- outcomes + current outcomePrices (from Gamma)\n",
+ "- `clobTokenIds` (the CLOB token IDs you use for pricing / order books)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "rAsqXCvpxhZs",
+ "outputId": "bd4b0018-4865-47f2-8662-39aa776d9204"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Event: Patriots vs. Broncos\n",
+ "Market question: Patriots vs. Broncos\n",
+ "Outcomes: ['Patriots', 'Broncos']\n",
+ "OutcomePrices: ['0.435', '0.565']\n",
+ "clobTokenIds: ['93940441597806605185863489141137222482434084554690688125580295758685733000625', '84067471748088275158649178487081940954142612413002471523992575056649818081482'] | type: \n",
+ "Using TOKEN_ID: 93940441597806605185863489141137222482434084554690688125580295758685733000625\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Pick an event that has at least 1 market\n",
+ "event = next(e for e in events if (e.get(\"markets\") or []))\n",
+ "market = (event.get(\"markets\") or [])[0]\n",
+ "\n",
+ "outcomes = maybe_json_list(market.get(\"outcomes\"))\n",
+ "outcome_prices = maybe_json_list(market.get(\"outcomePrices\"))\n",
+ "\n",
+ "# IMPORTANT: clobTokenIds can be a JSON-encoded string like '[\"...\",\"...\"]'\n",
+ "token_ids = maybe_json_list(market.get(\"clobTokenIds\"))\n",
+ "\n",
+ "print(\"Event:\", event.get(\"title\"))\n",
+ "print(\"Market question:\", market.get(\"question\"))\n",
+ "print(\"Outcomes:\", outcomes)\n",
+ "print(\"OutcomePrices:\", outcome_prices)\n",
+ "print(\"clobTokenIds:\", token_ids, \"| type:\", type(token_ids))\n",
+ "\n",
+ "if not isinstance(token_ids, list) or len(token_ids) == 0:\n",
+ " raise ValueError(f\"⚠️ clobTokenIds is missing or not a list. Got: {token_ids}\")\n",
+ "\n",
+ "# Convenience: choose the first token id (often \"Yes\" if outcomes=[Yes,No])\n",
+ "TOKEN_ID = str(token_ids[0])\n",
+ "print(\"Using TOKEN_ID:\", TOKEN_ID)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gcG0EHOVnRfU"
+ },
+ "source": [
+ "### Snapshot: current price + order book (REST)\n",
+ "\n",
+ "Uses CLOB REST endpoints to get real time prices\n",
+ "\n",
+ "This is a **point-in-time snapshot**. If you run it again, you’ll get an updated snapshot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "6Y2R0Vv9yRXW",
+ "outputId": "eab7f74f-f1f0-4faa-9df6-382f74550f47"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "BUY price: {'price': '0.44'}\n",
+ "SELL price: {'price': '0.45'}\n",
+ "Top of book bids: [{'price': '0.01', 'size': '67979'}, {'price': '0.02', 'size': '55162'}, {'price': '0.03', 'size': '31882'}, {'price': '0.04', 'size': '21368'}, {'price': '0.05', 'size': '23648.22'}]\n",
+ "Top of book asks: [{'price': '0.99', 'size': '85335.87'}, {'price': '0.98', 'size': '44343'}, {'price': '0.97', 'size': '38059'}, {'price': '0.96', 'size': '16901'}, {'price': '0.95', 'size': '950'}]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Current prices (note: side is BUY / SELL)\n",
+ "buy_px = get_json(f\"{CLOB}/price\", params={\"token_id\": TOKEN_ID, \"side\": \"BUY\"})\n",
+ "sell_px = get_json(f\"{CLOB}/price\", params={\"token_id\": TOKEN_ID, \"side\": \"SELL\"})\n",
+ "\n",
+ "book = get_json(f\"{CLOB}/book\", params={\"token_id\": TOKEN_ID})\n",
+ "\n",
+ "print(\"BUY price:\", buy_px)\n",
+ "print(\"SELL price:\", sell_px)\n",
+ "print(\"Top of book bids:\", (book.get(\"bids\") or [])[:5])\n",
+ "print(\"Top of book asks:\", (book.get(\"asks\") or [])[:5])\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HB4gG50lnRfU"
+ },
+ "source": [
+ "### Live updates: public WebSocket stream\n",
+ "\n",
+ "Starts a WebSocket subscription for one or more token IDs and prints a clean “live feed”.\n",
+ "\n",
+ "Why WS if you already have `/price`?\n",
+ "- WS is **push-based** (no polling loop / less API load)\n",
+ "- You get near-real-time updates without repeatedly calling REST endpoints\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "yrPJj1hy4VxG",
+ "outputId": "e9a7bdc7-49d5-4cc0-dc60-1d4d3c3bb0d3"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "✅ Polymarket WS subscribed (both outcomes). Streaming... (stop the cell to end)\n",
+ "[21:24:56 UTC] Patriots 0.5800/0.5900 last None | Broncos 0.4100/0.4200 last None\n",
+ "[21:24:58 UTC] Patriots 0.5800/0.6000 last None | Broncos 0.4100/0.4200 last None\n",
+ "[21:25:05 UTC] Patriots 0.5800/0.6000 last 0.6000 | Broncos 0.4000/0.4200 last 0.4200\n",
+ "[21:25:09 UTC] Patriots 0.5800/0.5900 last 0.6000 | Broncos 0.4000/0.4200 last 0.4200\n",
+ "[21:25:13 UTC] Patriots 0.5700/0.5900 last 0.5800 | Broncos 0.4100/0.4200 last 0.4100\n",
+ "[21:25:17 UTC] Patriots 0.5700/0.5800 last 0.5800 | Broncos 0.4100/0.4300 last 0.4300\n",
+ "[21:25:21 UTC] Patriots 0.5700/0.5800 last 0.5800 | Broncos 0.4200/0.4300 last 0.4200\n",
+ "[21:25:22 UTC] Patriots 0.5700/0.5800 last 0.5800 | Broncos 0.4200/0.4300 last 0.4300\n",
+ "[21:25:30 UTC] Patriots 0.5800/0.5900 last 0.5800 | Broncos 0.4200/0.4300 last 0.4300\n",
+ "[21:25:32 UTC] Patriots 0.5800/0.5900 last 0.5800 | Broncos 0.4100/0.4200 last 0.4200\n",
+ "[21:25:37 UTC] Patriots 0.5800/0.5900 last 0.5900 | Broncos 0.4100/0.4200 last 0.4200\n",
+ "[21:25:41 UTC] Patriots 0.5700/0.5800 last 0.5900 | Broncos 0.4100/0.4200 last 0.4200\n",
+ "[21:25:42 UTC] Patriots 0.5700/0.5800 last 0.5900 | Broncos 0.4200/0.4300 last 0.4300\n",
+ "[21:25:44 UTC] Patriots 0.5700/0.5800 last 0.5900 | Broncos 0.4200/0.4300 last 0.4200\n",
+ "[21:25:47 UTC] Patriots 0.5600/0.5700 last 0.5800 | Broncos 0.4200/0.4300 last 0.4200\n",
+ "[21:25:48 UTC] Patriots 0.5600/0.5700 last 0.5800 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:25:51 UTC] Patriots 0.5500/0.5700 last 0.5600 | Broncos 0.4300/0.4500 last 0.4400\n",
+ "[21:25:53 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:02 UTC] Patriots 0.5400/0.5500 last 0.5600 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:03 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4500/0.4600 last 0.4500\n",
+ "[21:26:07 UTC] Patriots 0.5400/0.5600 last 0.5500 | Broncos 0.4400/0.4500 last 0.4500\n",
+ "[21:26:10 UTC] Patriots 0.5600/0.5700 last 0.5600 | Broncos 0.4400/0.4600 last 0.4600\n",
+ "[21:26:12 UTC] Patriots 0.5600/0.5700 last 0.5700 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:26:13 UTC] Patriots 0.5600/0.5700 last 0.5700 | Broncos 0.4200/0.4500 last 0.4400\n",
+ "[21:26:16 UTC] Patriots 0.5500/0.5600 last 0.5700 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:26:18 UTC] Patriots 0.5500/0.5600 last 0.5500 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:19 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4500\n",
+ "[21:26:21 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:22 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:27 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4500\n",
+ "[21:26:31 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:32 UTC] Patriots 0.5500/0.5600 last 0.5500 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:37 UTC] Patriots 0.5600/0.5700 last 0.5500 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:26:40 UTC] Patriots 0.5600/0.5700 last 0.5600 | Broncos 0.4300/0.4400 last 0.4300\n",
+ "[21:26:47 UTC] Patriots 0.5600/0.5700 last 0.5700 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:26:56 UTC] Patriots 0.5600/0.5700 last 0.5700 | Broncos 0.4300/0.4400 last 0.4300\n",
+ "[21:26:59 UTC] Patriots 0.5600/0.5700 last 0.5700 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:27:00 UTC] Patriots 0.5600/0.5700 last 0.5600 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:27:08 UTC] Patriots 0.5500/0.5700 last 0.5600 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:27:12 UTC] Patriots 0.5600/0.5700 last 0.5600 | Broncos 0.4300/0.4500 last 0.4400\n",
+ "[21:27:15 UTC] Patriots 0.5600/0.5700 last 0.5600 | Broncos 0.4300/0.4400 last 0.4400\n",
+ "[21:27:17 UTC] Patriots 0.5500/0.5600 last 0.5500 | Broncos 0.4400/0.4500 last 0.4400\n",
+ "[21:27:20 UTC] Patriots 0.5400/0.5600 last 0.5500 | Broncos 0.4500/0.4600 last 0.4400\n",
+ "[21:27:21 UTC] Patriots 0.5500/0.5600 last 0.5600 | Broncos 0.4400/0.4500 last 0.4600\n",
+ "WS error: \n",
+ "WS closed: None None\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Polymarket WS — print BOTH outcome tokens on one line (clean)\n",
+ "\n",
+ "!pip -q install websocket-client\n",
+ "import websocket, threading, json, time\n",
+ "from datetime import datetime, timezone\n",
+ "\n",
+ "TOKENS = [str(t) for t in token_ids] # token_ids from your Gamma event/market cell (length 2)\n",
+ "OUTCOME_NAMES = outcomes # outcomes from your Gamma cell (e.g., [\"Patriots\",\"Broncos\"])\n",
+ "\n",
+ "state = {t: {\"bid\": None, \"ask\": None, \"last\": None} for t in TOKENS}\n",
+ "last_print_t = 0.0\n",
+ "\n",
+ "def fmt(x): return \"None\" if x is None else f\"{float(x):.4f}\"\n",
+ "\n",
+ "def as_levels(x):\n",
+ " out = []\n",
+ " if not x: return out\n",
+ " for lvl in x:\n",
+ " if isinstance(lvl, (list, tuple)) and len(lvl) >= 2:\n",
+ " try: out.append((float(lvl[0]), float(lvl[1])))\n",
+ " except: pass\n",
+ " elif isinstance(lvl, dict):\n",
+ " try: out.append((float(lvl.get(\"price\")), float(lvl.get(\"size\"))))\n",
+ " except: pass\n",
+ " return out\n",
+ "\n",
+ "def normalize_events(message):\n",
+ " try:\n",
+ " obj = json.loads(message)\n",
+ " except Exception:\n",
+ " return []\n",
+ " if isinstance(obj, list):\n",
+ " return [x for x in obj if isinstance(x, dict)]\n",
+ " if isinstance(obj, dict):\n",
+ " d = obj.get(\"data\")\n",
+ " if isinstance(d, list):\n",
+ " out = []\n",
+ " for item in d:\n",
+ " if isinstance(item, dict):\n",
+ " item = dict(item)\n",
+ " item.setdefault(\"event_type\", obj.get(\"event_type\") or obj.get(\"type\"))\n",
+ " out.append(item)\n",
+ " return out\n",
+ " if isinstance(d, dict):\n",
+ " item = dict(d)\n",
+ " item.setdefault(\"event_type\", obj.get(\"event_type\") or obj.get(\"type\"))\n",
+ " return [item]\n",
+ " return [obj]\n",
+ " return []\n",
+ "\n",
+ "def print_line():\n",
+ " ts = datetime.now(timezone.utc).strftime(\"%H:%M:%S\")\n",
+ " parts = []\n",
+ " for name, tid in zip(OUTCOME_NAMES, TOKENS):\n",
+ " s = state[tid]\n",
+ " parts.append(f\"{name[:10]:<10} {fmt(s['bid'])}/{fmt(s['ask'])} last {fmt(s['last'])}\")\n",
+ " print(f\"[{ts} UTC] \" + \" | \".join(parts))\n",
+ "\n",
+ "def run_ws(print_every=1.0, ping_every=10):\n",
+ " global last_print_t\n",
+ "\n",
+ " def on_open(ws):\n",
+ " ws.send(json.dumps({\"assets_ids\": TOKENS, \"type\": \"market\"}))\n",
+ " def ping_loop():\n",
+ " while True:\n",
+ " try:\n",
+ " ws.send(\"PING\")\n",
+ " time.sleep(ping_every)\n",
+ " except Exception:\n",
+ " break\n",
+ " threading.Thread(target=ping_loop, daemon=True).start()\n",
+ " print(\"✅ Polymarket WS subscribed (both outcomes). Streaming... (stop the cell to end)\")\n",
+ "\n",
+ " def on_message(ws, message):\n",
+ " global last_print_t\n",
+ " if message == \"PONG\":\n",
+ " return\n",
+ "\n",
+ " changed = False\n",
+ " for ev in normalize_events(message):\n",
+ " try:\n",
+ " et = ev.get(\"event_type\") or ev.get(\"type\")\n",
+ " tid = ev.get(\"asset_id\") or ev.get(\"token_id\") or ev.get(\"assetId\") or ev.get(\"tokenId\")\n",
+ " tid = str(tid) if tid is not None else None\n",
+ " if tid not in state:\n",
+ " continue\n",
+ "\n",
+ " if et in (\"book\", \"orderbook\", \"book_change\"):\n",
+ " bids = as_levels(ev.get(\"bids\") or [])\n",
+ " asks = as_levels(ev.get(\"asks\") or [])\n",
+ " if bids:\n",
+ " bid = max(bids, key=lambda t: t[0])[0]\n",
+ " if bid != state[tid][\"bid\"]:\n",
+ " state[tid][\"bid\"] = bid\n",
+ " changed = True\n",
+ " if asks:\n",
+ " ask = min(asks, key=lambda t: t[0])[0]\n",
+ " if ask != state[tid][\"ask\"]:\n",
+ " state[tid][\"ask\"] = ask\n",
+ " changed = True\n",
+ "\n",
+ " elif et in (\"last_trade_price\", \"last_trade\", \"price_change\"):\n",
+ " px = ev.get(\"price\") or ev.get(\"last_trade_price\") or ev.get(\"lastTradePrice\") or ev.get(\"new_price\") or ev.get(\"newPrice\")\n",
+ " if px is not None:\n",
+ " px = float(px)\n",
+ " if px != state[tid][\"last\"]:\n",
+ " state[tid][\"last\"] = px\n",
+ " changed = True\n",
+ " except Exception:\n",
+ " continue\n",
+ "\n",
+ " now = time.time()\n",
+ " if changed and (now - last_print_t >= print_every):\n",
+ " print_line()\n",
+ " last_print_t = now\n",
+ "\n",
+ " def on_error(ws, err):\n",
+ " print(\"WS error:\", err)\n",
+ "\n",
+ " def on_close(ws, code, msg):\n",
+ " print(\"WS closed:\", code, msg)\n",
+ "\n",
+ " ws = websocket.WebSocketApp(\n",
+ " WSS_MARKET,\n",
+ " on_open=on_open,\n",
+ " on_message=on_message,\n",
+ " on_error=on_error,\n",
+ " on_close=on_close\n",
+ " )\n",
+ " ws.run_forever()\n",
+ "\n",
+ "run_ws(print_every=1.0)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "01LanGtKnRfU"
+ },
+ "source": [
+ "## More Polymarket API features\n",
+ "\n",
+ "This starter kit covers the **core building blocks** for the contest:\n",
+ "- discovering sports series/events via the **Gamma API**\n",
+ "- pulling current prices and order books via **CLOB** (`/price`, `/book`)\n",
+ "- optional real-time updates via the public **WebSocket** stream\n",
+ "\n",
+ "If you need **more features beyond the base examples here** (additional endpoints and other WebSocket channels, etc.), please refer to the **official Polymarket API documentation**:\n",
+ "\n",
+ "https://docs.polymarket.com/quickstart/overview#apis-at-a-glance\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "gpuType": "L4",
+ "machine_shape": "hm",
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/Tutorials/Task_3_tutorial/README.md b/Tutorials/Task_3_tutorial/README.md
index 53989c9..1bbb09a 100644
--- a/Tutorials/Task_3_tutorial/README.md
+++ b/Tutorials/Task_3_tutorial/README.md
@@ -1,43 +1,178 @@
-# Task 3 Starter Kit: Prediction Market Arbitrage
+# FinAI Task III: Prediction Market Arbitrage
-This starter kit provides a template for the **Prediction Market Arbitrage** task. It demonstrates the expected agent interface for trading across Kalshi and Polymarket.
+## Task Overview
-> **IMPORTANT**: This is only an example. You should design and implement your own agent for submission.
+This task focuses on developing trading agents that identify and execute arbitrage opportunities across two prediction markets — **Kalshi** and **Polymarket** — for a series of sports events with binary options.
-## 📂 Directory Structure
+Models may incorporate sentiment signals in addition to market data to anticipate market moves when new information changes expectations during a game.
-```
-Task_3_tutorial/
-├── README.md # This file
-├── Task_3_Description.md # Task description and dataset info
-├── requirements.txt # Python dependencies (add your own)
-├── example_agent.py # Template agent (implement your own logic)
-└── main.py # Main script to run paper trading simulation
-```
+Evaluation will be conducted via **paper trading**, where agents perform simulated trading on real market data without using real capital.
-## 🚀 Setup
+---
-```bash
-cd Tutorials/Task_3_tutorial
-pip install -r requirements.txt
-```
+## Objective
-## ▶️ Running
+Your agent should:
-```bash
-python main.py
-```
+- Identify cross-market arbitrage opportunities between Kalshi and Polymarket binary sports contracts
+- Ingest and interpret real-time market data:
+ - Prices
+ - Bid–ask spreads
+ - Liquidity
+ - Order book signals
+- Maintain basic risk management:
+ - Position sizing
+ - Exposure limits
+ - Avoiding overtrading
+- Execute paper trades by generating explicit trade actions:
+ - Event selection
+ - Contract direction (YES / NO)
+ - Position size
+ - Simulated execution under realistic market conditions
+- Optionally incorporate sentiment signals from external data sources
-## 🛠 Developing Your Agent
+---
-This is only an example. You should design and implement your own agent with:
-- Your own market data fetching strategy (Kalshi API, Polymarket CLOB API)
-- Your own arbitrage detection algorithm
-- Your own order execution logic
-- Your own risk management
+## Why It Matters
-## 📚 API Resources
+Prediction markets are becoming increasingly mainstream as real-time signals of collective expectations.
-- **Kalshi API**: https://trading-api.readme.io/docs
-- **Polymarket CLOB API**: https://docs.polymarket.com
-- **Polymarket Python SDK**: https://github.com/Polymarket/py-clob-client
+Cross-venue arbitrage is meaningful because it tests whether an agent can:
+
+- Capture temporary mispricing between Kalshi and Polymarket
+- React under latency constraints
+- Account for bid–ask spreads
+- Handle liquidity constraints
+- Operate within risk limits
+
+This task evaluates both market efficiency detection and execution robustness.
+
+---
+
+# Starter Kit Overview
+
+The starter kit allows contestants to:
+
+- Pull real-time market data from Kalshi and Polymarket
+- Collect external sports sentiment data via RSS feeds
+- Build dashboards
+- Generate features for trading agents
+- Detect market-moving updates (injuries, trades, lineup changes, major headlines)
+
+---
+
+# Polymarket Data
+
+Documentation:
+https://docs.polymarket.com/quickstart/overview#apis-at-a-glance
+
+Polymarket uses a two-layer data access system:
+
+- **Gamma API** → Market discovery
+- **CLOB API** → Live pricing and order book data
+
+Includes:
+- Public WebSocket stream for real-time updates
+- Configurable runtime duration for streaming
+
+### What You Get from Polymarket API
+
+- List of sports series from Gamma (series_id)
+- Pull events and markets
+- Extract token IDs for CLOB usage
+- Fetch:
+ - Current prices via `/price`
+ - Current order book via `/book`
+- WebSocket live stream for low-latency bid/ask updates
+
+---
+
+# Kalshi Data
+
+Documentation:
+https://docs.kalshi.com/welcome
+
+This demo retrieves sports market data from Kalshi API and includes a liquidity quality filter.
+
+### What You Get from Kalshi API
+
+- Market list including:
+ - Bid
+ - Ask
+ - Last price
+ - Volume
+ - Open interest
+- Computed:
+ - Spread
+ - Midpoint
+- Filtered view of higher-liquidity, tighter-spread markets
+- Optional live polling output (auto-stops after configurable runtime)
+
+---
+
+# Sports Sentiment Data via RSS
+
+This demo creates a **Sports Sentiment Signal Feed** using RSS feeds.
+
+Features:
+
+- Polls multiple sports news RSS sources
+- Normalizes timestamps (UTC)
+- Tags items by league (NFL, NBA, etc.)
+- Applies signal labels:
+ - injury
+ - lineup
+ - trade
+ - suspension
+ - game_event
+- Deduplicates entries
+- Clean polling loop with configurable runtime
+
+### What You Get from the RSS Notebook
+
+- Multi-source RSS ingestion
+- Deduplication
+- Signal tagging
+- Auto-stopping clean polling loop
+
+---
+
+# Evaluation
+
+Each submission will be evaluated in a **paper-trading environment** using real-time market data from Kalshi and Polymarket.
+
+- No real capital is used.
+- Agents are evaluated on their ability to capture cross-market arbitrage opportunities.
+
+### Initial Capital
+
+- Polymarket Account: $10,000
+- Kalshi Account: $10,000
+
+---
+
+# Arbitrage Performance Metrics
+
+### 1. Total Profit / Loss (P&L)
+Net paper-trading return over the evaluation period.
+
+### 2. Sharpe Ratio
+Risk-adjusted return consistency.
+
+### 3. Maximum Drawdown
+Largest peak-to-trough decline in cumulative P&L.
+
+### 4. Number of Successful Arbitrage Trades
+Count of profitable arbitrage executions.
+
+---
+
+## Summary
+
+This task evaluates:
+
+- Cross-venue mispricing detection
+- Real-time execution capability
+- Risk-aware trading strategies
+- Optional sentiment-enhanced market anticipation
+- Performance consistency under realistic market conditions
\ No newline at end of file
diff --git a/Tutorials/Task_3_tutorial/RssFeedDemo.ipynb b/Tutorials/Task_3_tutorial/RssFeedDemo.ipynb
new file mode 100644
index 0000000..ef8e2ea
--- /dev/null
+++ b/Tutorials/Task_3_tutorial/RssFeedDemo.ipynb
@@ -0,0 +1,1284 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Sports Sentiment Data via RSS (Demo)"
+ ],
+ "metadata": {
+ "id": "SSlVdGKchW3C"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Install Required Libraries\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "Tskd2sGdqql7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "!pip -q install feedparser pandas python-dateutil\n"
+ ],
+ "metadata": {
+ "id": "7nIp4xh3kLfV"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Import Core Libraries\n",
+ "\n",
+ "This cell imports all core dependencies used throughout the pipeline"
+ ],
+ "metadata": {
+ "id": "JUsDR2raq2C0"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import time, re, hashlib\n",
+ "import feedparser\n",
+ "import pandas as pd\n",
+ "from datetime import datetime, timezone\n",
+ "from dateutil import parser as dtparser\n"
+ ],
+ "metadata": {
+ "id": "1xVcx7UhkOBU"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Configure RSS Feed Sources\n",
+ "\n",
+ "This cell defines the set of RSS feeds to monitor.\n",
+ "\n",
+ "You can freely:\n",
+ "- Add new feeds \n",
+ "- Remove feeds \n",
+ "- Rename sources \n",
+ "\n",
+ "This is just a demo using an RSS feed—you’ll need to add additional RSS sources/links for broader sports events coverage."
+ ],
+ "metadata": {
+ "id": "q62cD0TAq6wL"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Cell — RSS sources (add/remove freely)\n",
+ "# Cell — Working starter RSS feeds (NBA + NFL + general)\n",
+ "FEEDS = {\n",
+ " # General / multi-sport\n",
+ " \"ESPN\": \"https://www.espn.com/espn/rss/news\",\n",
+ " \"CBS_SPORTS\": \"https://www.cbssports.com/rss/headlines/\",\n",
+ " \"YAHOO_SPORTS\": \"https://sports.yahoo.com/rss/\",\n",
+ "\n",
+ " # NFL\n",
+ " \"NFL_NEWS\": \"https://www.nfl.com/rss/rsslanding?searchString=news\",\n",
+ " \"ESPN_NFL\": \"https://www.espn.com/espn/rss/nfl/news\",\n",
+ "\n",
+ " # NBA\n",
+ " \"ESPN_NBA\": \"https://www.espn.com/espn/rss/nba/news\",\n",
+ " \"NBA_RUMORS_HOOPSHYPE\": \"https://hoopshype.com/feed/\",\n",
+ "\n",
+ "}\n",
+ "\n",
+ "print(\"Feeds configured:\", len(FEEDS))\n",
+ "list(FEEDS.items())[:3]\n",
+ "\n",
+ "\n",
+ "print(\"Feeds configured:\", len(FEEDS))\n",
+ "list(FEEDS.keys())[:10]\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "KdeR3R2LkO0s",
+ "outputId": "1ef26628-7a91-4828-d70f-c784fe76875b"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Feeds configured: 7\n",
+ "Feeds configured: 7\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "['ESPN',\n",
+ " 'CBS_SPORTS',\n",
+ " 'YAHOO_SPORTS',\n",
+ " 'NFL_NEWS',\n",
+ " 'ESPN_NFL',\n",
+ " 'ESPN_NBA',\n",
+ " 'NBA_RUMORS_HOOPSHYPE']"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 97
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Core RSS Fetch Utilities\n",
+ "\n",
+ "Defines helpers to:\n",
+ "- Parse RSS timestamps safely (UTC)\n",
+ "- Create a unique fingerprint per item (dedupe)\n",
+ "- Fetch all feeds once into a clean DataFrame (sorted, deduped)\n",
+ "\n",
+ "Also runs a quick one-time fetch to preview results and total items.\n"
+ ],
+ "metadata": {
+ "id": "tTOxBhf8rCzF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "def safe_parse_dt(x):\n",
+ " if not x:\n",
+ " return None\n",
+ " try:\n",
+ " d = dtparser.parse(x)\n",
+ " if not d.tzinfo:\n",
+ " d = d.replace(tzinfo=timezone.utc)\n",
+ " return d.astimezone(timezone.utc)\n",
+ " except Exception:\n",
+ " return None\n",
+ "\n",
+ "def item_fingerprint(title, link, published):\n",
+ " base = (title or \"\") + \"|\" + (link or \"\") + \"|\" + (published.isoformat() if published else \"\")\n",
+ " return hashlib.sha1(base.encode(\"utf-8\", errors=\"ignore\")).hexdigest()\n",
+ "\n",
+ "def fetch_feeds_once(feeds: dict, timeout=15):\n",
+ " rows = []\n",
+ " for name, url in feeds.items():\n",
+ " if not url or \"PASTE_\" in url:\n",
+ " continue\n",
+ " try:\n",
+ " f = feedparser.parse(url, agent=\"colab-rss-sports-feed/1.0\")\n",
+ " for e in f.entries:\n",
+ " title = getattr(e, \"title\", None)\n",
+ " link = getattr(e, \"link\", None)\n",
+ " summary = getattr(e, \"summary\", None) or getattr(e, \"description\", None)\n",
+ "\n",
+ " published_raw = getattr(e, \"published\", None) or getattr(e, \"updated\", None)\n",
+ " published_dt = safe_parse_dt(published_raw)\n",
+ "\n",
+ " fp = item_fingerprint(title, link, published_dt)\n",
+ "\n",
+ " rows.append({\n",
+ " \"source\": name,\n",
+ " \"published_utc\": published_dt,\n",
+ " \"title\": title,\n",
+ " \"link\": link,\n",
+ " \"summary\": summary,\n",
+ " \"fp\": fp,\n",
+ " })\n",
+ " except Exception as ex:\n",
+ " rows.append({\n",
+ " \"source\": name,\n",
+ " \"published_utc\": None,\n",
+ " \"title\": None,\n",
+ " \"link\": None,\n",
+ " \"summary\": f\"ERROR: {ex}\",\n",
+ " \"fp\": f\"error:{name}\",\n",
+ " })\n",
+ " time.sleep(0.15) # polite throttle\n",
+ "\n",
+ " df = pd.DataFrame(rows)\n",
+ " if len(df):\n",
+ " # Sort newest first; some feeds have missing published times\n",
+ " df = df.sort_values([\"published_utc\"], ascending=False, na_position=\"last\")\n",
+ " df = df.drop_duplicates(subset=[\"fp\"], keep=\"first\")\n",
+ " return df\n",
+ "\n",
+ "df_rss = fetch_feeds_once(FEEDS)\n",
+ "display(df_rss.head(30))\n",
+ "print(\"Total items:\", len(df_rss))\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "rsYmWl65kQ0i",
+ "outputId": "565b2792-ae74-4bb4-b12b-3453892b8a22"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " source published_utc \\\n",
+ "65 YAHOO_SPORTS 2026-01-26 04:45:33+00:00 \n",
+ "66 YAHOO_SPORTS 2026-01-26 04:43:35+00:00 \n",
+ "68 YAHOO_SPORTS 2026-01-26 04:43:00+00:00 \n",
+ "67 YAHOO_SPORTS 2026-01-26 04:43:00+00:00 \n",
+ "69 YAHOO_SPORTS 2026-01-26 04:41:49+00:00 \n",
+ "70 YAHOO_SPORTS 2026-01-26 04:41:35+00:00 \n",
+ "71 YAHOO_SPORTS 2026-01-26 04:40:55+00:00 \n",
+ "72 YAHOO_SPORTS 2026-01-26 04:40:43+00:00 \n",
+ "73 YAHOO_SPORTS 2026-01-26 04:40:08+00:00 \n",
+ "74 YAHOO_SPORTS 2026-01-26 04:38:56+00:00 \n",
+ "75 YAHOO_SPORTS 2026-01-26 04:38:20+00:00 \n",
+ "76 YAHOO_SPORTS 2026-01-26 04:37:22+00:00 \n",
+ "77 YAHOO_SPORTS 2026-01-26 04:35:00+00:00 \n",
+ "78 YAHOO_SPORTS 2026-01-26 04:34:12+00:00 \n",
+ "79 YAHOO_SPORTS 2026-01-26 04:33:52+00:00 \n",
+ "80 YAHOO_SPORTS 2026-01-26 04:33:26+00:00 \n",
+ "81 YAHOO_SPORTS 2026-01-26 04:33:25+00:00 \n",
+ "82 YAHOO_SPORTS 2026-01-26 04:33:00+00:00 \n",
+ "83 YAHOO_SPORTS 2026-01-26 04:32:25+00:00 \n",
+ "84 YAHOO_SPORTS 2026-01-26 04:32:17+00:00 \n",
+ "85 YAHOO_SPORTS 2026-01-26 04:32:14+00:00 \n",
+ "86 YAHOO_SPORTS 2026-01-26 04:31:18+00:00 \n",
+ "87 YAHOO_SPORTS 2026-01-26 04:30:00+00:00 \n",
+ "88 YAHOO_SPORTS 2026-01-26 04:29:47+00:00 \n",
+ "89 YAHOO_SPORTS 2026-01-26 04:28:29+00:00 \n",
+ "90 YAHOO_SPORTS 2026-01-26 04:27:38+00:00 \n",
+ "91 YAHOO_SPORTS 2026-01-26 04:25:50+00:00 \n",
+ "92 YAHOO_SPORTS 2026-01-26 04:25:35+00:00 \n",
+ "93 YAHOO_SPORTS 2026-01-26 04:24:04+00:00 \n",
+ "94 YAHOO_SPORTS 2026-01-26 04:23:59+00:00 \n",
+ "\n",
+ " title \\\n",
+ "65 Las Vegas Raiders and the Buffalo Bills are in... \n",
+ "66 Photos: Best images from Thunder's 103-101 los... \n",
+ "68 Super Bowl Prop Bets: Odds and Expert Picks fo... \n",
+ "67 Super Bowl National Anthem Length: Charlie Put... \n",
+ "69 McVay bristles at question about Stafford's fu... \n",
+ "70 Writer suggests 'reasonable' trade package for... \n",
+ "71 Dru Smith keeps impressing with his defense 'O... \n",
+ "72 NFL fans raise conspiracy theory over Super Bo... \n",
+ "73 Russell Wilson praises Sam Darnold for 'inspir... \n",
+ "74 Sean McVay left at a loss for words after Rams... \n",
+ "75 Kawhi Leonard, James Harden fuel fast start as... \n",
+ "76 Nets player grades: Danny Wolf drops 14 in 126... \n",
+ "77 From Knicks disaster to Clippers blowout, Nets... \n",
+ "78 Sean McVay: Seahawks had "fortuitous bust... \n",
+ "79 Seahawks set to rematch with Patriots in Super... \n",
+ "80 'Did it for Harambe' Sun Devils' Twitter react... \n",
+ "81 Seahawks NFC championship win is good news for... \n",
+ "82 3 reasons Patriots defense dominated in AFC pl... \n",
+ "83 Sean McVay says Seahawks 'lucked into' pivotal... \n",
+ "84 Presumed Chargers OC 'still in mix' for Raider... \n",
+ "85 Scottie Scheffler's clubs: Inside his American... \n",
+ "86 Player grades: Thunder can't close out again i... \n",
+ "87 Best Super Bowl Coin Toss Prop Results: Heads ... \n",
+ "88 Seahawks to face Patriots in Super Bowl 60 \n",
+ "89 No QB had ever lost a playoff game with number... \n",
+ "90 How family grief made Hamer-Webb pick Wales \n",
+ "91 Patriots Join 49ers In Elite Company After Cli... \n",
+ "92 Miami linebacker Raul Aguirre commits to NC St... \n",
+ "93 What head coach candidates can Las Vegas Raide... \n",
+ "94 Silver Knights cannot keep first period moment... \n",
+ "\n",
+ " link \\\n",
+ "65 https://sports.yahoo.com/articles/las-vegas-ra... \n",
+ "66 https://sports.yahoo.com/articles/photos-best-... \n",
+ "68 https://sports.yahoo.com/articles/super-bowl-p... \n",
+ "67 https://sports.yahoo.com/articles/super-bowl-n... \n",
+ "69 https://sports.yahoo.com/articles/mcvay-bristl... \n",
+ "70 https://sports.yahoo.com/articles/writer-sugge... \n",
+ "71 https://sports.yahoo.com/articles/dru-smith-ke... \n",
+ "72 https://sports.yahoo.com/articles/nfl-fans-rai... \n",
+ "73 https://sports.yahoo.com/articles/russell-wils... \n",
+ "74 https://sports.yahoo.com/articles/sean-mcvay-l... \n",
+ "75 https://sports.yahoo.com/articles/kawhi-leonar... \n",
+ "76 https://sports.yahoo.com/articles/nets-player-... \n",
+ "77 https://sports.yahoo.com/articles/knicks-disas... \n",
+ "78 https://sports.yahoo.com/articles/sean-mcvay-s... \n",
+ "79 https://sports.yahoo.com/articles/seahawks-set... \n",
+ "80 https://sports.yahoo.com/articles/did-harambe-... \n",
+ "81 https://sports.yahoo.com/articles/seahawks-nfc... \n",
+ "82 https://sports.yahoo.com/articles/3-reasons-pa... \n",
+ "83 https://sports.yahoo.com/nfl/article/sean-mcva... \n",
+ "84 https://sports.yahoo.com/articles/potential-ch... \n",
+ "85 https://sports.yahoo.com/articles/scottie-sche... \n",
+ "86 https://sports.yahoo.com/articles/player-grade... \n",
+ "87 https://sports.yahoo.com/articles/best-super-b... \n",
+ "88 https://sports.yahoo.com/articles/patriots-bea... \n",
+ "89 https://sports.yahoo.com/articles/no-qb-had-ev... \n",
+ "90 https://sports.yahoo.com/articles/family-grief... \n",
+ "91 https://sports.yahoo.com/articles/patriots-joi... \n",
+ "92 https://sports.yahoo.com/articles/miami-lineba... \n",
+ "93 https://sports.yahoo.com/articles/head-coach-c... \n",
+ "94 https://sports.yahoo.com/articles/silver-knigh... \n",
+ "\n",
+ " summary \\\n",
+ "65 With the Broncos eliminated from the postseaso... \n",
+ "66 The best photos from the Oklahoma City Thunder... \n",
+ "68 We share the most popular Super Bowl props and... \n",
+ "67 A look at Over/Under odds for the National Ant... \n",
+ "69 The Los Angeles Rams quarterback turns 38 in t... \n",
+ "70 Would it be worth it for the Lakers to give up... \n",
+ "71 Dru Smith has continued to be one of the stand... \n",
+ "72 Some people are buried deep into NFL conspirac... \n",
+ "73 Here's what Wilson said after the Seahawks' win. \n",
+ "74 Rams coach Sean McVay had an honest reaction t... \n",
+ "75 Kawhi Leonard scored 21 of his 28 points in th... \n",
+ "76 Here are the Brooklyn Nets player grades follo... \n",
+ "77 Wednesday was Madison Square Garden. Sunday wa... \n",
+ "78 Although the NFC Championship had many compell... \n",
+ "79 The rematch of Super Bowl XLIX is set \n",
+ "80 Arizona State students wore "forks up for... \n",
+ "81 The Seahawks beat the Rams in the NFC Champion... \n",
+ "82 The Patriots played terrific defense throughou... \n",
+ "83 Bust or not, the Seahawks cut off all of Matth... \n",
+ "84 Mike McDaniel is still an option to be the Rai... \n",
+ "85 Scottie Scheffler won the 2026 American Expres... \n",
+ "86 Player grades for the Oklahoma City Thunder's ... \n",
+ "87 Find the best odds, past results, and advice f... \n",
+ "88 The Seattle Seahawks will face the New England... \n",
+ "89 Matthew Stafford is the first quarterback ever... \n",
+ "90 Uncapped Gabriel Hamer-Webb reveals how his Ca... \n",
+ "91 The New England Patriots will have one more ga... \n",
+ "92 Miami linebacker Raul Aguirre has committed to... \n",
+ "93 2nd interviews with candidates in Super Bowl c... \n",
+ "94 It is not about how you start, but how you fin... \n",
+ "\n",
+ " fp \n",
+ "65 b8d84f64683f1644e5becad3a58996cbb7f0ceb1 \n",
+ "66 11bbd167da9db5d889a9e5a16a6702cfece76ff9 \n",
+ "68 86b2e26eda383167ffd1f3b50650251976e772ef \n",
+ "67 db30bfe312fa7e2ecd264b572622161b07504e53 \n",
+ "69 8fbd9e9d7b8c54c6b0225f1dc149810e03249e57 \n",
+ "70 75147f0cd04952aee5fec4c094ab8e00f7184fae \n",
+ "71 9849427cefb85bd8c8d1eab7fccc1fdf3952cff5 \n",
+ "72 03963c4e13d9a55d1f218e9888f1d1a29aadca77 \n",
+ "73 b60ea2b179230ceac0d541903c494c1a052fafc6 \n",
+ "74 e0f2448a82a36f6c2d6f3dd264bb0a019772f58d \n",
+ "75 dc2cebb0a9691f099fa90d5578becba1a11b0892 \n",
+ "76 e21a22423f3a7d51f7e5a789ce7f327b3a34f111 \n",
+ "77 58f3892c4e48332a9e6189f505263062a1e3a2e9 \n",
+ "78 f88f6e81ef74138d5b38119592a02a55097dd313 \n",
+ "79 39fa46a8192ec569b5ba56aaea1513a6de8f49f8 \n",
+ "80 6be5b23359ace931c9eadcd7b4299778d3a2c6fc \n",
+ "81 10f4858e2ee8fa91d24267cdd5dc1158340d2a18 \n",
+ "82 855d3ce1fd578fe786eff95dbecec03a5019c16b \n",
+ "83 35b2427de65dcec6cd9a10232ba5d14976dbe178 \n",
+ "84 06034ec594380368fe798f6b580103c258969a26 \n",
+ "85 4118fbbbf698cfea11833af3d6d7676cbc05d144 \n",
+ "86 6d3a358f8e1b44b8cc8cd79556237408d71469ca \n",
+ "87 99c04171ee54ffc9b049b2a487e865af1906965a \n",
+ "88 d126529bb69db8c986494515c468eadd939cb77a \n",
+ "89 034bf9275945f83d6c699553b1773689389c35eb \n",
+ "90 4f4247a5a78b2434d2463c757867ef0358245f12 \n",
+ "91 befba3cb02dd17cc82929d64f59b64b4278ae8e0 \n",
+ "92 6e2574f514a0cf9bcc5ac8857cde57af65fe924e \n",
+ "93 301608520c48f925a46b4f787a6a217cbacfb4ea \n",
+ "94 9d7de37c55a1dee82f1797abcdb64e5ebf52162b "
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " source | \n",
+ " published_utc | \n",
+ " title | \n",
+ " link | \n",
+ " summary | \n",
+ " fp | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 65 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:45:33+00:00 | \n",
+ " Las Vegas Raiders and the Buffalo Bills are in... | \n",
+ " https://sports.yahoo.com/articles/las-vegas-ra... | \n",
+ " With the Broncos eliminated from the postseaso... | \n",
+ " b8d84f64683f1644e5becad3a58996cbb7f0ceb1 | \n",
+ "
\n",
+ " \n",
+ " | 66 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:43:35+00:00 | \n",
+ " Photos: Best images from Thunder's 103-101 los... | \n",
+ " https://sports.yahoo.com/articles/photos-best-... | \n",
+ " The best photos from the Oklahoma City Thunder... | \n",
+ " 11bbd167da9db5d889a9e5a16a6702cfece76ff9 | \n",
+ "
\n",
+ " \n",
+ " | 68 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:43:00+00:00 | \n",
+ " Super Bowl Prop Bets: Odds and Expert Picks fo... | \n",
+ " https://sports.yahoo.com/articles/super-bowl-p... | \n",
+ " We share the most popular Super Bowl props and... | \n",
+ " 86b2e26eda383167ffd1f3b50650251976e772ef | \n",
+ "
\n",
+ " \n",
+ " | 67 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:43:00+00:00 | \n",
+ " Super Bowl National Anthem Length: Charlie Put... | \n",
+ " https://sports.yahoo.com/articles/super-bowl-n... | \n",
+ " A look at Over/Under odds for the National Ant... | \n",
+ " db30bfe312fa7e2ecd264b572622161b07504e53 | \n",
+ "
\n",
+ " \n",
+ " | 69 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:41:49+00:00 | \n",
+ " McVay bristles at question about Stafford's fu... | \n",
+ " https://sports.yahoo.com/articles/mcvay-bristl... | \n",
+ " The Los Angeles Rams quarterback turns 38 in t... | \n",
+ " 8fbd9e9d7b8c54c6b0225f1dc149810e03249e57 | \n",
+ "
\n",
+ " \n",
+ " | 70 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:41:35+00:00 | \n",
+ " Writer suggests 'reasonable' trade package for... | \n",
+ " https://sports.yahoo.com/articles/writer-sugge... | \n",
+ " Would it be worth it for the Lakers to give up... | \n",
+ " 75147f0cd04952aee5fec4c094ab8e00f7184fae | \n",
+ "
\n",
+ " \n",
+ " | 71 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:40:55+00:00 | \n",
+ " Dru Smith keeps impressing with his defense 'O... | \n",
+ " https://sports.yahoo.com/articles/dru-smith-ke... | \n",
+ " Dru Smith has continued to be one of the stand... | \n",
+ " 9849427cefb85bd8c8d1eab7fccc1fdf3952cff5 | \n",
+ "
\n",
+ " \n",
+ " | 72 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:40:43+00:00 | \n",
+ " NFL fans raise conspiracy theory over Super Bo... | \n",
+ " https://sports.yahoo.com/articles/nfl-fans-rai... | \n",
+ " Some people are buried deep into NFL conspirac... | \n",
+ " 03963c4e13d9a55d1f218e9888f1d1a29aadca77 | \n",
+ "
\n",
+ " \n",
+ " | 73 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:40:08+00:00 | \n",
+ " Russell Wilson praises Sam Darnold for 'inspir... | \n",
+ " https://sports.yahoo.com/articles/russell-wils... | \n",
+ " Here's what Wilson said after the Seahawks' win. | \n",
+ " b60ea2b179230ceac0d541903c494c1a052fafc6 | \n",
+ "
\n",
+ " \n",
+ " | 74 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:38:56+00:00 | \n",
+ " Sean McVay left at a loss for words after Rams... | \n",
+ " https://sports.yahoo.com/articles/sean-mcvay-l... | \n",
+ " Rams coach Sean McVay had an honest reaction t... | \n",
+ " e0f2448a82a36f6c2d6f3dd264bb0a019772f58d | \n",
+ "
\n",
+ " \n",
+ " | 75 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:38:20+00:00 | \n",
+ " Kawhi Leonard, James Harden fuel fast start as... | \n",
+ " https://sports.yahoo.com/articles/kawhi-leonar... | \n",
+ " Kawhi Leonard scored 21 of his 28 points in th... | \n",
+ " dc2cebb0a9691f099fa90d5578becba1a11b0892 | \n",
+ "
\n",
+ " \n",
+ " | 76 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:37:22+00:00 | \n",
+ " Nets player grades: Danny Wolf drops 14 in 126... | \n",
+ " https://sports.yahoo.com/articles/nets-player-... | \n",
+ " Here are the Brooklyn Nets player grades follo... | \n",
+ " e21a22423f3a7d51f7e5a789ce7f327b3a34f111 | \n",
+ "
\n",
+ " \n",
+ " | 77 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:35:00+00:00 | \n",
+ " From Knicks disaster to Clippers blowout, Nets... | \n",
+ " https://sports.yahoo.com/articles/knicks-disas... | \n",
+ " Wednesday was Madison Square Garden. Sunday wa... | \n",
+ " 58f3892c4e48332a9e6189f505263062a1e3a2e9 | \n",
+ "
\n",
+ " \n",
+ " | 78 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:34:12+00:00 | \n",
+ " Sean McVay: Seahawks had "fortuitous bust... | \n",
+ " https://sports.yahoo.com/articles/sean-mcvay-s... | \n",
+ " Although the NFC Championship had many compell... | \n",
+ " f88f6e81ef74138d5b38119592a02a55097dd313 | \n",
+ "
\n",
+ " \n",
+ " | 79 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:33:52+00:00 | \n",
+ " Seahawks set to rematch with Patriots in Super... | \n",
+ " https://sports.yahoo.com/articles/seahawks-set... | \n",
+ " The rematch of Super Bowl XLIX is set | \n",
+ " 39fa46a8192ec569b5ba56aaea1513a6de8f49f8 | \n",
+ "
\n",
+ " \n",
+ " | 80 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:33:26+00:00 | \n",
+ " 'Did it for Harambe' Sun Devils' Twitter react... | \n",
+ " https://sports.yahoo.com/articles/did-harambe-... | \n",
+ " Arizona State students wore "forks up for... | \n",
+ " 6be5b23359ace931c9eadcd7b4299778d3a2c6fc | \n",
+ "
\n",
+ " \n",
+ " | 81 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:33:25+00:00 | \n",
+ " Seahawks NFC championship win is good news for... | \n",
+ " https://sports.yahoo.com/articles/seahawks-nfc... | \n",
+ " The Seahawks beat the Rams in the NFC Champion... | \n",
+ " 10f4858e2ee8fa91d24267cdd5dc1158340d2a18 | \n",
+ "
\n",
+ " \n",
+ " | 82 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:33:00+00:00 | \n",
+ " 3 reasons Patriots defense dominated in AFC pl... | \n",
+ " https://sports.yahoo.com/articles/3-reasons-pa... | \n",
+ " The Patriots played terrific defense throughou... | \n",
+ " 855d3ce1fd578fe786eff95dbecec03a5019c16b | \n",
+ "
\n",
+ " \n",
+ " | 83 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:32:25+00:00 | \n",
+ " Sean McVay says Seahawks 'lucked into' pivotal... | \n",
+ " https://sports.yahoo.com/nfl/article/sean-mcva... | \n",
+ " Bust or not, the Seahawks cut off all of Matth... | \n",
+ " 35b2427de65dcec6cd9a10232ba5d14976dbe178 | \n",
+ "
\n",
+ " \n",
+ " | 84 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:32:17+00:00 | \n",
+ " Presumed Chargers OC 'still in mix' for Raider... | \n",
+ " https://sports.yahoo.com/articles/potential-ch... | \n",
+ " Mike McDaniel is still an option to be the Rai... | \n",
+ " 06034ec594380368fe798f6b580103c258969a26 | \n",
+ "
\n",
+ " \n",
+ " | 85 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:32:14+00:00 | \n",
+ " Scottie Scheffler's clubs: Inside his American... | \n",
+ " https://sports.yahoo.com/articles/scottie-sche... | \n",
+ " Scottie Scheffler won the 2026 American Expres... | \n",
+ " 4118fbbbf698cfea11833af3d6d7676cbc05d144 | \n",
+ "
\n",
+ " \n",
+ " | 86 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:31:18+00:00 | \n",
+ " Player grades: Thunder can't close out again i... | \n",
+ " https://sports.yahoo.com/articles/player-grade... | \n",
+ " Player grades for the Oklahoma City Thunder's ... | \n",
+ " 6d3a358f8e1b44b8cc8cd79556237408d71469ca | \n",
+ "
\n",
+ " \n",
+ " | 87 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:30:00+00:00 | \n",
+ " Best Super Bowl Coin Toss Prop Results: Heads ... | \n",
+ " https://sports.yahoo.com/articles/best-super-b... | \n",
+ " Find the best odds, past results, and advice f... | \n",
+ " 99c04171ee54ffc9b049b2a487e865af1906965a | \n",
+ "
\n",
+ " \n",
+ " | 88 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:29:47+00:00 | \n",
+ " Seahawks to face Patriots in Super Bowl 60 | \n",
+ " https://sports.yahoo.com/articles/patriots-bea... | \n",
+ " The Seattle Seahawks will face the New England... | \n",
+ " d126529bb69db8c986494515c468eadd939cb77a | \n",
+ "
\n",
+ " \n",
+ " | 89 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:28:29+00:00 | \n",
+ " No QB had ever lost a playoff game with number... | \n",
+ " https://sports.yahoo.com/articles/no-qb-had-ev... | \n",
+ " Matthew Stafford is the first quarterback ever... | \n",
+ " 034bf9275945f83d6c699553b1773689389c35eb | \n",
+ "
\n",
+ " \n",
+ " | 90 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:27:38+00:00 | \n",
+ " How family grief made Hamer-Webb pick Wales | \n",
+ " https://sports.yahoo.com/articles/family-grief... | \n",
+ " Uncapped Gabriel Hamer-Webb reveals how his Ca... | \n",
+ " 4f4247a5a78b2434d2463c757867ef0358245f12 | \n",
+ "
\n",
+ " \n",
+ " | 91 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:25:50+00:00 | \n",
+ " Patriots Join 49ers In Elite Company After Cli... | \n",
+ " https://sports.yahoo.com/articles/patriots-joi... | \n",
+ " The New England Patriots will have one more ga... | \n",
+ " befba3cb02dd17cc82929d64f59b64b4278ae8e0 | \n",
+ "
\n",
+ " \n",
+ " | 92 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:25:35+00:00 | \n",
+ " Miami linebacker Raul Aguirre commits to NC St... | \n",
+ " https://sports.yahoo.com/articles/miami-lineba... | \n",
+ " Miami linebacker Raul Aguirre has committed to... | \n",
+ " 6e2574f514a0cf9bcc5ac8857cde57af65fe924e | \n",
+ "
\n",
+ " \n",
+ " | 93 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:24:04+00:00 | \n",
+ " What head coach candidates can Las Vegas Raide... | \n",
+ " https://sports.yahoo.com/articles/head-coach-c... | \n",
+ " 2nd interviews with candidates in Super Bowl c... | \n",
+ " 301608520c48f925a46b4f787a6a217cbacfb4ea | \n",
+ "
\n",
+ " \n",
+ " | 94 | \n",
+ " YAHOO_SPORTS | \n",
+ " 2026-01-26 04:23:59+00:00 | \n",
+ " Silver Knights cannot keep first period moment... | \n",
+ " https://sports.yahoo.com/articles/silver-knigh... | \n",
+ " It is not about how you start, but how you fin... | \n",
+ " 9d7de37c55a1dee82f1797abcdb64e5ebf52162b | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "summary": "{\n \"name\": \"print(\\\"Total items:\\\", len(df_rss))\",\n \"rows\": 30,\n \"fields\": [\n {\n \"column\": \"source\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"YAHOO_SPORTS\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"published_utc\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2026-01-26 04:23:59+00:00\",\n \"max\": \"2026-01-26 04:45:33+00:00\",\n \"num_unique_values\": 29,\n \"samples\": [\n \"2026-01-26 04:24:04+00:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"Miami linebacker Raul Aguirre commits to NC State out of NCAA transfer portal\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"link\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"https://sports.yahoo.com/articles/miami-linebacker-raul-aguirre-commits-042535150.html\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"summary\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"Miami linebacker Raul Aguirre has committed to NC State out of the NCAA transfer portal after three years with the Hurricanes, On3 learned.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"fp\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"6e2574f514a0cf9bcc5ac8857cde57af65fe924e\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Total items: 142\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Live RSS Polling (Clean Output)\n",
+ "\n",
+ "Continuously polls the feeds and prints only new items in a compact format:\n",
+ "\n",
+ "`[time UTC] sport topic source title`\n",
+ "` link`\n",
+ "\n",
+ "Auto-stops after a fixed runtime, you can adjust the time for RSS Polling based on your preference\n"
+ ],
+ "metadata": {
+ "id": "DtisyJERrswv"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# ================================\n",
+ "# RSS clean polling\n",
+ "# Requires: FEEDS dict + fetch_feeds_once(FEEDS) already defined\n",
+ "# ================================\n",
+ "\n",
+ "import time\n",
+ "from datetime import datetime, timezone\n",
+ "\n",
+ "MAX_RUNTIME_MINUTES = 10 # auto stop after N minutes\n",
+ "POLL_INTERVAL = 90 # poll interval (seconds)\n",
+ "\n",
+ "# --- guard ---\n",
+ "if \"FEEDS\" not in globals() or FEEDS is None or not isinstance(FEEDS, dict) or len(FEEDS) == 0:\n",
+ " raise NameError(\"FEEDS is not defined. Run the FEEDS cell first (the one that prints 'Feeds configured: ...').\")\n",
+ "\n",
+ "if \"fetch_feeds_once\" not in globals():\n",
+ " raise NameError(\"fetch_feeds_once() is not defined. Run the earlier cell that defines it first.\")\n",
+ "\n",
+ "def _fmt_utc(dt):\n",
+ " if dt is None:\n",
+ " return \"??:??:?? UTC\"\n",
+ " if hasattr(dt, \"tzinfo\") and dt.tzinfo is None:\n",
+ " dt = dt.replace(tzinfo=timezone.utc)\n",
+ " return dt.astimezone(timezone.utc).strftime(\"%H:%M:%S UTC\")\n",
+ "\n",
+ "def _classify_sport_and_topic(text: str):\n",
+ " \"\"\"\n",
+ " Very lightweight keyword tagging to match your screenshot style.\n",
+ " Returns: (sport_tag, topic_tag)\n",
+ " \"\"\"\n",
+ " if not text:\n",
+ " text = \"\"\n",
+ " t = text.lower()\n",
+ "\n",
+ " sport_tags = []\n",
+ " if any(k in t for k in [\"nfl\", \"steelers\", \"patriots\", \"broncos\", \"quarterback\", \"qb\", \"touchdown\", \"super bowl\"]):\n",
+ " sport_tags.append(\"NFL\")\n",
+ " if any(k in t for k in [\"nba\", \"warriors\", \"lakers\", \"suns\", \"timberwolves\", \"nbpa\"]):\n",
+ " sport_tags.append(\"NBA\")\n",
+ " if not sport_tags:\n",
+ " sport = \"GENERAL\"\n",
+ " else:\n",
+ " sport = \",\".join(dict.fromkeys(sport_tags)) # keep order, unique\n",
+ "\n",
+ " # topic\n",
+ " if any(k in t for k in [\"injury\", \"out\", \"sprain\", \"surgery\", \"fracture\", \"questionable\", \"ruled out\"]):\n",
+ " topic = \"injury\"\n",
+ " elif any(k in t for k in [\"lineup\", \"starting\", \"starter\", \"inactive\", \"roster\", \"depth chart\"]):\n",
+ " topic = \"lineup\"\n",
+ " elif any(k in t for k in [\"trade\", \"sign\", \"release\", \"waive\", \"acquire\", \"contract\"]):\n",
+ " topic = \"trade\"\n",
+ " elif any(k in t for k in [\"game\", \"vs.\", \"championship\", \"playoff\", \"final\", \"score\", \"record\"]):\n",
+ " topic = \"game_event\"\n",
+ " else:\n",
+ " topic = \"news\"\n",
+ "\n",
+ " return sport, topic\n",
+ "\n",
+ "start_time = time.time()\n",
+ "seen_fp = set()\n",
+ "\n",
+ "print(f\"🛰️ RSS clean polling started. every {POLL_INTERVAL}s (auto-stops after {MAX_RUNTIME_MINUTES} min)\")\n",
+ "\n",
+ "while True:\n",
+ " df = fetch_feeds_once(FEEDS)\n",
+ "\n",
+ " if df is not None and len(df):\n",
+ " # only new items\n",
+ " if \"fp\" in df.columns:\n",
+ " df_new = df[~df[\"fp\"].isin(seen_fp)].copy()\n",
+ " else:\n",
+ " df_new = df.copy()\n",
+ "\n",
+ " # sort oldest -> newest so it reads naturally like a feed\n",
+ " if \"published_utc\" in df_new.columns:\n",
+ " df_new = df_new.sort_values(\"published_utc\", ascending=True, na_position=\"last\")\n",
+ "\n",
+ " # print rows\n",
+ " for _, row in df_new.iterrows():\n",
+ " src = row.get(\"source\", \"\")\n",
+ " title = row.get(\"title\", \"\") or \"\"\n",
+ " link = row.get(\"link\", \"\") or \"\"\n",
+ " pub = row.get(\"published_utc\", None)\n",
+ " summ = row.get(\"summary\", \"\") or \"\"\n",
+ "\n",
+ " text_for_tags = f\"{title} {summ}\"\n",
+ " sport_tag, topic_tag = _classify_sport_and_topic(text_for_tags)\n",
+ "\n",
+ " print(f\"[{_fmt_utc(pub)}] {sport_tag:<6} {topic_tag:<9} {src:<12} {title}\")\n",
+ " if link:\n",
+ " print(f\" {link}\")\n",
+ "\n",
+ " if \"fp\" in row and row[\"fp\"]:\n",
+ " seen_fp.add(row[\"fp\"])\n",
+ "\n",
+ " # auto-stop\n",
+ " if (time.time() - start_time) / 60 >= MAX_RUNTIME_MINUTES:\n",
+ " print(\"\\nReached max runtime. Stopping RSS polling automatically.\")\n",
+ " break\n",
+ "\n",
+ " time.sleep(POLL_INTERVAL)\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "JU36twIQlRbF",
+ "outputId": "6e1fb6d8-d184-4719-fb16-0e8fcd03cf83"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "🛰️ RSS clean polling started. every 90s (auto-stops after 10 min)\n",
+ "[09:34:54 UTC] GENERAL news ESPN_NBA Keep, cut or add? What to do with George, Markkanen and six other trending players\n",
+ " https://www.espn.com/fantasy/basketball/story/_/id/47701635/espn-fantasy-basketball-nba-risers-fallers-keep-cut-add\n",
+ "[12:42:02 UTC] NFL,NBA news ESPN 'You should've never been born': How Buss family infighting drove the $10B sale of the Lakers\n",
+ " https://www.espn.com/nba/story/_/id/47594947/inside-jeanie-jerry-buss-family-infighting-drove-10b-sale-los-angeles-lakers-mark-walter\n",
+ "[10:44:26 UTC] NFL news ESPN_NFL Ranking the NFL's best offensive, defensive coordinator openings, plus intel on top candidates\n",
+ " https://www.espn.com/nfl/story/_/id/47674143/2026-nfl-offseason-rankings-offensive-defensive-coordinator-openings-intel\n",
+ "[13:17:21 UTC] NFL lineup ESPN_NFL Steelers to hire Mike McCarthy: Six questions on the new coach, plus a grade\n",
+ " https://www.espn.com/nfl/story/_/id/47716099/pittsburgh-steelers-hire-head-coach-mike-mccarthy-answering-six-big-questions-faq-aaron-rodgers-hiring\n",
+ "[17:35:33 UTC] GENERAL injury ESPN Eight things to know about the men's college hoops season\n",
+ " https://www.espn.com/mens-college-basketball/story/_/id/47695101/mens-college-basketball-storylines-scoring-freshmen-surprises-disappointments-2025-2026\n",
+ "[17:41:28 UTC] GENERAL news ESPN Ranking the 100 best college football players from the 2025 season\n",
+ " https://www.espn.com/college-football/story/_/id/47600553/college-football-top-100-players-rank-mendoza-bain-2025-26-season\n",
+ "[17:41:28 UTC] GENERAL news ESPN Who should've made the top 10? What were the biggest surprises?\n",
+ " https://www.espn.com/college-football/story/_/id/47694109/2026-college-football-player-rank-roundtable-miami-indiana\n",
+ "[18:17:13 UTC] NBA trade ESPN NBA buzz: Live updates, trades and intel from around the league\n",
+ " https://www.espn.com/nba/story/_/id/47191162/nba-buzz-latest-live-updates-trades-intel-league\n",
+ "[18:17:13 UTC] NBA injury ESPN Midseason lessons for all 30 NBA teams: Trade dramas, standings surprises dominate the first half\n",
+ " https://www.espn.com/nba/story/_/id/47684087/nba-midseason-intel-lessons-bucks-lakers-warriors-celtics-pistons-knicks-every-team\n",
+ "[18:19:02 UTC] GENERAL injury ESPN_NBA Midseason lessons for all 30 teams: Trade dramas, standings surprises\n",
+ " https://www.espn.com/nba/story/_/id/47684087/nba-midseason-intel-lessons-bucks-lakers-warriors-celtics-pistons-knicks-every-team\n",
+ "[18:19:02 UTC] NBA trade ESPN_NBA Buzz: Ripple effects from the Antetokounmpo, Morant injuries\n",
+ " https://www.espn.com/nba/story/_/id/47191162/nba-buzz-latest-live-updates-trades-intel-league\n",
+ "[18:28:13 UTC] GENERAL news CBS_SPORTS What Derrick Rose's jersey retirement meant to the Bulls, who have been lost since he left\n",
+ " https://www.cbssports.com/nba/news/bulls-derrick-rose-retired-jersey-franchise-legend/\n",
+ "[18:30:48 UTC] NFL game_event CBS_SPORTS 2026 AFC Championship Game odds, predictions, time: Broncos vs. Patriots picks by expert on 58-38 run\n",
+ " https://www.cbssports.com/nfl/news/2026-afc-championship-game-odds-predictions-time-broncos-patriots-expert-picks-nfl-bets/\n",
+ "[18:37:26 UTC] NFL game_event CBS_SPORTS Weather factors in Broncos vs. Patriots AFC Championship and Seahawks vs. Rams NFC Championship\n",
+ " https://www.cbssports.com/nfl/news/weather-broncos-patriots-afc-championship-seahawks-rams-nfc/\n",
+ "[18:45:27 UTC] GENERAL injury ESPN Women's Bracketology: Chavez, OT win boost Sooners' hopes of hosting\n",
+ " https://www.espn.com/espn/feature/story/_/id/30423107/ncaa-women-bracketology-2026-women-college-basketball-projections\n",
+ "[18:46:04 UTC] NFL game_event CBS_SPORTS Patriots vs. Broncos prediction, odds, start time: 2026 AFC Championship Game picks by proven model\n",
+ " https://www.cbssports.com/nfl/news/patriots-broncos-prediction-odds-start-time-spread-2026-afc-championship-game-picks-nfl-bets/\n",
+ "[18:51:43 UTC] NFL game_event CBS_SPORTS NFL player props, 2026 AFC, NFC Championship picks, odds, AI predictions: Puka Nacua Over 92.5 receiving yards\n",
+ " https://www.cbssports.com/nfl/news/nfl-player-props-2026-afc-nfc-championship-picks-odds-ai-predictions-best-bets/\n",
+ "[19:00:46 UTC] NFL injury CBS_SPORTS Broncos vs. Patriots prediction: Can Denver advance without Bo Nix or does New England return to Super Bowl?\n",
+ " https://www.cbssports.com/nfl/news/broncos-patriots-prediction-where-to-watch-pick-odds-prediction-nfl-playoffs/\n",
+ "[19:01:12 UTC] NFL injury CBS_SPORTS Broncos QB Bo Nix injury faces 12-week recovery after undergoing ankle surgery, per report\n",
+ " https://www.cbssports.com/nfl/news/bo-nix-injury-broncos-qb-ankle-surgery-recovery/\n",
+ "[19:10:17 UTC] NFL injury ESPN_NFL Offseason guide for eliminated NFL teams: Key free agents, draft outlook, priorities and predictions\n",
+ " https://www.espn.com/nfl/story/_/id/47454831/2026-nfl-offseason-guide-every-team-priorities-free-agents-draft-predictions\n",
+ "[19:10:17 UTC] NFL injury ESPN_NFL Barnwell sorts out the NFL's wide receiver market: free agents, trade targets and cuts\n",
+ " https://www.espn.com/nfl/story/_/id/47682393/2026-nfl-offseason-wide-receiver-market-free-agency-trades-cuts-signings\n",
+ "[19:12:49 UTC] GENERAL injury CBS_SPORTS Patrick Reed wins Dubai Desert Classic: LIV Golf member reveals PGA Tour return not out of question\n",
+ " https://www.cbssports.com/golf/news/patrick-reed-wins-dubai-desert-classic-liv-golf-pga-tour-return/\n",
+ "[19:13:15 UTC] GENERAL news ESPN Transfer rumors, news: PSG's goodwill gesture to Barcelona in Dro Fernández deal\n",
+ " https://www.espn.com/soccer/story/_/id/47722441/transfer-rumors-news-liverpool-want-usmnt-antonee-robinson-andy-robertson-replacement\n",
+ "[19:24:33 UTC] NFL,NBA game_event CBS_SPORTS Today's top games to watch, best bets, odds: Patriots vs. Broncos, Rams vs. Seahawks, NBA and more\n",
+ " https://www.cbssports.com/betting/news/todays-top-games-to-watch-best-bets-odds-patriots-vs-broncos-rams-vs-seahawks-nba-and-more/\n",
+ "[19:28:42 UTC] NFL news CBS_SPORTS HQ PM Newsletter 1/25/2026\n",
+ " https://www.cbssports.com/\n",
+ "[19:34:01 UTC] GENERAL news ESPN Beating Arsenal puts Man United into Premier League title race\n",
+ " https://www.espn.com/soccer/story/_/id/47726339/beating-arsenal-puts-manchester-united-premier-league-title-race\n",
+ "[19:34:13 UTC] GENERAL news ESPN The new Mets are better than the old Mets -- and we can prove it\n",
+ " https://www.espn.com/mlb/story/_/id/47693218/mlb-2025-26-offseason-mets-additions-bichette-robert-peralta-semien-polanco\n",
+ "[19:34:13 UTC] GENERAL injury ESPN Predictions for rest of MLB offseason: Where will the best ace available sign? Who will make a major trade?\n",
+ " https://www.espn.com/mlb/story/_/id/47692228/mlb-offseason-2025-26-bold-predictions-trades-free-agency-skubal-valdez-red-sox-mets-yankees\n",
+ "[19:39:28 UTC] NFL game_event CBS_SPORTS bet365 bonus code CBSBET365: Get $200 bonus for Patriots vs. Broncos AFC Championship\n",
+ " https://www.cbssports.com/nfl/news/bet365-bonus-code-cbsbet365-get-200-bonus-for-patriots-vs-broncos-afc-championship/\n",
+ "[20:05:47 UTC] NBA news ESPN_NBA 'Fantastic': Luka's clutch defense seals Lakers' win\n",
+ " https://www.espn.com/nba/story/_/id/47721615/fantastic-luka-doncic-comes-big-33-points-clutch-late-defense\n",
+ "[20:05:47 UTC] NBA news ESPN_NBA Nuggets-Grizz, Mavs-Bucks ppd. by winter storm\n",
+ " https://www.espn.com/espn/story/_/id/47726156/nba-postpones-grizzlies-nuggets-game-due-winter-storm\n",
+ "[20:05:47 UTC] NBA injury ESPN_NBA Minnesota teams, NBPA call for peace amid unrest\n",
+ " https://www.espn.com/espn/story/_/id/47727595/minnesota-teams-nbpa-join-calls-peace-wake-shootings\n",
+ "[20:05:47 UTC] NBA injury ESPN_NBA Warriors' Kuminga out with bone bruise in knee\n",
+ " https://www.espn.com/nba/story/_/id/47727257/warriors-jonathan-kuminga-bone-bruise-left-knee\n",
+ "[20:05:47 UTC] NBA injury ESPN_NBA Suns' Booker out at least week with ankle sprain\n",
+ " https://www.espn.com/nba/story/_/id/47729605/suns-devin-booker-miss-least-week-sprained-ankle\n",
+ "[20:05:47 UTC] GENERAL injury ESPN_NBA Emotional Rose sees Bulls' No. 1 jersey retired\n",
+ " https://www.espn.com/nba/story/_/id/47721550/chicago-bulls-retire-derrick-rose-no-1-jersey-win\n",
+ "[20:24:16 UTC] GENERAL news CBS_SPORTS Kangaroo crashes impact cycling race as Australian cyclist Jay Vine wins Tour Down Under\n",
+ " https://www.cbssports.com/general/news/kangaroo-crash-impacts-cycling-race-australia/\n",
+ "[20:32:52 UTC] NBA news ESPN_NBA KD, rising guards and bully ball: Inside the Rockets' Texas-sized offense\n",
+ " https://www.espn.com/nba/story/_/id/47684732/houston-rocket-bullied-nba-best-offenses-sengun-thompson-sheppard-durant\n",
+ "[20:32:52 UTC] NFL,NBA news ESPN_NBA Inside the Buss family's $10B sale of the Lakers\n",
+ " https://www.espn.com/nba/story/_/id/47594947/inside-jeanie-jerry-buss-family-infighting-drove-10b-sale-los-angeles-lakers-mark-walter\n",
+ "[20:34:20 UTC] GENERAL news CBS_SPORTS Arsenal's Premier League pursuit hits Man United road block, but Gunners biggest obstacle remains themselves\n",
+ " https://www.cbssports.com/soccer/news/arsenal-vs-manchester-united-score-premier-league-pursuit/\n",
+ "[20:35:48 UTC] NFL injury CBS_SPORTS Meet Jarrett Stidham, the former 5-star QB now tasked with leading Denver to Super Bowl LX\n",
+ " https://www.cbssports.com/nfl/news/bo-nix-ankle-injury-broncos-qb-jarrett-stidham-afc-championship/\n",
+ "[20:45:38 UTC] GENERAL news CBS_SPORTS College basketball rankings: Full-circle moment at Gonzaga as Bulldogs rise in college basketball rankings\n",
+ " https://www.cbssports.com/college-basketball/news/college-basketball-rankings-gonzaga-college-basketball-rankings/\n",
+ "[20:47:53 UTC] GENERAL news CBS_SPORTS Tomorrow's Top 25 Today: Illinois, Texas Tech rise after massive Saturday wins over top-10 opponents\n",
+ " https://www.cbssports.com/college-basketball/news/tomorrows-top-25-today-illinois-texas-tech-wins-top-10/\n",
+ "[20:48:21 UTC] NBA game_event CBS_SPORTS Winter Storm Fern forces postponement of NBA, college basketball games\n",
+ " https://www.cbssports.com/nba/news/winter-storm-fern-nba-college-basketball-games-postponements/\n",
+ "[21:00:50 UTC] NFL game_event CBS_SPORTS Seahawks vs. Rams: NFC Championship expert picks, odds, NFL playoffs best bets, where to watch, TV, stream\n",
+ " https://www.cbssports.com/nfl/news/rams-seahawks-nfc-championship-expert-picks-odds-nfl-playoffs-best-bets-where-to-watch-tv-stream/\n",
+ "[21:30:44 UTC] NFL game_event CBS_SPORTS Seahawks vs. Rams prediction: Can L.A. pull off another postseason win or does Seattle surge to NFC title?\n",
+ " https://www.cbssports.com/nfl/news/seahawks-rams-prediction-where-to-watch-pick-odds-prediction-nfl-playoffs/\n",
+ "[22:08:17 UTC] GENERAL news ESPN Title paths for Gaethje, Pimblett and O'Malley after UFC 324\n",
+ " https://www.espn.com/mma/story/_/id/47722059/ufc-324-next-justin-gaethje-paddy-pimblett-sean-omalley-others\n",
+ "[22:09:45 UTC] GENERAL game_event ESPN Can Carlos Alcaraz finally win the Australian Open?\n",
+ " https://www.espn.com/tennis/story/_/id/47531272/carlos-alcaraz-australian-open-win\n",
+ "[22:15:00 UTC] NFL game_event CBS_SPORTS 2026 NFC Championship Game odds, prediction, time: Rams vs. Seahawks picks from expert on a 28-10 run\n",
+ " https://www.cbssports.com/nfl/news/2026-nfc-championship-game-odds-predictions-spread-time-rams-seahawks-expert-picks-nfl-bets/\n",
+ "[22:17:21 UTC] NFL injury ESPN_NFL Rooney to fans: Steelers 'excited' about McCarthy\n",
+ " https://www.espn.com/nfl/story/_/id/47728620/steelers-art-rooney-ii-mike-mccarthy-winning-track-record\n",
+ "[22:17:21 UTC] NBA injury ESPN_NFL Minnesota teams, NBPA call for peace amid unrest\n",
+ " https://www.espn.com/espn/story/_/id/47727595/minnesota-teams-nbpa-join-calls-peace-wake-shootings\n",
+ "[22:17:21 UTC] NFL injury ESPN_NFL Darnold, Seahawks outlast Rams to reach SB\n",
+ " https://www.espn.com/nfl/story/_/id/47730596/darnold-seahawks-beat-rams-thriller-reach-super-bowl\n",
+ "[22:17:21 UTC] GENERAL news ESPN_NFL Sources: Gannon agrees to become Packers DC\n",
+ " https://www.espn.com/nfl/story/_/id/47724577/sources-packers-agree-hire-jonathan-gannon-dc\n",
+ "[22:17:21 UTC] GENERAL news ESPN_NFL Sources: Giants hire Wilson as Harbaugh's DC\n",
+ " https://www.espn.com/nfl/story/_/id/47727766/sources-giants-hire-dennard-wilson-john-harbaugh-dc\n",
+ "[22:17:21 UTC] NFL injury ESPN_NFL Stidham: Wish I put team in better spot to win\n",
+ " https://www.espn.com/nfl/story/_/id/47730325/jarrett-stidham-rues-missed-chances-rare-broncos-start\n",
+ "[22:17:21 UTC] NFL game_event ESPN_NFL Vrabel: Pats' turnaround rooted in belief, identity\n",
+ " https://www.espn.com/nfl/story/_/id/47728666/patriots-edge-broncos-win-afc-title-earn-super-bowl-lx-trip\n",
+ "[22:17:21 UTC] NFL injury ESPN_NFL 📝 Mel Kiper's debut 2026 NFL mock draft\n",
+ " https://www.espn.com/nfl/draft2026/story/_/id/47661581/2026-nfl-mock-draft-kiper-32-picks-predictions-round-1-quarterbacks\n",
+ "[22:22:07 UTC] NFL game_event CBS_SPORTS Seahawks vs. Rams odds, prediction, spread, time: 2026 NFC Championship Game picks from proven computer model\n",
+ " https://www.cbssports.com/nfl/news/seahawks-rams-odds-prediction-time-spread-2026-nfc-championship-game-picks-nfl-lines-best-bets/\n",
+ "[22:26:17 UTC] NFL game_event CBS_SPORTS Patriots tie NFL playoff record for longest field goal attempt during AFC Championship Game vs. Broncos\n",
+ " https://www.cbssports.com/nfl/news/patriots-broncos-longest-field-goal-attempt-playoff-record/\n",
+ "[22:39:00 UTC] NFL news CBS_SPORTS Seahawks have the NFL's best defense again: How the fall of the 'Legion of Boom' led to the 'Dark Side'\n",
+ " https://www.cbssports.com/nfl/news/seahawks-have-the-nfls-best-defense-again-how-the-fall-of-the-legion-of-boom-led-to-the-dark-side/\n",
+ "[22:40:38 UTC] NFL news ESPN The Patriots just showed us what it means to hire the right coach\n",
+ " https://www.espn.com/nfl/story/_/id/47725541/nfl-playoffs-new-england-patriots-mike-vrabel-coaching-hire-turnaround-super-bowl\n",
+ "[22:46:19 UTC] NFL lineup ESPN_NFL Reid's updated NFL draft QB Hot Board: Strengths and weaknesses for the top 12 passers\n",
+ " https://www.espn.com/nfl/draft2026/story/_/id/46532548/2026-nfl-draft-ranking-top-quarterbacks-hot-board-team-fits-strengths-weaknesses\n",
+ "[22:46:23 UTC] GENERAL news ESPN_NFL Texans hit offseason with familiar feeling after another divisional round loss\n",
+ " https://www.espn.com/nfl/story/_/page/Houston-Texans/houston-texans-offseason-familiar-place-divisional-round-loss-cj-stroud\n",
+ "[22:52:26 UTC] NFL game_event ESPN Super Bowl LX: Odds, trends, past winners and MVPs\n",
+ " https://www.espn.com/espn/betting/story/_/id/47692869/super-bowl-60-betting-odds-spreads-lines-totals-new-england-patriots-seattle-seahawks-preview-trends-champions-mvp\n",
+ "[22:52:26 UTC] NFL news ESPN My first bet for Super Bowl LX: Back Seattle's offense in a high-scoring matchup\n",
+ " https://www.espn.com/espn/betting/story/_/id/47682112/nfl-betting-2025-super-bowl-lx-first-bets-odds-props-spreads\n",
+ "[22:52:39 UTC] GENERAL injury ESPN Why feds call former Olympic snowboarder a 'modern-day Pablo Escobar'\n",
+ " https://www.espn.com/olympics/story/_/id/47707459/why-feds-call-olympic-snowboarder-modern-day-pablo-escobar\n",
+ "[22:53:08 UTC] NFL lineup ESPN Steelers to hire Mike McCarthy: Six questions on the new coach, plus a grade\n",
+ " https://www.espn.com/nfl/story/_/id/47716099/pittsburgh-steelers-hire-head-coach-mike-mccarthy-answering-six-big-questions-faq-aaron-rodgers-hiring\n",
+ "[22:54:17 UTC] NFL game_event ESPN_NFL Offensive battle leads to a Seahawks win, a berth to Super Bowl LX\n",
+ " https://www.espn.com/nfl/story/_/id/47728615/seattle-seahawks-win-los-angeles-rams-nfc-championship-game\n",
+ "[23:14:39 UTC] GENERAL news CBS_SPORTS Chaotic Serie A weekend puts Inter in Serie A driver's seat while Napoli, Milan waste key chances\n",
+ " https://www.cbssports.com/soccer/news/serie-a-chaos-inter-napoli-milan-juventus-roma/\n",
+ "[23:28:36 UTC] NFL game_event ESPN Vrabel: Pats' turnaround rooted in belief, identity\n",
+ " https://www.espn.com/nfl/story/_/id/47728666/patriots-edge-broncos-win-afc-title-earn-super-bowl-lx-trip\n",
+ "[23:28:36 UTC] NBA trade ESPN 'Disgusted' Stewart protests shooting with sign\n",
+ " https://www.espn.com/wnba/story/_/id/47727308/breanna-stewart-protests-minneapolis-shooting-sign\n",
+ "[23:28:36 UTC] NFL injury ESPN Darnold, Seahawks outlast Rams to reach SB\n",
+ " https://www.espn.com/nfl/story/_/id/47730596/darnold-seahawks-beat-rams-thriller-reach-super-bowl\n",
+ "[23:28:36 UTC] GENERAL news ESPN Sources: Giants hire Wilson as Harbaugh's DC\n",
+ " https://www.espn.com/nfl/story/_/id/47727766/sources-giants-hire-dennard-wilson-john-harbaugh-dc\n",
+ "[23:28:36 UTC] GENERAL news ESPN New year, same result: Scheffler wins AmEx by 4\n",
+ " https://www.espn.com/golf/story/_/id/47729405/scottie-scheffler-wins-american-express-20th-pga-tour-title\n",
+ "[23:28:36 UTC] NFL game_event ESPN_NFL Payton rues 4th-down call after stalling in snow\n",
+ " https://www.espn.com/nfl/story/_/id/47730233/broncos-sean-payton-regrets-4th-call-loss-patriots\n",
+ "[23:28:36 UTC] GENERAL injury ESPN Defending Aussie Open champ Keys falls to Pegula\n",
+ " https://www.espn.com/tennis/story/_/id/47730111/defending-australia-open-champion-keys-falls-pegula\n",
+ "[23:28:36 UTC] NFL lineup ESPN 🏈 Reid's NFL draft QB Hot Board: Mendoza top?\n",
+ " https://www.espn.com/nfl/draft2026/story/_/id/46532548/2026-nfl-draft-ranking-top-quarterbacks-hot-board-team-fits-strengths-weaknesses\n",
+ "[23:28:40 UTC] NFL news ESPN Sports Broadcasting Hall of Famer Mason dies\n",
+ " https://www.espn.com/espn/story/_/id/47729621/sports-broadcasting-hall-famer-geoffrey-mason-dies-85\n",
+ "[23:30:49 UTC] NFL news ESPN_NFL An early look at Super Bowl LX: Experts make picks, answer questions and break down Seahawks-Patriots\n",
+ " https://www.espn.com/nfl/story/_/id/47684830/seahawks-patriots-super-bowl-2026-lx-predictions-picks-odds-stats\n",
+ "[23:30:49 UTC] NFL news ESPN_NFL My first bet for Super Bowl LX: Back Seattle's offense in a high-scoring matchup\n",
+ " https://www.espn.com/espn/betting/story/_/id/47682112/nfl-betting-2025-super-bowl-lx-first-bets-odds-props-spreads\n",
+ "[23:32:52 UTC] NFL news ESPN An early look at Super Bowl LX: Experts make picks, answer questions and break down Seahawks-Patriots\n",
+ " https://www.espn.com/nfl/story/_/id/47684830/seahawks-patriots-super-bowl-2026-lx-predictions-picks-odds-stats\n",
+ "[00:01:42 UTC] GENERAL injury CBS_SPORTS Perfect no more: No. 5 Vanderbilt's undefeated season ends in 103-74 blowout loss to No. 2 South Carolina\n",
+ " https://www.cbssports.com/womens-college-basketball/news/vanderbilts-undefeated-season-ends-103-74-blowout-loss-south-carolina/\n",
+ "[00:02:56 UTC] NFL news CBS_SPORTS Patriots beat Broncos: Mike Vrabel can become first to win Super Bowl as player and coach for same team\n",
+ " https://www.cbssports.com/nfl/news/patriots-broncos-mike-vrabel-super-bowl-history/\n",
+ "[00:12:51 UTC] GENERAL game_event CBS_SPORTS Scottie Scheffler grabs 20th PGA Tour win, joins Tiger Woods, Jack Nicklaus under 30 club at American Express\n",
+ " https://www.cbssports.com/golf/news/american-express-leaderboard-winner-2026-scottie-scheffler-tiger-woods-jack-nicklaus/\n",
+ "[00:39:04 UTC] NFL game_event CBS_SPORTS What's next for Broncos after AFC Championship defeat? Bo Nix recovery and hunt for RB take center stage\n",
+ " https://www.cbssports.com/nfl/news/whats-next-for-broncos-after-afc-championship-defeat/\n",
+ "[00:56:34 UTC] GENERAL trade CBS_SPORTS Breanna Stewart holds up 'Abolish ICE' sign ahead of Unrivaled game\n",
+ " https://www.cbssports.com/wnba/news/breanna-stewart-holds-up-abolish-ice-sign/\n",
+ "[00:58:48 UTC] NFL news CBS_SPORTS Mike McCarthy isn't a sexy Steelers hire, but he's the right fit for a franchise stuck in neutral\n",
+ " https://www.cbssports.com/nfl/news/steelers-hire-mike-mccarthy-column-on-future/\n",
+ "[02:14:38 UTC] NFL game_event CBS_SPORTS Broncos kicker says snowy field caused unusual mistake on pivotal late field goal try vs. Patriots\n",
+ " https://www.cbssports.com/nfl/news/wil-lutz-blocked-field-goal-snowy-field-patriots-broncos-afc-championship/\n",
+ "[02:21:31 UTC] NFL game_event CBS_SPORTS Drake Maye went rogue on game-sealing play that beat Broncos to put Patriots in the Super Bowl\n",
+ " https://www.cbssports.com/nfl/news/drake-maye-game-sealing-play-patriots-beat-broncos-afc-championship/\n",
+ "[03:00:23 UTC] NFL game_event CBS_SPORTS 2026 NFL playoff schedule and bracket: Dates, times, TV, streaming for AFC, NFC title games and Super Bowl\n",
+ " https://www.cbssports.com/nfl/news/2026-nfl-playoff-schedule-dates-times-tv-wild-card-to-super-bowl/\n",
+ "[03:21:06 UTC] NFL game_event CBS_SPORTS Super Bowl 2026 is set: Where to watch Patriots vs. Seahawks with TV channel, live stream and kickoff time\n",
+ " https://www.cbssports.com/nfl/news/super-bowl-lx-patriots-seahawks-where-to-watch-tv-channel-live-stream-kickoff-time/\n",
+ "[03:30:38 UTC] NFL news CBS_SPORTS Ranking the top 50 NFL free agents for 2026: Early look at the stars who could hit the market in March\n",
+ " https://www.cbssports.com/nfl/news/early-look-at-2026-nfl-free-agency-ranking-top-50/\n",
+ "[04:02:52 UTC] GENERAL news YAHOO_SPORTS Castle grad and New York Met Cam Tilly stops by Night of Memories\n",
+ " https://sports.yahoo.com/articles/castle-grad-york-met-cam-040252186.html\n",
+ "[04:03:04 UTC] GENERAL game_event YAHOO_SPORTS Michael Irvin gets brutally honest on cocaine claim following Miami National Championship loss\n",
+ " https://sports.yahoo.com/articles/michael-irvin-gets-brutally-honest-040304412.html\n",
+ "[04:03:13 UTC] NFL game_event YAHOO_SPORTS Seahawks’ Tariq Woolen Awaits NFL Punishment as Mike Macdonald Sends Authoritative Message\n",
+ " https://sports.yahoo.com/articles/seahawks-tariq-woolen-awaits-nfl-040313049.html\n",
+ "[04:05:31 UTC] NFL game_event YAHOO_SPORTS When was the last time the Seahawks went to the Super Bowl? Full history\n",
+ " https://sports.yahoo.com/articles/last-time-seahawks-went-super-040531833.html\n",
+ "[04:05:35 UTC] GENERAL news YAHOO_SPORTS Aggies fall to Mizzou, 81–70, as SEC struggles continue\n",
+ " https://sports.yahoo.com/articles/aggies-fall-mizzou-81-70-040535016.html\n",
+ "[04:06:03 UTC] NFL game_event YAHOO_SPORTS Who will win Super Bowl 2026? Picks, predictions, odds for Patriots vs. Seahawks in Super Bowl 60\n",
+ " https://sports.yahoo.com/articles/win-super-bowl-2026-picks-040603883.html\n",
+ "[04:08:00 UTC] NFL game_event YAHOO_SPORTS NFL playoff bracket 2026: Breaking down matchups, schedule for AFC & NFC championship games\n",
+ " https://sports.yahoo.com/articles/nfl-playoff-bracket-2026-breaking-051321929.html\n",
+ "[04:08:41 UTC] GENERAL news YAHOO_SPORTS Texas Football mega donors Jason Itkin and Kurt Arnold named among 500 leading lawyers in America\n",
+ " https://sports.yahoo.com/articles/texas-football-mega-donors-jason-040841538.html\n",
+ "[04:08:47 UTC] NFL injury YAHOO_SPORTS Cooper Kupp delivers knockout punch to Rams' Super Bowl chances with revenge game against former team\n",
+ " https://sports.yahoo.com/articles/cooper-kupp-delivers-knockout-punch-040847015.html\n",
+ "[04:10:51 UTC] NFL game_event YAHOO_SPORTS Sean Payton on decisions in AFC title game: 'There's always regrets'\n",
+ " https://sports.yahoo.com/articles/sean-payton-decisions-afc-title-041051137.html\n",
+ "[04:11:49 UTC] NFL news YAHOO_SPORTS Analyst: Buccaneers Great Evans Will Play Elsewhere in 2026\n",
+ " https://sports.yahoo.com/articles/analyst-buccaneers-great-evans-play-041149327.html\n",
+ "[04:12:00 UTC] NFL game_event YAHOO_SPORTS NFL Draft order 2026: Updated list of picks for every team after conference championships\n",
+ " https://sports.yahoo.com/articles/nfl-draft-order-2026-updated-100001404.html\n",
+ "[04:12:01 UTC] NFL news CBS_SPORTS 2026 Super Bowl odds: Seahawks favored over Patriots; Sam Darnold the early MVP favorite over Drake Maye\n",
+ " https://www.cbssports.com/nfl/news/2026-super-bowl-odds-seahawks-favored-sam-darnold-early-mvp-favorite/\n",
+ "[04:15:00 UTC] NFL news YAHOO_SPORTS Seahawks vs Patriots Predictions - Early Picks & Odds for Super Bowl 60\n",
+ " https://sports.yahoo.com/articles/seahawks-vs-patriots-predictions-early-041500398.html\n",
+ "[04:15:04 UTC] NFL injury YAHOO_SPORTS Sean McVay got weirdly irate about Matthew Stafford retirement question\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-got-weirdly-irate-041504176.html\n",
+ "[04:17:38 UTC] GENERAL game_event YAHOO_SPORTS Sennecke scores in OT for 1st NHL hat trick as Ducks rally to beat Flames 4-3\n",
+ " https://sports.yahoo.com/articles/sennecke-scores-ot-1st-nhl-041738339.html\n",
+ "[04:17:53 UTC] NFL trade YAHOO_SPORTS Why Seahawks' bold move to sign Sam Darnold paid off with return to Super Bowl\n",
+ " https://sports.yahoo.com/articles/why-seahawks-bold-move-sign-041753898.html\n",
+ "[04:20:00 UTC] NFL game_event YAHOO_SPORTS Latest Super Bowl Odds: Seahawks Soar as Big Game Betting Favorites\n",
+ " https://sports.yahoo.com/articles/latest-super-bowl-odds-seahawks-034200198.html\n",
+ "[04:21:11 UTC] GENERAL injury YAHOO_SPORTS Sean McVay scoffs at question about Matthew Stafford's future with Rams\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-scoffs-matthew-staffords-042111592.html\n",
+ "[04:22:19 UTC] GENERAL game_event YAHOO_SPORTS Cheesy apple pie for Keys as victor Pegula dodges Chiefs jersey\n",
+ " https://sports.yahoo.com/articles/cheesy-apple-pie-keys-victor-042219199.html\n",
+ "[04:23:18 UTC] GENERAL injury YAHOO_SPORTS Sennecke's first career hat trick lifts Ducks over Flames in OT\n",
+ " https://sports.yahoo.com/articles/senneckes-first-career-hat-trick-042318104.html\n",
+ "[04:23:59 UTC] GENERAL injury YAHOO_SPORTS Silver Knights cannot keep first period momentum, fall to Tucson in overtime\n",
+ " https://sports.yahoo.com/articles/silver-knights-cannot-keep-first-042359944.html\n",
+ "[04:24:04 UTC] NFL game_event YAHOO_SPORTS What head coach candidates can Las Vegas Raiders hire after NFL Conference Championships?\n",
+ " https://sports.yahoo.com/articles/head-coach-candidates-las-vegas-042404057.html\n",
+ "[04:25:35 UTC] GENERAL injury YAHOO_SPORTS Miami linebacker Raul Aguirre commits to NC State out of NCAA transfer portal\n",
+ " https://sports.yahoo.com/articles/miami-linebacker-raul-aguirre-commits-042535150.html\n",
+ "[04:25:50 UTC] NFL game_event YAHOO_SPORTS Patriots Join 49ers In Elite Company After Clinching AFC Title\n",
+ " https://sports.yahoo.com/articles/patriots-join-49ers-elite-company-042550333.html\n",
+ "[04:27:38 UTC] GENERAL news YAHOO_SPORTS How family grief made Hamer-Webb pick Wales\n",
+ " https://sports.yahoo.com/articles/family-grief-made-hamer-webb-042738556.html\n",
+ "[04:28:29 UTC] NFL game_event YAHOO_SPORTS No QB had ever lost a playoff game with numbers like Matthew Stafford's vs. Seahawks\n",
+ " https://sports.yahoo.com/articles/no-qb-had-ever-lost-042829686.html\n",
+ "[04:29:47 UTC] NFL news YAHOO_SPORTS Seahawks to face Patriots in Super Bowl 60\n",
+ " https://sports.yahoo.com/articles/patriots-beat-broncos-blizzard-reach-232610568.html\n",
+ "[04:30:00 UTC] NFL news YAHOO_SPORTS Best Super Bowl Coin Toss Prop Results: Heads or Tails at Super Bowl 60?\n",
+ " https://sports.yahoo.com/articles/best-super-bowl-coin-toss-182400977.html\n",
+ "[04:31:18 UTC] GENERAL injury YAHOO_SPORTS Player grades: Thunder can't close out again in 103-101 loss to Raptors\n",
+ " https://sports.yahoo.com/articles/player-grades-thunder-cant-close-043118405.html\n",
+ "[04:32:14 UTC] GENERAL news YAHOO_SPORTS Scottie Scheffler's clubs: Inside his American Express-winning setup\n",
+ " https://sports.yahoo.com/articles/scottie-schefflers-clubs-inside-american-043214836.html\n",
+ "[04:32:17 UTC] GENERAL news YAHOO_SPORTS Presumed Chargers OC 'still in mix' for Raiders HC position\n",
+ " https://sports.yahoo.com/articles/potential-chargers-oc-still-mix-043217729.html\n",
+ "[04:32:25 UTC] NFL game_event YAHOO_SPORTS Sean McVay says Seahawks 'lucked into' pivotal 4th-down stop in NFC championship, calls it a 'fortuitous bust'\n",
+ " https://sports.yahoo.com/nfl/article/sean-mcvay-says-seahawks-lucked-into-pivotal-4th-down-stop-in-nfc-championship-calls-it-a-fortuitous-bust-043225049.html\n",
+ "[04:33:00 UTC] NFL injury YAHOO_SPORTS 3 reasons Patriots defense dominated in AFC playoffs — and can keep it up in Super Bowl 60\n",
+ " https://sports.yahoo.com/articles/3-reasons-patriots-defense-dominated-002311245.html\n",
+ "[04:33:25 UTC] GENERAL game_event YAHOO_SPORTS Seahawks NFC championship win is good news for Raiders head coach search\n",
+ " https://sports.yahoo.com/articles/seahawks-nfc-championship-win-good-043325900.html\n",
+ "[04:33:26 UTC] GENERAL news YAHOO_SPORTS 'Did it for Harambe' Sun Devils' Twitter reacts to win vs UC Bearcats\n",
+ " https://sports.yahoo.com/articles/did-harambe-sun-devils-twitter-043326264.html\n",
+ "[04:33:52 UTC] NFL news YAHOO_SPORTS Seahawks set to rematch with Patriots in Super Bowl LX\n",
+ " https://sports.yahoo.com/articles/seahawks-set-rematch-patriots-super-043352094.html\n",
+ "[04:34:12 UTC] GENERAL game_event YAHOO_SPORTS Sean McVay: Seahawks had "fortuitous bust" on key fourth-down play\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-seahawks-had-fortuitous-043412720.html\n",
+ "[04:35:00 UTC] GENERAL injury YAHOO_SPORTS From Knicks disaster to Clippers blowout, Nets can’t stop the bleeding\n",
+ " https://sports.yahoo.com/articles/knicks-disaster-clippers-blowout-nets-043500101.html\n",
+ "[04:37:22 UTC] GENERAL news YAHOO_SPORTS Nets player grades: Danny Wolf drops 14 in 126-89 loss at the Clippers\n",
+ " https://sports.yahoo.com/articles/nets-player-grades-danny-wolf-043722262.html\n",
+ "[04:38:20 UTC] NBA injury YAHOO_SPORTS Kawhi Leonard, James Harden fuel fast start as Clippers rout Nets 126-89\n",
+ " https://sports.yahoo.com/articles/kawhi-leonard-james-harden-fuel-043820820.html\n",
+ "[04:38:56 UTC] GENERAL game_event YAHOO_SPORTS Sean McVay left at a loss for words after Rams' NFC championship 'tough' defeat to Seahawks\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-left-loss-words-043856350.html\n",
+ "[04:40:08 UTC] NFL news YAHOO_SPORTS Russell Wilson praises Sam Darnold for 'inspirational' comeback that led to Seahawks' Super Bowl berth\n",
+ " https://sports.yahoo.com/articles/russell-wilson-praises-sam-darnold-044008446.html\n",
+ "[04:40:43 UTC] NFL news YAHOO_SPORTS NFL fans raise conspiracy theory over Super Bowl 60 graphic\n",
+ " https://sports.yahoo.com/articles/nfl-fans-raise-conspiracy-theory-044043960.html\n",
+ "[04:40:55 UTC] GENERAL injury YAHOO_SPORTS Dru Smith keeps impressing with his defense 'One of the more valuable defensive players'\n",
+ " https://sports.yahoo.com/articles/dru-smith-keeps-impressing-defense-044055121.html\n",
+ "[04:41:35 UTC] NBA trade YAHOO_SPORTS Writer suggests 'reasonable' trade package for Kings' Keon Ellis\n",
+ " https://sports.yahoo.com/articles/writer-suggests-reasonable-trade-package-044135456.html\n",
+ "[04:41:49 UTC] NFL injury YAHOO_SPORTS McVay bristles at question about Stafford's future after NFC title loss\n",
+ " https://sports.yahoo.com/articles/mcvay-bristles-staffords-future-nfc-044149196.html\n",
+ "[04:43:00 UTC] NFL news YAHOO_SPORTS Super Bowl National Anthem Length: Charlie Puth Over/Under Odds\n",
+ " https://sports.yahoo.com/articles/super-bowl-national-anthem-length-185746764.html\n",
+ "[04:43:00 UTC] NFL game_event YAHOO_SPORTS Super Bowl Prop Bets: Odds and Expert Picks for Super Bowl LX\n",
+ " https://sports.yahoo.com/articles/super-bowl-prop-bets-bets-165100253.html\n",
+ "[04:43:35 UTC] GENERAL news YAHOO_SPORTS Photos: Best images from Thunder's 103-101 loss to Raptors\n",
+ " https://sports.yahoo.com/articles/photos-best-images-thunders-103-044335844.html\n",
+ "[04:45:33 UTC] NFL game_event YAHOO_SPORTS Las Vegas Raiders and the Buffalo Bills are interested in interviewing Broncos passing game coordinator/QB coach Davis Webb this week\n",
+ " https://sports.yahoo.com/articles/las-vegas-raiders-buffalo-bills-044533025.html\n",
+ "[04:44:56 UTC] GENERAL injury YAHOO_SPORTS Legends of Winter Olympics: heroes of the slopes\n",
+ " https://sports.yahoo.com/articles/legends-winter-olympics-heroes-slopes-044456667.html\n",
+ "[04:47:19 UTC] GENERAL injury YAHOO_SPORTS Tobias Bjornfot scores twice, tripling his career total as Panthers beat Blackhawks\n",
+ " https://sports.yahoo.com/articles/tobias-bjornfot-scores-twice-tripling-044719175.html\n",
+ "[04:49:00 UTC] GENERAL injury YAHOO_SPORTS Nets can’t stop the bleeding in blowout loss to Clippers\n",
+ " https://sports.yahoo.com/articles/nets-t-stop-bleeding-blowout-044900677.html\n",
+ "[04:56:42 UTC] GENERAL news YAHOO_SPORTS Sean McVay on whether he expects Matthew Stafford back: "What the hell kind of question is that?"\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-whether-expects-matthew-045642081.html\n",
+ "[04:35:40 UTC] NFL game_event CBS_SPORTS NFL Championship Sunday overreactions: Was AFC Championship a bronze medal game? Did McVay blow it for L.A?\n",
+ " https://www.cbssports.com/nfl/news/nfl-championship-sunday-overreactions-super-bowl-2026/\n",
+ "[04:42:58 UTC] GENERAL game_event CBS_SPORTS What's next for Rams after NFC Championship defeat? Matthew Stafford decision, potential staff losses loom\n",
+ " https://www.cbssports.com/nfl/news/whats-next-for-rams-after-nfc-championship-defeat-matthew-stafford/\n",
+ "[04:58:29 UTC] GENERAL news CBS_SPORTS Tomorrow's Top 25 Today: Illinois, Texas Tech rise after massive Saturday wins over top-10 opponents\n",
+ " https://www.cbssports.com/college-basketball/news/tomorrows-top-25-today-illinois-texas-tech-wins-top-10/\n",
+ "[00:03:12 UTC] GENERAL game_event ESPN Is defeating Madison Keys the breakthrough Jessica Pegula needs?\n",
+ " https://www.espn.com/tennis/story/_/id/47730491/australian-open-jessica-pegula-madison-keys\n",
+ "[04:22:14 UTC] NFL game_event YAHOO_SPORTS Mike Macdonald Rips Sam Darnold’s Critics in Blunt Post-Game Message After Seahawks Clinch Super Bowl Berth\n",
+ " https://sports.yahoo.com/articles/mike-macdonald-rips-sam-darnold-042214102.html\n",
+ "[04:28:25 UTC] NFL injury YAHOO_SPORTS Sam Darnold’s Big Performance & Jarrett Stidham’s Questionable Fumble Lead Key Takeaways From Conference Championship Weekend\n",
+ " https://sports.yahoo.com/articles/sam-darnold-big-performance-jarrett-042825411.html\n",
+ "[04:28:45 UTC] GENERAL game_event YAHOO_SPORTS Jessica Pegula Ends Madison Keys’ Australian Open Title Defense in Straight Sets\n",
+ " https://sports.yahoo.com/articles/jessica-pegula-ends-madison-keys-042845847.html\n",
+ "[04:34:35 UTC] GENERAL lineup YAHOO_SPORTS Just Wait: Alabama Football Will Be Just Fine\n",
+ " https://sports.yahoo.com/articles/just-wait-alabama-football-just-043435135.html\n",
+ "[04:35:21 UTC] NFL injury YAHOO_SPORTS Broncos Stidham makes critical error as Pats advance 10-7 slugfest\n",
+ " https://sports.yahoo.com/articles/broncos-stidham-makes-critical-error-043521665.html\n",
+ "[04:36:07 UTC] GENERAL news YAHOO_SPORTS Goldeneyes String Together Consecutive Wins In Front Of Strong Denver Crowd\n",
+ " https://sports.yahoo.com/articles/goldeneyes-string-together-consecutive-wins-043607783.html\n",
+ "[04:36:45 UTC] GENERAL news YAHOO_SPORTS St. Louis Blues Weekly Prospect Report (Jan. 25)\n",
+ " https://sports.yahoo.com/articles/st-louis-blues-weekly-prospect-043645642.html\n",
+ "[04:43:55 UTC] GENERAL news YAHOO_SPORTS Scottie Scheffler enters Tiger Woods territory in the most Scottie way possible\n",
+ " https://sports.yahoo.com/articles/scottie-scheffler-enters-tiger-woods-044355681.html\n",
+ "[04:45:33 UTC] NFL game_event YAHOO_SPORTS Raiders and Bills are interested in interviewing Broncos passing game coordinator/QB coach Davis Webb\n",
+ " https://sports.yahoo.com/articles/las-vegas-raiders-buffalo-bills-044533025.html\n",
+ "[04:57:17 UTC] GENERAL injury YAHOO_SPORTS Sean McVay gets testy when asked about Matthew Stafford's future\n",
+ " https://sports.yahoo.com/articles/sean-mcvay-gets-testy-asked-045717074.html\n",
+ "[04:57:21 UTC] GENERAL news YAHOO_SPORTS Nelson nets hat trick as Avalanche continue spree with 4-1 win over Maple Leafs\n",
+ " https://sports.yahoo.com/articles/nelson-nets-hat-trick-avalanche-045721055.html\n",
+ "[04:58:51 UTC] GENERAL news YAHOO_SPORTS Alex Honnold says he was paid an ‘embarrassing amount’ for Taipei 101 climb\n",
+ " https://sports.yahoo.com/articles/alex-honnold-says-being-paid-200235718.html\n",
+ "[04:59:00 UTC] GENERAL news YAHOO_SPORTS AEW Star Saved Enzo Amore's Career In WWE NXT\n",
+ " https://sports.yahoo.com/articles/aew-star-saved-enzo-amores-045900096.html\n",
+ "[05:00:00 UTC] GENERAL news YAHOO_SPORTS Yankees news: Stacking up the AL East rivals\n",
+ " https://sports.yahoo.com/articles/yankees-news-stacking-al-east-050000026.html\n",
+ "[05:00:00 UTC] GENERAL news YAHOO_SPORTS Bayern Munich News: FC Bayern’s summer cut list revealed; Inter Milan eyeing ex-Bayern star; A successor to Luis Díaz?; and MORE!\n",
+ " https://sports.yahoo.com/articles/bayern-munich-news-fc-bayern-050000293.html\n",
+ "\n",
+ "Reached max runtime. Stopping RSS polling automatically.\n"
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file