Proxy./ docs

Proxy checker API

GET or POST https://hproxy.com/api/proxy-check runs a real live test on any proxy: alive, protocols, anonymity, latency and location. Free, no key.

GEThproxy.com/api/proxy-checkno key
curl "https://hproxy.com/api/proxy-check?proxy=203.0.113.7:1080"

Check one proxy

Check whether a proxy is alive and get its protocols, anonymity grade, latency and location. Free, no key, CORS enabled. Each request runs a real live test against the proxy (a dead one can take a few seconds to report).

Two limits apply, and every checker endpoint shares them. Requests: 120 in a burst per IP, then 5 a second. Proxies checked: 300,000 a day per IP, refilling continuously. A signed-in account, or an API key, gets ten times both. Past either you get a 429 with Retry-After and a code saying which limit it was (rate_limited, daily_budget, or busy when the whole service is at capacity). Every answer reports the daily budget in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Cost, so you can pace yourself from the headers.

status is the verdict: alive, dead, invalid (we could not read the line), unresolved (the hostname has no DNS answer), forbidden (a private or reserved address we do not dial) or unchecked (no answer inside the time budget; not a verdict, retry the line). For a gateway proxy, exit_ip is where your traffic actually comes out, and the location fields describe that address. A dead proxy carries the reason in failure (refused, timeout, tls_error, bad_status, no_echo). Geo and ASN fields fill in when enrichment data exists and are null otherwise.

ParameterTypeRequiredDescription
proxyip:port (query)requiredThe proxy to test, e.g. 203.0.113.7:1080, or host:port:user:pass for one with a login.
POSThproxy.com/api/proxy-checkno key
curl -X POST https://hproxy.com/api/proxy-check \
  -H "Content-Type: application/json" \
  -d '{"proxies": ["203.0.113.7:1080", "198.51.100.3:8080"]}'

Check up to 1,000 at once

POST a JSON body with up to 1,000 proxies. They are checked in parallel and the answer comes back in one response within about 25 seconds: a few seconds when they are alive, longer when some never answer. The response is { "count": n, "results": [ ... ], "complete": true, "unchecked": 0 } with the same per-proxy shape, one row for every line you sent. A line that did not get an answer inside the time budget comes back with status: "unchecked", and complete is then false: retry those lines, or stream the list instead. Bigger lists belong on the streaming endpoint below, which takes up to 100,000 and reports each proxy the moment it settles.

ParameterTypeRequiredDescription
proxiesstring[]requiredUp to 1,000 proxy lines per request (ip:port, host:port:user:pass or user:pass@host:port).
POSThproxy.com/api/free-proxy/checkno key
curl -N -X POST https://hproxy.com/api/free-proxy/check \
  -H "Content-Type: application/json" \
  -d '{"proxies": ["203.0.113.7:1080", "198.51.100.3:8080"], "protocols": ["socks5"]}'

Stream a big list, up to 100,000

The endpoint behind our proxy checker page. POST the list and read the answer as NDJSON: one JSON line per proxy, in the shape above, written the moment that proxy settles, so you can show results while the rest are still running. The same limits apply, counted per proxy.

Two kinds of event lines ride along; skip any line that has an _event key you do not know. {"_event":"progress","done":N,"total":M} arrives every 15 seconds, and {"_event":"end","total":M,"done":M,"duration_ms":N} closes a finished batch. A stream that stops without the end line was cut (a network drop, or a restart on our side): the lines you have no row for were not checked, so send just those again.

If your list is big enough that the run takes minutes, hand it over as a job instead: nothing stays connected, and an interrupted job resumes by itself.

ParameterTypeRequiredDescription
proxiesstring[]requiredUp to 100,000 proxy lines.
timeout_msintegeroptionalPer-probe budget, 1,000 to 60,000. Default 8,000.
retriesintegeroptionalExtra attempts for a proxy that does not answer, 0 to 3. Default 0.
protocolsstring[]optionalAny of http, https, socks4, socks5. Default all four.
measure_speedbooleanoptionalAlso measure download speed through each working proxy (speed_mbps).
measure_udpbooleanoptionalAlso test whether each working SOCKS5 proxy relays UDP (supports_udp).
POSThproxy.com/api/v1/free-proxy/checkkey
Request
curl -N -X POST https://hproxy.com/api/v1/free-proxy/check \
  -H "X-API-Key: hpx_..." -H "Content-Type: application/json" \
  -d '{"proxies": ["gate.example.com:7000:user:pass"]}'

With your API key

Every checker endpoint also answers under /api/v1 for an API key: POST /api/v1/free-proxy/check streams, GET and POST /api/v1/proxy-check answer in one response. Same bodies, same result rows, and your account's tier: ten times the requests and 3,000,000 proxies a day, counted on the account rather than on the address, so a whole team behind one office connection is not squeezed into one person's budget. Any key works; checking spends nothing and needs no scope. Errors come back in the usual /api/v1 shape, { "error", "code" }.

ParameterTypeRequiredDescription
X-API-KeyheaderrequiredYour hpx_ key (or Authorization: Bearer hpx_...).
POSThproxy.com/api/v1/proxy-check/jobskey
curl -X POST https://hproxy.com/api/v1/proxy-check/jobs \
  -H "X-API-Key: hpx_..." -H "Content-Type: text/plain" \
  --data-binary @list.txt

Hand over a big list as a job

For the lists that take minutes: hand the list over, get an id back immediately, come back for the results when it is done. Nothing has to stay connected, so a dropped line, a closed laptop or a restart on our side does not cost you the run — a job that is interrupted resumes on the line after the last one answered.

Accounts only (an API key, or signed in on the dashboard). The list costs the same as checking it any other way: every line is charged to your daily budget of 3,000,000 when the job is created, and refunded if the job could not be created at all.

The limits that keep this from becoming a flood: up to 100,000 lines per job, 3 queued or running jobs at a time per account, and 20 job creations an hour. Job probes run in the lowest lane, below every live check, so they pause while the service is under load and pick up again by themselves. Results live for 72 hours after the job ends, then the files are deleted and the job reads expired.

Send the list as { "proxies": [...] } with the same options the streaming endpoint takes, or as a text/plain body of one proxy per line (what curl --data-binary @list.txt sends). Answer is 202 with the job.

ParameterTypeRequiredDescription
X-API-KeyheaderrequiredYour hpx_ key (or Authorization: Bearer hpx_...).
proxiesstring[]requiredUp to 100,000 proxy lines. A text/plain body of one line per proxy works too.
labelstringoptionalYour own name for the run, up to 64 characters. Shown in the dashboard.
timeout_msintegeroptionalPer-probe budget, 1,000 to 60,000. Default 8,000.
retriesintegeroptionalExtra attempts for a proxy that does not answer, 0 to 3. Default 0.
protocolsstring[]optionalAny of http, https, socks4, socks5. Default all four.
measure_speedbooleanoptionalAlso measure download speed through each working proxy (speed_mbps).
measure_udpbooleanoptionalAlso test whether each working SOCKS5 proxy relays UDP (supports_udp).
GEThproxy.com/api/v1/proxy-check/jobs/{id}key
curl https://hproxy.com/api/v1/proxy-check/jobs/cj_7f1c0e5a... \
  -H "X-API-Key: hpx_..."

Watch a job

The same job body, with done and alive climbing as lines settle. status is queued (with queue_position while it waits), running, done, cancelled, failed (the reason is in error) or expired (the results have been deleted). Poll it every few seconds, not every few milliseconds — it counts against your request limit like any other call.

GET /api/v1/proxy-check/jobs lists your 20 most recent jobs as { "count": n, "jobs": [ ... ] }.

ParameterTypeRequiredDescription
X-API-KeyheaderrequiredYour hpx_ key.
idstring (path)requiredThe job id you got back from the create call.
GEThproxy.com/api/v1/proxy-check/jobs/{id}/resultskey
# the working ones, ready to use
curl "https://hproxy.com/api/v1/proxy-check/jobs/cj_7f1c0e5a.../results?format=txt" \
  -H "X-API-Key: hpx_..." -o working.txt

Download the results

Everything that has settled, in the format you ask for. It works on a running job too, so you can start reading before the list is finished — and reading does not consume anything: the file stays until the job expires, so you can download it as often as you like.

format=ndjson (the default) is one result row per line, the exact shape every checker endpoint returns. format=txt is the working proxies only, one line per proxy, ready to paste straight back into whatever you feed proxies to. format=csv is a spreadsheet with a header row. Add only=alive to drop the dead rows from any format. txt and csv come back as a download; ndjson streams.

After the retention window the job reads expired and this answers 410.

ParameterTypeRequiredDescription
X-API-KeyheaderrequiredYour hpx_ key.
formatndjson | txt | csvoptionalDefault ndjson. txt is the working proxies only; csv carries a header row.
onlyaliveoptionalDrop the dead rows (txt does this anyway).
DELETEhproxy.com/api/v1/proxy-check/jobs/{id}key
Request
curl -X DELETE https://hproxy.com/api/v1/proxy-check/jobs/cj_7f1c0e5a... \
  -H "X-API-Key: hpx_..."

Cancel a job

Stops a queued or running job. What it already answered stays downloadable until it expires, so cancelling a long run is a fine way to say "that is enough of these". A job that has already finished answers 409; the lines it did not get to are not refunded.

ParameterTypeRequiredDescription
X-API-KeyheaderrequiredYour hpx_ key.
idstring (path)requiredThe job to stop.
Your proxies stay yours. The checker tests the proxies you send and returns the results. They are never saved or added to our free list. A job's list and results sit on our disk only until the job expires, then both files are deleted.

Need a hand wiring this up? Email support@hproxy.com. A real person reads every message.

Proxy.· developer documentation