πŸ›°οΈ proxyMgr API

← ν”„λ‘μ‹œ λͺ©λ‘μœΌλ‘œ

proxyMgr API 맀뉴얼

μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘Β·κ²€μ¦λœ 무료 ν”„λ‘μ‹œ λͺ©λ‘μ„ κ°€μ Έλ‹€ μ“°κΈ° μœ„ν•œ REST API. λͺ¨λ“  μ—”λ“œν¬μΈνŠΈλŠ” 인증 없이 μ‚¬μš©ν•œλ‹€.

이 λ¬Έμ„œμ˜ λͺ¨λ“  URLΒ·μ‘λ‹΅Β·μ˜ˆμ œλŠ” μ‹€μ œ μ„œλ²„μ— λŒ€ν•΄ κ²€μ¦λœ 것이닀(2026-06-18).


λΉ λ₯Έ μ‹œμž‘ (TL;DR)

# 1) λ°”λ‘œ μ“Έ 수 μžˆλŠ”(usable) ν”„λ‘μ‹œλ₯Ό μ§€μ—°μ‹œκ°„ λΉ λ₯Έ 순으둜 κ°€μ Έμ˜€κΈ°
curl 'https://proxy.gulu.kr/api/proxies?status=usable&sort=latency&limit=20'

# 2) 받은 λͺ©λ‘μ—μ„œ ν•˜λ‚˜ 골라 μ‹€μ œλ‘œ μ‚¬μš© (socks5 μ˜ˆμ‹œ)
curl --socks5-hostname 49.143.59.205:110 https://api.ipify.org
#   -> 49.143.59.205  (ν”„λ‘μ‹œμ˜ IPκ°€ 좜λ ₯되면 정상 λ™μž‘)

status=usable은 μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯ν•œ ν”„λ‘μ‹œλ§Œ μ€€λ‹€(μ•„λž˜ "usable κ·œμΉ™" μ°Έμ‘°). κ°€μž₯ ν”ν•œ μ‚¬μš© νŒ¨ν„΄μ΄λ‹€.


μ—”λ“œν¬μΈνŠΈ

GET /api/proxies β€” ν”„λ‘μ‹œ λͺ©λ‘

κ°€μž₯ 핡심 μ—”λ“œν¬μΈνŠΈ. ν•„ν„°Β·μ •λ ¬Β·νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ§€μ›ν•œλ‹€.

쿼리 νŒŒλΌλ―Έν„° (λͺ¨λ‘ 선택)

이름 κ°’ κΈ°λ³Έκ°’ μ„€λͺ…
status usable | alive | all usable usable=λ°”λ‘œ μ‚¬μš© κ°€λŠ₯, alive=λ§ˆμ§€λ§‰ κ²€μ‚¬μ—μ„œ μ‚΄μ•„μžˆμŒ, all=전체
protocol http | socks5 (전체) ν”„λ‘œν† μ½œ ν•„ν„°
country κ΅­κ°€μ½”λ“œ (예: KR, US) (전체) ISO 2자리, λŒ€μ†Œλ¬Έμž 무관
anonymity elite | anonymous | transparent (전체) 읡λͺ…도
https 1 | true | yes (무관) HTTPS(CONNECT) 터널링 μ§€μ›λ§Œ
max_latency μ •μˆ˜(ms) (λ¬΄μ œν•œ) 이 μ§€μ—°μ‹œκ°„ μ΄ν•˜λ§Œ
sort latency | checked | country | uptime latency μ •λ ¬ κΈ°μ€€
limit μ •μˆ˜ (μ΅œλŒ€ 2000) 200 νŽ˜μ΄μ§€ 크기
offset μ •μˆ˜ 0 νŽ˜μ΄μ§€ μ˜€ν”„μ…‹

잘λͺ»λœ 값은 HTTP 422둜 κ±°λΆ€λœλ‹€(예: status=bogus, limit=abc).

μ˜ˆμ‹œ URL

https://proxy.gulu.kr/api/proxies?status=usable&sort=latency&limit=20
https://proxy.gulu.kr/api/proxies?status=usable&protocol=socks5&country=KR
https://proxy.gulu.kr/api/proxies?status=alive&protocol=http&https=1&anonymity=elite
https://proxy.gulu.kr/api/proxies?status=usable&sort=uptime&max_latency=1000
https://proxy.gulu.kr/api/proxies?status=alive&limit=100&offset=100

응닡 (μ‹€μ œ μ˜ˆμ‹œ)

{
  "count": 3,
  "total": 8,
  "offset": 0,
  "proxies": [
    {
      "ip": "49.143.59.205",
      "port": 110,
      "protocol": "socks5",
      "country": "South Korea",
      "country_code": "KR",
      "anonymity": "unknown",
      "https": 1,
      "latency_ms": 119,
      "alive": 1,
      "usable": 1,
      "sources": "proxyscrape,proxyscrape-api-v4,stormsia-proxy-list-socks5,...",
      "last_checked": "2026-06-18 12:02:40",
      "last_alive": "2026-06-18 12:02:40",
      "check_count": 1,
      "success_count": 1,
      "checked_age_s": 334,
      "alive_age_s": 334
    }
  ]
}

ν•„λ“œ μ„€λͺ…

ν•„λ“œ μ„€λͺ…
ip, port, protocol 접속 정보 (http λ˜λŠ” socks5)
country, country_code 좜ꡬ(exit) κ΅­κ°€
anonymity elite(IPΒ·ν”„λ‘μ‹œ 흔적 λͺ¨λ‘ μˆ¨κΉ€) / anonymous(ν”„λ‘μ‹œ 흔적 λ…ΈμΆœ) / transparent(μ‹€ IP λ…ΈμΆœ) / unknown
https 1이면 HTTPS(CONNECT) 터널링 지원 β€” HTTPS μ‚¬μ΄νŠΈμ— μ‚¬μš© κ°€λŠ₯
latency_ms λ§ˆμ§€λ§‰ 검사 μ‹œ 응닡 μ§€μ—°(ms)
alive λ§ˆμ§€λ§‰ κ²€μ‚¬μ—μ„œ μ‚΄μ•„μžˆμ—ˆλŠ”μ§€ (1/0)
usable "λ°”λ‘œ μ“Έ 수 있음" ν”Œλž˜κ·Έ (μ•„λž˜ κ·œμΉ™)
sources 이 ν”„λ‘μ‹œλ₯Ό λ³΄κ³ ν•œ μ†ŒμŠ€ 이름(콀마 ꡬ뢄)
last_checked, last_alive λ§ˆμ§€λ§‰ 검사 / λ§ˆμ§€λ§‰ 생쑴 μ‹œκ° (UTC)
check_count, success_count λˆ„μ  검사/성곡 횟수 (가동λ₯  κ³„μ‚°μš©)
checked_age_s, alive_age_s λ§ˆμ§€λ§‰ 검사/생쑴 이후 κ²½κ³Ό 초 (μ„œλ²„κ°€ UTC둜 계산해 λ‚΄λ €μ€Œ β€” 신선도 νŒλ‹¨μ— μ‚¬μš©)

응닡 μ΅œμƒμœ„μ˜ count=이번 νŽ˜μ΄μ§€ ν–‰ 수, total=ν•„ν„° 일치 총 개수, offset=μš”μ²­ μ˜€ν”„μ…‹.


GET /api/stats β€” μš”μ•½ 톡계

https://proxy.gulu.kr/api/stats
{
  "total": 515399,
  "alive": 40,
  "usable": 9,
  "checked": 172247,
  "by_protocol": { "socks5": 9 },
  "by_anonymity": { "elite": 5, "unknown": 35 },
  "last_check_at": "2026-06-18 12:07:13"
}

by_protocol은 usable κΈ°μ€€, by_anonymityλŠ” alive κΈ°μ€€ 집계.


GET /api/countries β€” κ΅­κ°€ λͺ©λ‘

usable ν”„λ‘μ‹œκ°€ μžˆλŠ” κ΅­κ°€λ₯Ό 건수 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ.

https://proxy.gulu.kr/api/countries
[
  { "country_code": "JP", "country": "Japan", "c": 2 },
  { "country_code": "KR", "country": "South Korea", "c": 2 },
  { "country_code": "SG", "country": "Singapore", "c": 2 }
]

GET /api/sources β€” μ†ŒμŠ€λ³„ κΈ°μ—¬ ν˜„ν™©

λ“±λ‘λœ μ•½ 244개 μ†ŒμŠ€μ™€ 각 μ†ŒμŠ€κ°€ κΈ°μ—¬ν•œ ν”„λ‘μ‹œ 수(30초 μΊμ‹œ).

https://proxy.gulu.kr/api/sources
{
  "count": 244,
  "enabled": 229,
  "sources": [
    {
      "name": "vmheaven-vmheaven-io-free-proxy-list",
      "kind": "text",
      "reliability": "medium",
      "enabled": true,
      "protocols": ["http", "socks5"],
      "note": "vmheaven/vmheaven.io-free-proxy-list (GitHub raw)",
      "urls": ["https://raw.githubusercontent.com/.../http.txt", "..."],
      "total": 6311,
      "alive": 8,
      "usable": 5
    }
  ]
}

usable/alive/total λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬.


POST /api/collect β€” μˆ˜λ™ μˆ˜μ§‘ 트리거 (κ΄€λ¦¬μš©)

λͺ¨λ“  μ†ŒμŠ€λ₯Ό μ¦‰μ‹œ 1회 μž¬μˆ˜μ§‘ν•œλ‹€. λ°±κ·ΈλΌμš΄λ“œκ°€ 30λΆ„λ§ˆλ‹€ μžλ™ μˆ˜ν–‰ν•˜λ―€λ‘œ 보톡은 ν•„μš” μ—†λ‹€. μ™„λ£ŒκΉŒμ§€ μ•½ 1λΆ„ λΈ”λ‘λ˜λ©° μš”μ•½μ„ λ°˜ν™˜ν•œλ‹€.

curl -X POST https://proxy.gulu.kr/api/collect
{ "total_unique": 507742, "sources_ok": 222, "per_source": { "fyvri-fresh-proxy-list": 453414, "...": 0 } }

ν”„λ‘μ‹œ μ‚¬μš© μ˜ˆμ‹œ (검증됨)

APIμ—μ„œ 받은 ν”„λ‘μ‹œλ₯Ό μ‹€μ œλ‘œ μ“°λŠ” 방법. 49.143.59.205:110(socks5, KR)둜 μ‹€μΈ‘ 검증됨 β€” ν”„λ‘μ‹œ 경유 μ‹œ exit IPκ°€ ν”„λ‘μ‹œ IP둜 바뀐닀.

curl

# socks5  (DNS도 ν”„λ‘μ‹œμ—μ„œ 해석: --socks5-hostname)
curl --socks5-hostname 49.143.59.205:110 https://api.ipify.org      # -> 49.143.59.205

# http ν”„λ‘μ‹œ
curl -x http://IP:PORT https://api.ipify.org

Python (pip install "requests[socks]")

import requests

# 1) usable ν”„λ‘μ‹œλ“€μ„ λ°›μ•„ μ‚΄μ•„μžˆλŠ” 것을 λ§Œλ‚  λ•ŒκΉŒμ§€ μ‹œλ„(무료 ν”„λ‘μ‹œλŠ” 자주 μ£½μœΌλ―€λ‘œ 폴백 ν•„μˆ˜)
proxies = requests.get("https://proxy.gulu.kr/api/proxies",
                       params={"status": "usable", "sort": "latency", "limit": 20}).json()["proxies"]
for p in proxies:
    scheme = "socks5h" if p["protocol"] == "socks5" else "http"
    proxy_url = f"{scheme}://{p['ip']}:{p['port']}"
    try:
        r = requests.get("https://api.ipify.org",
                         proxies={"http": proxy_url, "https": proxy_url}, timeout=15)
        print("exit ip:", r.text)   # ν”„λ‘μ‹œμ˜ IPκ°€ λ‚˜μ˜€λ©΄ 성곡
        break
    except Exception:
        continue   # λ‹€μŒ ν”„λ‘μ‹œλ‘œ 폴백

Node.js (npm i socks-proxy-agent) β€” μ‹€μΈ‘ κ²€μ¦λœ νŒ¨ν„΄

import https from 'node:https';
import { SocksProxyAgent } from 'socks-proxy-agent';

const list = await (await fetch(
  'https://proxy.gulu.kr/api/proxies?status=usable&protocol=socks5&sort=latency&limit=20'
)).json();

for (const p of list.proxies) {
  const agent = new SocksProxyAgent(`socks5h://${p.ip}:${p.port}`, { timeout: 8000 });
  const exitIp = await new Promise((resolve) => {
    const req = https.request({ hostname: 'api.ipify.org', path: '/', agent, timeout: 10000 },
      (r) => { let d = ''; r.on('data', (c) => d += c); r.on('end', () => resolve(d.trim())); });
    req.on('error', () => resolve(null));
    req.on('timeout', () => { req.destroy(); resolve(null); });
    req.end();
  });
  agent.destroy();
  if (exitIp) { console.log('exit ip:', exitIp); break; }   // 성곡 β†’ μ‚¬μš©; μ‹€νŒ¨ μ‹œ λ‹€μŒ ν”„λ‘μ‹œλ‘œ 폴백
}

ꢌμž₯ μ‚¬μš© νŒ¨ν„΄

usable κ·œμΉ™

usable = (protocol == "socks5" && alive)
       || (protocol == "http"   && alive && anonymity == "elite" && https)

였λ₯˜

상황 응닡
잘λͺ»λœ status `422 {"detail":"status must be one of usable
limit/offset/max_latency κ°€ μ •μˆ˜ μ•„λ‹˜ 422 {"detail":"... must be an integer"}