325 lines
13 KiB
Markdown
325 lines
13 KiB
Markdown
# 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 <by_jwt>)
|
|
-> {"seedphrase": "24 words"} # the ONLY recovery path for the account
|
|
|
|
POST /account/api-key {"name": "urnet-1"} (Bearer <by_jwt>)
|
|
-> {"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 <urn_...>)
|
|
-> {"client_id": "...", "proxy_config_result": {
|
|
"https_proxy_url": "https://<token>.crisp.bringyour.com:7155",
|
|
"socks_proxy_url": "socks5h://crisp.bringyour.com:7153",
|
|
"http_proxy_url": "http://crisp.bringyour.com:7154" }}
|
|
|
|
GET /network/proxies (Bearer <urn_...>) -> all proxies of the account
|
|
GET /subscription/balance (Bearer <urn_...>) -> bytes left today
|
|
```
|
|
|
|
Base URL: `https://api.bringyour.com`. Every authenticated call takes
|
|
`Authorization: Bearer <jwt or urn_ key>`.
|
|
|
|
`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://<token>.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. |