# GUIDE — urnet from zero to a working proxy pool Everything here was run and measured on 2026-11-13 on a stock Windows 11 box with Python 3.11 and git-bash. Linux and macOS behave the same; differences are called out where they matter. --- ## 1. What you get | | per account | 10 accounts | |---|---|---| | traffic | 30 GiB / day (resets 00:00 UTC) | 300 GiB / day | | proxies | 5, each in its own country | 50 | | time to create | ~25 s | ~5 min | | cost | 0 — no card, no email, no captcha | 0 | Exits are residential peers (Comcast, Vodafone, Bell, KPN, Bouygues, Telia, Swisscom, SoftBank…). They are not dedicated: the exit IP can change between requests, and not every peer is a home connection — see [§8 Caveats](#8-caveats-worth-knowing). ## 2. How it works URnetwork is a P2P bandwidth network: a client ("network") buys traffic, peers supply the exits. A free network gets 30 GiB/day, and you can publish hosted proxy endpoints on top of it. The API is public and needs no browser session: ``` POST /auth/network-create {"terms": true, "product_updates": false} -> {"network": {"network_id": "...", "network_name": "february-exhaust-83", "by_jwt": "..."}} POST /auth/regenerate-seedphrase (Bearer ) -> {"seedphrase": "24 words"} # the ONLY recovery path for the account POST /account/api-key {"name": "urnet-1"} (Bearer ) -> {"api_key": "urn_..."} # long-lived key for everything below POST /network/auth-client {"description": "HTTPS proxy · US", "device_spec": "resident proxy", "proxy_config": {"initial_device_state": {"country_code": "us"}}} (Bearer ) -> {"client_id": "...", "proxy_config_result": { "https_proxy_url": "https://.crisp.bringyour.com:7155", "socks_proxy_url": "socks5h://crisp.bringyour.com:7153", "http_proxy_url": "http://crisp.bringyour.com:7154" }} GET /network/proxies (Bearer ) -> all proxies of the account GET /subscription/balance (Bearer ) -> bytes left today ``` Base URL: `https://api.bringyour.com`. Every authenticated call takes `Authorization: Bearer `. `urnet.py` wraps exactly these calls. Nothing else is required. ## 3. Install ### Windows 1. Install Python 3.8+ from python.org (tick "Add python.exe to PATH"). 2. Verify: ```bash python --version curl --version ``` `curl` ships with Windows 10 1803+ (`C:\Windows\System32\curl.exe`). If it is missing, install it, or run without proxy flags (direct mode). 3. Get the code: ```bash git clone https://git.reformboss.com/reform/ur-network-farm.git cd ur-network-farm ``` ### Linux / macOS ```bash sudo apt install -y python3 curl git # Debian/Ubuntu; brew install python curl git on macOS git clone https://git.reformboss.com/reform/ur-network-farm.git cd ur-network-farm ``` There is nothing to install for the script itself — standard library only. ### Sanity check ```bash python urnet.py --help ``` Expected: usage block listing `farm | collect | verify | export | balance`. ## 4. First account in one minute ```bash python urnet.py farm --count 1 ``` Expected output (names are random): ``` farm: 1 account(s) x 5 proxies | egress: direct | bank: bank.jsonl #1 OK february-exhaust-83 proxies=5 [us,de,nl,fr,gb] {"accounts_ok": 1, "proxies_ok": 5, "failed": 0, "bank": "bank.jsonl"} next: python urnet.py collect --bank bank.jsonl --out pool.jsonl python urnet.py verify --pool pool.jsonl --limit 10 ``` Then: ```bash python urnet.py collect --bank bank.jsonl --out pool.jsonl python urnet.py verify --pool pool.jsonl --limit 3 python urnet.py export --pool pool.jsonl --format txt --out proxies.txt python urnet.py balance --bank bank.jsonl ``` Expected `verify` output: ``` 1 us 72.89.45.91 US Freeport AS701 Verizon Business 1 de 77.187.40.197 DE Frankfurt am M AS6805 Telefonica Germany GmbH 1 nl 81.204.241.210 NL Amsterdam AS1136 KPN B.V. TOTAL 3 | alive 3 | unique_ip 3 | countries 3 | hosting_exits 0 ``` `balance` shows what is left today: ``` 1 february-exhaust-83 left 29.71 GiB of 30.00 GiB open 292.05 MiB | proxies 5 accounts 1 | live keys 1 | traffic left today 29.71 GiB ``` ## 5. Commands ### `farm` — create accounts, keys and proxies | flag | default | meaning | |---|---|---| | `--count N` | 1 | how many accounts to create | | `--proxies N` | 5 | proxies per account, hard max **5** | | `--countries us,de,nl` | built-in list of 15 | ISO codes, cycled across proxies | | `--bank FILE` | `bank.jsonl` | where accounts are appended | | `--start N` | 1 | label of the first account | | `--proxy URL` | — | single egress for every request | | `--proxy-file FILE` | — | one proxy URL per line, rotates per account | | `--shuffle` | off | randomise the proxy file order | | `--delay SEC` | 1.3 | pause between proxy calls (keep >= 1.3) | | `--curl` | off | force curl as the transport | | `--show-seed` | off | print a seed prefix in the log | Notes: - Each account is written to `bank.jsonl` **after every step**, so a crash or Ctrl-C never loses an account that already exists. Re-running with a new `--start` continues where you stopped. - Names are server-generated (`february-exhaust-83`); you cannot choose them. - Every account stores `jwt`, `seed` and `urn`. The seed is the only recovery path — back the file up. ### `collect` — bank to pool ```bash python urnet.py collect --bank bank.jsonl --out pool.jsonl # collected 49 unique proxies from bank.jsonl -> pool.jsonl (15 countries: AT,BR,CA,CH,DE,ES,FR,GB,...) ``` Duplicates are removed by URL. Proxies created in the web UI are picked up as long as their account line is in `bank.jsonl`. ### `verify` — is the proxy really alive ```bash python urnet.py verify --pool pool.jsonl --limit 20 --shuffle --out verify.json ``` One `curl https://ipinfo.io/json` per proxy. Summary line: ``` TOTAL 20 | alive 19 | unique_ip 18 | countries 9 | hosting_exits 2 ``` - `alive` — the proxy answered. - `unique_ip` — how many **distinct** exit IPs you really have; this is the number that matters. - `hosting_exits` — rows whose ASN looks like a datacenter/VPN (`3xK`, `OVH`, `Hetzner`, `M247`…). They still proxy traffic but they are not residential; drop them for anything geo-sensitive. ### `export` — for other tools ```bash python urnet.py export --pool pool.jsonl --format txt --out proxies.txt # one URL per line python urnet.py export --pool pool.jsonl --format csv --out proxies.csv --cc us # filter by country python urnet.py export --pool pool.jsonl --format env --out proxy.env # HTTP_PROXY/HTTPS_PROXY ``` ### `balance` — traffic left ```bash python urnet.py balance --bank bank.jsonl ``` Walks every account and prints `left / start / open_transfer` plus the total left today. `start` is the daily allowance (30 GiB), so `left` is what you can still push until 00:00 UTC. ## 6. Scaling past the IP cap Free accounts are capped **per IP address** (~4, then HTTP 429). The cap follows the address you connect from — `px.txt` exists to change that address. ```bash # step 1 - a few accounts directly python urnet.py farm --count 3 # step 2 - export what they gave you as egress python urnet.py collect --bank bank.jsonl --out pool.jsonl python urnet.py export --pool pool.jsonl --format txt --out px.txt # step 3 - keep farming, rotating egress through your own proxies python urnet.py farm --count 20 --proxies 5 --proxy-file px.txt --start 100 # step 4 - grow the pool again python urnet.py collect --bank bank.jsonl --out pool.jsonl ``` Measured: step 3 ran 8 accounts back-to-back with zero 429s. After each wave the pool grows (5 new proxies per account), so the next wave has more egress to rotate through. Guard rails the script applies itself: - retries only while failures stay under sanity thresholds, then stops with a clear message instead of hammering the API; - keeps `--delay 1.3` between proxy calls (the per-account limit is ~5 proxies/minute); - writes partial progress, so a stop costs you nothing. Practical free ceiling: ~4 accounts per fresh IP, and each account yields 5 more IPs, so the pool compounds. 12 accounts = 360 GiB/day and 49 usable proxies is what one evening produced. ## 7. Using the proxies ```bash # curl curl --proxy "$(head -1 proxies.txt)" https://ipinfo.io/json # environment (whole shell) python urnet.py export --pool pool.jsonl --format env --out proxy.env set -a; . ./proxy.env; set +a ``` ```python # python requests, random pick import random, requests urls = [l.strip() for l in open("proxies.txt") if l.strip()] r = requests.get("https://ipinfo.io/json", proxies={"https": random.choice(urls)}, timeout=30) ``` All URLs are HTTPS CONNECT with the credential inside the URL — paste and go, no user/password fields to fill. ## 8. Caveats worth knowing - **Exit IP is not pinned.** The same URL returned `188.103.48.237 AS3209 Vodafone Augsburg` and later `80.171.40.200 AS6805 Telefonica Essen`. For anything needing a stable address, enable *Fixed IP* on the proxy in the web UI, or treat the address as best-effort. - **The exit country can be wrong.** A proxy created with `country_code: br` came back as `209.50.178.206 AS200373 3xK Tech GmbH, Toronto`. The network is P2P; a peer can sit anywhere. Always `verify` and filter by `country`. - **`country_code` is mandatory** — omit `initial_device_state.country_code` and the API answers `Invalid location`. - **5 proxies is the free cap.** The 6th call returns `client_limit_exceeded` with `upgrade_required: true`. - **`--proxies` above 5 is pointless** — the extra calls only return the cap error. - **Do not do this in a browser.** The UI "Copy URL" copies the card you clicked, not the one you meant, and clipboard reads fail when the window is not focused. The API returns every URL. ## 9. Troubleshooting | symptom | cause | fix | |---|---|---| | `429 Too many accounts have been created recently from your network address` | per-IP account cap (~4) | `--proxy-file px.txt` to rotate egress, or wait for the reset | | `Invalid location` | missing/invalid `country_code` | pass `--countries us,de` (2-letter ISO) | | `client_limit_exceeded` / `upgrade_required` | already 5 proxies | delete one in the UI or lower `--proxies` | | `curl returned nothing through this proxy` | dead proxy or rotated token | re-run `collect`; if it persists the account was reset | | `Remote end closed connection without response` | urllib cannot do TLS-in-TLS to an `https://` proxy | the script auto-uses curl; make sure `curl` is installed | | `create failed (0): URLError ...` with no proxy | no internet / DNS / firewall | `curl -s https://api.bringyour.com` and check connectivity | | account created but no proxies | hit the 5/min rate | raise `--delay` to 2.0 and retry with a new `--start` | | `balance` prints nothing for some rows | `bank.jsonl` keeps failed creates for the record | expected — those have no `urn` | | proxies answer `FAIL` in `verify` | peer went offline | normal churn; re-run `collect` and `verify`, drop dead rows | Exit code is `0` on success, `1` when nothing was produced — safe to use in scripts. ## 10. Hygiene - `bank.jsonl` = full control of every account. `chmod 600 bank.jsonl`, keep it out of git (`.gitignore` already lists it), back it up. - `pool.jsonl` and `proxies.txt` contain proxy tokens — anyone with the file can spend your traffic. - Nothing here needs a card, an email or a phone number, so there is no PII to leak. - The tool writes no logs besides the bank/pool files. ## 11. FAQ **Can I choose the account name?** No, the server generates it. **Can I use these proxies in a browser?** Yes, as an HTTPS proxy. Chrome: `--proxy-server="https://.crisp.bringyour.com:7155"`. Playwright/Camoufox: the same string as `proxy.server`. **Do they work for Gmail / Google sign-ups?** No. Google treats datacenter and rotating residential ranges as suspicious; those flows need a mobile or home line. **How much traffic is enough?** One account covers ~30 GiB of scraping per day. Ten accounts are a comfortable pool for a small crawler; heavy media work needs Pro (10 TiB/month). **Does the free tier expire?** No trial clock — the daily allowance simply resets every day. **What happens after 30 GiB?** Requests stop passing until the 00:00 UTC reset; `balance` shows the remaining bytes. **Is there a way to get more per account?** Pro: 10 TiB/month and 1000 proxies, $3 for the first year (USDC / Zcash / Monero or a card). ## 12. Scope This tool creates accounts you own and prints the proxy endpoints they generate. It handles no card data, no third-party accounts and no payment flows. URnetwork's terms of service apply — read them before running large waves, and do not use the pool for anything you would not do from your own line.