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.com
HTTP/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 opensHow 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 proxyWhile that request is in flight
A SOCKS5 connectionThe 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:

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.

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 showsWhat it meansWhat to do
Peak well below the limit, none turned awayThe plan has roomNothing
A few refusals on a few minutes a weekShort bursts above the limitCap your tool's concurrency at the limit
Minutes at limit across many hoursThe work needs more concurrency than the plan hasAdd capacity
Open now near the limit while your jobs are idleIdle connections are being held openShorten 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:

  1. 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.
  2. Reuse connections. One session per worker, with keep-alive on, sends many requests down one tunnel.
  3. Close what you finish with. Close sessions at the end of a job, and give pooled connections a short idle timeout.
  4. 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.