Skip to main content

NodeMaven

nodemaven

Builds the proxy username a gateway expects, and refuses the input it would silently drop.

pypi python

license

Quickstart · Sticky sessions · Why the validation is the point · What it does not do · Docs

Build and validate proxy connection strings.

This library opens no socket. It builds the username a proxy gateway expects, refuses the input that gateway would mishandle, and hands the result to whatever HTTP client you already use.

pip install nodemaven

Quickstart

login and password are the Proxy Username and Proxy Password assigned under Proxy Setup in the dashboard - a separate pair from the account you sign in with. The other option there is IP whitelisting, which needs no credentials in the username at all; both are described in authentication methods.

Everything below except this first snippet builds strings offline and runs without an account.

import requests
from nodemaven import Proxy

proxy = Proxy(login="your-login", password="your-password",
              country="us", filter="medium")

r = requests.get("https://api.ipify.org", proxies=proxy.requests())
print(r.text)

Credentials can come from the environment instead, so nothing is in your source:

# NODEMAVEN_LOGIN and NODEMAVEN_PASSWORD
proxy = Proxy(country="us", filter="medium")

The same identity, for other clients:

proxy.url()          # http://user:pass@gate.nodemaven.com:8080  - httpx, aiohttp, curl
proxy.requests()     # {"http": ..., "https": ...}
proxy.httpx()        # {"http://": ..., "https://": ...}
proxy.playwright()   # {"server": ..., "username": ..., "password": ...}
proxy.username       # the username on its own
proxy.server         # host:port, no credentials

With Playwright, Patchright or Puppeteer:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context(proxy=proxy.playwright())

Sticky sessions

One Proxy is one identity. Pin it to a sticky session:

held = proxy.session("order4417")

A session id cannot contain the character the gateway separates parameters with, which for this one is -, and passing one raises rather than connecting. That is measured and not a precaution: on 2026-08-20 a probe opened tunnels with sid-order8e3bf9-4417 and with sid-order8e3bf9, four rounds each, interleaved, and both landed on one exit address while a third arm spelled sid-order8e3bf94417 held a different one throughout. The gateway cuts the value at the separator and reads the rest as something else, so every order id beginning order would quietly share one session and one exit.

The session key is the whole parameter set, not the session id. country=us, sid=A and country=us, sid=A, filter=medium are two different sessions on the gateway, so adding or removing any parameter moves you to a different exit address. That is why parameters change through a method that returns a new object rather than by assignment - the move is a different identity, and the code should say so:

germany = proxy.replace(country="de")   # a new identity, a new exit
plain   = proxy.replace(filter=None)    # also a new identity

Why the validation is the point

A gateway is bad at telling you that you got the username wrong. Measured against this one on 2026-08-10, seven kinds of bad input produce seven different reactions and not one of them names the cause:

you sent the gateway answers
bad country 406 Not Acceptable
bad region 406 Not Acceptable
bad city 500 Internal Server Error
bad filter value 407 Proxy Authentication Required
bad ttl value 407 Proxy Authentication Required
empty value nothing, the connection hangs about 20 s
unknown parameter name 200, and the parameter is ignored

The two 407 replies send you to check credentials that are correct. The last row is worse than any of them: the request succeeds, your code carries on, and the setting you asked for was never applied. Nothing that comes back over the wire can tell you.

So this library checks before anything is sent:

>>> Proxy(login="u", password="p", contry="us")
ParamError: NodeMaven does not know the parameter 'contry': it is answered with
200 and dropped, so the connection would succeed and your setting would NOT be
applied. Known: ['city', 'country', 'filter', 'ipv4', 'isp', 'region', 'sid',
'speed', 'ttl']

What this library does not do

It does not retry. That is deliberate, and it is the one design decision here taken against a measurement rather than a preference.

Retrying a refused request is the thing that most reliably makes the next one worse: each retry confirms automation to the target and burns the exit range for everyone else sharing the pool. Measured over 1464 attempts, the chance that the next attempt succeeds, by how many failures came immediately before it:

failures before P(next attempt succeeds)
0 75%
1 21%
3 5.9%
5 5.8%
6 1.6%
7-9 0.5%

294 attempts were spent past six consecutive failures and returned 3 pages - 98 attempts per delivered page, against 1.7 in a healthy session. A library that shipped automatic retry as a default would be spending that on your behalf without telling you.

It also does not own an HTTP client, a connection pool or a browser. Those are yours, and they are better than anything a vendor SDK would bundle.

Other gateways

Parameters are data, not hardcoded keywords. A gateway is one TOML file - its prefix, separators, session parameter and the set of parameter names it actually recognises - and a definition read from disk goes through the same builder and the same validation as the one shipped here:

from nodemaven import Proxy, load_file

mine = load_file("my-gateway.toml")
proxy = Proxy(provider=mine, login="u", password="p", country="us")

Every definition carries a status. measured means traffic has gone through that gateway and the dialect was read off the wire. documented means it was transcribed from documentation and never exercised. Only nodemaven is shipped here, and it is measured.

Requirements

Python 3.9 or newer. No dependencies on 3.11 and newer; tomli on older ones.

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nodemaven-0.1.2.tar.gz (22.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nodemaven-0.1.2-py3-none-any.whl (17.9 kB view details)

Uploaded Python 3

File details

Details for the file nodemaven-0.1.2.tar.gz.

File metadata

  • Download URL: nodemaven-0.1.2.tar.gz
  • Upload date:
  • Size: 22.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nodemaven-0.1.2.tar.gz
Algorithm Hash digest
SHA256 47ea341515ac2fd6da35dec01cb763147ce44192f583a7bfe9db3dd6bd4fc9e1
MD5 0de7952eaa45ed4c565600382a65577f
BLAKE2b-256 3e8cac320fc8d40ef9b08b0da1f7b6fda06535c4e5391e435c34a45edab98caa

See more details on using hashes here.

Provenance

The following attestation bundles were made for nodemaven-0.1.2.tar.gz:

Publisher: publish.yml on nodemaven/nodemaven-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nodemaven-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: nodemaven-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 17.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nodemaven-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c3b63cc6d33129dfd4679276d03525f799967897939ebe200237cca6f4ebcb04
MD5 0c511b1148b3e75a7700a1fcef722db9
BLAKE2b-256 73b7cbeaad847a388c4d9dcab50453572d3d5c940d8ee3ee29d96184993676e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for nodemaven-0.1.2-py3-none-any.whl:

Publisher: publish.yml on nodemaven/nodemaven-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page