<?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: Aethyn Team</title>
    <description>The latest articles on DEV Community by Aethyn Team (@aethyn_team).</description>
    <link>https://dev.to/aethyn_team</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%2F4021651%2Fca9d9894-4ac4-4552-b800-8b2c7db54f09.png</url>
      <title>DEV Community: Aethyn Team</title>
      <link>https://dev.to/aethyn_team</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aethyn_team"/>
    <language>en</language>
    <item>
      <title>Build a country-by-country price index with an AI agent (one MCP server, no scraping stack)</title>
      <dc:creator>Aethyn Team</dc:creator>
      <pubDate>Sun, 12 Jul 2026 12:45:27 +0000</pubDate>
      <link>https://dev.to/aethyn_team/build-a-country-by-country-price-index-with-an-ai-agent-one-mcp-server-no-scraping-stack-34kl</link>
      <guid>https://dev.to/aethyn_team/build-a-country-by-country-price-index-with-an-ai-agent-one-mcp-server-no-scraping-stack-34kl</guid>
      <description>&lt;p&gt;Give an AI agent a browser and it can read the web. But it reads the web from exactly &lt;strong&gt;one&lt;/strong&gt; address — whichever machine it happens to be running on.&lt;/p&gt;

&lt;p&gt;That's fine until the thing you're asking about is country-specific. Public prices, currency, regional availability, localized search results — all of it comes back through a vantage point the agent never chose and can't move. The agent doesn't error. It just confidently reports the wrong country's answer.&lt;/p&gt;

&lt;p&gt;I wanted an agent that could say &lt;em&gt;"check this from Germany, now from the UK, now from the US"&lt;/em&gt; — and then &lt;strong&gt;prove&lt;/strong&gt; it actually did. So I built an MCP server for it, and this post is the walkthrough: we'll build a small country-by-country price index, driven entirely by tool calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap this fills
&lt;/h2&gt;

&lt;p&gt;If you've used &lt;strong&gt;Microsoft's Playwright MCP&lt;/strong&gt;, you know it's a genuinely good tool — it drives a browser properly. But its proxy is a &lt;strong&gt;launch flag&lt;/strong&gt;: you set it when the server starts, and every call in that session goes out the same door. It wasn't built for per-task geography, and that's a reasonable design choice.&lt;/p&gt;

&lt;p&gt;Hosted "scraping" MCPs solve geography by routing through their own cloud and handing you JSON. The geography is real, but it's &lt;strong&gt;opaque&lt;/strong&gt; — you don't pick the exit, and you can't verify where a request actually landed.&lt;/p&gt;

&lt;p&gt;What I wanted sat in between: a &lt;strong&gt;local&lt;/strong&gt; browser, a residential exit, and the &lt;strong&gt;country as an argument on the tool call&lt;/strong&gt; — plus a way for the agent to check the exit before trusting the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup (2 minutes)
&lt;/h2&gt;

&lt;p&gt;It's an npm package. Add it to your MCP client config — &lt;code&gt;claude_desktop_config.json&lt;/code&gt; for Claude Desktop, &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt; for Cursor:&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;"mcpServers"&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;"aethyn-browser"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn-browser-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"AETHYN_USERNAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn-XXXXX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AETHYN_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-proxy-password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AETHYN_DEFAULT_TIER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"premium"&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;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;Chromium auto-installs on first run (~170 MB, once). The browser runs &lt;strong&gt;on your machine&lt;/strong&gt; — nothing is hosted for you, and your credentials never leave your box.&lt;/p&gt;

&lt;p&gt;Restart the client and the agent has 10 tools, all prefixed &lt;code&gt;aethyn_&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_launch_browser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a proxied session in a chosen country&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_navigate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to a URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_get_content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page content as text / html / markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_snapshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Accessibility tree with &lt;code&gt;[ref=eNN]&lt;/code&gt; handles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;aethyn_click&lt;/code&gt; / &lt;code&gt;aethyn_type&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Interact by ref or selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_check_exit_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify the exit &lt;strong&gt;through the session's proxy&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_new_identity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rotate to a fresh exit IP, clear cookies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_close&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Close the session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aethyn_list_countries&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Discover exit options at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The build: a regional price index
&lt;/h2&gt;

&lt;p&gt;The task: &lt;strong&gt;read a public product/pricing page from three countries and put the numbers side by side.&lt;/strong&gt; Every step below is a real tool call the agent makes on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — let the agent discover its options
&lt;/h3&gt;

&lt;p&gt;Rather than hard-coding a country list, the agent asks:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn_list_countries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"with_cities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;This matters more than it looks: the agent can now &lt;em&gt;plan&lt;/em&gt; a loop over countries it knows are actually available, instead of guessing and failing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — one sticky session per country
&lt;/h3&gt;

&lt;p&gt;For each country, launch a session. The &lt;code&gt;session&lt;/code&gt; argument is the important one — it's your &lt;strong&gt;task id&lt;/strong&gt;, and reusing it pins the same exit IP for the whole task:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn_launch_browser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"price_idx_de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lifetime_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"premium"&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;Note the token is &lt;strong&gt;&lt;code&gt;lifetime_min&lt;/code&gt;&lt;/strong&gt; (1–1440 minutes, default 10), not "ttl". It's how long that exit stays pinned to your session. Launch returns a &lt;code&gt;session_id&lt;/code&gt;, which every other tool takes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — verify before you trust (the step people skip)
&lt;/h3&gt;

&lt;p&gt;This is the one I'd argue is the whole point:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn_check_exit_ip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"session_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;"..."&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;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;"ip"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"city"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"org"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"is_residential"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs the check &lt;strong&gt;through the session's own proxy&lt;/strong&gt;, so it tells you where the page you're about to load will &lt;em&gt;actually&lt;/em&gt; come from. If the agent asked for &lt;code&gt;de&lt;/code&gt; and the exit says something else, it can rotate and re-check instead of quietly reporting a German price it never saw.&lt;/p&gt;

&lt;p&gt;(Fair warning: &lt;code&gt;is_residential&lt;/code&gt; is a best-effort heuristic derived from the ASN/org — treat it as a signal, not a guarantee.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — read the page
&lt;/h3&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn_navigate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"session_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;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example-store.com/pricing"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aethyn_get_content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"session_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;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markdown"&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;&lt;code&gt;markdown&lt;/code&gt; is usually the right format for feeding an LLM — it's the page, cleaned, without the script/style noise eating your context window.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — close, repeat, aggregate
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;aethyn_close&lt;/code&gt; the session, then run the same sequence for &lt;code&gt;uk&lt;/code&gt; and &lt;code&gt;us&lt;/code&gt; with their own &lt;code&gt;session&lt;/code&gt; ids. Because each country gets its own session, the identities never cross-contaminate.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you actually type
&lt;/h3&gt;

&lt;p&gt;The nice part is you don't orchestrate any of this by hand. You say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Using the aethyn-browser tools: list the available countries, then for &lt;strong&gt;de&lt;/strong&gt;, &lt;strong&gt;uk&lt;/strong&gt;, and &lt;strong&gt;us&lt;/strong&gt;, open a sticky session, verify the exit IP is in the right country, load &lt;code&gt;https://example-store.com/pricing&lt;/code&gt;, and pull the plan prices. Close each session when you're done. Put the results in a table with the currency, and flag any country where the exit IP didn't match what you asked for."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…and the agent runs the loop, checks its own work, and hands you the table. From there it's one more step to a chart or a nightly pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two gotchas worth your time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The 407 that looks like a proxy failure but isn't.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;AETHYN_DEFAULT_TIER&lt;/code&gt; defaults to &lt;code&gt;premium&lt;/code&gt;, which uses HTTP port &lt;strong&gt;2099&lt;/strong&gt;. Elite uses &lt;strong&gt;5499&lt;/strong&gt;. If your account is Elite and you leave the default alone, the browser launches perfectly fine and then the proxy rejects auth with a &lt;strong&gt;407&lt;/strong&gt;. It looks like broken credentials; it's a port mismatch. Fix: set &lt;code&gt;AETHYN_DEFAULT_TIER=elite&lt;/code&gt;, or pass &lt;code&gt;tier: "elite"&lt;/code&gt; on the call.&lt;/p&gt;

&lt;p&gt;Also note &lt;strong&gt;city and state targeting are Elite-only&lt;/strong&gt; (port 5499). Country works on both tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. HTTP, not SOCKS5.&lt;/strong&gt;&lt;br&gt;
The server is HTTP-only by design — Chromium can't authenticate SOCKS5 proxies. If you've been burned by that before, this is why.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bring your own proxy
&lt;/h2&gt;

&lt;p&gt;It defaults to Aethyn, but it isn't locked to it. Point it at &lt;strong&gt;any HTTP proxy&lt;/strong&gt; with &lt;code&gt;PROXY_HOST&lt;/code&gt;, &lt;code&gt;PROXY_PORT&lt;/code&gt;, &lt;code&gt;PROXY_USERNAME&lt;/code&gt;, &lt;code&gt;PROXY_PASSWORD&lt;/code&gt;, and a &lt;code&gt;PROXY_USERNAME_TEMPLATE&lt;/code&gt; describing how your provider encodes targeting in the username:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PROXY_USERNAME_TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{username}-country-{country}[-city-{city}]-session-{session}-lifetime-{lifetime}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;[optional]&lt;/code&gt; segments drop out when empty. For a fixed proxy with no geo targeting at all, the template is just &lt;code&gt;{username}&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this stays honest
&lt;/h2&gt;

&lt;p&gt;Worth being direct about the boundaries, because the "agents + browsers" space is full of overclaiming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public data only.&lt;/strong&gt; Respect &lt;code&gt;robots.txt&lt;/code&gt;, rate limits, and each site's terms. "The agent &lt;em&gt;can&lt;/em&gt; reach it" isn't "the agent &lt;em&gt;should&lt;/em&gt;."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no CAPTCHA-solving tool&lt;/strong&gt;, and none is planned. If a challenge fires, that's a signal to back off — not to fight it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No login/credential-wall automation.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing here auto-detects a block.&lt;/strong&gt; If a page comes back looking wrong, &lt;em&gt;the agent&lt;/em&gt; reads the content, judges it, and calls &lt;code&gt;aethyn_new_identity&lt;/code&gt;. That's a deliberate choice — I'd rather the model make that call visibly than have the tool silently paper over it.&lt;/li&gt;
&lt;li&gt;A residential exit fixes your &lt;strong&gt;network vantage point&lt;/strong&gt;. It doesn't fix reckless pacing or a client that looks robotic in every other way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; aethyn-browser-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop the config block in your MCP client, and your agent can pick a country on its very next tool call.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full walkthrough + runnable examples:&lt;/strong&gt; &lt;a href="https://www.aethyn.io/docs/browser-mcp?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=browser-mcp&amp;amp;utm_content=docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The deeper writeup:&lt;/strong&gt; &lt;a href="https://www.aethyn.io/blog/residential-proxy-browser-mcp-for-ai-agents?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=browser-mcp&amp;amp;utm_content=intro" rel="noopener noreferrer"&gt;Residential proxy browser MCP for AI agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source (MIT):&lt;/strong&gt; &lt;a href="https://github.com/aethynio/aethyn-browser-mcp" rel="noopener noreferrer"&gt;github.com/aethynio/aethyn-browser-mcp&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/aethyn-browser-mcp" rel="noopener noreferrer"&gt;npm&lt;/a&gt; · &lt;a href="https://glama.ai/mcp/servers/aethynio/aethyn-browser-mcp" rel="noopener noreferrer"&gt;Glama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free account, no card:&lt;/strong&gt; &lt;a href="https://www.aethyn.io/signup?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=browser-mcp&amp;amp;utm_content=cta" rel="noopener noreferrer"&gt;aethyn.io/signup&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something with it — or it breaks in an interesting way — I'd like to hear about it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Residential Proxy "Pool Size" Myth — Why 100M+ IPs Tells You Almost Nothing</title>
      <dc:creator>Aethyn Team</dc:creator>
      <pubDate>Wed, 08 Jul 2026 16:03:38 +0000</pubDate>
      <link>https://dev.to/aethyn_team/the-residential-proxy-pool-size-myth-why-100m-ips-tells-you-almost-nothing-4di0</link>
      <guid>https://dev.to/aethyn_team/the-residential-proxy-pool-size-myth-why-100m-ips-tells-you-almost-nothing-4di0</guid>
      <description>&lt;p&gt;Open any residential proxy provider's homepage and the first thing you see is a number. 50 million IPs. 100 million. "The largest residential network in the world." It's the industry's favourite headline — and one of the &lt;em&gt;weakest&lt;/em&gt; predictors of whether your scraper actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the "pool size" number actually measures &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;That headline figure is almost always a &lt;strong&gt;cumulative count of unique IPs seen over a rolling 30-day window&lt;/strong&gt; — not a live inventory. Three things follow, none of which make the marketing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's self-reported and unaudited.&lt;/strong&gt; No standard for what counts as an IP, over what window. Two networks drawing on the &lt;em&gt;same&lt;/em&gt; underlying supply can honestly print wildly different numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The incentive only runs one way.&lt;/strong&gt; Nobody ever chose a provider for a &lt;em&gt;smaller&lt;/em&gt; pool. Every incentive pushes the number up — the exact condition under which a metric stops meaning anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody publishes the number that matters:&lt;/strong&gt; &lt;em&gt;concurrent&lt;/em&gt; addresses available in your country, right now. That's a fraction of the headline and you'll never see it on a pricing page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fw%3D1200%26q%3D80%26auto%3Dformat%26fit%3Dcrop" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1558494949-ef010cbdcc31%3Fw%3D1200%26q%3D80%26auto%3Dformat%26fit%3Dcrop" alt="Network cabling in a data center" width="1200" height="673"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;The headline IP count is a marketing decision, not a measurement.
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the number can't predict success &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The target never sees your pool. &lt;strong&gt;It sees one IP — the one you're using right now — and it scores that single address.&lt;/strong&gt; Modern anti-bot systems judge a request on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Is this a residential IP at all?&lt;/strong&gt; The ASN instantly separates a real consumer ISP from a datacenter range. Datacenter IPs are blocked on sight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's this IP's reputation?&lt;/strong&gt; Fraud-score databases flag addresses recently tied to abuse or automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Has this IP already misbehaved here?&lt;/strong&gt; A recycled exit that hammered the target yesterday is treated very differently from a quiet one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the story consistent?&lt;/strong&gt; An IP geolocating to one country while headers/timezone claim another is a tell.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those is pool size. A huge pool full of recycled or flagged addresses performs &lt;strong&gt;worse&lt;/strong&gt; than a smaller, clean one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake that ruins your data: trusting the status code &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Internalise this before you benchmark anything: &lt;strong&gt;a 200 is not success.&lt;/strong&gt; Modern defenses "soft-block" — a 200 with a CAPTCHA interstitial, a stripped decoy, or an empty shell. Measure success on &lt;strong&gt;content&lt;/strong&gt;, not status:&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;requests&lt;/span&gt;

&lt;span class="n"&gt;PROXY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://USER:PASS@proxy.example.com:PORT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# your provider's endpoint
&lt;/span&gt;&lt;span class="n"&gt;proxies&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;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROXY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROXY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_real_success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positive_token&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;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;block_signals&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;captcha&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;unusual traffic&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;access denied&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;are you a robot&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="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;block_signals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;positive_token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;   &lt;span class="c1"&gt;# something ONLY a real page has
&lt;/span&gt;
&lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...]&lt;/span&gt;          &lt;span class="c1"&gt;# YOUR real URLs — not httpbin, not the vendor demo
&lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add to cart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# a string unique to a genuine page on YOUR target
&lt;/span&gt;
&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_real_success&lt;/span&gt;&lt;span class="p"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;TOKEN&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;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;targets&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content-verified success rate: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&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;targets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&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;That percentage — success on &lt;em&gt;your&lt;/em&gt; sites, verified on content — is the number the entire industry's marketing exists to distract you from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check what you're actually handed &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Pull the exit IP and inspect it. This is where "big pool, dirty IPs" gets exposed in thirty seconds:&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="n"&gt;ip&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;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;https://api.ipify.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit IP:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Look that IP up in any public IP-reputation / fraud-score tool and confirm:
#   1. ASN is a consumer ISP (not AWS/GCP/a hosting provider)
#   2. it geolocates where you asked
#   3. it isn't already flagged for abuse
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1682559736721-c2e77ff4c650%3Fw%3D1200%26q%3D80%26auto%3Dformat%26fit%3Dcrop" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1682559736721-c2e77ff4c650%3Fw%3D1200%26q%3D80%26auto%3Dformat%26fit%3Dcrop" alt="Cables connected to a rack of servers" width="1200" height="627"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Spot-check the exits you're served — reputation beats raw count every time.
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one question a provider can't dodge &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Ask &lt;strong&gt;where the IPs come from — and don't accept a non-answer.&lt;/strong&gt; IPs from users who gave informed, opt-in consent behave like the real people they belong to and carry the reputation to match. IPs harvested from compromised devices are a botnet: already flagged, ethically indefensible, and a legal liability you inherit. A clean sourcing story is either documented or it isn't. A network that leads with a pool-size number and goes quiet on sourcing has told you which one it optimised for.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — what to judge a network on &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Success rate on &lt;em&gt;your&lt;/em&gt; targets&lt;/strong&gt;, verified on content (not status).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP reputation&lt;/strong&gt; — spot-check exits against a fraud-score tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sourcing&lt;/strong&gt; — consented/opt-in, not mystery pools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency where you need it&lt;/strong&gt;, not a global cumulative total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-GB pricing you can forecast&lt;/strong&gt; — if you need a sales call to see a price, you can't model cost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whatever wins that test is your provider. Pool size never enters the calculation — because it was never in the target's calculation either.&lt;/p&gt;




&lt;h3&gt;
  
  
  About Aethyn
&lt;/h3&gt;

&lt;p&gt;I help build &lt;strong&gt;&lt;a href="https://www.aethyn.io/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pool-size-myth"&gt;Aethyn&lt;/a&gt;&lt;/strong&gt; — residential proxies built for engineers, not a marketing slide. One unified endpoint, country/city/session targeting encoded in the username, &lt;strong&gt;transparent per-GB pricing&lt;/strong&gt; (€2.00/GB Premium, €4.50/GB Elite), and a &lt;strong&gt;free trial, no card&lt;/strong&gt;. We deliberately &lt;em&gt;don't&lt;/em&gt; lead with an IP-count — we'd rather you run the benchmark above on your own targets.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Try it on your own targets:&lt;/strong&gt; &lt;a href="https://www.aethyn.io/signup?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pool-size-myth"&gt;aethyn.io — free, no card&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.aethyn.io/blog/residential-proxy-pool-size-myth?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pool-size-myth"&gt;aethyn.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images via &lt;a href="https://unsplash.com/s/photos/data-center-network" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt; (free license).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>proxy</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
