From 0edb769a473d402667630ea3d0f9540206693f6b Mon Sep 17 00:00:00 2001 From: hanlin2004914 <58474171+hanlin2004914@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:34:23 -0500 Subject: [PATCH] Task3 Updates --- .DS_Store | Bin 0 -> 6148 bytes Tutorials/.DS_Store | Bin 0 -> 6148 bytes Tutorials/Task_3_tutorial/.DS_Store | Bin 0 -> 6148 bytes .../Task_3_tutorial/Kalshi_API_Demo.ipynb | 2113 +++++++++++++++++ .../Task_3_tutorial/Polymarket_API_Demo.ipynb | 1202 ++++++++++ Tutorials/Task_3_tutorial/README.md | 197 +- Tutorials/Task_3_tutorial/RssFeedDemo.ipynb | 1284 ++++++++++ 7 files changed, 4765 insertions(+), 31 deletions(-) create mode 100644 .DS_Store create mode 100644 Tutorials/.DS_Store create mode 100644 Tutorials/Task_3_tutorial/.DS_Store create mode 100644 Tutorials/Task_3_tutorial/Kalshi_API_Demo.ipynb create mode 100644 Tutorials/Task_3_tutorial/Polymarket_API_Demo.ipynb create mode 100644 Tutorials/Task_3_tutorial/RssFeedDemo.ipynb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b88e6b05efc4bb31e7ebf34c49f3ddabb6511476 GIT binary patch literal 6148 zcmeHK%}T>S5T0$TO(;SS3OxqA7Ob_1;w9Aj0;cFer6#m!FlHq`_D~8r>kIiLK94iI z8?m&4ClNaXv)}CeWZ5raCkp_gpO5zengC#-5>{*+RtUvOm!x7mghD+dfe?I%APuHV z+3fg>4A8r?VF)>7AmPjVOP_*B1{i${o}w_#I-Pe>sn#|&>sH-rSU29ioO+p`<8i8LJsq%Y%N{jbvstgx zYdgK8?!4{Hj=LSS4-V&Z+uGUPJ2@XcM31q2(R2#@@|0{DEa4T66+3(Ok~os_9Y)K_ zvVxHrUx1Z}!Y5IP23 zgM~(npa@-xs7r;pVhCN1e#hjw1`Cb49E4gKpJP@Q=7u8F>gab=ItW)IkIVowu*g7F zPn*>L&%VF^FBb8P8DIwf6$7F+@CJR{lIg8Wo1md|+4j)?JLk1I6 zmjA#2o!vH^LjWm^@a#U%Pr(=>^vB^eeGFq2V&rT17)NQ=XuOHiT6ukA)7f;Y&W(4k zrd}3gle8C%uc&vfR2&v|5MD&XsbAYUQArj=$#AR_qQMYDt}mlxpr$=FNd~FT^~``% zaVmaoZ#L^RTXos#w&!&@J8CxSvfb*==M`sn|KRw{AH@%edNx!G{0g;fSuEfMjURUT zevqhyuEpG-zB;g>-$xoR z6Oy1!ZwW$a(Y2Tx#1Rx>QV~t6uulwO($Oz%oNF;RXwpIGm2n=sval}{p;t%0)Zrjp zgWNI$%)lZ8Yo=SH`hWWU`+qTsd&~ecuu=?&a^LIsa7(tfE^Ur#twg;=C84<7;71A? ix)ft9mEt{AE$EkIAi5TFgXlrw9|27RH_X7FGVl&n!%;&3 literal 0 HcmV?d00001 diff --git a/Tutorials/Task_3_tutorial/.DS_Store b/Tutorials/Task_3_tutorial/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tickertitlecategoryvolume_fp
0KXBORDERBILLBorder billPolitics852101.00
1KXATTYGENIDAG race IDElections625.00
2KXBELGIANPLGAMEBelgian Pro League GameSports5357862.00
3KXKHMIHarris wins but loses Michigan35622.00
4KXUKBANGROKWill the UK ban Grok?Politics70188.00
5KXMLSGAMEMajor League Soccer GameSports21677235.00
6KXCHOPINCHOPINEntertainment0.00
7HOUSENJ5House NJ's 5thPolitics1422.00
8KXMEEKMILLAIWhen will Meek Mill launch his AI tool?Companies2501.00
9NEPANEPA permitting reform billPolitics0.00
10KXLEAVEBONDIBondi outPolitics518330.00
11KXWACAPANDTRADEWashington cap and trade programPolitics14056.00
12KXSCREWWORMCOUNTSCREWWORM CASESHealth17746.00
13KXTOPSONGRECORDLUTHERLuther top song lengthEntertainment6055.00
14KXLOSEPRIMARYSENATERHow many Senate Republicans will lose their pr...Politics1758.00
15KXCEOYCOMBY Combinator CEO leavingCompanies15373.00
16KXDJTBMENBlack men 20240.00
17KXVENEZUELALEADER2Who will be the head of state of Venezuela on ...Politics96657.00
18FEMAStates that declare natural disastersClimate and Weather0.00
19RECNCHReconciliation bill passes the HousePolitics0.00
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tickertitlestatusyes_bid_dollarsyes_ask_dollarsyes_spreadlast_price_dollarsvolume_fpopen_interest_fpclose_time
1325KXNBASPREAD-26JAN25SACDET-DET13Detroit wins by over 13.5 Points?active0.520.570.050.54115119.095258.02026-02-08T20:00:00Z
1552KXATPMATCH-26JAN25SHERUU-SHEWill Ben Shelton win the Shelton vs Ruud : Rou...active0.580.590.010.5976126.073044.02026-02-08T23:00:00Z
659KXATPMATCH-26JAN26ALCDE-ALCWill Carlos Alcaraz win the Alcaraz vs de Mina...active0.800.820.020.8275231.075193.02026-02-10T00:30:00Z
1528KXNBAMENTION-26JAN25DENMEM-INJUWhat will the announcers say during Denver at ...active0.060.070.010.0767414.049470.02026-01-26T01:30:00Z
1553KXATPMATCH-26JAN25SHERUU-RUUWill Casper Ruud win the Shelton vs Ruud : Rou...active0.410.420.010.4159366.058324.02026-02-08T23:00:00Z
1286KXNBASPREAD-26JAN25DENMEM-MEM2Memphis wins by over 2.5 Points?active0.530.610.080.6256226.038234.02026-02-08T20:30:00Z
1306KXNBATOTAL-26JAN25SACDET-240Sacramento at Detroit: Total Pointsactive0.460.500.040.4853419.037318.02026-02-08T20:00:00Z
1326KXNBASPREAD-26JAN25SACDET-DET10Detroit wins by over 10.5 Points?active0.610.670.060.6253166.046076.02026-02-08T20:00:00Z
658KXATPMATCH-26JAN26ALCDE-DEWill Alex de Minaur win the Alcaraz vs de Mina...active0.180.200.020.2037882.030262.02026-02-10T00:30:00Z
1569KXWTAMATCH-26JAN24INGSWI-INGWill Maddison Inglis win the Inglis vs Swiatek...active0.020.040.020.0235186.034755.02026-02-08T00:00:00Z
674KXATPMATCH-26JAN26ZVETIE-ZVEWill Alexander Zverev win the Zverev vs Tien :...active0.660.670.010.6727450.027377.02026-02-10T00:30:00Z
1285KXNBASPREAD-26JAN25DENMEM-MEM5Memphis wins by over 5.5 Points?active0.470.510.040.4626294.015891.02026-02-08T20:30:00Z
1530KXNBAMENTION-26JAN25DENMEM-ELBOWhat will the announcers say during Denver at ...active0.010.030.020.0326208.023187.02026-01-26T01:30:00Z
1250KXNBASPREAD-26JAN25TOROKC-OKC11Oklahoma City wins by over 11.5 Points?active0.460.470.010.4626189.023873.02026-02-09T00:00:00Z
1531KXNBAMENTION-26JAN25DENMEM-BUZZWhat will the announcers say during Denver at ...active0.030.040.010.0525213.022685.02026-01-26T01:30:00Z
1529KXNBAMENTION-26JAN25DENMEM-FEDEWhat will the announcers say during Denver at ...active0.020.040.020.0425189.021666.02026-01-26T01:30:00Z
675KXATPMATCH-26JAN26ZVETIE-TIEWill Learner Tien win the Zverev vs Tien : Qua...active0.340.350.010.3524725.024657.02026-02-10T00:30:00Z
1318KXNBASPREAD-26JAN25SACDET-DET7Detroit wins by over 7.5 Points?active0.730.770.040.7523868.017909.02026-02-08T20:00:00Z
1307KXNBATOTAL-26JAN25SACDET-237Sacramento at Detroit: Total Pointsactive0.530.610.080.5521735.013362.02026-02-08T20:00:00Z
1525KXNBAMENTION-26JAN25DENMEM-PLAYWhat will the announcers say during Denver at ...active0.020.050.030.0520705.017505.02026-01-26T01:30:00Z
1310KXNBATOTAL-26JAN25SACDET-228Sacramento at Detroit: Total Pointsactive0.730.790.060.8118827.011585.02026-02-08T20:00:00Z
1554KXWTAMATCH-26JAN25RYBMER-RYBWill Elena Rybakina win the Rybakina vs Merten...active0.820.830.010.8318374.015719.02026-02-08T23:00:00Z
1202KXNBATOTAL-26JAN25DALMIL-219Dallas at Milwaukee: Total Pointsactive0.460.550.090.5517086.012496.02026-02-09T00:00:00Z
1303KXNBASPREAD-26JAN25NOPSAS-SAS11San Antonio wins by over 11.5 Points?active0.490.510.020.4916149.014110.02026-02-09T00:00:00Z
1257KXNBATOTAL-26JAN25DENMEM-223Denver at Memphis: Total Pointsactive0.420.470.050.4215780.010023.02026-02-08T20:30:00Z
1533KXNBAMENTION-26JAN25DENMEM-ALLEWhat will the announcers say during Denver at ...active0.010.030.020.0314295.011366.02026-01-26T01:30:00Z
1208KXNBASPREAD-26JAN25BKNLAC-LAC9Los Angeles C wins by over 9.5 Points?active0.450.480.030.4814228.011429.02026-02-09T02:00:00Z
1526KXNBAMENTION-26JAN25DENMEM-MVPWhat will the announcers say during Denver at ...active0.020.030.010.0313683.012070.02026-01-26T01:30:00Z
1523KXNBAMENTION-26JAN25DENMEM-TECHWhat will the announcers say during Denver at ...active0.010.030.020.0313510.011807.02026-01-26T01:30:00Z
1534KXNBAMENTION-26JAN25DENMEM-ALLWhat will the announcers say during Denver at ...active0.020.080.060.0812740.011622.02026-01-26T01:30:00Z
1522KXNBAMENTION-26JAN25DENMEM-TRADWhat will the announcers say during Denver at ...active0.010.040.030.0112735.010110.02026-01-26T01:30:00Z
1309KXNBATOTAL-26JAN25SACDET-231Sacramento at Detroit: Total Pointsactive0.650.710.060.7812675.06882.02026-02-08T20:00:00Z
1535KXNBAMENTION-26JAN25DENMEM-AIRWhat will the announcers say during Denver at ...active0.010.030.020.0312548.011515.02026-01-26T01:30:00Z
1524KXNBAMENTION-26JAN25DENMEM-RETIWhat will the announcers say during Denver at ...active0.010.030.020.0112299.010294.02026-01-26T01:30:00Z
1532KXNBAMENTION-26JAN25DENMEM-ANKLWhat will the announcers say during Denver at ...active0.010.040.030.0411409.010979.02026-01-26T01:30:00Z
1316KXNBATOTAL-26JAN25SACDET-210Sacramento at Detroit: Total Pointsactive0.950.990.040.8510801.09498.02026-02-08T20:00:00Z
1312KXNBATOTAL-26JAN25SACDET-222Sacramento at Detroit: Total Pointsactive0.840.910.070.909926.07035.02026-02-08T20:00:00Z
1274KXNBASPREAD-26JAN25MIAPHX-PHX5Phoenix wins by over 5.5 Points?active0.490.510.020.519668.07053.02026-02-09T01:00:00Z
928KXWTAMATCH-26JAN26SABJOV-JOVWill Iva Jovic win the Sabalenka vs Jovic : Qu...active0.140.170.030.179057.07853.02026-02-10T00:30:00Z
1266KXNBATOTAL-26JAN25NOPSAS-240New Orleans at San Antonio: Total Pointsactive0.480.500.020.488897.06635.02026-02-09T00:00:00Z
1180KXNBATOTAL-26JAN25BKNLAC-212Brooklyn at Los Angeles C: Total Pointsactive0.440.460.020.467987.06478.02026-02-09T02:00:00Z
1556KXNBAGAME-26JAN26LALCHI-LALLos Angeles L at Chicago Winner?active0.540.570.030.577896.07460.02026-02-10T01:00:00Z
1191KXNBATOTAL-26JAN25TOROKC-225Toronto at Oklahoma City: Total Pointsactive0.470.490.020.497725.05608.02026-02-09T00:00:00Z
1314KXNBATOTAL-26JAN25SACDET-216Sacramento at Detroit: Total Pointsactive0.910.980.070.977449.06836.02026-02-08T20:00:00Z
614KXWTAMATCH-26JAN26GAUSVI-GAUWill Coco Gauff win the Gauff vs Svitolina : Q...active0.640.650.010.657448.07133.02026-02-10T00:30:00Z
1235KXNBATOTAL-26JAN25MIAPHX-226Miami at Phoenix: Total Pointsactive0.470.480.010.477061.06456.02026-02-09T01:00:00Z
1521KXNBAMENTION-26JAN25DENMEM-TRIPWhat will the announcers say during Denver at ...active0.010.020.010.026756.05970.02026-01-26T01:30:00Z
1313KXNBATOTAL-26JAN25SACDET-219Sacramento at Detroit: Total Pointsactive0.910.940.030.946680.06408.02026-02-08T20:00:00Z
927KXWTAMATCH-26JAN26SABJOV-SABWill Aryna Sabalenka win the Sabalenka vs Jovi...active0.840.860.020.866587.06478.02026-02-10T00:30:00Z
1323KXNBASPREAD-26JAN25SACDET-DET19Detroit wins by over 19.5 Points?active0.320.370.050.306465.03031.02026-02-08T20:00:00Z
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ts_utcts_estyes_bidyes_asklastvolume_fpopen_interest_fp
1422026-01-26T05:31:59.907749+00:002026-01-26T00:31:59.907749-05:000.62000.64000.6400501087.00495150.00
1432026-01-26T05:32:01.940888+00:002026-01-26T00:32:01.940888-05:000.62000.64000.6400501087.00495150.00
1442026-01-26T05:32:03.983733+00:002026-01-26T00:32:03.983733-05:000.62000.64000.6400501087.00495150.00
1452026-01-26T05:32:06.020696+00:002026-01-26T00:32:06.020696-05:000.62000.64000.6400501087.00495150.00
1462026-01-26T05:32:08.061393+00:002026-01-26T00:32:08.061393-05:000.62000.64000.6400501087.00495150.00
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsportimageresolutionorderingtagsseriescreatedAt
01ncaabhttps://polymarket-upload.s3.us-east-2.amazona...https://www.ncaa.com/march-madness-live/brackethome1,100149,100639392025-11-05T19:27:45.399303Z
12eplhttps://polymarket-upload.s3.us-east-2.amazona...https://www.premierleague.com/home1,82,306,100639,100350101882025-11-05T19:27:45.399303Z
23lalhttps://polymarket-upload.s3.us-east-2.amazona...https://www.laliga.com/en-GBhome1,780,100639,100350101932025-11-05T19:27:45.399303Z
395acnhttps://polymarket-upload.s3.us-east-2.amazona...https://www.cafonline.com/caf-africa-cup-of-na...home1,102974107862025-12-18T19:19:31.18134Z
45iplhttps://polymarket-upload.s3.us-east-2.amazona...https://www.iplt20.com/home1,101977,100639,517,518442025-11-05T19:27:45.399303Z
56wnbahttps://polymarket-upload.s3.us-east-2.amazona...https://www.wnba.com/away1,100639,100254101052025-11-05T19:27:45.399303Z
67bunhttps://polymarket-upload.s3.us-east-2.amazona...https://www.bundesliga.com/en/bundesligahome1,1494,100639,100350101942025-11-05T19:27:45.399303Z
78mlbhttps://polymarket-upload.s3.us-east-2.amazona...https://www.mlb.com/away1,100639,10038132025-11-05T19:27:45.399303Z
89cfbhttps://polymarket-upload.s3.us-east-2.amazona...https://www.ncaa.com/away1,100351,100639102102025-11-05T19:27:45.399303Z
910nflhttps://polymarket-upload.s3.us-east-2.amazona...https://www.nfl.com/away1,450,100639101872025-11-05T19:27:45.399303Z
1011fl1https://polymarket-upload.s3.us-east-2.amazona...https://ligue1.com/enhome1,100639,102070,100350101952025-11-05T19:27:45.399303Z
1112seahttps://polymarket-upload.s3.us-east-2.amazona...https://www.legaseriea.it/enhome1,100639,101962,100350102032025-11-05T19:27:45.399303Z
1213uclhttps://polymarket-upload.s3.us-east-2.amazona...https://www.uefa.com/uefachampionsleague/home1,100977,100639,1234,100350102042025-11-05T19:27:45.399303Z
1315afchttps://polymarket-upload.s3.us-east-2.amazona...https://www.the-afc.com/en/home.htmlhome1,100639,100350,101680102412025-11-05T19:27:45.399303Z
1416ofchttps://polymarket-upload.s3.us-east-2.amazona...https://www.oceaniafootball.com/home1,100639,100350,102566102942025-11-05T19:27:45.399303Z
1517fifhttps://polymarket-upload.s3.us-east-2.amazona...https://www.fifa.com/enhome1,100639,100350,102539102382025-11-05T19:27:45.399303Z
1618erehttps://polymarket-upload.s3.us-east-2.amazona...https://eredivisie.eu/competition/home1,100639,100350,101735102862025-11-05T19:27:45.399303Z
1719arghttps://polymarket-upload.s3.us-east-2.amazona...https://www.afa.com.ar/home1,100639,100350,102561102852025-11-05T19:27:45.399303Z
1820itchttps://polymarket-upload.s3.us-east-2.amazona...https://www.legaseriea.it/en/coppa-italiahome1,100639,100350,102008102872025-11-05T19:27:45.399303Z
1921mexhttps://polymarket-upload.s3.us-east-2.amazona...https://www.ligamx.net/home1,100639,100350,102448102902025-11-05T19:27:45.399303Z
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_idtitlestartTimenum_markets
0174405Patriots vs. Broncos2026-01-25T20:00:00Z73
1174407Rams vs. Seahawks2026-01-25T23:30:00Z59
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sourcepublished_utctitlelinksummaryfp
65YAHOO_SPORTS2026-01-26 04:45:33+00:00Las Vegas Raiders and the Buffalo Bills are in...https://sports.yahoo.com/articles/las-vegas-ra...With the Broncos eliminated from the postseaso...b8d84f64683f1644e5becad3a58996cbb7f0ceb1
66YAHOO_SPORTS2026-01-26 04:43:35+00:00Photos: Best images from Thunder's 103-101 los...https://sports.yahoo.com/articles/photos-best-...The best photos from the Oklahoma City Thunder...11bbd167da9db5d889a9e5a16a6702cfece76ff9
68YAHOO_SPORTS2026-01-26 04:43:00+00:00Super Bowl Prop Bets: Odds and Expert Picks fo...https://sports.yahoo.com/articles/super-bowl-p...We share the most popular Super Bowl props and...86b2e26eda383167ffd1f3b50650251976e772ef
67YAHOO_SPORTS2026-01-26 04:43:00+00:00Super Bowl National Anthem Length: Charlie Put...https://sports.yahoo.com/articles/super-bowl-n...A look at Over/Under odds for the National Ant...db30bfe312fa7e2ecd264b572622161b07504e53
69YAHOO_SPORTS2026-01-26 04:41:49+00:00McVay bristles at question about Stafford's fu...https://sports.yahoo.com/articles/mcvay-bristl...The Los Angeles Rams quarterback turns 38 in t...8fbd9e9d7b8c54c6b0225f1dc149810e03249e57
70YAHOO_SPORTS2026-01-26 04:41:35+00:00Writer suggests 'reasonable' trade package for...https://sports.yahoo.com/articles/writer-sugge...Would it be worth it for the Lakers to give up...75147f0cd04952aee5fec4c094ab8e00f7184fae
71YAHOO_SPORTS2026-01-26 04:40:55+00:00Dru Smith keeps impressing with his defense 'O...https://sports.yahoo.com/articles/dru-smith-ke...Dru Smith has continued to be one of the stand...9849427cefb85bd8c8d1eab7fccc1fdf3952cff5
72YAHOO_SPORTS2026-01-26 04:40:43+00:00NFL fans raise conspiracy theory over Super Bo...https://sports.yahoo.com/articles/nfl-fans-rai...Some people are buried deep into NFL conspirac...03963c4e13d9a55d1f218e9888f1d1a29aadca77
73YAHOO_SPORTS2026-01-26 04:40:08+00:00Russell Wilson praises Sam Darnold for 'inspir...https://sports.yahoo.com/articles/russell-wils...Here's what Wilson said after the Seahawks' win.b60ea2b179230ceac0d541903c494c1a052fafc6
74YAHOO_SPORTS2026-01-26 04:38:56+00:00Sean McVay left at a loss for words after Rams...https://sports.yahoo.com/articles/sean-mcvay-l...Rams coach Sean McVay had an honest reaction t...e0f2448a82a36f6c2d6f3dd264bb0a019772f58d
75YAHOO_SPORTS2026-01-26 04:38:20+00:00Kawhi Leonard, James Harden fuel fast start as...https://sports.yahoo.com/articles/kawhi-leonar...Kawhi Leonard scored 21 of his 28 points in th...dc2cebb0a9691f099fa90d5578becba1a11b0892
76YAHOO_SPORTS2026-01-26 04:37:22+00:00Nets player grades: Danny Wolf drops 14 in 126...https://sports.yahoo.com/articles/nets-player-...Here are the Brooklyn Nets player grades follo...e21a22423f3a7d51f7e5a789ce7f327b3a34f111
77YAHOO_SPORTS2026-01-26 04:35:00+00:00From Knicks disaster to Clippers blowout, Nets...https://sports.yahoo.com/articles/knicks-disas...Wednesday was Madison Square Garden. Sunday wa...58f3892c4e48332a9e6189f505263062a1e3a2e9
78YAHOO_SPORTS2026-01-26 04:34:12+00:00Sean McVay: Seahawks had &quot;fortuitous bust...https://sports.yahoo.com/articles/sean-mcvay-s...Although the NFC Championship had many compell...f88f6e81ef74138d5b38119592a02a55097dd313
79YAHOO_SPORTS2026-01-26 04:33:52+00:00Seahawks set to rematch with Patriots in Super...https://sports.yahoo.com/articles/seahawks-set...The rematch of Super Bowl XLIX is set39fa46a8192ec569b5ba56aaea1513a6de8f49f8
80YAHOO_SPORTS2026-01-26 04:33:26+00:00'Did it for Harambe' Sun Devils' Twitter react...https://sports.yahoo.com/articles/did-harambe-...Arizona State students wore &quot;forks up for...6be5b23359ace931c9eadcd7b4299778d3a2c6fc
81YAHOO_SPORTS2026-01-26 04:33:25+00:00Seahawks NFC championship win is good news for...https://sports.yahoo.com/articles/seahawks-nfc...The Seahawks beat the Rams in the NFC Champion...10f4858e2ee8fa91d24267cdd5dc1158340d2a18
82YAHOO_SPORTS2026-01-26 04:33:00+00:003 reasons Patriots defense dominated in AFC pl...https://sports.yahoo.com/articles/3-reasons-pa...The Patriots played terrific defense throughou...855d3ce1fd578fe786eff95dbecec03a5019c16b
83YAHOO_SPORTS2026-01-26 04:32:25+00:00Sean McVay says Seahawks 'lucked into' pivotal...https://sports.yahoo.com/nfl/article/sean-mcva...Bust or not, the Seahawks cut off all of Matth...35b2427de65dcec6cd9a10232ba5d14976dbe178
84YAHOO_SPORTS2026-01-26 04:32:17+00:00Presumed Chargers OC 'still in mix' for Raider...https://sports.yahoo.com/articles/potential-ch...Mike McDaniel is still an option to be the Rai...06034ec594380368fe798f6b580103c258969a26
85YAHOO_SPORTS2026-01-26 04:32:14+00:00Scottie Scheffler's clubs: Inside his American...https://sports.yahoo.com/articles/scottie-sche...Scottie Scheffler won the 2026 American Expres...4118fbbbf698cfea11833af3d6d7676cbc05d144
86YAHOO_SPORTS2026-01-26 04:31:18+00:00Player grades: Thunder can't close out again i...https://sports.yahoo.com/articles/player-grade...Player grades for the Oklahoma City Thunder's ...6d3a358f8e1b44b8cc8cd79556237408d71469ca
87YAHOO_SPORTS2026-01-26 04:30:00+00:00Best Super Bowl Coin Toss Prop Results: Heads ...https://sports.yahoo.com/articles/best-super-b...Find the best odds, past results, and advice f...99c04171ee54ffc9b049b2a487e865af1906965a
88YAHOO_SPORTS2026-01-26 04:29:47+00:00Seahawks to face Patriots in Super Bowl 60https://sports.yahoo.com/articles/patriots-bea...The Seattle Seahawks will face the New England...d126529bb69db8c986494515c468eadd939cb77a
89YAHOO_SPORTS2026-01-26 04:28:29+00:00No QB had ever lost a playoff game with number...https://sports.yahoo.com/articles/no-qb-had-ev...Matthew Stafford is the first quarterback ever...034bf9275945f83d6c699553b1773689389c35eb
90YAHOO_SPORTS2026-01-26 04:27:38+00:00How family grief made Hamer-Webb pick Waleshttps://sports.yahoo.com/articles/family-grief...Uncapped Gabriel Hamer-Webb reveals how his Ca...4f4247a5a78b2434d2463c757867ef0358245f12
91YAHOO_SPORTS2026-01-26 04:25:50+00:00Patriots Join 49ers In Elite Company After Cli...https://sports.yahoo.com/articles/patriots-joi...The New England Patriots will have one more ga...befba3cb02dd17cc82929d64f59b64b4278ae8e0
92YAHOO_SPORTS2026-01-26 04:25:35+00:00Miami linebacker Raul Aguirre commits to NC St...https://sports.yahoo.com/articles/miami-lineba...Miami linebacker Raul Aguirre has committed to...6e2574f514a0cf9bcc5ac8857cde57af65fe924e
93YAHOO_SPORTS2026-01-26 04:24:04+00:00What head coach candidates can Las Vegas Raide...https://sports.yahoo.com/articles/head-coach-c...2nd interviews with candidates in Super Bowl c...301608520c48f925a46b4f787a6a217cbacfb4ea
94YAHOO_SPORTS2026-01-26 04:23:59+00:00Silver Knights cannot keep first period moment...https://sports.yahoo.com/articles/silver-knigh...It is not about how you start, but how you fin...9d7de37c55a1dee82f1797abcdb64e5ebf52162b
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\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