| Header | Description |
|---|---|
X-SOAX-Error | Machine-readable error code (e.g. AUTH_FAILED) |
X-SOAX-Detail | Human-readable explanation of what went wrong |
Validation errors (400)
Your connection string was parsed but something in it wasn’t valid. The request never reached node selection.ERR_INVALID_VALUE
- Check the
X-SOAX-Detailfor which parameter is wrong. - Country codes are lowercase ISO 3166-1 alpha-2 (
us,gb,de). Not uppercase, not three-letter codes. - ISP and city names use underscores for spaces (
new_york,verizon_wireless). Available names are listed in your package settings.
ERR_MISSING_PARAMS
country-any.
ERR_UNKNOWN_PARAM
- Check spelling against the parameter reference.
- Make sure multi-word values use underscores:
city-los_angeles, notcity-los-angeles.
ERR_DUPLICATE_PARAM
country-us-country-gb).
How to fix it: Remove the duplicate. Each rule appears at most once.
ERR_INVALID_COMBINATION
bind-node with rotate-timed_N, rotate-requests_N, onerror-replace, or prefer-lookalike — bind-node is incompatible with all of those.
How to fix it: Drop one side of the conflict. See the bind-node interaction table for the full list.
ERR_PARAM_NOT_ALLOWED
network value the package doesn’t have enabled, or a premium feature your plan doesn’t include.
How to fix it: Remove the rule, or enable the feature in the package settings.
Authentication errors (407)
These errors mean SOAX couldn’t verify your identity. Your request never reached a proxy node.ERR_AUTH_REQUIRED
- For username/password: make sure your client is actually sending the proxy username and password. Some HTTP clients need explicit configuration.
- For IP Auth: check your outbound IP at checker.soax.com/api/ipinfo without a proxy and add it to the package’s IP allowlist.
AUTH_FAILED
- Check that your package key matches what’s in the dashboard. Copy it exactly.
- Make sure the key is in the password field, not the username field. The format is
{rules}:{package_key}, separated by a colon. - If you recently regenerated your package key, update it everywhere you use it. The old key stops working immediately.
IP_NOT_ALLOWED
- In the dashboard, go to your proxy package settings and check the IP Allowlist.
- Add the public IP of the machine making the request. This is the IP the internet sees, not your local/private IP. You can check your public IP at checker.soax.com/api/ipinfo without a proxy.
- If you’re behind a corporate NAT or VPN, your outbound IP may be different from what you expect. Add the correct outbound IP.
- If you don’t need IP Auth, switch to username/password authentication instead.
PACKAGE_SUSPENDED
- Check the dashboard for any account notifications or alerts.
- This can happen if your subscription has expired, your payment method failed, or your account was flagged for a policy violation.
- Contact support if you believe this is an error.
PACKAGE_PAUSED
PACKAGE_NO_CREDITS
429 TRAFFIC_LIMIT_EXCEEDED, which is returned when a single package hits its own GB cap while the organization still has credits. PACKAGE_NO_CREDITS means the organization has run out of credits entirely.
How to fix it:
- Top up your organization’s credits in the dashboard. Only organization Owners can purchase credits.
- Set up auto top-up under Settings → Credits to avoid this happening again.
Session errors (409)
SESSION_PARAMS_MISMATCH
- Use a new session ID if you want different rules.
- Keep the rules identical every time you send the same session ID.
Rate and quota errors (429)
These errors mean your request was valid but exceeded a limit on your package.RATE_LIMIT_EXCEEDED
- Reduce the number of parallel requests you’re sending.
- If you’re using a worker pool, lower the concurrency.
- Check your package limits in the dashboard. Higher-tier plans have higher RPS and connection limits.
- If you consistently need more throughput, consider upgrading your plan.
TRAFFIC_LIMIT_EXCEEDED
407 PACKAGE_NO_CREDITS, which means the organization’s entire credit pool is empty. TRAFFIC_LIMIT_EXCEEDED is a cap on one package, not an account-wide credit shortage.
How to fix it:
- Check this package’s usage in the dashboard under Usage & Analytics.
- Ask an organization Owner to raise or remove the package’s traffic limit.
- If you also see
407 PACKAGE_NO_CREDITS, the organization is out of credits — top up to continue.
Node errors (502)
These errors mean SOAX accepted your request but couldn’t complete it through the proxy network.NODE_UNAVAILABLE
- If you’re using rotating mode (no session), just retry. The next request will get a different node.
- If you’re using a session, your
onerrorrule controls what happens next. The default (onerror-replace) automatically gets a new node. If you setonerror-fail, you’ll see this error instead of an automatic replacement. - If this happens frequently for a specific geo target, the available pool in that region may be limited. Try broadening your filters (e.g. target the country instead of a specific city).
NODE_NOT_FOUND
- Check the
X-SOAX-Detailheader for exactly which filters couldn’t be matched. - Broaden your targeting. The most common cause is combining a small city with a specific ISP or carrier, leaving very few eligible nodes.
- If you’re targeting mobile (
network-mob), remember the mobile pool is smaller than residential. Trynetwork-resornetwork-anyto see if the issue is mobile-specific. - Some country/city/ISP combinations may have limited availability at certain times of day. Try again later or target a nearby city instead.
RETRIES_EXHAUSTED
onerror-retry_N, SOAX retries on the current node up to N times. If all of those fail, it then tries to replace the node — and that replacement attempt also failed.
How to fix it:
- This usually means the pool matching your filters is under heavy load or very small. Broaden your geo or ISP filters.
- If you’re using
onerror-retry_Nwith a high retry count, consider reducing it. Retrying many times on a failing node wastes time. - Check if the issue is transient by retrying the request after a short delay.
Binding errors (503)
BOUND_NODE_FAILED
bind-node to lock your session to a specific node, and that node is no longer available. Because bind-node prevents automatic replacement, the request fails.
How to fix it:
- This is expected behavior with
bind-node. The tradeoff for strict node binding is that you lose the safety net of automatic replacement. - Start a new session (use a different session ID) to get assigned to a new node.
- If you want retries on the same node before failing, combine
bind-nodewithonerror-retry_N. For example:session-x-bind-node-onerror-retry_3. - If you don’t need strict node binding, remove
bind-nodefrom your rules and let the system handle replacement automatically.
Protocol errors (403)
DISALLOWED
- Switch to an allowed protocol (HTTP, HTTPS, or SOCKS5).
- If you need a specific protocol that’s currently blocked, update the package settings in the dashboard.
Timeout errors (504)
GATEWAY_TIMEOUT
- Check if the target website is accessible directly (without a proxy). If it’s down, the proxy can’t help.
- If the target is a large page or slow API, increase the timeout on your HTTP client.
- Try a different geo target. Some regions have higher latency nodes than others.
- If this happens consistently on specific targets, the target may be rate-limiting or blocking the exit IP at the TCP level. Try rotating to a fresh IP.
Quick reference
| Code | X-SOAX-Error | Category | Cause |
|---|---|---|---|
| 400 | ERR_INVALID_VALUE | Validation | Bad value for a rule (country code, ISP, ASN, etc.) |
| 400 | ERR_MISSING_PARAMS | Validation | No targeting rule supplied |
| 400 | ERR_UNKNOWN_PARAM | Validation | Unrecognised rule name |
| 400 | ERR_DUPLICATE_PARAM | Validation | Same rule appears twice |
| 400 | ERR_INVALID_COMBINATION | Validation | Rules that can’t be used together |
| 400 | ERR_PARAM_NOT_ALLOWED | Validation | Rule not permitted on this package or context |
| 403 | DISALLOWED | Protocol | Protocol not in the allowed list |
| 407 | ERR_AUTH_REQUIRED | Auth | No credentials supplied |
| 407 | AUTH_FAILED | Auth | Wrong or missing package key |
| 407 | IP_NOT_ALLOWED | Auth | Client IP not on allowlist |
| 407 | PACKAGE_SUSPENDED | Account | Account suspended |
| 407 | PACKAGE_PAUSED | Account | Package paused |
| 407 | PACKAGE_NO_CREDITS | Account | Organization credit pool empty (account-wide) |
| 409 | SESSION_PARAMS_MISMATCH | Session | Session ID reused with different rules |
| 429 | RATE_LIMIT_EXCEEDED | Limit | RPS or connection limit hit |
| 429 | TRAFFIC_LIMIT_EXCEEDED | Limit | Package’s own GB cap reached (org still has credits) |
| 502 | NODE_UNAVAILABLE | Node | Node went offline |
| 502 | NODE_NOT_FOUND | Node | No nodes match your filters |
| 502 | RETRIES_EXHAUSTED | Node | All retries and replacement failed |
| 503 | BOUND_NODE_FAILED | Binding | Bound node failed, no replacement allowed |
| 504 | GATEWAY_TIMEOUT | Timeout | Request timed out after tunnel established |
Still stuck?
If you’ve worked through the fixes above and the issue persists, check the Connection Debugging page for a step-by-step diagnostic checklist, or contact support through the dashboard.Next steps
Connection debugging
Step-by-step checklist for diagnosing connection issues.
FAQ
Answers to the most common questions.
Residential proxies
Full rule reference including error handling options.
Authentication
Make sure your credentials are set up correctly.