Quick answer
How do I check if a proxy is static?
To check if a proxy is static, request api.ipify.org and ipinfo.io/json through it once an hour for at least 24 hours. Then compare the exit IP, the ASN (the org field) and the country across all successful checks. One IP and one ASN in every row means the proxy stayed static over that window. SteadyProxy static IPs are meant to stay fixed for each 30-day rental; this test lets you verify it yourself. Updated 19 October 2026.
What are the key facts of the test?
| Test endpoints | api.ipify.org (exit IP only) and ipinfo.io/json (IP, org/ASN, city, region, country) |
|---|---|
| Suggested window | 24 hours, one check per hour (24 checks); repeat on day 7 for long jobs |
| Static result | The same IP and the same ASN in every successful check |
| Rotating result | Two or more distinct IPs, or a change of ASN |
| Failed request | A timeout is not an IP change: compare successful rows only |
| City changes | Can happen when a database updates; IP and ASN are the stronger signals |
| Tested | Both scripts ran on 19 October 2026 through a password-protected test proxy |
What exactly should stay the same on a static proxy?
Three values must not change: the exit IP, the ASN and the country. The exit IP is the address websites see; api.ipify.org returns only that. The ASN is the network that announces the IP; ipinfo.io shows it in the org field, for example AS9009 followed by a network name. The country comes from an IP database. The city and region can move when that database is updated, even if the IP stays the same. Note that the host you connect to is not always the exit IP: always read the exit IP through the proxy.
How do I check a proxy with curl?
Run one check first to see the fields, then the loop. Replace USERNAME, PASSWORD, host and port with the four values shown for your IP in the dashboard. The loop writes one line per check to ip-log.txt and sleeps 3,600 seconds between checks. The last two commands count distinct IPs and networks: one line each means the proxy stayed static during the test.
# One check through the proxy: IP, network (org = ASN + name), country, city
curl -s -m 30 -x "http://USERNAME:[email protected]:7777" https://ipinfo.io/json
# 24 checks, one per hour, one line per check in ip-log.txt
PROXY="http://USERNAME:[email protected]:7777"
for i in $(seq 1 24); do
printf '%s ' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> ip-log.txt
curl -s -m 30 -x "$PROXY" https://ipinfo.io/json | tr -d '\n' >> ip-log.txt
echo >> ip-log.txt
sleep 3600
done
# Count the distinct exit IPs and networks in the log (one line each = static)
grep -o '"ip": *"[^"]*"' ip-log.txt | sort | uniq -c
grep -o '"org": *"[^"]*"' ip-log.txt | sort | uniq -c
How do I check a proxy with Python?
The Python script does the same test and writes a CSV file you can open in a spreadsheet. It reads the proxy details from environment variables (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS) and two settings: CHECKS (default 24) and INTERVAL_SECONDS (default 3600). It queries both endpoints in each round, so you can also catch a mismatch between them. At the end it prints the distinct IPs, networks and countries, and a one-line result. We ran it on 19 October 2026 with Python 3.14 and Requests 2.34, through a local test proxy that requires a username and password.
"""Log the exit IP, network and location of one proxy over time.
A static IP shows the same IP, network (ASN) and country in every row.
Install: python -m pip install requests
"""
import csv
import os
import time
from datetime import datetime, timezone
from urllib.parse import quote
import requests
HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
PORT = os.environ.get("PROXY_PORT", "7777")
USER = os.environ.get("PROXY_USER", "USERNAME")
PASSWORD = os.environ.get("PROXY_PASS", "PASSWORD")
CHECKS = int(os.environ.get("CHECKS", "24"))
INTERVAL = int(os.environ.get("INTERVAL_SECONDS", "3600"))
LOG_FILE = os.environ.get("LOG_FILE", "static-ip-log.csv")
PROXY = "http://" + quote(USER, safe="") + ":" + quote(PASSWORD, safe="") + "@" + HOST + ":" + PORT
PROXIES = {"http": PROXY, "https": PROXY}
FIELDS = ["time_utc", "ipify_ip", "ipinfo_ip", "org", "country", "region", "city"]
def check_once(session):
ipify = session.get("https://api.ipify.org?format=json", proxies=PROXIES, timeout=(10, 30))
ipify.raise_for_status()
info = session.get("https://ipinfo.io/json", proxies=PROXIES, timeout=(10, 30))
info.raise_for_status()
data = info.json()
return {
"time_utc": datetime.now(timezone.utc).isoformat(timespec="seconds"),
"ipify_ip": ipify.json()["ip"],
"ipinfo_ip": data.get("ip", ""),
"org": data.get("org", ""),
"country": data.get("country", ""),
"region": data.get("region", ""),
"city": data.get("city", ""),
}
def main():
rows = []
with requests.Session() as session, open(LOG_FILE, "a", newline="", encoding="utf-8") as fh:
session.trust_env = False
writer = csv.DictWriter(fh, fieldnames=FIELDS)
if fh.tell() == 0:
writer.writeheader()
for n in range(CHECKS):
try:
row = check_once(session)
except requests.RequestException as exc:
print("check", n + 1, "failed:", type(exc).__name__)
else:
writer.writerow(row)
fh.flush()
rows.append(row)
print(row["time_utc"], row["ipify_ip"], row["org"], row["country"], row["city"])
if n + 1 < CHECKS:
time.sleep(INTERVAL)
ips = {r["ipify_ip"] for r in rows} | {r["ipinfo_ip"] for r in rows}
orgs = {r["org"] for r in rows}
countries = {r["country"] for r in rows}
print("successful checks:", len(rows), "of", CHECKS)
print("distinct IPs:", sorted(ips))
print("distinct networks:", sorted(orgs))
print("distinct countries:", sorted(countries))
if len(rows) >= 2 and len(ips) == 1 and len(orgs) == 1 and len(countries) == 1:
print("RESULT: same IP, network and country in every successful check")
else:
print("RESULT: not stable, or not enough data - read the log")
if __name__ == "__main__":
main()
How long should the test run?
Run it for at least 24 hours. Many rotating offers change the IP per request, per session or after a set number of minutes, so a few checks in one minute can miss a change. For a job that runs every week, repeat the test after 7 days. One check per hour is enough and stays far below the usage limits of free lookup services. Use a shorter interval only for a short test, such as 12 checks 5 minutes apart.
What if the IP changes during the test?
First rule out a setup error. Check that every request used the same host, port and username: two different IPs often come from two different credential lines. Then check whether a system proxy or VPN on your machine took over some requests; the Python script ignores such settings with trust_env = False. If the exit IP of one SteadyProxy credential line really changes during its rental, send your log to support. Our replacement rule: If an IP does not work, write to support: we repair it or replace it with another IP in the same country when stock allows.
Why can the location change while the IP stays the same?
Because location is an estimate from a database, not a property of the IP. Geolocation vendors update their data, and a static IP can move from one city to a nearby one between updates. Registry data is no better guide: RIPE's documentation says its country attribute cannot be used reliably to map IPs to countries. Treat a change of city as a database event and a change of IP or ASN as a real change. Our guide are static residential proxies really residential? explains how to read these records.
What else do people ask about testing static proxies?
How many checks prove that a proxy is static?
No number proves it for the future; a test only describes the window you measured. In practice, 24 hourly checks with one IP and one ASN show that the proxy did not rotate for a day. Repeat the test after a week and keep the logs. At SteadyProxy, each IP is meant to stay fixed for its 30-day rental.
Why use both api.ipify.org and ipinfo.io?
api.ipify.org returns only the IP, which makes it a clean reference. ipinfo.io adds the ASN and organisation, the city, the region and the country. If the two services ever report different IPs in the same round, your client may be opening several connections through different routes. That is worth checking before you trust any result.
Can a sticky session look static in a short test?
Yes. A rotating residential proxy with a sticky session keeps one IP for a set time, often minutes, then changes. A test of a few minutes would look static. That is why this guide asks for checks over at least 24 hours. A real static IP keeps the same IP and ASN across days.
Does a failed request mean the IP changed?
No. A timeout or a proxy error only means that one request did not complete. The scripts skip failed rounds and compare successful rows only. Many failures in a row deserve a look: check the credentials, the port and your own connection, then contact support if the problem stays.
Is it fine to send these checks to ipinfo.io without a token?
For light use, yes: one request per hour is very light traffic. ipinfo.io answers basic requests without a token, as our test on 19 October 2026 showed, and offers tokens for higher volumes. If you test many IPs at once, create a free token and add it to the request, or use api.ipify.org alone.
Should I test the exit IP or the host in my dashboard?
The exit IP. The host you connect to can be a name or an address that differs from the IP websites see. Run the check through the proxy and use the IP returned by api.ipify.org. That exit IP is also the one to add to an allowlist or to look up in WHOIS.
Can I run the test on a SteadyProxy IP before relying on it?
Yes, and we recommend it. Order one IP from $2.24 for 30 days, run the Python script for a day, and read the log. Under our refund policy, an IP that does not work in the first 24 hours after delivery, and that we cannot fix or replace, is credited back to your balance in full.
Which sources does this guide use? (5)
- ipify API — ipify (2026-10-19)
- IPinfo developer documentation — IPinfo (2026-10-19)
- Requests advanced usage: proxies and timeouts — Requests (2026-10-19)
- curl man page — curl (2026-10-19)
- RIPE Database documentation: country attribute — RIPE NCC (2026-10-19)