# urnet — URnetwork free-tier farm Turn URnetwork ([ur.io](https://ur.io)) into a rotating **residential** proxy pool. Every account you create gives **30 GiB of traffic per day** and **5 hosted proxies** — no card, no email, no captcha, no browser. Everything runs over the public API. ```bash python urnet.py farm --count 1 --proxies 3 # account + proxies, ~25 s python urnet.py collect --bank bank.jsonl --out pool.jsonl python urnet.py verify --pool pool.jsonl --limit 3 ``` That is the whole quick start. One account ~ 25 seconds ~ 30 GiB/day. ## Requirements - Python **3.8+** — standard library only, nothing to `pip install` - `curl` — optional, but required when you route a run through a proxy (`--proxy` / `--proxy-file`). Windows 10/11, macOS and most Linux distros ship it. Without curl, direct (non-proxied) calls work. ## Install ```bash git clone https://git.reformboss.com/reform/ur-network-farm.git cd ur-network-farm python urnet.py --help ``` No virtualenv, no requirements.txt, no build step, no config file. ## First run ```bash python urnet.py farm --count 1 # 1 account, 5 proxies in 5 countries python urnet.py collect --bank bank.jsonl --out pool.jsonl python urnet.py export --pool pool.jsonl --format txt --out proxies.txt python urnet.py verify --pool pool.jsonl --limit 5 python urnet.py balance --bank bank.jsonl ``` `proxies.txt` is a plain list of ready-to-use URLs: ``` https://.crisp.bringyour.com:7155 ``` Use one directly: ```bash curl --proxy "$(head -1 proxies.txt)" https://ipinfo.io/json ``` ## How it works Four API calls per account, no UI involved: ``` POST /auth/network-create {"terms":true,"product_updates":false} -> network.by_jwt POST /auth/regenerate-seedphrase -> seedphrase (24 words) POST /account/api-key {"name":"urnet-1"} -> urn_... key POST /network/auth-client {"device_spec":"resident proxy", "proxy_config":{"initial_device_state":{"country_code":"us"}}} -> https_proxy_url ``` Base: `https://api.bringyour.com`. Auth header: `Authorization: Bearer `. `GET /network/proxies` returns every proxy of an account, `GET /subscription/balance` returns traffic left today. ## Limits (measured, not guessed) | limit | value | |---|---| | traffic per account | **30 GiB / day**, resets 00:00 UTC | | proxies per account | **5 active** — the 6th answers `client_limit_exceeded` | | proxy creation rate | ~5 / minute / account | | accounts per IP | **~4**, then `429 Too many accounts have been created recently from your network address` | | countries seen | 15 verified by `ipinfo`: US DE NL FR GB CA BR SE PL CH JP SG IT ES AT | Proof of the caps, straight from the API: ``` start_balance_byte_count: 32212254720 (30 GiB, window 2026-11-13T00:00:00Z -> 2026-11-14T01:00:00Z) 6th proxy: {"error":{"client_limit_exceeded":true,"upgrade_required":true, "message":"Your plan's limit of 5 active proxies is reached..."}} ``` Workaround for the IP cap: create the first few accounts directly, then feed their own proxy URLs back into the farm as rotating egress — `--proxy-file px.txt`. Recipe: [GUIDE.md](GUIDE.md#scaling-past-the-ip-cap). ## Commands | command | what it does | |---|---| | `farm` | create accounts: JWT, seed phrase, `urn_` API key, hosted proxies | | `collect` | flatten `bank.jsonl` into a deduplicated proxy pool | | `verify` | ipinfo through every proxy -> `alive / unique_ip / countries / hosting_exits` | | `export` | pool -> `txt` / `csv` / `env` | | `balance` | traffic left per account | Every flag, recipe and failure mode: **[GUIDE.md](GUIDE.md)**. ## Proxy URL shape ``` https://<40-char-token>.crisp.bringyour.com:7155 # HTTPS CONNECT, token is the credential socks5h://crisp.bringyour.com:7153 # SOCKS5, username/password auth http://crisp.bringyour.com:7154 # plain HTTP ``` `https_proxy_url` carries the token inline, so `curl --proxy "$url"` works as-is. ## Files it writes | file | content | secret? | |---|---|---| | `bank.jsonl` | one line per account: name, jwt, seed, `urn_` key, proxies | **yes** | | `pool.jsonl` | deduplicated proxy URLs | yes (token inside URL) | | `proxies.txt` / `.csv` | exports for other tools | yes | | `verify.json` | pool enriched with ip / country / org | no | `.gitignore` excludes all of them. Keep `bank.jsonl` at `chmod 600`: the account has no email and no password recovery, so losing the file loses the account, and leaking it hands the account over. ## Troubleshooting (short version) | symptom | fix | |---|---| | `429 Too many accounts ... from your network address` | add `--proxy-file px.txt` (rotate egress), or wait for the reset | | `Invalid location` | `country_code` missing — pass `--countries us,de` | | `Your plan's limit of 5 active proxies is reached` | 5 proxies per account is the free cap; `--proxies 5` max | | `curl returned nothing through this proxy` | proxy dead or token rotated — re-run `collect` | | nothing created, no error | `curl` not on PATH — install it or drop the proxy flags | Full table with causes: [GUIDE.md](GUIDE.md#troubleshooting). ## Scope Free-tier testing of a public API on accounts you create yourself. No card data, no third-party accounts, no payment flows. Respect the provider's terms of service.