Rotating Unmetered Connection Limits and Live Connections
What counts as a connection on Rotating Unmetered, what happens when you reach your plan's limit, and how to read the live connections panel.
A Rotating Unmetered plan is sized by concurrent connections: the number on your plan is how many connections your account can hold open through the gateway at the same moment. Bytes are not metered. When every connection is in use, the next one is refused with HTTP 429 (or a SOCKS5 "not allowed" reply) and the connections already open carry on normally. Close some, lower your tool's concurrency, or add capacity, and the refusals stop.
You need an active Rotating Unmetered plan. The live figures are on the Proxies page, on the Rotating Unmetered tab.
Recognize a refusal
A connection refused at the limit names itself. Over HTTP the gateway answers before any exit is picked:
curl -s -o /dev/null -D - -x "http://USERNAME:PASSWORD@gw-rotating_unmetered.node4.io:PORT" https://example.comHTTP/1.1 429 Too Many Requests
X-Node4-Conn-Limit: reached; plan allows <your limit>PORT is the HTTP port shown for Rotating Unmetered on the Proxies page. The body of the refusal says the same thing in words: the account is already using every connection its plan allows, and existing connections are unaffected.
Your tool may report this as a proxy error, a 429 or a timeout, and a scraper often describes it as "everything slows down above a certain thread count". The X-Node4-Conn-Limit header is how you tell it apart from a target rate-limiting you, which is a different 429 that arrives from the destination with no Node4 header. Over SOCKS5 the refusal is reply code 0x02, "connection not allowed by ruleset"; the same code is used for a wrong password, so check the live panel to see which one you hit.
Retrying straight away does not help. Every retry is another attempt against a full allowance, and it adds to the "Turned away" count.
What counts as a connection
Rotation on the gateway happens per connection, and so does counting:
| What your tool opens | How long it holds a slot |
|---|---|
An HTTPS request through the proxy (a CONNECT tunnel) | The whole life of the tunnel, including idle time while it is kept alive |
| A plain-HTTP request through the proxy | While that request is in flight |
| A SOCKS5 connection | The whole life of the connection |
Many requests sent down one kept-alive tunnel use one slot and share one exit. A tunnel left open and idle still holds its slot, so an HTTP client that keeps a large pool of idle connections can sit at the limit while sending almost nothing.
The limit belongs to the account, not to a credential or a server:
- Every credential set, every source address and both protocols draw on the same allowance.
- Connections are counted in one place for all gateway servers, so spreading traffic across them does not add capacity.
- Whitelisted connections count the same as password ones.
- Two Rotating Unmetered plans on one account add together, and the panel shows the combined limit.
A connection that drops without closing cleanly, for example when a process is killed, keeps its slot for about 90 seconds and is then released on its own.
Read the live connections panel
The Live connections panel on the Rotating Unmetered tab is drawn from the same count the gateway enforces.
- Open now shows open connections against your limit, with a meter labeled Headroom, Near limit or At limit, and the number still free.
- Peak is the most connections open at once in the selected range, and when that was.
- Turned away counts connections refused at your limit.
- Minutes at limit counts the minutes with at least one refusal, out of the minutes your account was active.
- Peak headroom is how far below the limit your busiest moment stayed.
The chart plots peak open connections against connections turned away. The range buttons switch between 1H, 24H, 7D and 30D; history is kept for 35 days. If the panel says the live count is unavailable, the counter could not be read for a moment. Your traffic is unaffected and the limit is still enforced.
| What the panel shows | What it means | What to do |
|---|---|---|
| Peak well below the limit, none turned away | The plan has room | Nothing |
| A few refusals on a few minutes a week | Short bursts above the limit | Cap your tool's concurrency at the limit |
| Minutes at limit across many hours | The work needs more concurrency than the plan has | Add capacity |
| Open now near the limit while your jobs are idle | Idle connections are being held open | Shorten your client's idle timeout or close sessions when a job ends |
When connections were turned away in the selected range, a banner above the panel says how many and offers an Add capacity button for the plan size that covers the shortfall.
The connection limit email
"Your proxies are hitting their connection limit" is sent when connections were refused across several minutes of the past 24 hours. It shows your limit, how many connections were turned away and how many minutes you spent at the limit, and it suggests the smallest plan to add to cover what your tools tried to open in their worst minute. It is sent at most once a week, together with an in-app notification and the connections.limit_reached webhook.
The email does not mean anything has been switched off. It means your tools asked for more connections than the plan holds, and those extra connections failed. Transactional emails can be turned off under Settings > Email Preferences; the panel keeps the same figures either way.
Open fewer connections
Most refusals come from a concurrency setting higher than the plan, or from connections left open. In order of effect:
- Set your tool's concurrency at or below your limit. In Scrapy that is
CONCURRENT_REQUESTS; in a thread pool it is the number of workers. - Reuse connections. One session per worker, with keep-alive on, sends many requests down one tunnel.
- Close what you finish with. Close sessions at the end of a job, and give pooled connections a short idle timeout.
- Back off on a gateway
429. Wait a second or two before retrying, instead of retrying in a tight loop.
A Python worker pool that stays inside the limit:
import requests
from concurrent.futures import ThreadPoolExecutor
PROXY = "http://USERNAME:PASSWORD@gw-rotating_unmetered.node4.io:PORT"
WORKERS = 200 # at or below your plan's connection count
def worker(urls):
# One session per worker: its requests reuse one tunnel per destination,
# and closing it at the end leaves nothing open.
with requests.Session() as s:
s.proxies = {"http": PROXY, "https": PROXY}
return [s.get(url, timeout=30).status_code for url in urls]
def run(urls):
chunks = [urls[i::WORKERS] for i in range(WORKERS)]
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
return [code for codes in pool.map(worker, chunks) for code in codes]Each worker holds one session, so the pool never has more than WORKERS connections to a destination open at once. Requests to several destinations from one session open one tunnel per destination, so keep that in mind when a worker visits many hosts. Reusing a tunnel also keeps its exit; if every request needs a new address, open a new connection per request and keep the worker count at your limit. Python proxy integration and Node.js proxy setup show the session setup in more detail, and high-concurrency proxies covers sizing a crawler.
Add capacity
When the panel shows refusals across many minutes, the work needs a bigger allowance. Plans stack, so the simplest step is to add a second Rotating Unmetered plan: your limit rises by its size the moment it is active, and the hostname, ports and credential stay the same. Buy it from the Plans page or with the Add capacity button on the panel.
The plan sizes include $29.00/month for 250 connections ($0.116 per connection), $99.00/month for 1,200 connections ($0.082 per connection) and $249.00/month for 4,000 connections ($0.062 per connection); every size is on Rotating Unmetered pricing. To replace your current plan with a larger one instead of adding to it, open a ticket; changing or upgrading your plan explains how that works.
If your traffic needs only a few connections but moves a lot of data, or the reverse, compare the two rotating meters in per-GB or unmetered pricing. Both products take the same -country- targeting, described in choosing and changing proxy locations; see rotating proxies.
Watch it from the API
The figures on the panel are also available from the REST API. GET /connections/live returns the open count, the limit and recent refusals, and GET /connections/history returns the series for a range. Building proxy strings with the gateway API has examples of both, the field list is in the API reference, and receiving Node4 webhooks shows how to act on connections.limit_reached instead of polling.
If refusals continue after your concurrency is below the limit and the panel shows connections open while your jobs are stopped, open a ticket from Support with the time it happened. Support runs 24/7 and replies within 12 hours. For errors that are not 429, start with connection issues.