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.
hproxy.com/api/proxy-checkno keycurl "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.
| Parameter | Type | Required | Description |
|---|---|---|---|
proxy | ip:port (query) | required | The proxy to test, e.g. 203.0.113.7:1080, or host:port:user:pass for one with a login. |
hproxy.com/api/proxy-checkno keycurl -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.
| Parameter | Type | Required | Description |
|---|---|---|---|
proxies | string[] | required | Up to 1,000 proxy lines per request (ip:port, host:port:user:pass or user:pass@host:port). |
hproxy.com/api/free-proxy/checkno keycurl -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.
| Parameter | Type | Required | Description |
|---|---|---|---|
proxies | string[] | required | Up to 100,000 proxy lines. |
timeout_ms | integer | optional | Per-probe budget, 1,000 to 60,000. Default 8,000. |
retries | integer | optional | Extra attempts for a proxy that does not answer, 0 to 3. Default 0. |
protocols | string[] | optional | Any of http, https, socks4, socks5. Default all four. |
measure_speed | boolean | optional | Also measure download speed through each working proxy (speed_mbps). |
measure_udp | boolean | optional | Also test whether each working SOCKS5 proxy relays UDP (supports_udp). |
hproxy.com/api/v1/free-proxy/checkkeycurl -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" }.
| Parameter | Type | Required | Description |
|---|---|---|---|
X-API-Key | header | required | Your hpx_ key (or Authorization: Bearer hpx_...). |
hproxy.com/api/v1/proxy-check/jobskeycurl -X POST https://hproxy.com/api/v1/proxy-check/jobs \
-H "X-API-Key: hpx_..." -H "Content-Type: text/plain" \
--data-binary @list.txtHand 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
X-API-Key | header | required | Your hpx_ key (or Authorization: Bearer hpx_...). |
proxies | string[] | required | Up to 100,000 proxy lines. A text/plain body of one line per proxy works too. |
label | string | optional | Your own name for the run, up to 64 characters. Shown in the dashboard. |
timeout_ms | integer | optional | Per-probe budget, 1,000 to 60,000. Default 8,000. |
retries | integer | optional | Extra attempts for a proxy that does not answer, 0 to 3. Default 0. |
protocols | string[] | optional | Any of http, https, socks4, socks5. Default all four. |
measure_speed | boolean | optional | Also measure download speed through each working proxy (speed_mbps). |
measure_udp | boolean | optional | Also test whether each working SOCKS5 proxy relays UDP (supports_udp). |
hproxy.com/api/v1/proxy-check/jobs/{id}keycurl 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": [ ... ] }.
| Parameter | Type | Required | Description |
|---|---|---|---|
X-API-Key | header | required | Your hpx_ key. |
id | string (path) | required | The job id you got back from the create call. |
hproxy.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.txtDownload 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
X-API-Key | header | required | Your hpx_ key. |
format | ndjson | txt | csv | optional | Default ndjson. txt is the working proxies only; csv carries a header row. |
only | alive | optional | Drop the dead rows (txt does this anyway). |
hproxy.com/api/v1/proxy-check/jobs/{id}keycurl -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.
| Parameter | Type | Required | Description |
|---|---|---|---|
X-API-Key | header | required | Your hpx_ key. |
id | string (path) | required | The job to stop. |
Need a hand wiring this up? Email support@hproxy.com. A real person reads every message.