Skip to content

1.0.26: Node4, ProxyEmpire, MountProxies and Massive connectors, Rotate IP for MountProxies through its API - #78

Merged
softglazee merged 6 commits into
mainfrom
fix/1.0.26-connectors-new-2
Nov 10, 2026
Merged

softglazee merged 6 commits into
mainfrom
fix/1.0.26-connectors-new-2

Conversation

@softglazee

@softglazee softglazee commented Nov 10, 2026 •

Copy link
Copy Markdown
Owner

New connectors, part 1 of lane C2. Stacked on #76 (fix/1.0.26-connectors-new-1), which is stacked on #80, #77 and #73. Merge order: #73, #77, #80, #76, then this one, then #79. It brings in #76 (and with it #77 and #80) by merge commits; nothing is rebased. No version bump, no schema change. All four connectors are built from each vendor's public docs and tested with fixtures only. None is tested against a live account yet (no trial is active).

What changed

Provider Pull Change
Node4 API: gateway builder and static list An n4k_ API key (read:proxies). Residential, Rotating Datacenter and Rotating Unmetered logins are built by Node4 (POST /gateways/endpoint). Static Datacenter lists the IPs the account owns (GET /proxies/list). Load countries, account check.
ProxyEmpire API: proxy-list generator A Bearer token. GET /user checks the package, then POST /proxy-list returns ready lines. Four products. Keep same IP up to 2 hours. Load countries per pool, account check.
MountProxies API: list, Rotate IP by API The account key lists the US 4G/5G modems (HTTP only). Rotate IP goes through the provider-API rotate hook with the saved key; nothing key-bearing is stored on a row. Account check.
Massive Gateway Logins built on network.joinmassive.com with the targeting in the username. The API token is the proxy password. The port follows the protocol. ISP is on isp.joinmassive.com:8000. Account check on the Reporting API.

Shared pieces it adds or uses:

Node4

  • Pool to product:

    Pool Product Call
    Residential residential POST /gateways/endpoint
    Rotating Datacenter rotating_datacenter POST /gateways/endpoint
    Rotating Unmetered rotating_unmetered POST /gateways/endpoint
    Static Datacenter your IPs GET /proxies/list
  • Gateway pulls:

    • How many 1 is one rotating login (sticky: false, count: 1).
    • More are sticky: 100 a call, up to 1000 a pull, at most 10 calls, 1.1 s apart, so a pull stays inside 60 a minute per key.
    • ttl is never sent.
    • State, city and ASN are Residential only. They are refused before any call on the other pools, and a state or city needs a country.
    • Values are sent lowercase. The UK is gb.
    • Rows dedupe on the password too, because the login grammar is Node4's.
  • Static:

    • Only premium_private and shared rows for the chosen protocol are kept.
    • Rows without a login (the free tier's IP authorization) are counted and explained, not added.
    • Country filters the list and How many caps it.
  • Errors:

    • 401, 403, 404 ("no active plan"), 409 and 429 each have their own message. The 429 message says "Wait seconds", from Retry-After or the body's retryAfterSeconds.
    • A 400 or 422 shows Node4's own error text (it lists the countries served), with the key masked.
    • A transport error is never echoed.
  • Never called: replace, refresh, credential or sub-user writes, orders, top-ups, webhooks.

  • Load countries: Residential reads GET /geo/countries. The datacenter products return the plan's US, IT and ES without a call.

  • Account check: GET /status.

    • Active when ok.
    • Used, total and left MB to GB when the plan is limited.
    • no_active_proxies shows as a note. user_inactive shows as suspended.
  • Dashboard button: the owner's live affiliate link, https://node4.io?ref=REF-7643BU.

ProxyEmpire

  • Pools:
    • Rotating Residential and Rotating Mobile take a country, state (sent as region), city, ZIP and ASN. Places are lowercase, joined with +.
    • Rotating Datacenter takes a country only. The UK is sent as uk, as its list names it.
    • Static Residential takes no location and no rotation fields; Keep same IP is refused there.
    • Everything is refused before any call, so ProxyEmpire never sees a 422 for it.
  • Rotation (gatewayPullPlan semantics):
    • How many 1 with Keep same IP blank is random.
    • More is sticky.
    • Keep same IP set is custom, with session_lifetime = min(life, 120).
  • Before the pull, GET /user checks the package. It stops if:
    • the pool's slot is null;
    • traffic is 0;
    • provider_availability.state is unavailable or circuit_open.
  • Lines: format 1 is parsed with parseLoginList. The row type follows the Protocol select, since HTTP and SOCKS5 share the host and port.
  • Errors: 401, the two 403 cases, 422 (no package, or the first errors message), 429 (with the Retry-After seconds) and 5xx. The token is never echoed.
  • Account check: GET /user.
    • Sums each package's bytes (as 2^30 per GB until ProxyEmpire says otherwise).
    • Plan = the packages present.
    • summedPlans when there is more than one.

MountProxies

  • Pull: GET /proxies?api_key=…&output=json, one call.
    • Rows are HTTP, in the US, labelled with the carrier, city, port and "until " when expire_at is a date.
    • A past expire_at is skipped; "N/A" is kept.
    • Modems without a login (IP authorization only) are counted and explained.
    • api_key, modem_key and subscription_key are never stored on a row, and no rotationUrl is stored.
  • Errors: the key is in the query string, so every failure is a fixed message. No error ever contains the key or the URL.
  • Rotate IP (provider-API hook, modelled on DataImpulse):
    • apiRotationProvider returns mountproxies for a row tagged mountproxies with a host, port and username, so canRotate stays a pure function of the row.
    • rotateMountProxies reads the saved key with readSavedProviderCreds('mountproxies') (main only). It lists the proxies and matches the row by IP, port and username.
    • It then calls GET /subscription/<subscription_key>/rotate_ip. On a 404 it retries once with GET /proxy/<modem_key>/rotate_ip, the help article's form. The reply says which path worked ("(V2)" or "(V1)").
    • Failures:
      • no saved key: says to save it;
      • the proxy is no longer listed: says to pull again;
      • 401, 404 and 429 each have a fixed message;
      • another refusal shows MountProxies' own message with the key masked, plus "wait at least one minute".
    • The vendor reply reaches only a member who may see links, as before.
    • The hint (English and Spanish) says Rotate IP uses the key saved on the page.
  • Account check: modem count, the next expire_at (else auto_renew_at), and the billing cycles. There is no traffic figure (plans are unlimited data). firstToExpire when there is more than one modem.

Massive

  • Username: massiveUsername builds {USER}-country-US-subdivision-NY-city-New%20York-…-type-mobile-session-<sid>-sessionttl-<min>.
    • The country is upper case.
    • The city is URL-encoded, a dash included, so "Winston-Salem" cannot split the username.
    • A ZIP code replaces the city.
    • Geo keys need a country.
    • sessionttl is sent only with a session, clamped to 1440.
    • Targeting already pasted in the username is stripped.
  • Pools:
    • Residential;
    • Residential mobile (-type-mobile);
    • ISP: isp.joinmassive.com:8000 for both protocols. A location is refused, and Keep same IP is not sent (ISP sessions do not expire).
  • Port:
    • HTTP 65534 and SOCKS5 65533 follow the Protocol select, unless another port was typed.
    • A typed host wins, for a regional host.
  • No API call for a pull. Rows use mintGatewayRows (rotating for one row with no session; sticky otherwise; up to 1000).
  • Account check: x-api-key: <token> on the Reporting API.
    • GB used = sum of used_bytes / 10^9, with the note "Traffic used in the last 7 days; the API does not report what is left."
    • The reply's outer shape is not published, so an array, { data: [] }, { usage: [] } or one row are all read.

Open questions per provider (for the held emails)

Each spec's section 16 has the full list. These are the points this build assumed:

Node4

  1. Does GET /proxies/list return one row per protocol for static proxies, or only HTTP? How is the SOCKS5 port read by API? The build keeps rows whose protocol matches the select.
  2. Is the body's asn a string or a number? The build sends a digits string. Are state and city lowercase? The build sends them lowercase, with spaces dropped from the city.
  3. Is https://node4.io/dashboard the dashboard address? It is inferred.
  4. Is the key always n4k_ plus 8 to 200 characters? The length is inferred.
  5. The GET /subscription schema, for an expiry date. It is not in v1.
  6. Which scopes to recommend; and does a per-profile login count as reselling?

ProxyEmpire

  1. Which ability does POST /proxy-list need: read, or create? The 403 message tells the user to add create if asked.
  2. Country code case. The build sends lowercase, uk for Datacenter and gb elsewhere.
  3. Does Datacenter honour ip_rotation_type? The build sends it as for Residential. Which host is current?
  4. Is a GB 10^9 or 2^30 bytes? The build reads 2^30.
  5. The numeric rate limits.
  6. ToS 3.10.2 ("automated" use) in writing.

MountProxies

  1. Rotate with subscription_key (V2) or modem_key (V1)? The build tries V2, then V1 on a 404.
  2. The rotate reply for "too soon" or "in progress", and the minimum gap between rotations.
  3. SOCKS5: is there a port, and can /proxies return it? The connector is HTTP only.
  4. Can the key go in a header, or can a per-modem rotate token be issued?
  5. Is the key format [A-Za-z0-9_-]{8,200}? It is inferred.
  6. Is the trial on the account yet?

Massive

  1. Is the proxy username always the login email?
  2. The Reporting API reply's shape: only used_bytes is documented.
  3. Is a dash in a city name encoded %2D accepted?
  4. Is port 1080 HTTP or SOCKS5 too?
  5. Should -subaccount-softglaze be added? The build does not add it.
  6. License 2.2 (service bureau).
  7. KYC by manual verification.

How it was verified

  • npm test:
  • Existing tests changed: none. 1.0.26: ProxyBrazil, ProxyUDP, Zokol, ResiProx and SimplyNode connectors, a 65-second rotation link for ProxyBrazil, provider-API Rotate IP for ProxyUDP and SimplyNode ports #76's tests pass unchanged after the merge.
  • CI steps, all pass:
    • npm run check:deps
    • npx vite build
    • node --check on all 95 main and preload files
  • Test environment:
    • The shared node_modules was partly deleted during this work, by another process.
    • The final runs use a private node_modules in this worktree: npm ci --ignore-scripts, then prisma generate there only.
  • UI renders, headless Chrome with a throwaway profile and a fake preload API, at 1440 and 375 px, light and dark, English and Spanish:
    • Shots: the four connector forms (32), the Proxy providers page (8), and Keep same IP with How many 5 and 3.
    • Findings:
      • no page scrolls sideways;
      • no cut-off labels;
      • every select's selected and longest option fits at 1440;
      • at 375 the selected option fits. Only very long country names overflow the Country select, which has a title.
    • Blank Keep same IP option:
      • ProxyEmpire, How many 5: "Provider default" / "Valor del proveedor";
      • Massive, How many 3: "Default (15 minutes)" / "Por defecto (15 minutos)".
    • The pool-type labels were shortened so their longest option fits at 375: "Static Datacenter" and "Residential mobile".
  • Not done: a pull against a live account (no trial is active yet).

Noticed, not fixed

  • SoftGlaze AI's compactProxy reports canRotate only for proxies with a link (src/main/ai/tools.js:119). So the AI is not told that MountProxies rows (or DataImpulse, ProxyUDP, SimplyNode ports) can rotate, although rotate_proxy_ip works for them. 1.0.26: imported rotation links rotate, Rotate IP for "use only" shares, Firefox WebRTC shown as off, Quick generate preview with fewer proxies, token reveal flag #68 noted the same for DataImpulse.
  • Live affiliate links are not used for some Dashboard buttons: PROXY6, Coronium, CatProxies, NOVADA, PacketStream, Proxmint, RapidProxy, 2extract, Gsocks and Proxy-Solutions still point to the plain site. AFFILIATE-LINKS.md lists live links for them.
  • The shared form's State and City placeholders ("California", "NewYork") do not show Node4's format (TX, austin). The hint and the refusal message explain it.

…roxies Rotate IP through its API

- Node4: an n4k_ API key; Residential, Rotating Datacenter and Rotating Unmetered logins built by
  POST /gateways/endpoint (100 a call, up to 1000 a pull, calls spaced for 60 a minute), Static
  Datacenter from GET /proxies/list, countries from /geo/countries, account from GET /status.
- ProxyEmpire: a Bearer token; GET /user checks the package, POST /proxy-list returns ready lines
  (random, sticky or a custom time up to 120 minutes); Datacenter takes a country only, Static
  Residential nothing. Countries per pool; account from GET /user.
- MountProxies: the account key lists the modems (HTTP only, no key kept on a row); Rotate IP reads
  the saved key, finds the modem's subscription_key and calls rotate_ip (V2, then V1 with the
  modem_key on a 404) through the provider-API rotate hook. Errors never echo the key or the URL.
- Massive: gateway-built logins with the targeting in the username, the API token as the password,
  the port by protocol, ISP on isp.joinmassive.com:8000; account from the Reporting API (GB used
  in the last 7 days).
- httpRequestText keeps the reply headers on a failed request, for a vendor's Retry-After.
…roviders page

PROVIDERS entries (Node4 with the live affiliate link), Keep same IP defaults for ProxyEmpire and
Massive, en and es hints, a 15 minute option text, the API token (proxy password) label, an
account note for traffic used in the last 7 days, and an initials tile for a provider without a logo.
…ew-2

Both lanes appended to the same registries: the import list, PROXY_VENDORS, VENDOR_LOOKUPS,
REAL_VENDOR_ADAPTERS, apiRotationProvider and PROVIDER_ROTATORS, the account adapters and parsers,
PROVIDERS and LIFE_BLANK_DEFAULTS keep both lanes' entries (ProxyBrazil to SimplyNode, then Node4
to Massive). httpRequestText keeps new-1's error fields (retryAfter, requestId); Node4 and
ProxyEmpire read the wait from error.retryAfter. The initials tile is new-1's. The Node4 to
Massive sections now sit before the ProxyBrazil section, so each lane's test sections keep their
bounds; the Massive test's end marker follows.
…o fix/1.0.26-connectors-new-2

# Conflicts:
#	src/renderer/lib/gatewayPull.mjs
…o fix/1.0.26-connectors-new-2

# Conflicts:
#	src/renderer/i18n/locales/en/cmpSettingsC.json
#	src/renderer/i18n/locales/es/cmpSettingsC.json
#	src/renderer/lib/gatewayPull.mjs
Base automatically changed from fix/1.0.26-connectors-new-1 to main November 10, 2026 17:13
@softglazee
softglazee merged commit 96e19a6 into main Nov 10, 2026
6 checks passed
@softglazee
softglazee deleted the fix/1.0.26-connectors-new-2 branch November 10, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant