<?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: proxymint</title>
    <description>The latest articles on DEV Community by proxymint (@proxymint).</description>
    <link>https://dev.to/proxymint</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%2F4165857%2F5fdb37fe-0d53-4f05-ba3c-4c224bfcc5d3.png</url>
      <title>DEV Community: proxymint</title>
      <link>https://dev.to/proxymint</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/proxymint"/>
    <language>en</language>
    <item>
      <title>Web scraping architecture: components, patterns and proxies</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Mon, 02 Nov 2026 12:06:08 +0000</pubDate>
      <link>https://dev.to/proxymint/web-scraping-architecture-components-patterns-and-proxies-c1a</link>
      <guid>https://dev.to/proxymint/web-scraping-architecture-components-patterns-and-proxies-c1a</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/web-scraping-architecture/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Web scraping architecture splits a scraper into scheduler, fetcher, parser, storage and monitoring layers. How it changes with scale, and where proxies belong.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five components, five failure modes.&lt;/strong&gt; A scraping system splits into a scheduler and queue, a fetcher with its proxy layer, a parser with validation, storage, and monitoring. Each one gets its own metrics and retry rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits live in the scheduler.&lt;/strong&gt; A concurrency budget per target domain, enforced centrally, keeps every worker inside it. Adding exit IPs never raises that budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The proxy layer is an interface, not a loop.&lt;/strong&gt; Workers ask for an egress by job type and country; rotation is chosen per job shape and DNS resolves at the proxy with CONNECT or socks5h.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some errors mean stop.&lt;/strong&gt; A 429 means wait as long as Retry-After says; a 403 or challenge page means the job for that target stops and a person reviews access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check for an official API or data export first.&lt;/strong&gt; Scraping is the fallback for public pages where no such route exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store raw responses before parsing.&lt;/strong&gt; A broken selector then costs a replay over stored pages, with no new requests to the target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce robots.txt and per-domain budgets before the queue.&lt;/strong&gt; Cache robots.txt for at most 24 hours, as RFC 9309 says, and share one limiter across all workers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give each job shape its own egress profile.&lt;/strong&gt; A new IP per request for independent pages, a timed session for paginated flows, a static address for long logins on accounts the team owns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert on change per layer.&lt;/strong&gt; Parse yield, 429 share per domain and data freshness catch problems the day they start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/web-scraping-architecture/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Puppeteer proxy setup: launch flag, auth, contexts, SOCKS5 and rotation</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Mon, 02 Nov 2026 08:06:05 +0000</pubDate>
      <link>https://dev.to/proxymint/puppeteer-proxy-setup-launch-flag-auth-contexts-socks5-and-rotation-22db</link>
      <guid>https://dev.to/proxymint/puppeteer-proxy-setup-launch-flag-auth-contexts-socks5-and-rotation-22db</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/puppeteer-proxy/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Set a Puppeteer proxy with --proxy-server or per browser context, authenticate with page.authenticate, fix 407 and SOCKS5 errors, and rotate by context.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puppeteer takes a proxy per browser or per context.&lt;/strong&gt; The --proxy-server launch flag covers the whole browser, and createBrowserContext({ proxyServer }) gives one isolated context its own exit inside the same browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credentials go through page.authenticate, never the flag.&lt;/strong&gt; Chrome does not use credentials embedded in proxy settings, and a user:pass@ URL in --proxy-server fails with net::ERR_NO_SUPPORTED_PROXIES.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A missing authenticate call looks like a network error.&lt;/strong&gt; Current Chrome reports net::ERR_INVALID_AUTH_CREDENTIALS on HTTP pages and net::ERR_TUNNEL_CONNECTION_FAILED on HTTPS pages, not a 407 status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOCKS5 with a password does not work in Chrome.&lt;/strong&gt; Chrome supports no SOCKSv5 authentication methods, so a password-protected SOCKS5 server fails with net::ERR_SOCKS_CONNECTION_FAILED whatever page.authenticate says.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome allows 32 simultaneous connections through an HTTP/1.1 proxy.&lt;/strong&gt; Heavy parallel work in one browser queues inside Chrome before the proxy sees it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Call page.authenticate on every page before goto.&lt;/strong&gt; Cached credentials can make a forgotten call pass in testing and fail on a fresh context in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give each identity its own context.&lt;/strong&gt; Rotate by closing the context and opening the next on a fresh sticky session, so the IP, cookies and cache change together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the HTTP endpoint when SOCKS5 needs a password.&lt;/strong&gt; HTTPS pages still run end to end through the CONNECT tunnel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the exit before the job runs.&lt;/strong&gt; Assert the country inside the page, and set Accept-Language for the market whose pages the job reads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block images, fonts and media before sizing the plan.&lt;/strong&gt; Request interception works alongside page.authenticate and cuts the bytes a per-GB tier bills.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/puppeteer-proxy/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Browser profile proxy setup: one proxy, WebRTC and DNS</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sun, 01 Nov 2026 12:06:06 +0000</pubDate>
      <link>https://dev.to/proxymint/browser-profile-proxy-setup-one-proxy-webrtc-and-dns-2gn4</link>
      <guid>https://dev.to/proxymint/browser-profile-proxy-setup-one-proxy-webrtc-and-dns-2gn4</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/browser-profile-proxy-setup/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Set up one proxy per browser profile: own credentials per profile, the proxy type for each job, and how to check WebRTC, DNS and language before login.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A browser profile proxy setup gives each profile its own proxy.&lt;/strong&gt; The profile keeps its own cookies, saved logins and settings such as language; the proxy decides where its traffic leaves from: IP, network, country and city.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One profile, one proxy, one set of credentials.&lt;/strong&gt; Each client's sessions stay on one consistent address, and no profile carries another client's proxy login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the tier by the job.&lt;/strong&gt; ISP for long-lived logins, residential with a sticky timer for logged-out ad checks, mobile for app-first accounts, datacenter IPv4 for QA on your own sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebRTC and DNS are the usual leaks.&lt;/strong&gt; RFC 8828 notes that HTTP and most SOCKS proxies carry no UDP, so set WebRTC to proxy-only, and confirm that names resolve on the proxy side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify inside the launched profile before the first login.&lt;/strong&gt; Check exit IP, language, WebRTC, DNS resolver and IPv6, and run it again after any exit change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assign exactly one proxy to each profile.&lt;/strong&gt; Name the profile after the client or market, paste host, port, username and password, and use the http:// scheme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep credentials per profile.&lt;/strong&gt; A static ISP IP comes with its own username and password; on per-GB tiers give each profile its own port and each client its own order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set the language for the market.&lt;/strong&gt; The profile language drives navigator.language and Accept-Language; set it to the market whose pages the job needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch WebRTC to proxy-only or address replacement.&lt;/strong&gt; Never leave the default that routes WebRTC from the host network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the platform's own access route first.&lt;/strong&gt; Meta partner access and Google Ads manager accounts often remove the need for a separate profile holding a client's login.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/browser-profile-proxy-setup/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Backconnect proxy: one gateway, many exit IPs, how to test</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sun, 01 Nov 2026 08:06:04 +0000</pubDate>
      <link>https://dev.to/proxymint/backconnect-proxy-one-gateway-many-exit-ips-how-to-test-12ek</link>
      <guid>https://dev.to/proxymint/backconnect-proxy-one-gateway-many-exit-ips-how-to-test-12ek</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/backconnect-proxy/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A backconnect proxy is one gateway address that routes your traffic to exit IPs from a pool. Gateway vs exit, rotation, proxy lists, and how to test one.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A backconnect proxy is one gateway address with a pool of exit IPs behind it.&lt;/strong&gt; Your client configures the gateway, and the target only ever sees the exit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The port is the unit you work with.&lt;/strong&gt; On a list-based gateway every line shares one host and one login and differs by port, so parallel sessions mean more ports, not more logins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotation is a setting, not a different product.&lt;/strong&gt; The same gateway rotates per request, on a 5-60 minute timer, or holds an exit while the device stays online.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test before you scale.&lt;/strong&gt; A short script shows whether rotation follows requests or connections, how ports spread over exits, and how long sticky ports hold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick the mode by the longest step that must share an IP.&lt;/strong&gt; Then write the client to survive an early IP change, because a device can drop before the timer ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give each browser context or worker its own port.&lt;/strong&gt; Keep per-request rotation away from live pages that load many assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use http:// or socks5h:// in the proxy URL.&lt;/strong&gt; Names then resolve on the proxy side, and HTTPS targets stay encrypted inside the tunnel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move identity that must hold for days to an ISP address.&lt;/strong&gt; A gateway gives short windows, not a fixed IP for weeks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/backconnect-proxy/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>What network error sent you looking in the wrong place?</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sat, 31 Oct 2026 20:02:59 +0000</pubDate>
      <link>https://dev.to/proxymint/what-network-error-sent-you-looking-in-the-wrong-place-40d</link>
      <guid>https://dev.to/proxymint/what-network-error-sent-you-looking-in-the-wrong-place-40d</guid>
      <description>&lt;p&gt;The network bugs that eat a whole day tend to have the same shape: the error points at the wrong layer.&lt;/p&gt;

&lt;p&gt;A 407 that looks like the site blocking you, when it's the proxy refusing a password with an unencoded &lt;code&gt;@&lt;/code&gt; in it. A scraper that works on a laptop and times out on a server because the server's DNS resolver is somewhere else entirely. A curl call that exits 0 while the request never reached the site. A redirect loop that only Chrome sees, because of an HTTPS record nobody knew was published.&lt;/p&gt;

&lt;p&gt;So we're curious what yours was. What's the network or proxy error that sent you looking in completely the wrong place, and what was it actually?&lt;/p&gt;

&lt;p&gt;Bonus points for the one-line fix at the end. We'll read every answer and reply to each one.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>networking</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>curl through a proxy can exit 0 when the login fails</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:41:59 +0000</pubDate>
      <link>https://dev.to/proxymint/curl-through-a-proxy-can-exit-0-when-the-login-fails-c98</link>
      <guid>https://dev.to/proxymint/curl-through-a-proxy-can-exit-0-when-the-login-fails-c98</guid>
      <description>&lt;p&gt;Small thing that probably bites a lot of cron jobs out there: curl through a proxy, wrong password, and &lt;code&gt;$?&lt;/code&gt; is 0.&lt;/p&gt;

&lt;p&gt;No crash, no stderr. The output file just has an empty 407 in it where the page should be, and whatever reads that file next is going to have a bad day.&lt;/p&gt;

&lt;p&gt;I wanted to know exactly when this happens, so I wrote a fake proxy that refuses everyone and pointed curl 8.7.1 at it.&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="c1"&gt;# p407.py - a fake proxy that refuses every login
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;http.server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socketserver&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;H&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseHTTPRequestHandler&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;refuse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;407&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Proxy-Authenticate&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;Basic realm=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;p&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Length&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;0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end_headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;do_GET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;do_CONNECT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;do_HEAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;refuse&lt;/span&gt;

&lt;span class="n"&gt;socketserver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TCPServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18407&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;serve_forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  http:// target: exit 0
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; out.html &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; http://user:pass@127.0.0.1:18407 http://example.com/
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exit &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&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 shell"&gt;&lt;code&gt;407
&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yep. With a plain http URL curl hands the whole request to the proxy, the proxy says 407, and that comes back like any other response. curl got an answer, job done. Bad password, an &lt;code&gt;@&lt;/code&gt; in the password nobody encoded, plan ran out, doesn't matter, your script sees a clean exit.&lt;/p&gt;

&lt;h2&gt;
  
  
  -f fixes it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sf&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; out.html &lt;span class="nt"&gt;-x&lt;/span&gt; http://user:pass@127.0.0.1:18407 http://example.com/
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exit &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-f&lt;/code&gt; tells curl that 400 and up is a failure, so you get 22. &lt;code&gt;--fail-with-body&lt;/code&gt; does the same but keeps the body, handy when you want to see what the proxy actually said.&lt;/p&gt;

&lt;h2&gt;
  
  
  https:// target: fails anyway, different number
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-x&lt;/span&gt; http://user:pass@127.0.0.1:18407 https://example.com/
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exit &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&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 plaintext"&gt;&lt;code&gt;curl: (56) CONNECT tunnel failed, response 407
exit 56
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here curl has to ask the proxy for a tunnel first (CONNECT), and the 407 shows up before TLS even starts, so there's nothing to pretend about. 56 on 8.7.1. We got 7 for the same thing on 8.21.0, so if your script matches exact numbers, don't. Non-zero means it broke.&lt;/p&gt;

&lt;p&gt;Honestly the https case isn't the scary one. The scary one is the cheap health check or the old scraper hitting an http endpoint, because that's where it fails quietly for days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix I'd use
&lt;/h2&gt;

&lt;p&gt;Check the status code too, not only the exit code:&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;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; out.html &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}'&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PROXY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; 400 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"failed: exit=&lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="s2"&gt; status=&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just &lt;code&gt;-f&lt;/code&gt; plus &lt;code&gt;set -e&lt;/code&gt; if you like it short.&lt;/p&gt;

&lt;p&gt;Two neighbours of this bug:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOCKS5 can't give you a 407 at all, there's no HTTP in between. A bad login there is &lt;code&gt;curl: (97) User was rejected by the SOCKS5 server&lt;/code&gt;. Other number, same problem.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p@ss&lt;/code&gt; in a proxy URL has to be &lt;code&gt;p%40ss&lt;/code&gt;. Otherwise curl cuts the URL at the wrong &lt;code&gt;@&lt;/code&gt;, sends a username the proxy has never heard of, and you're staring at a 407 for a password you know is right.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We wrote up the rest of curl-through-a-proxy (socks5 vs socks5h and DNS leaks, &lt;code&gt;--noproxy&lt;/code&gt;, timing each hop with &lt;code&gt;-w&lt;/code&gt;, a five-command check that tells you which layer broke) here: &lt;a href="https://proxymint.com/curl-proxy/" rel="noopener noreferrer"&gt;curl proxy: -x, auth, SOCKS5, timing and exit codes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on proxymint, a proxy service. None of the above depends on whose proxy it is.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>curl</category>
      <category>bash</category>
      <category>devops</category>
      <category>networking</category>
    </item>
    <item>
      <title>How many proxies do I need? A sizing formula by job</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sat, 31 Oct 2026 12:06:05 +0000</pubDate>
      <link>https://dev.to/proxymint/how-many-proxies-do-i-need-a-sizing-formula-by-job-h2d</link>
      <guid>https://dev.to/proxymint/how-many-proxies-do-i-need-a-sizing-formula-by-job-h2d</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/how-many-proxies-do-i-need/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How many proxies you need depends on the job: requests per hour, concurrent sessions, accounts or GB. Formulas, a pilot test and a worked example for each job.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The count depends on the billing model.&lt;/strong&gt; Static ISP and datacenter IPv4 sell IPs, so the number is literal; rotating residential and mobile sell GB, so the pool supplies the IPs and the job sizes traffic and sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For collection, size by concurrency, not by a per-IP rate.&lt;/strong&gt; Rented IPs equal requests in flight divided by the connections one IP carries, at least one per country, plus a 10-30% reserve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The target sets the pace for the whole job.&lt;/strong&gt; Its terms, API limits and robots.txt decide it; a 429, block page or challenge in the pilot means slow down or stop, not add IPs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounts need one static IP per login location, not per account.&lt;/strong&gt; Teams using the platform's own team or partner access from their own office often need none.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name the billing model first.&lt;/strong&gt; Decide whether the order buys IPs or GB before running any formula, because the question changes with it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size for peak and for concurrency.&lt;/strong&gt; Requests in flight equal requests per second times seconds per request, and sticky sessions need one exit per session running at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a pilot before ordering.&lt;/strong&gt; Send the job's own pace from one IP on public pages the target permits, log status codes and response times, and stop at the first 429 or challenge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat a block as a stop signal.&lt;/strong&gt; More IPs do not change a target's answer; check its terms and official API before going further.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure bytes per page on per-GB tiers.&lt;/strong&gt; A 20-page sample through the real client beats any median, and the fetch mode moves the bill far more than the pool does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/how-many-proxies-do-i-need/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Cheap datacenter proxies: billing, sizing and where they fit</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Sat, 31 Oct 2026 08:06:06 +0000</pubDate>
      <link>https://dev.to/proxymint/cheap-datacenter-proxies-billing-sizing-and-where-they-fit-36jj</link>
      <guid>https://dev.to/proxymint/cheap-datacenter-proxies-billing-sizing-and-where-they-fit-36jj</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/cheap-datacenter-proxies/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Cheap datacenter proxies are billed per IP or per GB, but value is set by how many requests return data. How to measure it, size an order and pick the tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Count useful responses, not addresses.&lt;/strong&gt; A port is billed per month, so what it returns is requests times success rate; at a 25% success rate it takes four requests to get one useful response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On lenient targets a port's bill does not follow volume.&lt;/strong&gt; A dedicated IPv4 port is billed per month with no per-GB meter, so a million requests are billed the same as ten thousand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size by concurrency and country, not by the target's limit.&lt;/strong&gt; A target's rate limit covers the whole job, so more ports never buy more pace on one site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datacenter addresses are labelled as hosting.&lt;/strong&gt; IP databases flag hosting ranges, so platforms with anti-bot scoring and strict retail challenge them on sight.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run a small-port test first.&lt;/strong&gt; Measure 2xx, 403, 429 and challenge rates on 50-100 real pages before buying bulk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size by concurrency, not by the target's limit.&lt;/strong&gt; Ports needed equals parallel workers divided by workers per port, per country; the job's total pace stays inside what the target allows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use ports for heavy pages.&lt;/strong&gt; A port has no per-GB meter, so full renders at the 2.6 MB median page weight stay flat-priced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the tier before buying.&lt;/strong&gt; Targets that score hosting ranges fit rotating residential per GB, and one-address work fits static ISP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/cheap-datacenter-proxies/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>networking</category>
      <category>devops</category>
    </item>
    <item>
      <title>Proxy error codes: which hop sent it and how to fix it</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Fri, 30 Oct 2026 12:06:05 +0000</pubDate>
      <link>https://dev.to/proxymint/proxy-error-codes-which-hop-sent-it-and-how-to-fix-it-489b</link>
      <guid>https://dev.to/proxymint/proxy-error-codes-which-hop-sent-it-and-how-to-fix-it-489b</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/proxy-error-codes/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Proxy error codes decoded by hop: which ones the proxy sends, which come from the target, how to read them with curl -v, and which ones are safe to retry.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The hop matters more than the number.&lt;/strong&gt; A request through a proxy crosses the client, the gateway, the exit and the target, and the same 502 means different things depending on which one sent it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;curl -v shows the phase.&lt;/strong&gt; On an https:// target an error that answers the CONNECT came from the proxy side; anything after 200 Connection established came from the target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some failures have no status code.&lt;/strong&gt; Refused connections, timeouts and SOCKS5 replies surface as client errors such as curl exit codes 5, 7, 28, 56 and 97.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry only what can pass.&lt;/strong&gt; 429, 503 and gateway-phase 502 or 504 are worth a backoff or a new exit; 400, 407 and refused connections are setup errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run the failing request with curl -v first.&lt;/strong&gt; It tells you whether the error came back on the CONNECT or inside the tunnel, which decides who can fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read Proxy-Status and Retry-After when present.&lt;/strong&gt; RFC 9209 lets a gateway name the failing hop and cause; Retry-After tells you how long to wait on 429 and 503.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail fast on 400, 407 and refused connections.&lt;/strong&gt; Log the exact proxy string and error, fix the setting, and keep these out of the retry loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat repeated 403s as a fit question.&lt;/strong&gt; Slow down, check the target terms and API, and match the proxy category to the network type the target accepts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/proxy-error-codes/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to choose a residential proxy provider: a buyer's checklist</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Fri, 30 Oct 2026 08:06:06 +0000</pubDate>
      <link>https://dev.to/proxymint/how-to-choose-a-residential-proxy-provider-a-buyers-checklist-88a</link>
      <guid>https://dev.to/proxymint/how-to-choose-a-residential-proxy-provider-a-buyers-checklist-88a</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/how-to-choose-a-residential-proxy-provider/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How to choose a residential proxy provider: sourcing and consent, pool depth where you need it, sessions, geo accuracy, real cost per GB and a test plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five checks decide a residential proxy provider.&lt;/strong&gt; Sourcing and consent, live supply in your cities, session controls, the real cost at your band, and a small paid test on your own target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent needs a statement, not a badge.&lt;/strong&gt; Ask how devices joined the pool, whether owners agreed, and whether they can leave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;City targeting is only as good as the target's IP database.&lt;/strong&gt; MaxMind states about 66% accuracy for US cities within 50 km, against about 99.8% at country level.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write the job down first.&lt;/strong&gt; Targets, cities, session length and monthly GB decide which provider and which tier fit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get the sourcing answer in writing.&lt;/strong&gt; Score "ethically sourced" with no consent statement as a no.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price at the GB you will actually buy.&lt;/strong&gt; Include GB expiry and refund terms, not only the banner rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test before a large order.&lt;/strong&gt; Measure success rate, concurrency, geo and exit reuse on a target you are permitted to access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check that residential is the right tier.&lt;/strong&gt; Datacenter suits lenient high-volume targets, static ISP holds one identity for days, and mobile suits mobile-only platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/how-to-choose-a-residential-proxy-provider/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Residential proxy pricing: what a GB buys for your job</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Thu, 29 Oct 2026 12:06:04 +0000</pubDate>
      <link>https://dev.to/proxymint/residential-proxy-pricing-what-a-gb-buys-for-your-job-jp</link>
      <guid>https://dev.to/proxymint/residential-proxy-pricing-what-a-gb-buys-for-your-job-jp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/residential-proxy-pricing/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Residential proxy pricing per GB explained: what a GB buys in pages, traffic per 1,000 pages, expiry and run-outs, and when another tier fits the job better.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;proxymint sells residential per GB.&lt;/strong&gt; Packages are one-off with no renewal, and the rate drops as the package grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A GB means pages only once page weight is known.&lt;/strong&gt; At the 22 KB median HTML size one GB is about 45,000 pages; at the 1.8 MB median mobile inner page it is about 550 full renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1,000 pages move as many GB as one page weighs in MB.&lt;/strong&gt; Full renders at 1.8 MB move about 1.8 GB per 1,000 pages, and the fetch method moves that far more than the package size does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing renews and no expiry is set on the GB.&lt;/strong&gt; A package bought for a quarterly job is still on the balance for the next run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Budget in pages, not GB.&lt;/strong&gt; Fetch 20 representative pages through the real client, average the bytes and multiply by the page count, plus 20-30% headroom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the fetch method before the package size.&lt;/strong&gt; HTML or JSON instead of a full render cuts the traffic per page by one or two orders of magnitude.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size the package to the job.&lt;/strong&gt; Read the rate for that quantity on the pricing page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy one package per job.&lt;/strong&gt; One package sized to the job means one order and one balance to watch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the tier to the job.&lt;/strong&gt; Lenient bulk work fits datacenter ports, and fixed-address work fits static ISP IPs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/residential-proxy-pricing/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>networking</category>
      <category>devops</category>
    </item>
    <item>
      <title>Mobile proxy pricing: what one carrier GB buys</title>
      <dc:creator>proxymint</dc:creator>
      <pubDate>Thu, 29 Oct 2026 08:06:06 +0000</pubDate>
      <link>https://dev.to/proxymint/mobile-proxy-pricing-what-one-carrier-gb-buys-3o7h</link>
      <guid>https://dev.to/proxymint/mobile-proxy-pricing-what-one-carrier-gb-buys-3o7h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://proxymint.com/mobile-proxy-pricing/" rel="noopener noreferrer"&gt;proxymint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mobile proxy pricing explained: what a carrier GB buys, how to size a job before you pay, cost per successful request, and which jobs call for mobile IPs.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile proxies are usually sold per GB.&lt;/strong&gt; On proxymint they come in one-off packages, the rate falls as the package grows, and the full table is on the pricing page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rate reflects carrier supply and trust.&lt;/strong&gt; Carriers share one public address across many subscribers with CGNAT, so platforms that score network origin treat carrier ranges carefully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bytes drive the bill.&lt;/strong&gt; A full mobile page render moves roughly 80 times the bytes of its HTML, and every retry is billed again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure cost per success.&lt;/strong&gt; Success rate and bytes per attempt on the real target decide what a job actually costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the tier to the target.&lt;/strong&gt; Mobile fits app-first platforms, mobile ad checks and QA on carrier routing; catalogs and price checks usually clear on residential.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size the job first.&lt;/strong&gt; GB needed = requests x bytes per request x a retry factor, measured on a small sample.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure success on the target.&lt;/strong&gt; A platform that scores mobile origin shows it in the success rate of a small test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test both tiers on a small package.&lt;/strong&gt; Run the same 200 to 500 permitted requests through each and record success and bytes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route desk-based account work to static ISP.&lt;/strong&gt; Fixed ISP addresses are billed per IP per month; mobile fits accounts that live in an app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy one package per job.&lt;/strong&gt; A package sized from the test covers the whole run, with no renewal and no expiry set on the GB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://proxymint.com/mobile-proxy-pricing/" rel="noopener noreferrer"&gt;Read the full guide on proxymint&lt;/a&gt;&lt;/strong&gt;, with the commands, tables and sources.&lt;/p&gt;

</description>
      <category>proxies</category>
      <category>webscraping</category>
      <category>networking</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
