이 페이지의 엔드포인트
GET /v1/catalog/coins: 지원 암호화폐 및 네트워크(고정 입금 주소 포함)POST /v1/topups: 잔액 암호화폐 충전 시작(고정 주소, 정확한 금액)POST /v1/topups/{topUpId}/txid: 결제 전송 완료로 보고(TXID 선택 사항)GET /v1/topups/{topUpId}: 충전 조회(실시간 상태 확인)GET /v1/topups: 암호화폐 충전 목록 조회
기본 URL https://localserpproxy.com/api/v1. 인증, 오류 및 제한 사항은 API 개요]를 참조하세요.
허용되는 암호화폐 및 네트워크(고정 입금 주소 포함)
GET/v1/catalog/coins
공개: API 키가 필요하지 않습니다.
응답 200 OK
{
"data": [
{
"code": "BTC",
"name": "Bitcoin",
"networks": [
{
"id": "bitcoin",
"name": "Bitcoin",
"confirmationsRequired": 2,
"estimatedMinutes": null,
"memoRequired": false,
"address": "DEPOSIT_ADDRESS"
}
]
}
]
}코드 예시
curl -s "https://localserpproxy.com/api/v1/catalog/coins"import os
import requests
API = "https://localserpproxy.com/api/v1"
r = requests.get(f"{API}/catalog/coins", 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/coins`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());잔액 충전을 위한 암호화폐 충전 시작(고정 주소, 정확한 금액)
POST/v1/topups
amountUsd≥ 25.00 USD이고 기본 최대 금액인 10,000.00 이하: 그렇지 않으면422(amountUsd기준).coin+network는GET /v1/catalog/coins중 하나여야 합니다(그렇지 않으면409 coin_unavailable).- 네트워크의 고정
address과 코인 정밀도에 맞춰 올림한 정확한amountCrypto=amountUsd/rate을 반환합니다(BTC/LTC/ETH/SOL은 소수점 8자리, USDT/USDC는 소수점 6자리). 또한 같은 네트워크에서 진행 중인 충전 2건이 동일한 금액을 요청하지 않도록 마지막 자릿수에 작고 고유한 오프셋을 더합니다.rate은expiresAt까지(30분) 잠깁니다.txidDeadline=expiresAt+ 72 h. - 선택 사항인
purchase(POST /v1/orders와 동일한 본문): 지금 검증하고 가격을 산정합니다(필드 이름에purchase.,409 plan_unavailable… 접두사를 붙인422).amountUsd은 총purchase금액에서 현재 잔액을 뺀 금액을 충당해야 합니다(amountUsd기준422 too_small). 충전 금액이 잔액에 반영되면 동일한 트랜잭션에서 잔액으로 주문이 접수됩니다.purchase.status는completed(orderId포함) 또는failed(failureReason, 금액은 잔액에 유지) 상태가 됩니다.
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
Idempotency-Key | header | string | 아니요 | POST 요청을 안전하게 재시도하기 위한 고유 키(예: UUID). 24 h 동안 보관됩니다. — 최대 128자 |
요청 본문
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
amountUsd | string (USD, 2 decimals) | 예 | 충전할 USD 금액: ≥ 25.00, 기본 최대 금액 10,000.00 이하. |
coin | string | 예 | — |
network | string | 예 | — |
purchase | object | 아니요 | 충전 금액이 잔액에 반영되면 잔액으로 구매할 계획입니다(POST /v1/orders와 동일한 본문). |
{
"amountUsd": "50.00",
"coin": "USDT",
"network": "tron"
}{
"amountUsd": "25.00",
"coin": "BTC",
"network": "bitcoin",
"purchase": {
"planId": "res-10",
"quantity": 1
}
}응답 201 Created
{
"id": "top_7d2kq9x1",
"status": "verifying",
"final": false,
"amountUsd": "25.00",
"coin": "USDT",
"network": "tron",
"address": "DEPOSIT_ADDRESS",
"amountCrypto": "25.000137",
"rate": "1.00",
"paymentUri": "PAYMENT_URI",
"expiresAt": "2026-10-05T14:33:11Z",
"txidDeadline": "2026-10-08T14:33:11Z",
"confirmationsRequired": 20,
"confirmations": 7,
"txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"txidSubmittedAt": "2026-10-05T14:09:42Z",
"amountReceivedCrypto": "25.000137",
"explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"creditedUsd": null,
"creditedAt": null,
"rejection": null,
"purchase": {
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"options": {},
"promoCode": null,
"total": "7.50",
"status": "pending",
"orderId": null,
"failureReason": null
},
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X POST "https://localserpproxy.com/api/v1/topups" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"amountUsd":"50.00","coin":"USDT","network":"tron"}'import os, uuid
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}", "Idempotency-Key": str(uuid.uuid4())}
r = requests.post(f"{API}/topups", headers=HEADERS, json={"amountUsd": "50.00", "coin": "USDT", "network": "tron"}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
import { randomUUID } from 'node:crypto';
const API = 'https://localserpproxy.com/api/v1';
const res = await fetch(`${API}/topups`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Idempotency-Key': randomUUID(), 'Content-Type': 'application/json' },
body: JSON.stringify({ amountUsd: '50.00', coin: 'USDT', network: 'tron' }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());결제를 보냈다고 알리기(TXID 선택 사항)
POST/v1/topups/{topUpId}/txid
결제가 지갑이나 거래소에서 출금된 후 결제를 보냈다고 알리세요. API에서 “결제를 보냈습니다” 버튼을 사용하는 것과 같습니다. 트랜잭션 ID(TXID)는 선택 사항입니다. 빈 본문({})을 보내거나, TXID가 있으면 txid을 추가하세요. 결제는 충전 건의 네트워크와 주소에서 정확한 금액(amountCrypto)으로 대조되므로 반드시 해당 금액을 정확히 보내야 합니다.
충전 상태가 awaiting_payment, expired 또는 rejected이고 txidDeadline(expiresAt + 72 h) 이전이면 알릴 수 있습니다. 늦게 알리더라도 결제가 누락되지 않습니다. txid을 입력한 경우 네트워크 형식(txid 기준 422)을 확인하며, 다른 충전 건에서 이미 사용 중이어서는 안 됩니다(409 txid_already_used). 종료된 충전 건은 409 topup_closed를 반환합니다. 이후 블록체인에서 결제를 확인하는 동안 충전 상태는 verifying이 되며, 네트워크에서 트랜잭션을 확인하면 credited 상태가 됩니다. 확인에 실패하면 rejected(rejection 포함) 상태가 됩니다.
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
topUpId | path | string | 예 | — |
요청 본문
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
txid | string | 아니요 | 선택 사항. 트랜잭션 해시: 16진수 64자(bitcoin, litecoin, tron), 0x + 16진수 64자(ethereum), base58 서명(solana). 비어 있거나 생략된 경우 정확한 금액으로 결제를 대조합니다. — 최대 128자 |
{}{
"txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
}응답 200 OK
{
"id": "top_7d2kq9x1",
"status": "verifying",
"final": false,
"amountUsd": "25.00",
"coin": "USDT",
"network": "tron",
"address": "DEPOSIT_ADDRESS",
"amountCrypto": "25.000137",
"rate": "1.00",
"paymentUri": "PAYMENT_URI",
"expiresAt": "2026-10-05T14:33:11Z",
"txidDeadline": "2026-10-08T14:33:11Z",
"confirmationsRequired": 20,
"confirmations": 7,
"txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"txidSubmittedAt": "2026-10-05T14:09:42Z",
"amountReceivedCrypto": "25.000137",
"explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"creditedUsd": null,
"creditedAt": null,
"rejection": null,
"purchase": {
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"options": {},
"promoCode": null,
"total": "7.50",
"status": "pending",
"orderId": null,
"failureReason": null
},
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s -X POST "https://localserpproxy.com/api/v1/topups/top_7d2kq9x1/txid" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{}'import os
import requests
API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/topups/top_7d2kq9x1/txid", headers=HEADERS, json={}, 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}/topups/top_7d2kq9x1/txid`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());충전 상태 확인
GET/v1/topups/{topUpId}
충전 상태를 확인하려면 이 경로를 폴링하세요. status = verifying 동안에는 10초마다, 결제를 기다리는 동안에는 30초마다 확인하고 final = true이 되면 중지하세요. expiresAt 전에 결제를 전송했다고 알리지 않으면 충전 상태가 expired로 변경됩니다. 그래도 txidDeadline까지는 전송 사실을 알릴 수 있습니다.
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
topUpId | path | string | 예 | — |
응답 200 OK
{
"id": "top_7d2kq9x1",
"status": "verifying",
"final": false,
"amountUsd": "25.00",
"coin": "USDT",
"network": "tron",
"address": "DEPOSIT_ADDRESS",
"amountCrypto": "25.000137",
"rate": "1.00",
"paymentUri": "PAYMENT_URI",
"expiresAt": "2026-10-05T14:33:11Z",
"txidDeadline": "2026-10-08T14:33:11Z",
"confirmationsRequired": 20,
"confirmations": 7,
"txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"txidSubmittedAt": "2026-10-05T14:09:42Z",
"amountReceivedCrypto": "25.000137",
"explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"creditedUsd": null,
"creditedAt": null,
"rejection": null,
"purchase": {
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"options": {},
"promoCode": null,
"total": "7.50",
"status": "pending",
"orderId": null,
"failureReason": null
},
"createdAt": "2026-10-05T14:03:11Z"
}코드 예시
curl -s "https://localserpproxy.com/api/v1/topups/top_7d2kq9x1" \
-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}/topups/top_7d2kq9x1", 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}/topups/top_7d2kq9x1`, {
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/topups
인증: Authorization: Bearer API_KEY 헤더에 API 키를 입력합니다.
매개변수
| 이름 | 위치 | 유형 | 필수 | 설명 |
|---|---|---|---|---|
page | query | integer | 아니요 | ≥ 1, 기본값 1 |
perPage | query | integer | 아니요 | 1–100, 기본값 20 |
status | query | awaiting_payment · verifying · credited · rejected · expired | 아니요 | final = 충전 완료 또는 txidDeadline 이후 만료 / 거부. |
응답 200 OK
{
"data": [
{
"id": "top_7d2kq9x1",
"status": "verifying",
"final": false,
"amountUsd": "25.00",
"coin": "USDT",
"network": "tron",
"address": "DEPOSIT_ADDRESS",
"amountCrypto": "25.000137",
"rate": "1.00",
"paymentUri": "PAYMENT_URI",
"expiresAt": "2026-10-05T14:33:11Z",
"txidDeadline": "2026-10-08T14:33:11Z",
"confirmationsRequired": 20,
"confirmations": 7,
"txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"txidSubmittedAt": "2026-10-05T14:09:42Z",
"amountReceivedCrypto": "25.000137",
"explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
"creditedUsd": null,
"creditedAt": null,
"rejection": null,
"purchase": {
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"options": {},
"promoCode": null,
"total": "7.50",
"status": "pending",
"orderId": null,
"failureReason": null
},
"createdAt": "2026-10-05T14:03:11Z"
}
],
"pagination": {
"page": 1,
"perPage": 20,
"total": 1,
"totalPages": 1
}
}코드 예시
curl -s "https://localserpproxy.com/api/v1/topups" \
-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}/topups", 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}/topups`, {
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());