VeilSwap
← All posts
분석2026-11-108 min read

스왑 견적 API 읽는 법: rate, validUntil, routes, advantageBps (2026 실측)

견적 객체에는 대부분이 읽지 않는 다섯 가지 사실이 있습니다. 환율, 소액 주문에만 나타나는 120초 validUntil, 경로 수, 우위 점수, 400 오류 안에 숨은 상하한. 다섯 모두 주문 타이밍을 바꿉니다.

이 해설이 존재하는 이유. 주문 페이지는 하나의 작은 JSON 객체—견적—위에 얹힌 편의층일 뿐입니다. 환율이 좋은지, 창이 언제 닫히는지, 몇 개의 풀이 실제로 이 페어를 두고 경쟁하는지. 페이지가 대신 결정하는 모든 것이 이미 원시 응답에 보이고, 인증도 필요 없습니다. 2026-11-10 10:03~10:17 UTC에 몇 가지 금액과 의도적으로 깨뜨린 입력으로 USDT→XMR(TRON 구간)을 공개 엔드포인트에서 돌렸고, BTC→XMR과 반대 방향 XMR→USDT도 각각 한 번씩 확인했습니다. 아래는 각 필드의 의미와 그렇지 않은 것. 전부 실측입니다. (XMR→USDT 출구 루트)

응답의 모양. 정상 응답은 한 객체입니다. best, routes, advantageBps. best 안에는 fromAsset, toAsset, fromAmount, toAmount, rate, validUntil. 계약 전체가 이것뿐—한 객체 안 여섯 필드, 밖에 스칼라 두 개. 세션도 키도 서명도 없습니다. 요청 한 번의 왕복은 194~604ms(10회 중앙값 약 203ms)로, 수동 판단 전에 회랑을 견적하는 스크립트 비용은 5분의 1초 정도입니다. 엔드포인트는 GET이며 쿼리 매개변수는 from, to, amount 세 개.

rate와 그 8자리. rate 필드는 toAmount를 fromAmount로 나눈 것을 유효숫자 8자리로 반올림한 값입니다. 10:05:55의 100 USDT 견적은 toAmount 0.16052661, rate 0.0016052661. 100.123456789012 USDT는 0.16074732, 0.0016054911—rate는 유효숫자 8자리만 유지했습니다. 실무적 귀결: 아홉째 자리가 다른 두 금액도 toAmount는 원래 금액으로 계산 후 8자리로 반올림되므로 rate 필드는 같을 수 있습니다. 회랑을 넘어 환율을 눈으로 비교하지 마세요—먼저 역수를 취하십시오. 2026-11-10, 100 USDT는 0.16082327 XMR(XMR당 621.80달러)을 샀고 같은 분에 1 XMR은 2경로 192bps로 540.097 USDT-TRX에 팔렸습니다. 같은 분의 매수·매도 12.9% 격차. 이는 두 방향 사이의 스프레드 밴드이지 오류가 아닙니다. (XMR→USDT 출구 루트)

validUntil은 조건부입니다. 100 USDT 견적은 validUntil 2026-11-10T10:13:55.878Z를 가졌습니다—응답 기준 +119.8초로 세 번 연속(119.8, 119.8, 119.1) 안정적. 같은 엔드포인트는 2경로 주문(110, 130 USDT)과 샘플링한 모든 BTC 견적에서 null을 반환했습니다. 규칙은 금액 자체가 아니라 승리한 경로가 그 정확한 금액을 고정가로 제시하는지입니다. 소액은 120초 보장가, 대액이나 2경로는 주문 페이지에서 고정될 때까지 환율을 따라 움직입니다. 봇이나 비교 페이지를 만든다면 null인 validUntil은 '표시 시 재견적'으로 읽어야지 버그가 아닙니다. (XMR→USDT 출구 루트)

routes와 advantageBps: 깊이 읽기. routes는 몇 개의 풀 견적이 경쟁까지 살아남았는지, advantageBps는 승자를 준우승과 비교해 백분율의 백분위(1/100) 단위로 채점합니다. 같은 날의 두 읽기를 나란히 보면: 10:07에 100 USDT는 routes=1, advantageBps=0(한 견적만 살아남음). 10:12에 110 USDT는 routes=2, advantageBps=0—두 견적이 끝자리까지 일치. 10:12에 130 USDT는 routes=2, advantageBps=895—두 경로가 거의 9% 차이를 보였고 저렴한 쪽이 그 격차로 이겼습니다. 반대 방향 1 XMR→USDT-TRX는 routes=2, advantageBps=192였습니다. 해석: 2경로 회랑에서 높은 bps는 지금 이 순간 두 풀이 가격을 크게 다르게 본다는 신호—보장이 아니라 힌트입니다. 2026-11-10에 130 USDT 승자는 0.235639 XMR(XMR당 551.83달러)를 지불했고 현물 543.39달러 대비 그 분 XMR 매수 프리미엄은 1.55%였습니다. (XMR→USDT 출구 루트)

400 본문은 두 번째 API입니다. 두 응답이 표 하나의 값이 됩니다. 하한 미만이면 400 본문은 {"error": "amount below minimum", "minAmount": 18.472402, "maxAmount": 162815.934213}. 상한 초과면 같은 두 숫자가 다른 오류 문자열로 {"error": "amount above maximum", ...}. 둘 다 상하한을 모두 담기 때문에 어떤 회랑이든 한 번의 프로브로 사용 가능한 구간을 얻고, 두 번째 엔드포인트가 필요 없습니다—견적 전에 금액을 구간으로 클램프하려는 자동화에 유용합니다. 경계는 시장과 함께 움직입니다. 10:03~10:06 3분 동안 USDT→XMR 하한은 18.463823→18.472402(몇 센트), 상한은 162793.649781→162815.934213(약 22달러)로 이동했습니다. 같은 날 BTC→XMR은 0.0001825 / 2.1850807. 금액이 0이나 음수면 그 전에 {"error": "amount must be a positive number"}로 거부됩니다. 알 수 없는 자산 id는 404 {"error": "pair not supported"}, from이나 to 누락은 400 {"error": "from/to required"}. (XMR→USDT 출구 루트)

카탈로그와 자산 id 규약. 두 번째 공개 엔드포인트 /api/currencies는 10:03 UTC에 453개 자산·65개 네트워크를 반환했습니다—367개 티커, isStable 52, hasExtraId 6(메모나 수취 태그가 필요한 자산), 다중 네트워크 상위는 USDC 13, USDT 11, ETH 7, DAI와 WBTC 각 5. 각 항목은 id, ticker, network, name, logo, hasExtraId, featured, isStable을 가집니다. 자산 id 규약은 티커-네트워크이며 견적 엔드포인트는 레거시 별칭에 관대합니다. 2026-11-10에 usdt-tron과 usdt-trx는 바이트 단위로 동일한 견적(같은 toAmount 0.16082327, 같은 rate, validUntil은 0.4초 시계 차이만)을 반환했습니다. 진실의 원천은 기억이 아니라 카탈로그입니다. id는 풀이 네트워크를 추가·제거할 때마다 오가므로 런타임에 목록을 읽고 하드코딩하지 마십시오. (XMR→USDT 출구 루트)

캐시가 '새로운' 견적의 의미를 바꿉니다. 같은 금액을 매초 25초간 폴링하면 네 번 연속 동일한 toAmount 0.16080074가 돌아오고 다섯 번째에 새 숫자 0.16079135—견적 캐시 창은 약 8초로 실측됐고 11월 저대역 테스트의 결론과 일치합니다. 그러나 20초 간격의 두 견적은 같은 금액에 다른 validUntil을 반환했습니다. 캐시는 완전한 응답을 키로 하며 캐시된 견적은 원래의 고정 창을 유지합니다. 환율은 그 아래에서 움직입니다. 30초 간격의 세 견적은 0.0016217233, 0.0016272058, 0.0016291304—100 USDT 기준 60초에 0.46% 드리프트. 실무 규칙: 보장가가 필요하면 120초 validUntil 안에서 한 견적에 움직이고, 자동 갱신 페이지는 표시 시 재견적하며 캐시 본문을 신뢰하지 마십시오. (XMR→USDT 출구 루트)

오류 규율, 그리고 스크립트 전에 알아둘 한 가지 제한. 관찰된 모든 실패는 error 문자열만 담은 JSON 객체 하나를 반환합니다—HTML도, 스택 트레이스도, 조용한 빈 본문도 없습니다. 기형 입력(빈 to, 0 금액, 음수)은 순서대로 거부됩니다. from/to 먼저, 그다음 양수, 그다음 구간, 마지막으로 페어 존재. 이 순서는 자동화에 중요합니다. 대부분의 회랑에서 유효한 것으로 알린 금액으로 페어 존재를 확인하고 400 본문에서 정확한 구간을 읽으면 됩니다. 하나의 운영 제한: 엔드포인트를 두드리면 HTTP 429와 평범한 {"error": "rate limited"}가 돌아옵니다—이번 실측에서는 초당 약 1회를 수십 초간 이어지자 발동해, 차단이 최소 4분 지속됐습니다. 이 API에 스크립트를 붙인다면 429는 '즉시 재시도'가 아니라 '백오프'로 다루십시오. (모네로 확인 대기)

필드의 한계. 견적이 말해 주지 않는 것: routes 뒤의 풀, 고정 견적의 연장 가능 여부, 그리고 입금을 전달하기 위해 실제로 내는 네트워크 수수료—수수료는 체인 쪽 문제이고 출발 자산의 네이티브 코인으로 청구됩니다(수수료 예비 해설 참조). 말해 주는 것만으로도 주문 타이밍을 잡기에 충분합니다. 회랑을 넘는 비교는 먼저 rate의 역수를 취하고, validUntil이 있으면 존중하고, routes와 advantageBps를 '깊이와 불일치' 신호로 쓰고, 한 번의 프로브로 얻은 min/max로 금액을 클램프하고, 429에서 물러서십시오. 이 해설 전체는 판단당 하나의 curl로 요약됩니다. 위 가격은 2026-11-10 10:03~10:17 UTC 스냅숏입니다. 견적은 움직이므로 실시간 주문 페이지가 기준입니다.

Frequently asked questions

제 견적에는 validUntil이 있는데 다른 사람 것에는 없는 이유는?

소액 구간은 고정 창에서 가격을 잠급니다. 2026-11-10의 100 USDT 견적은 약 119.8초 뒤의 validUntil을 가졌고, 110과 130(2개 경로)과 세 건의 BTC 견적은 null이었습니다. 고정에는 비용이 들기 때문에 시장을 흔들 만큼 작은 주문에만 주어지고, 더 큰 금액은 주문 페이지에서 고정될 때까지 환율을 따라 움직입니다.

UI 없이 페어의 최소·최대 금액을 어떻게 알 수 있나요?

아무 금액이나 견적을 요청하고 400을 읽으세요. 하한 미만이면 본문이 'amount below minimum', 상한 초과면 'amount above maximum'을 담고 둘 다 minAmount와 maxAmount를 줍니다. 2026-11-10 USDT→XMR은 18.472402 / 162815.934213(숫자는 분마다 몇 센트씩 움직임), BTC→XMR은 0.0001825 / 2.1850807였습니다. 금액 0은 그 전에 'amount must be a positive number'로 거부됩니다.

advantageBps는 무엇에 쓰이나요?

최선 경로를 차선과 비교해 채점합니다. routes=1이면 한 견적만 이겨 advantageBps는 0, routes=2이면 두 견적 중 최선이 이겼다는 뜻입니다. 2026-11-10에 130 USDT는 895bps(두 경로가 거의 9% 차이), 1 XMR→USDT-TRX는 2경로 192bps, 110 USDT의 2경로는 0—두 견적이 끝자리까지 일치—를 보였습니다. 회랑에서 높은 bps는 두 풀이 가격을 크게 다르게 보는 신호이며, 이번에 이긴 경로가 다음에도 이긴다는 보장이 없습니다.

Keep reading

All articles →

Ready to swap?

No account · No KYC · No email

Exchange now
스왑 견적 API 읽는 법: rate, validUntil, routes, advantageBps (2026 실측)