이 페이지의 엔드포인트
GET /v1/residential/subscriptions: 트래픽 구독 목록(GB 단위 레지덴셜 프록시 및 로테이팅 모바일 프록시)GET /v1/residential/subscriptions/{subscriptionId}: 레지덴셜 프록시 구독 가져오기PATCH /v1/residential/subscriptions/{subscriptionId}: 이름 변경 또는 자동 갱신 설정 전환POST /v1/residential/subscriptions/{subscriptionId}/reset-password: 기본 사용자의 새 프록시 비밀번호 생성GET /v1/residential/subscriptions/{subscriptionId}/usage: 일일 트래픽 사용량GET /v1/residential/subscriptions/{subscriptionId}/sub-users: 하위 사용자 목록(각자 별도의 프록시 인증 정보와 트래픽 한도 사용)POST /v1/residential/subscriptions/{subscriptionId}/sub-users: 하위 사용자 생성PATCH /v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}: 하위 사용자 정보 수정(라벨, 한도, 활성화/비활성화, 새 비밀번호)DELETE /v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}: 하위 사용자 삭제GET /v1/catalog/countries: 상품 이용 가능 국가GET /v1/catalog/countries/{countryCode}/states: 국가 내 타겟팅 가능한 주/도(US, CA, AU…)GET /v1/catalog/countries/{countryCode}/cities: 국가 내 타겟팅 가능한 도시GET /v1/catalog/countries/{countryCode}/asns: 국가 내 타겟팅 가능한 ISP(ASN) — 레지덴셜 프록시 전용
기본 URL https://localserpproxy.com/api/v1. 인증, 오류 및 한도는 API 개요]를 참조하세요.
고정 세션
같은 IP를 유지하려면 프록시 사용자 이름에 -session-{id}-ttl-{minutes}을 추가하세요. {id}은 원하는 영문자 또는 숫자 1~32자, ttl는 1~30분입니다. 예를 들어 연결된 기기가 오프라인이 되면 IP가 더 일찍 변경될 수 있습니다.
트래픽 구독 목록(GB 단위 레지덴셜 프록시 및 로테이팅 모바일 프록시)
GET/v1/residential/subscriptions
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
productId | query | residential · mobile-gb | 아니요 | 이 상품만 표시합니다(생략하면 두 상품 모두 표시). |
응답 200 OK
{
"data": [
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.localserpproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/residential/subscriptions" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());레지덴셜 프록시 구독 가져오기
GET/v1/residential/subscriptions/{subscriptionId}
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
응답 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.localserpproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());이름 변경 또는 자동 갱신 설정 전환
PATCH/v1/residential/subscriptions/{subscriptionId}
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
요청 본문
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
label | string | 아니요 | 최대 60자 |
autoRenew | boolean | 아니요 | — |
{
"label": "Price monitoring",
"autoRenew": true
}응답 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.localserpproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X PATCH "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"label":"Price monitoring","autoRenew":true}'import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.patch(f"{API}/residential/subscriptions/res_9x2m4k", headers=HEADERS, json={"label": "Price monitoring", "autoRenew": True}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ label: 'Price monitoring', autoRenew: true }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());기본 사용자용 새 프록시 비밀번호 생성
POST/v1/residential/subscriptions/{subscriptionId}/reset-password
기존 비밀번호는 게이트웨이에서 60초 이내에 더 이상 작동하지 않습니다.
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
응답 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.localserpproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X POST "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/reset-password" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/residential/subscriptions/res_9x2m4k/reset-password", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/reset-password`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());일일 트래픽 사용량
GET/v1/residential/subscriptions/{subscriptionId}/usage
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
from | query | string (date) | 아니요 | 첫째 날(UTC), 해당 날짜 포함. 기본값 = to보다 29일 전. |
to | query | string (date) | 아니요 | 마지막 날(UTC), 해당 날짜 포함. 기본값 = 오늘. 최대 기간 366일. |
subUserId | query | string | 아니요 | 하위 사용자 1명으로 제한 |
응답 200 OK
{
"from": "2026-10-04",
"to": "2026-10-05",
"totalBytes": 2350000000,
"totalRequests": 48210,
"points": [
{
"date": "2026-10-04",
"bytes": 1200000000,
"requests": 24800
},
{
"date": "2026-10-05",
"bytes": 1150000000,
"requests": 23410
}
],
"byCountry": [
{
"country": "US",
"bytes": 2350000000
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/usage" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k/usage", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/usage`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());하위 사용자 목록(별도 트래픽 한도가 적용되는 개별 프록시 인증 정보)
GET/v1/residential/subscriptions/{subscriptionId}/sub-users
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
응답 200 OK
{
"data": [
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}
],
"limit": 50
}코드 예시
curl -s "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k/sub-users", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());하위 사용자 생성
POST/v1/residential/subscriptions/{subscriptionId}/sub-users
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
요청 본문
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
label | string | 예 | 최대 60자 |
password | string | 아니요 | 생략하면 자동 생성됩니다. — 최대 64자 |
trafficLimitBytes | integer (int64), nullable | 아니요 | ≥ 0 |
{
"label": "Scraper EU",
"trafficLimitBytes": 5000000000
}응답 201 Created
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X POST "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"label":"Scraper EU","trafficLimitBytes":5000000000}'import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/residential/subscriptions/res_9x2m4k/sub-users", headers=HEADERS, json={"label": "Scraper EU", "trafficLimitBytes": 5000000000}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ label: 'Scraper EU', trafficLimitBytes: 5000000000 }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());하위 사용자 수정(라벨, 한도, 활성화/비활성화, 새 비밀번호)
PATCH/v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
subUserId | path | string | 예 | — |
요청 본문
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
label | string | 아니요 | 최대 60자 |
trafficLimitBytes | integer (int64), nullable | 아니요 | ≥ 0 |
enabled | boolean | 아니요 | — |
regeneratePassword | boolean | 아니요 | — |
{
"enabled": false
}응답 200 OK
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X PATCH "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.patch(f"{API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2", headers=HEADERS, json={"enabled": False}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ enabled: false }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());하위 사용자 삭제
DELETE/v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
subscriptionId | path | string | 예 | — |
subUserId | path | string | 예 | — |
응답 204 No Content
본문 없음: 상태 코드가 답변입니다.
코드 예시
curl -s -X DELETE "https://localserpproxy.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.delete(f"{API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.status_code) # 204: done// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(res.status); // 204: done제품을 이용할 수 있는 국가
GET/v1/catalog/countries
공개: API 키가 필요하지 않습니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
product | query | string | 아니요 | 이 상품을 이용할 수 있는 위치로 제한됩니다(residential, mobile, mobile-gb). |
응답 200 OK
{
"data": [
{
"code": "US",
"name": "United States",
"region": "Americas",
"products": [
"residential",
"mobile",
"mobile-gb"
],
"cities": 6,
"asns": 4,
"carriers": 3
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/catalog/countries"import os
import requests
API = "https://localserpproxy.com/api/v1"
r = requests.get(f"{API}/catalog/countries", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/catalog/countries`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());국가별 타겟팅 가능한 주 / 도 (US, CA, AU…)
GET/v1/catalog/countries/{countryCode}/states
-state-{state} 사용자 이름 세그먼트의 값입니다. 주 타겟팅을 지원하지 않는 국가는 빈 목록입니다. ZIP 코드는 목록에 표시되지 않습니다. -zip-{zip} 세그먼트에는 5자리 US ZIP 코드를 입력할 수 있으며, 일치하는 출구 IP가 없으면 게이트웨이에서 오류 페이지를 반환합니다.
공개: API 키가 필요하지 않습니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
countryCode | path | string | 예 | ISO 3166-1 alpha-2, 대문자. |
응답 200 OK
{
"data": [
{
"id": "ny",
"code": "NY",
"name": "New York",
"cities": 0
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/catalog/countries/US/states"import os
import requests
API = "https://localserpproxy.com/api/v1"
r = requests.get(f"{API}/catalog/countries/US/states", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/catalog/countries/US/states`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());국가별 타겟팅 가능한 도시
GET/v1/catalog/countries/{countryCode}/cities
product=mobile 또는 product=mobile-gb을 사용하는 경우, 4G/5G 모뎀이 있는 도시만 선택할 수 있습니다.
공개: API 키가 필요하지 않습니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
countryCode | path | string | 예 | ISO 3166-1 alpha-2, 대문자. |
product | query | string | 아니요 | 이 상품을 이용할 수 있는 위치로 제한됩니다(residential, mobile, mobile-gb). |
응답 200 OK
{
"data": [
{
"id": "new_york",
"name": "New York",
"state": "ny"
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/catalog/countries/US/cities"import os
import requests
API = "https://localserpproxy.com/api/v1"
r = requests.get(f"{API}/catalog/countries/US/cities", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/catalog/countries/US/cities`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());국가별 타겟팅 가능한 ISP (ASN) — 레지덴셜 전용
GET/v1/catalog/countries/{countryCode}/asns
공개: API 키가 필요하지 않습니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
countryCode | path | string | 예 | ISO 3166-1 alpha-2, 대문자. |
응답 200 OK
{
"data": [
{
"asn": 7922,
"name": "Comcast Cable"
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/catalog/countries/US/asns"import os
import requests
API = "https://localserpproxy.com/api/v1"
r = requests.get(f"{API}/catalog/countries/US/asns", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/catalog/countries/US/asns`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());