API Documentation
Check proxies, read job results, and pull verified proxy lists programmatically. The API-key endpoints are rate limited per account tier; the free proxy list can also be read without a key, limited per IP address.
Getting started
1. Create a key
Generate an API key at Account → API Keys. The full key is shown only once.
2. Call the API
Send the key in the Authorization header on every request.
3. Request access
Programmatic API access and curated pools are free on request: email [email protected].
https://proxycheck.app/api/v1Authentication
Every request must include your API key as a Bearer token. Keys start with pk_live_ and are tied to your account's role and permissions.
Authorization: Bearer pk_live_YOUR_KEYTreat keys like passwords: never commit them, never expose them in client-side code. Revoking a key at Account → API Keys blocks it immediately.
Endpoints
Holding an API key does not unlock every endpoint. Each one is gated by a permission that an admin assigns per role, so your key reaches only the subset your plan allows. The badges below reflect your own access.
Sign in to see which of these endpoints your plan can call.
/api/proxies| Parameter | Type | Description |
|---|---|---|
| protocol | string | http, https, socks4 or socks5, any case; any other value returns 400 |
| country | string | Two-letter ISO code, e.g. US, any case; any other value returns 400 |
| anonymity | string | elite for all protocols: HTTP/HTTPS are checked through an HTTPS (CONNECT) tunnel, where a proxy cannot add headers |
| fresh_minutes | int | Only proxies checked within N minutes; 1–1440 (default 1440, other values use 1440) |
| max_latency_ms | int | Maximum latency (ttfb_ms) in ms |
| min_uptime | int | Minimum uptime as a percentage 0–100 (e.g. 90 = at least 90%; 100 = perfect) |
| proxy | string | Substring match on the proxy (ip:port) |
| sort | string | checked_desc (default), checked_asc, latency_asc, latency_desc, uptime_desc, uptime_asc |
| page / limit | int | Pagination; limit 1–200 (default 50) |
curl "https://proxycheck.app/api/v1/api/proxies?protocol=socks5&country=US&limit=20" \
-H "Authorization: Bearer pk_live_YOUR_KEY"{
"page": 1,
"limit": 20,
"total": 1342,
"refreshed_at": "2026-06-10T08:00:00Z",
"items": [
{
"proxy_norm": "socks5://1.2.3.4:1080",
"status": "live",
"protocol": "socks5",
"connect_ms": 230,
"ttfb_ms": 510,
"exit_ip": "1.2.3.4",
"country": "US",
"city": "Ashburn",
"asn": "AS14061",
"anonymity": "elite",
"uptime_score": 0.98,
"checked_at": "2026-06-10T07:59:12Z"
}
]
}/api/proxies/export| Parameter | Type | Description |
|---|---|---|
| format | string | txt (default), csv or json |
| max_rows | int | Rows to export, 1–500 (default 500; other values use 500) |
| …filters | — | Same filters and rules as /api/proxies (results are always newest-first); fresh_minutes is clamped to 1–1440 as on the list |
curl -o proxies.txt "https://proxycheck.app/api/v1/api/proxies/export?format=txt&protocol=http" \
-H "Authorization: Bearer pk_live_YOUR_KEY"/api/check| Parameter | Type | Description |
|---|---|---|
| proxies_text | string | Newline-separated proxies (required) |
| include_anonymity | bool | Accepted for compatibility; anonymity is not measured |
| default_protocol | string | http (default), https, socks4 or socks5, for lines without a protocol:// prefix; other values return 400 |
curl -X POST "https://proxycheck.app/api/v1/api/check" \
-H "Authorization: Bearer pk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"proxies_text": "1.2.3.4:1080\n5.6.7.8:8080"}'// 201 Created
{ "job_id": "9f1c…" }
// Poll GET /api/jobs/{job_id} for status (queued → running → done)./api/jobs/{jobId}{
"job_id": "9f1c…",
"status": "done",
"total": 2,
"done": 2,
"created_at": "2026-06-10T08:00:00Z",
"started_at": "2026-06-10T08:00:02Z",
"finished_at": "2026-06-10T08:00:21Z"
}/api/jobs/{jobId}/items| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by result status, e.g. live or dead |
| protocol | string | http, https, socks4 or socks5 |
| country | string | ISO country code, e.g. US |
| max_latency_ms | int | Maximum latency (ttfb_ms) in ms |
| sort | string | input, latency (= latency_desc), latency_asc, status; defaults to input order |
| page / limit | int | Pagination; limit 1–200 (default 50) |
{
"page": 1,
"limit": 50,
"total": 2,
"items": [
{
"input_index": 0,
"proxy_norm": "socks5://1.2.3.4:1080",
"status": "live",
"protocol": "socks5",
"connect_ms": 230,
"ttfb_ms": 510,
"exit_ip": "1.2.3.4",
"country": "US",
"city": "Ashburn",
"asn": "AS14061",
"anonymity": "elite",
"checked_at": "2026-06-10T08:00:20Z"
}
]
}/api/jobs/{jobId}/export| Parameter | Type | Description |
|---|---|---|
| format | string | txt (default), csv or json |
| …filters | — | Same status / protocol / country / max_latency_ms / sort filters as the items endpoint |
curl -o results.csv "https://proxycheck.app/api/v1/api/jobs/<JOB_ID>/export?format=csv" \
-H "Authorization: Bearer pk_live_YOUR_KEY"/api/premium/proxies| Parameter | Type | Description |
|---|---|---|
| protocol | string | http, https, socks4 or socks5, in any case. Any other value returns 400 |
| country | string | Two-letter ISO code in any case (us matches US). Any other value returns 400 |
| tier | string | A (Hot — freshest, most reliable) or B (Warm). Omit to return both |
| search | string | Substring match on the proxy or host |
| sort_by | string | score (default), reliability, latency or last_check_at |
| sort_order | string | asc or desc (latency defaults to asc, the rest to desc) |
| limit | int | Page size 1–200 (default 50) |
| offset | int | Rows to skip (default 0). Premium paginates by offset, not page |
| platform | string | Comma list of google, youtube, facebook, instagram, threads, tiktok: only proxies with a fresh ok verdict on every listed platform. protocol_counts apply it too. An unknown name returns 400 |
| facets | string | 1 or true adds facets: counts per protocol, tier and country under every other filter in the request (the facet’s own filter is ignored; country sorted by count, proxies without a two-letter country code left out), and per platform the proxies that match every filter and have a fresh ok on it (only while platform_filter is true). Every key is present, zero included; if the counts cannot be read, facets is left out and the list is still returned |
curl "https://proxycheck.app/api/v1/api/premium/proxies?tier=A&protocol=socks5&sort_by=reliability&limit=20" \
-H "Authorization: Bearer pk_live_YOUR_KEY"{
"total": 1342,
"limit": 20,
"offset": 0,
"protocol_counts": { "http": 800, "socks5": 542 },
"platform_filter": true,
"proxies": [
{
"id": "12345",
"proxy_norm": "socks5://1.2.3.4:1080",
"host": "1.2.3.4",
"port": 1080,
"protocol": "socks5",
"country": "US",
"city": "Ashburn",
"anonymity": "elite",
"latency_ms": 230.5,
"reliability": 0.9871,
"score": 642.7,
"tier": "A",
"asn": "AS14061",
"last_check_at": "2026-06-19T07:59:12Z",
"platforms": {
"google": { "status": "blocked", "reason": "sorry", "checked_at": "2026-06-19T07:31:02Z" },
"youtube": { "status": "ok", "checked_at": "2026-06-19T06:58:40Z" },
"tiktok": { "status": "ok", "checked_at": "2026-06-19T03:12:09Z" }
}
}
]
}/api/stable-proxies| Parameter | Type | Description |
|---|---|---|
| pool | string | premium (optional; the only list) |
| days | int | Window in days, 1–7 (default 1) |
| min_uptime | number | Minimum uptime 0.5–1.0 (default 0.8), required of every window ending now, from the last day up to the whole window |
| protocol | string | http, https, socks4 or socks5 (the label), in any case |
| country | string | Two-letter ISO code in any case, e.g. US |
| live_now | bool | true (default) or false |
| sort | string | uptime (default), checks or latency |
| limit | int | Page size 1–500 (default 100) |
| offset | int | Rows to skip, 0–10000 (default 0) |
| format | string | json (default) or txt (one URL per line, same filters, order and page) |
| platform | string | While the platform check is on: comma list of google, youtube, facebook, instagram, threads, tiktok; only proxies with a fresh ok on every listed platform (before the merge, like protocol). Items then carry platforms (as on the premium list) and the response has platform_filter: true. An unknown name returns 400 |
| facets | string | 1 or true adds facets, each count equal to the total with that option picked: protocol (rows per label before the merge; protocol_all = the total with no protocol picked), country (URLs per country, two-letter codes only) and platform (URLs with a fresh ok); every protocol and platform key is present |
curl "https://proxycheck.app/api/v1/api/stable-proxies?days=3&min_uptime=0.9&protocol=socks5" \
-H "Authorization: Bearer pk_live_YOUR_KEY"{
"pool": "premium",
"days": 3,
"min_uptime": 0.9,
"window_start": "2026-10-05T09:00:00Z",
"window_end": "2026-10-08T09:00:00Z",
"generated_at": "2026-10-08T09:41:12Z",
"total": 123,
"items": [
{
"proxy": "socks5://user:[email protected]:1080",
"protocol": "socks5",
"country": "US",
"uptime": 0.9583,
"hours_live": 69,
"window_hours": 72,
"live_ratio": 0.9295,
"checks": 312,
"live_checks": 290,
"tracked_since": "2026-10-04T18:00:00Z",
"last_checked_at": "2026-10-08T09:35:02Z",
"latency_ms": 850,
"live_now": true,
"tier": 1
}
]
}Free list API (no key)
The free proxy list behind /free-proxies can be read by scripts without an API key or an account. These read-only endpoints use the same base URL and are limited per IP address, not per account.
Machine-readable spec for code generators and AI agents: /openapi.json (OpenAPI 3.1, these four endpoints only).
The list, stats and countries endpoints share one bucket of 120 requests per minute per IP; export allows 6 files per hour per IP, each of at most 500 proxies. Answers are cached on the server for 30 seconds (export: 60 seconds), and cached answers count toward the limit too.
Over the limit the API returns 429 with {"error": "rate limit exceeded", "retry_at": "…"}; wait until retry_at. For higher limits use the API-key endpoints above.
/public-proxies| Parameter | Type | Description |
|---|---|---|
| protocol | string | http, https, socks4 or socks5, any case; any other value returns 400 |
| country | string | Two-letter ISO code, e.g. US, any case (us = US); any other value returns 400 |
| anonymity | string | elite for all protocols: HTTP/HTTPS are checked through an HTTPS (CONNECT) tunnel, where a proxy cannot add headers |
| fresh_minutes | int | Only proxies checked within N minutes; 1–1440 (default 1440, other values use 1440) |
| max_latency_ms | int | Maximum latency (ttfb_ms) in ms |
| min_uptime | int | Minimum uptime as a percentage 0–100 (100 = at least 99.5%) |
| proxy | string | Substring match on the proxy or its exit IP (not cached) |
| sort | string | checked_desc (default), checked_asc, latency_asc, latency_desc, uptime_desc, uptime_asc |
| page / limit | int | page ≥ 1 (pages past 1000 return page 1000); limit 1–200, default 50 (other values use 50) |
| quality | string | full (default), quick or none |
curl "https://proxycheck.app/api/v1/public-proxies?protocol=socks5&country=US&limit=20"{
"page": 1,
"limit": 20,
"total": 312,
"refreshed_at": "2026-10-17T08:00:00Z",
"items": [
{
"proxy_norm": "socks5://1.2.3.4:1080",
"status": "live",
"protocol": "socks5",
"connect_ms": 230,
"ttfb_ms": 510,
"country": "US",
"anonymity": "elite",
"uptime_score": 0.98,
"checked_at": "2026-10-17T07:59:12Z"
}
]
}/public-proxies/stats| Parameter | Type | Description |
|---|---|---|
| …filters | — | protocol, country, anonymity, fresh_minutes, max_latency_ms, min_uptime, proxy and quality, as on /public-proxies |
curl "https://proxycheck.app/api/v1/public-proxies/stats?country=US"{
"total": 371,
"protocols": { "http": 30, "https": 12, "socks4": 17, "socks5": 312 },
"anonymity": { "transparent": 0, "anonymous": 0, "elite": 371 }
}/public-proxies/countries| Parameter | Type | Description |
|---|---|---|
| fresh_minutes | int | 1–1440 (default 1440, other values use 1440) |
curl "https://proxycheck.app/api/v1/public-proxies/countries"{
"countries": [
{
"code": "US",
"total": 370,
"protocols": { "http": 30, "https": 12, "socks4": 17, "socks5": 311 }
}
]
}/public-proxies/export| Parameter | Type | Description |
|---|---|---|
| format | string | txt (default), csv or json; any other value returns 400 |
| max_rows | int | Rows to export, 1–500 (default 500; other values use 500) |
| …filters | — | Same filters and rules as /public-proxies, except sort and paging; fresh_minutes is clamped to 1–1440 as on the list |
curl -o proxies.txt "https://proxycheck.app/api/v1/public-proxies/export?format=txt&protocol=socks5"Rate limits
Limits are applied per account — every key you own shares the same bucket per category. When a limit is exceeded the API returns 429 Too Many Requests — back off and retry after the window resets. Default limits:
| Category | Applies to | Free | Premium |
|---|---|---|---|
| api_read | Proxy lists, job status & results | 60 / min | 300 / min |
| api_check | Submitting check jobs | 20 / hour | 200 / hour |
| api_export | File exports (incl. stable proxies as txt) | 10 / hour | 60 / hour |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers so you can pace requests. A 429 adds a Retry-After header and a retry_at field in the body.
Errors
Errors are returned as JSON: {"error": "message"}
| Status | Meaning |
|---|---|
| 400 | Invalid request — bad parameters or no valid proxies in proxies_text |
| 401 | Missing or invalid API key |
| 403 | Key is valid but your role lacks the required permission, account is not active, or premium is required |
| 429 | Rate limit exceeded for this category — body includes retry_at; honor the Retry-After header |
| 5xx | Server error — safe to retry with backoff |
Code examples
Full check-and-poll workflow: submit proxies, wait for the job, read results.
# 1. Submit proxies for checking
curl -X POST "https://proxycheck.app/api/v1/api/check" \
-H "Authorization: Bearer pk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"proxies_text": "1.2.3.4:1080\n5.6.7.8:8080"}'
# -> {"job_id":"<JOB_ID>", ...}
# 2. Poll job status until "done"
curl "https://proxycheck.app/api/v1/api/jobs/<JOB_ID>" \
-H "Authorization: Bearer pk_live_YOUR_KEY"
# 3. Fetch results
curl "https://proxycheck.app/api/v1/api/jobs/<JOB_ID>/items" \
-H "Authorization: Bearer pk_live_YOUR_KEY"