Dead proxies waste accounts — batch-check TCP, HTTP, geo, and DNSBL before assigning lanes.
Project description
proxy-lane-checker
Python 3.10+ | MLX optional · Compatibility
Concurrent proxy validator — TCP connect, HTTP through proxy, optional geo IP lookup, latency p50/p95, and optional DNSBL listing.
Outputs JSON with pass/fail per proxy and recommended tags: residential, datacenter, dead.
Problem
Proxy lists rot quickly. Before assigning IPs to scrapers or antidetect profiles, you need:
- Can we reach the host:port?
- Does HTTP actually work through the proxy?
- What country/ISP is the exit IP?
- Is latency acceptable (p50/p95)?
- Is the IP on a spam blacklist?
proxy-lane checks all of this concurrently and writes machine-readable results.
pip install
pip install proxy-lane-checker
MLX profile proxy apply:
pip install proxy-lane-checker[mlx]
Quick start
# Batch check a list (table to stdout, JSON saved to -o)
proxy-lane check proxies.txt --concurrency 20 --format table -o results.json
# CSV for spreadsheets
proxy-lane check proxies.txt --format csv -o results.json
# Single proxy with geo
proxy-lane check --proxy socks5://user:pass@host:port --geo
# Dedupe before checking
proxy-lane dedupe proxies.txt -o proxies-unique.txt
# Import vendor CSV (column mapping only — no API keys)
proxy-lane import examples/brightdata.sample.csv --format brightdata -o proxies.txt
proxy-lane check examples/oxylabs.sample.csv --import-format oxylabs --geo
# Pretty-print saved results
proxy-lane report results.json --format table
Walkthrough: 48 proxies → 12 dead → tag residential
You bought a mixed list and need to know what is alive, what is dead, and which exits look residential before assigning them to MLX profiles.
# 1. Remove duplicate lines (vendor lists often repeat)
proxy-lane dedupe proxies.txt -o proxies-unique.txt
# Deduped 48 -> 45 (3 removed) -> proxies-unique.txt
# 2. Check with geo + limited concurrency (retries transient timeouts)
proxy-lane check proxies-unique.txt \
--concurrency 10 \
--geo \
--format table \
-o results.json
# Checked ... — total=45 passed=33 failed=12
# Table shows tags: dead, datacenter, residential, unknown
# 3. Export CSV for filtering in a spreadsheet
proxy-lane report results.json --format csv > results.csv
# Filter rows where tags contains "residential" and passed=yes
# 4. Apply a winner to an MLX profile
export MLX_TOKEN="..."
proxy-lane mlx-apply --profile-id "$PROFILE_ID" --proxy socks5://user:pass@residential-host:1080
In this example 48 lines became 45 unique after dedupe; 12 failed TCP/HTTP (dead tag); the remaining 33 get geo-based tags — pick residential for consumer ISP exits, datacenter for hosting ASNs.
CLI
| Command | Description |
|---|---|
proxy-lane check FILE |
Batch validate proxies from text file |
proxy-lane check --proxy URL |
Check one proxy |
proxy-lane check --format csv|json|table |
Stdout format (-o always JSON) |
proxy-lane check --concurrency N |
Asyncio semaphore limit (default 20) |
proxy-lane import FILE --format brightdata|oxylabs|generic |
Vendor CSV → host:port[:user:pass] lines |
proxy-lane check FILE --import-format FORMAT |
Check vendor CSV directly (YAML maps in examples/) |
proxy-lane dedupe FILE [-o OUT] |
Remove duplicate proxy lines |
proxy-lane report FILE --format csv|json|table |
Format saved JSON results |
proxy-lane mlx-apply --profile-id UUID --proxy URL |
Apply proxy to MLX profile ([mlx]) |
Vendor CSV import
Maps common proxy list exports via YAML column configs in examples/ — no API keys, only header → field mapping.
--format |
Mapping file | Typical columns |
|---|---|---|
brightdata |
examples/brightdata.mapping.yaml |
host, port, username, password |
oxylabs |
examples/oxylabs.mapping.yaml |
ip, port, user, password |
generic |
examples/generic.mapping.yaml |
Edit columns to match your CSV |
# Convert CSV to proxies.txt
proxy-lane import vendor.csv --format oxylabs -o proxies.txt
# Custom mapping (copy generic.mapping.yaml)
proxy-lane import vendor.csv --format generic --mapping my.mapping.yaml -o proxies.txt
# Check without writing an intermediate file
proxy-lane check vendor.csv --import-format brightdata --concurrency 10 -o results.json
Sample fixtures: examples/*.sample.csv paired with examples/*.mapping.yaml.
Proxy line formats
http://user:pass@host:8080
socks5://user:pass@host:1080
host:port
host:port:user:pass
Lines starting with # are ignored.
Checks performed
| Check | Description |
|---|---|
| TCP | asyncio.open_connection to proxy host:port |
| HTTP | GET via proxy (default http://httpbin.org/ip) |
| Geo | ip-api.com JSON through proxy (--geo) |
| Latency | Multiple HTTP samples → p50 / p95 ms |
| DNSBL | Optional Spamhaus-style lookup (--dnsbl) |
| Retry | Up to 2 retries on transient timeouts / 5xx only |
Tags
| Tag | When |
|---|---|
dead |
TCP or HTTP failed |
datacenter |
Hosting ASN/org keywords or hosting=true from geo API |
residential |
Mobile ISP signals or residential org keywords |
unknown |
Alive but inconclusive classification |
Exit codes
| Code | Meaning |
|---|---|
0 |
All proxies passed |
1 |
One or more proxies failed |
2 |
Runtime error |
API
from proxy_lane_checker import ProxyChecker, ProxySpec
from proxy_lane_checker.runner import CheckOptions
checker = ProxyChecker(CheckOptions(concurrency=20, geo=True))
batch = checker.run([ProxySpec.from_url("socks5://user:pass@1.2.3.4:1080")])
for item in batch.results:
print(item.proxy.display, item.passed, item.tags, item.latency_p95_ms)
MLX apply ([mlx] extra)
Apply a validated proxy from check results or a direct URL. See docs/MLX_INTEGRATION.md (pairs with profile-yaml-factory).
export MLX_TOKEN="your-bearer-token"
proxy-lane check proxies.txt --geo -o results.json
proxy-lane mlx-apply --profile-id PROFILE_UUID --results results.json --tag residential
proxy-lane mlx-apply --profile-id PROFILE_UUID --results results.json --dry-run
- Default:
PATCH /profile/partial_update(proxy +proxy_masking=custom) --full:POST /profile/update--dry-run: print redacted payload, no API call
Limitations
- HTTP test URL — default probe uses
httpbin.org; blocked networks need a custom URL (future flag) or offline TCP-only inference. - Geo provider — uses ip-api.com free tier (HTTP, rate limits); not a commercial geo database.
- DNSBL accuracy — public DNS resolvers may block or rate-limit DNSBL queries; treat as advisory.
- Tag heuristics —
residential/datacenterare keyword + API flags, not ground truth. - SOCKS4 — parsed but prefer SOCKS5 for auth support.
Production
Partner offers, eligibility, and disclosure: docs/AFFILIATE.md.
Typical workflow with antidetect profiles:
proxy-lane check proxies.txt --concurrency 20 --geo --dnsbl -o results.json
proxy-lane report results.json --format table
export MLX_TOKEN="..."
proxy-lane mlx-apply --profile-id "$PROFILE_ID" --results results.json --tag residential
Pair with cookie-jar-bridge and playwright-cdp-probe for full session QA.
Guides
Monorepo playbooks (copy-paste commands, sample output, diagrams):
| Guide | Flow |
|---|---|
| Detection fail → MLX farm | cdp-probe → cdp-connect → farm-runner mlx-pool |
| Competitor migration | antidetect-import → profile-factory mlx-create |
| Proxy lane → profile pool | proxy-lane → profile-factory → farm-runner mlx-pool |
FAQ: docs/FAQ.md — SOCKS5 checks, residential vs datacenter, DNSBL.
Related tools
| Tool | Use with |
|---|---|
| playwright-cdp-probe — Score CDP/WebDriver exposure and fingerprint leaks | → cdp-connect-kit when probe fails |
| cookie-jar-bridge — Convert, validate, and merge cookies across formats | → session-bundle-kit for full session |
| proxy-lane-checker — Batch-check proxies for connectivity, geo, and DNSBL | → profile-yaml-factory |
| fingerprint-coherence — Lint fingerprints for cross-signal contradictions | → profile-yaml-factory before create |
| human-input-kit — Human-like mouse, scroll, and warmup replay | → automation-farm-runner |
| cdp-connect-kit — Playwright CDP connect; MLX start/stop helpers | → all packages needing CDP |
| session-bundle-kit — Export/import cookies and storage as portable bundles | → cookie-jar-bridge |
profile-yaml-factory — YAML blueprints → MLX profile/create payloads |
→ antidetect-importer after migration |
| antidetect-importer — Parse competitor exports and push to MLX | → profile-yaml-factory |
| automation-farm-runner — YAML job queue and MLX profile-pool runner | → cdp-connect-kit [mlx] |
License
MIT
Production antidetect: Multilogin X · Code SAAS50 (-50% browser) · MIN50 (-50% cloud phone)
More scripts: @Multilogin_Scripts_Bot · Coupons
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file proxy_lane_checker-0.2.0.tar.gz.
File metadata
- Download URL: proxy_lane_checker-0.2.0.tar.gz
- Upload date:
- Size: 28.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83f04d0ee867ac95f271f5dd530d1b18f6cba43ad7b1000a9799158fbf8f5387
|
|
| MD5 |
509b42b0128dbfb17f6e6a6f9ec45903
|
|
| BLAKE2b-256 |
7f629a64f88e7c38ef8d1ade76ec5f5b54a50eaa0470ef275d794d8f4b0430f9
|
File details
Details for the file proxy_lane_checker-0.2.0-py3-none-any.whl.
File metadata
- Download URL: proxy_lane_checker-0.2.0-py3-none-any.whl
- Upload date:
- Size: 31.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d319feb644a7066bacb61456ca642acd09f5514eaf32343239c4005a1ad07b2
|
|
| MD5 |
9acb3a86b1748895a4282ffbe5e6b116
|
|
| BLAKE2b-256 |
e2669f346ebc198903996a28c6eb44ed8f3de07e08159ce24365c339ca80f536
|