<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Toph A</title>
    <description>The latest articles on DEV Community by Toph A (@toph_a_0607897a5c9c5aca5c).</description>
    <link>https://dev.to/toph_a_0607897a5c9c5aca5c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4191772%2F4134f097-2442-420b-866e-4ae3f6fc82f0.png</url>
      <title>DEV Community: Toph A</title>
      <link>https://dev.to/toph_a_0607897a5c9c5aca5c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toph_a_0607897a5c9c5aca5c"/>
    <language>en</language>
    <item>
      <title>Customer research on Reddit with an AI agent: pull full comment threads through MCP</title>
      <dc:creator>Toph A</dc:creator>
      <pubDate>Sun, 18 Oct 2026 10:43:05 +0000</pubDate>
      <link>https://dev.to/toph_a_0607897a5c9c5aca5c/customer-research-on-reddit-with-an-ai-agent-pull-full-comment-threads-through-mcp-2451</link>
      <guid>https://dev.to/toph_a_0607897a5c9c5aca5c/customer-research-on-reddit-with-an-ai-agent-pull-full-comment-threads-through-mcp-2451</guid>
      <description>&lt;p&gt;If you have ever tried to answer "what do people complain about in our category?" by reading Reddit, you know the useful part is rarely the post. It is the comment thread underneath, three or four levels deep, where someone explains why they returned the product and five people reply with what they bought instead. This post walks through how to get those threads into an AI agent as structured data, using MCP for chat clients and a plain REST API for scripts.&lt;/p&gt;

&lt;p&gt;I work on ProLevelMax, the data source used in the examples below. The approach (discover a source, check the price, run it, page through results) is the part worth taking away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why scraping Reddit yourself gets old fast
&lt;/h2&gt;

&lt;p&gt;Getting one thread is easy. Getting a few hundred threads reliably is where the time goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comment trees are nested and truncated.&lt;/strong&gt; Long threads come back with collapsed branches and "more replies" stubs. To get the whole conversation you have to follow each stub, keep parent links straight, and stitch the tree back together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination is per thread.&lt;/strong&gt; Every post has its own cursor, so a research job across 30 threads is 30 separate paging loops, each of which can fail halfway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access needs upkeep.&lt;/strong&gt; You register an app, manage credentials, watch rate limits and handle the day the response format or the HTML changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents make it worse.&lt;/strong&gt; If you hand a raw HTTP tool to an LLM and say "read these threads", it will happily fetch page one and summarise a fraction of the discussion as if it were all of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I wanted instead: the agent asks for "comments on this post", gets a price before anything runs, and receives clean records it can count and quote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways in: MCP or REST
&lt;/h2&gt;

&lt;p&gt;ProLevelMax exposes the same data three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;remote MCP server&lt;/strong&gt; at &lt;code&gt;https://prolevelmax.com/mcp&lt;/code&gt;. Claude.ai, Claude Desktop and ChatGPT connect with OAuth (no key). Claude Code, Codex and Cursor can use an API key as a Bearer token.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Agent Skill&lt;/strong&gt; at &lt;code&gt;https://prolevelmax.com/SKILL.md&lt;/code&gt;. You create an API key in the dashboard, then send your AI the line &lt;code&gt;set up https://prolevelmax.com/SKILL.md&lt;/code&gt; together with the key, and it configures itself.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;REST API&lt;/strong&gt; under &lt;code&gt;https://prolevelmax.com/v1&lt;/code&gt;, described in an OpenAPI 3.1 file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Claude Code, the setup line from SKILL.md is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--transport&lt;/span&gt; http prolevelmax https://prolevelmax.com/mcp &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_procli_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once connected, the agent has eight tools. The four that matter for research are &lt;code&gt;procli_discover&lt;/code&gt;, &lt;code&gt;procli_inspect&lt;/code&gt;, &lt;code&gt;procli_run&lt;/code&gt; and &lt;code&gt;procli_runs_get&lt;/code&gt;. The REST endpoints mirror them, so I will use REST for the rest of this post because it is easier to show.&lt;/p&gt;

&lt;h2&gt;
  
  
  The request flow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Discover.&lt;/strong&gt; You describe what you want in plain words (English or Chinese) and get candidate sources back.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://prolevelmax.com/v1/discover &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_procli_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"query":"reddit comments"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response has &lt;code&gt;recommended&lt;/code&gt; and &lt;code&gt;items&lt;/code&gt;. Each source carries a &lt;code&gt;scraper&lt;/code&gt; id, a &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;bestFor&lt;/code&gt;, a &lt;code&gt;verdict&lt;/code&gt; (&lt;code&gt;recommended&lt;/code&gt;, &lt;code&gt;ok&lt;/code&gt; or &lt;code&gt;not_recommended&lt;/code&gt;), a &lt;code&gt;why&lt;/code&gt;, its &lt;code&gt;pricing&lt;/code&gt; and an &lt;code&gt;estimate&lt;/code&gt;. For Reddit there are separate sources for search, subreddit feeds, a post with its comments, post comments page by page, and replies under one comment for deep threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Inspect.&lt;/strong&gt; Before running anything, ask for the input fields and a quote.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://prolevelmax.com/v1/inspect &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_procli_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"scraper":"procli_reddit_b","input":{"post_id":"t3_1abcde"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response shape (values omitted):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "scraper": "procli_reddit_b",
  "inputFields": [
    { "name": &amp;lt;string&amp;gt;, "type": &amp;lt;string&amp;gt;, "required": &amp;lt;bool&amp;gt;, "description": &amp;lt;string&amp;gt;, "paging": &amp;lt;bool&amp;gt; }
  ],
  "exampleInput": { ... },
  "pagingNote": &amp;lt;string&amp;gt;,
  "quote": {
    "maxCharge": &amp;lt;number, USD&amp;gt;,
    "maxChargeDisplay": &amp;lt;string&amp;gt;,
    "needsConfirmation": &amp;lt;bool&amp;gt;,
    "balanceTooLow": &amp;lt;bool&amp;gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;quote.maxCharge&lt;/code&gt; is the most this run can cost. &lt;code&gt;needsConfirmation&lt;/code&gt; is true when the quote is above $0.10. Fields marked &lt;code&gt;paging: true&lt;/code&gt; are the ones you fill from the previous result to get the next page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Run.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://prolevelmax.com/v1/run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_procli_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"scraper":"procli_reddit_b","input":{"post_id":"t3_1abcde"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A finished run returns &lt;code&gt;runId&lt;/code&gt;, &lt;code&gt;items&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, a &lt;code&gt;page&lt;/code&gt; object with cursor values for the next page, &lt;code&gt;cost&lt;/code&gt; (with &lt;code&gt;amountDisplay&lt;/code&gt;), &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;wallet&lt;/code&gt; (with &lt;code&gt;balanceDisplay&lt;/code&gt;) and &lt;code&gt;download&lt;/code&gt; links for &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;csv&lt;/code&gt; and &lt;code&gt;xlsx&lt;/code&gt;. For long jobs, send &lt;code&gt;"async": true&lt;/code&gt; and you get a &lt;code&gt;202&lt;/code&gt; with a &lt;code&gt;runId&lt;/code&gt; to poll at &lt;code&gt;GET /v1/runs/:id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Download.&lt;/strong&gt; &lt;code&gt;GET /v1/runs/RUN_ID/download?format=csv&lt;/code&gt; (or &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;). Nested fields become &lt;code&gt;a.b&lt;/code&gt; columns in CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small working script
&lt;/h2&gt;

&lt;p&gt;This pulls every page of comments for one Reddit post, refuses to run anything that needs confirmation, and writes the records to a JSON file. Replace the key and the post id.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://prolevelmax.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sk_procli_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;SOURCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;procli_reddit_b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;           &lt;span class="c1"&gt;# "Post comments", page by page
&lt;/span&gt;&lt;span class="n"&gt;inp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t3_1abcde&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;       &lt;span class="c1"&gt;# the post you want
&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;                  &lt;span class="c1"&gt;# hard stop at 10 pages
&lt;/span&gt;    &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/inspect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;needsConfirmation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Quote is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maxChargeDisplay&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, stopping for review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amountDisplay&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;paging&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputFields&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paging&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;paging&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;paging&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;                        &lt;span class="c1"&gt;# no next cursor: done
&lt;/span&gt;    &lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;paging&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comments.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comments, charges:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balance:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wallet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanceDisplay&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script does not hard-code the cursor field name. It reads which input fields are marked &lt;code&gt;paging&lt;/code&gt; from inspect and copies matching values from the result's &lt;code&gt;page&lt;/code&gt; object, which is how the docs describe paging for per-call sources. Error handling is left out to keep it short; errors come back as JSON with a stable &lt;code&gt;type&lt;/code&gt; (for example &lt;code&gt;insufficient_balance&lt;/code&gt;, &lt;code&gt;spend_limit&lt;/code&gt;, &lt;code&gt;invalid_input&lt;/code&gt;, &lt;code&gt;rate_limited&lt;/code&gt;) you can branch on.&lt;/p&gt;

&lt;p&gt;From here, feed &lt;code&gt;comments.json&lt;/code&gt; to whatever model you use and ask for themes with counts and verbatim quotes. Asking for quotes with links keeps the summary honest, because you can check each claim against the thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping costs predictable
&lt;/h2&gt;

&lt;p&gt;Running an agent against a paid API is only comfortable if spend has a ceiling. The pieces that give you one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A quote before every run.&lt;/strong&gt; &lt;code&gt;inspect&lt;/code&gt; returns &lt;code&gt;maxCharge&lt;/code&gt;, and the charge never exceeds the quote. The Skill tells agents to state the price and wait for your OK when the quote is above $0.10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No overdraft.&lt;/strong&gt; Per-result runs shrink to what your balance covers, per-call runs do not start without enough balance, and the account cannot go below zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend limits per key or app.&lt;/strong&gt; You can set daily or monthly limits in the dashboard. A run that hits one fails with &lt;code&gt;spend_limit&lt;/code&gt; instead of charging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caps on schedules.&lt;/strong&gt; If you monitor threads on a schedule (&lt;code&gt;POST /v1/schedules&lt;/code&gt;), each schedule takes a &lt;code&gt;runCap&lt;/code&gt; and an optional &lt;code&gt;monthlyCap&lt;/code&gt;, and &lt;code&gt;dryRun: true&lt;/code&gt; previews the cost without saving anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed runs.&lt;/strong&gt; These are generally not charged; a partial charge, if any, stays within the quote.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Billing is pay per use: some sources charge per call, others per result plus a per-run fee with a minimum. Most Reddit sources are per call. Current rates are on the &lt;a href="https://prolevelmax.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, and new accounts get $1 of credit after email verification, which is enough to try the flow above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public data only.&lt;/strong&gt; Private and quarantined subreddits cannot be read, and anything that needs someone's login is not collected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deleted content stays deleted.&lt;/strong&gt; Removed or deleted posts and comments show only what Reddit still shows publicly, usually nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scores are a snapshot.&lt;/strong&gt; Upvotes and comment counts are the public numbers at the moment of the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency.&lt;/strong&gt; Up to 5 jobs run at once per account, across all keys and connections. Extra runs get &lt;code&gt;429 too_many_runs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run size and time.&lt;/strong&gt; Per-result sources return up to 100 results unless you set &lt;code&gt;maxItems&lt;/code&gt;. A synchronous run waits at most 300 seconds (&lt;code&gt;timeout&lt;/code&gt;), so use &lt;code&gt;async&lt;/code&gt; for big jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retention.&lt;/strong&gt; Run results are kept for 30 days. Download what you want to keep.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://prolevelmax.com/docs" rel="noopener noreferrer"&gt;prolevelmax.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAPI: &lt;a href="https://prolevelmax.com/openapi.json" rel="noopener noreferrer"&gt;prolevelmax.com/openapi.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent Skill: &lt;a href="https://prolevelmax.com/SKILL.md" rel="noopener noreferrer"&gt;prolevelmax.com/SKILL.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Client configs: &lt;a href="https://github.com/tophmeee/prolevelmax-mcp" rel="noopener noreferrer"&gt;github.com/tophmeee/prolevelmax-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something in the flow is unclear or broken, email &lt;a href="mailto:toph@prolevelmax.com"&gt;toph@prolevelmax.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>reddit</category>
      <category>python</category>
    </item>
    <item>
      <title>Replace Reddit RSS in n8n before November 13</title>
      <dc:creator>Toph A</dc:creator>
      <pubDate>Sun, 18 Oct 2026 08:54:51 +0000</pubDate>
      <link>https://dev.to/toph_a_0607897a5c9c5aca5c/replace-reddit-rss-in-n8n-before-november-13-ckb</link>
      <guid>https://dev.to/toph_a_0607897a5c9c5aca5c/replace-reddit-rss-in-n8n-before-november-13-ckb</guid>
      <description>&lt;p&gt;Reddit is switching off its RSS feeds on 13 November 2026. If an n8n workflow reads a subreddit or a Reddit search through the RSS Read node, it will stop returning items that day, usually without an error you would notice.&lt;/p&gt;

&lt;p&gt;This guide swaps the RSS node for one HTTP Request node, so the rest of the workflow keeps working. It uses the ProLevelMax API (I'm the founder, so take that into account), but the pattern is the same for any JSON source.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Get an API key
&lt;/h2&gt;

&lt;p&gt;Create an account at &lt;a href="https://prolevelmax.com" rel="noopener noreferrer"&gt;prolevelmax.com&lt;/a&gt;. New accounts get $1 of free credit after verifying their email, which covers a few hundred Reddit search calls. Create an API key in the dashboard and set a daily spend limit on it while you're there.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Replace the RSS Read node
&lt;/h2&gt;

&lt;p&gt;Add an &lt;strong&gt;HTTP Request&lt;/strong&gt; node where the RSS node was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;https://prolevelmax.com/v1/run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer &amp;lt;your key&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body (JSON):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scraper"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"procli_reddit_d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;your keyword&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"search_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NEW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"time_range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"day"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"need_format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the quotes inside &lt;code&gt;query&lt;/code&gt; if you want an exact phrase match.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Split the results
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Split Out&lt;/strong&gt; node on the &lt;code&gt;items&lt;/code&gt; field. Each item has a &lt;code&gt;post&lt;/code&gt; object with &lt;code&gt;postTitle&lt;/code&gt;, &lt;code&gt;permalink&lt;/code&gt;, &lt;code&gt;score&lt;/code&gt;, &lt;code&gt;commentCount&lt;/code&gt; and &lt;code&gt;createdAt&lt;/code&gt;, which map cleanly onto the fields you were using from RSS (title, link, date). Prefix &lt;code&gt;permalink&lt;/code&gt; with &lt;code&gt;https://www.reddit.com&lt;/code&gt; to get the full URL.&lt;/p&gt;

&lt;p&gt;Every response also carries a CSV download link, if you only need a file.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. (Optional) Pull the comments
&lt;/h2&gt;

&lt;p&gt;RSS never gave you comments. To get them, add a second HTTP Request with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scraper"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"procli_reddit_b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"post_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t3_&amp;lt;id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sort_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TOP"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each call returns one page of the thread with author, score and text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost and limits
&lt;/h2&gt;

&lt;p&gt;Reddit calls are billed per call from a prepaid balance (from $0.003). You can get a quote before running anything with &lt;code&gt;POST /v1/inspect&lt;/code&gt;, and the daily limit on the key stops a runaway loop from spending more than you set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer not to build a workflow?
&lt;/h2&gt;

&lt;p&gt;Create an API key in the dashboard, send it to Claude, Codex or Cursor together with &lt;code&gt;set up https://prolevelmax.com/SKILL.md&lt;/code&gt;, and ask in plain language, for example "what is Reddit saying about our brand this week". A small Python version of the steps above is on GitHub: &lt;a href="https://github.com/tophmeee/reddit-to-csv" rel="noopener noreferrer"&gt;tophmeee/reddit-to-csv&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>reddit</category>
      <category>automation</category>
      <category>api</category>
    </item>
  </channel>
</rss>
