자사 제품 안에 Wise 환율을 표시하려고 시도해 본 적이 있다면, Wise 환율 API가 기대했던 것과는 사뭇 다르다는 사실을 이미 발견했을 것입니다. Wise는 실제로 매우 훌륭한 중간 시장 환율(mid-market rate) 데이터를 공개하고 REST 엔드포인트로 제공합니다. 하지만 그것은 파트너 심사 절차 뒤에 있고, 시장 데이터 API가 아니라 결제 API 안에 존재하며, 돌려받는 환율은 의도적으로 사용자가 실제로 지불하는 가격이 아닙니다.
이 글은 Wise가 정확히 무엇을 공개하는지, 어떻게 인증하는지, 각 엔드포인트가 실제로 무엇을 반환하는지, 그리고 Wise가 여러분 프로젝트에 맞는 출처인지를 결정하는 다섯 가지 구조적 한계를 다룹니다. 또한 대부분이 실제로 궁금해하는 질문에도 솔직하게 답합니다. 앱에서 믿을 만한 중간 시장 환율만 필요하다면, Wise가 그 일에 맞는 도구일까요?
Wise 환율 API의 실체
Wise는 송금 회사입니다. Wise Platform이라는 이름의 API는 돈을 옮기기 위해 만들어졌습니다. 견적 생성, 수취인 등록, 송금 자금 충당, 잔액 대사, 카드 발급. 환율이 이 API에 들어 있는 이유는 환율 없이는 송금 가격을 매길 수 없기 때문이지, Wise가 시장 데이터를 팔기 때문이 아닙니다.
이 관점이 개발자들이 마주치는 거의 모든 놀라움을 설명합니다. 환율은 결제 플랫폼 안의 작은 모듈이며, Wise가 실제로 지원하는 통화 경로로 범위가 한정됩니다.
세 개의 서로 다른 창구, 세 갈래의 접근 경로
가장 큰 혼란의 원인은 "Wise 환율 API"가 최소 세 가지 서로 다른 것을 가리킨다는 점입니다.
GET /rates— 환율 엔드포인트. 특정 통화쌍에 대한 Wise의 중간 시장 환율을 현재값 또는 과거값으로 반환합니다. 대부분이 말하는 것이 이것입니다.POST /quotes— 견적 엔드포인트. 가격이 매겨진 송금을 반환합니다. 환율, 수수료, 예상 도착 시간, 그리고 환율 만료 타임스탬프.GET /comparisons— 비교 엔드포인트. 특정 경로에 대해 Wise 및 경쟁 사업자와 은행의 가격·속도 추정치를 반환합니다.
셋은 같은 레퍼런스에 문서화되어 있고, 서로 다른 인증 방식을 쓰며, 아주 다른 질문에 답합니다. 잘못된 엔드포인트를 집는 것이 "왜 이 환율이 wise.com에 보이는 것과 다르지?"의 통상적인 원인입니다.
Wise 환율 데이터 접근 권한을 얻는 방법
셀프서비스 API 키는 없습니다. 접근은 두 갈래로 나뉩니다.
플랫폼 파트너. Wise Platform 파트너로 온보딩한 뒤 OAuth 2.0(client ID와 client secret)으로 인증해 토큰을 받습니다. /rates 레퍼런스는 이 엔드포인트가 "제휴(affiliate)가 아닌 파트너에 대해서는 Bearer 인증만 지원한다"고 명시하며, User Token 또는 Personal Token을 사용합니다.
제휴 파트너. Wise 제휴 프로그램에 가입한 뒤 partnerwise@wise.com으로 메일을 보내 자격 증명을 요청합니다. Wise가 요청을 검토하고 승인하면 Basic 인증 자격 증명을 발급하는데, 이때 열리는 엔드포인트는 정확히 두 개 — Exchange Rates List와 Get Temporary Quote — 뿐입니다.
여기가 갈림길입니다. 비교 사이트, 여행 블로그 위젯, 핀테크 마케팅 페이지를 만든다면 제휴 경로는 바로 여러분을 위해 설계된 것입니다. 반면 제품 기능 — 다중 통화 가격 표시, 청구서 발행, 환산 화면, 내부 리포트 — 을 만든다면, 여러분은 결제 파트너십 팀에게 시장 데이터 이용 승인을 요청하는 셈이고, 이는 양쪽 모두가 그 관계에서 원하는 바가 아닙니다.
또 하나. Wise는 API 버전을 URL 경로에 박아 넣습니다. 프로덕션은 https://api.wise.com/2026Q3/rates, 샌드박스는 https://api.wise-sandbox.com/2026Q3/rates입니다. 예전 제휴 문서는 여전히 api.transferwise.com의 /v1/rates를 참조합니다. 경로에 박힌 버전은, 누군가 업그레이드를 책임지지 않는 한 여러분의 연동이 조용히 낡아간다는 뜻입니다.
Wise rates 엔드포인트 호출하기
토큰만 있으면 엔드포인트 자체는 깔끔하고 잘 설계되어 있습니다. 문서에는 네 가지 호출 형태가 나옵니다.
# Latest rates for every supported currency
curl -X GET 'https://api.wise.com/2026Q3/rates' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# Latest rate for a single pair
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# Rate at a specific historical moment
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD&time=2019-02-13T14:53:01' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# A time series, grouped by day, hour or minute
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD&from=2019-02-13&to=2019-03-13&group=day' \
-H 'Authorization: Bearer <YOUR_TOKEN>'응답은 배열이며, 구간당 하나의 객체입니다.
[
{
"rate": 1.166,
"source": "EUR",
"target": "USD",
"time": "2018-08-31T10:43:31+0000"
}
]두 가지 세부 사항을 짚어둘 만합니다. 첫째, group은 day, hour, minute을 받습니다. 분 단위 히스토리는 이례적으로 후하며 백테스팅에 실제로 유용합니다. 둘째, 응답은 단일 쌍이어도 항상 배열이므로 그에 맞게 파싱해야 합니다.
import requests
TOKEN = "<YOUR_TOKEN>"
BASE = "https://api.wise.com/2026Q3"
def wise_rate(source: str, target: str) -> float:
r = requests.get(
f"{BASE}/rates",
params={"source": source, "target": target},
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=10,
)
r.raise_for_status()
payload = r.json()
if not payload:
raise LookupError(f"No rate returned for {source}/{target}")
return payload[0]["rate"] # array, even for one pair
print(wise_rate("EUR", "USD"))현장에서 잘 알려진 함정이 하나 더 있습니다. 같은 요청에 time 과 from/to를 함께 보내면 범위 파라미터가 이기고 time은 무시됩니다. 이 때문에 n8n의 Wise 노드에 오래 지속된 버그가 있었고 업스트림 패치로 수정되었습니다. 둘 중 하나만 보내고, 절대 둘 다 보내지 마세요.
중간 시장 환율은 사용자가 지불하는 가격이 아니다
Wise의 /rates는 중간 시장 환율을 반환합니다. 은행 간 시장에서 매수호가와 매도호가의 중간값이죠. 이것이 "진짜" 환율이고 Wise 마케팅의 핵심입니다. 동시에 정의상 아무도 그 값으로 거래하지 않는 환율이기도 합니다.
송금이 실제로 얼마인지 알아야 한다면 필요한 것은 /quotes입니다.
curl -X POST 'https://api.wise.com/2026Q3/quotes' \
-H 'Authorization: Bearer <YOUR_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"sourceCurrency": "GBP",
"targetCurrency": "USD",
"sourceAmount": 100
}'견적 응답에는 가격 로직이 실제로 필요로 하는 필드가 담겨 있습니다. rate, rateType(예: FIXED), rateExpirationTime, fee 내역, feePercentage, 그리고 입금 수단별 estimatedDelivery가 들어간 paymentOptions 배열. notices도 반환되는데, Wise 자체 문서 예시에는 고객이 환율 보장 상태의 미완료 송금을 최대 세 건까지만 보유할 수 있고 그 이후에는 실시간 환율로 전환된다는 경고가 들어 있습니다.
실무적 함의는 이렇습니다. 견적은 송금에 묶인, 수명이 짧은 상태 객체이지 주기적으로 폴링할 수 있는 환율 조회가 아닙니다. 사용 사례가 "가격 페이지에 오늘의 USD 가격 표시"라면 견적은 잘못된 원시 요소이고 환율이 맞습니다. "사용자가 받을 금액을 정확히 알려주기"라면 환율만으로는 금액을 과대 추정하게 됩니다. 이 구분을 혼동하는 것이 통화 반올림과 소수 자릿수 가이드에서 설명한 반올림·대사 불일치의 흔한 원인입니다.
비교 API가 실제로 반환하는 것
비교 엔드포인트는 이 플랫폼에서 가장 흥미롭고 가장 오해받는 부분입니다. 특정 경로에 대해 은행과 송금 서비스의 가격·속도 추정치를 사업자별로 반환합니다.
curl -X GET 'https://api.wise.com/2026Q3/comparisons?sourceCurrency=GBP&targetCurrency=EUR&sendAmount=10000&filter=POPULAR'이 위에 무언가를 만들기 전에 Wise 자체의 방법론 설명을 꼼꼼히 읽으세요. Wise는 제3자 웹사이트에서 광고된 환율과 수수료를 수집하고, 수집 시점의 중간 시장 환율 대비 각 사업자의 마크업을 계산한 다음, 저장해 둔 그 마크업을 현재의 중간 시장 환율에 다시 적용해 여러분이 받는 숫자를 만든다고 밝히고 있습니다. 수집은 대략 한 시간에 한 번 돕니다.
다시 말해 이 엔드포인트의 경쟁사 가격은 시간당 수집에서 도출된 모델 추정치이지 실시간 견적이 아닙니다. Wise가 이를 명확히 밝히는 점은 높이 평가할 만하지만, 경쟁사 숫자에 대해 여러분이 책임져야 하는 용도에는 이 데이터가 부적합하다는 뜻이기도 합니다. 게다가 Wise는 추정치를 은행 송금 입출금에 한정하며, 다수 사업자가 카드와 현금에 대해 매우 다른 가격을 매긴다는 점도 덧붙입니다.
구조적으로 응답은 비정규화되어 있습니다. 가격과 소요 기간이 목적지 국가에 따라 달라지기 때문에, 한 사업자가 같은 통화쌍에 대해 여러 견적을 반환할 수 있습니다. providers 배열을 받고 각 항목에 quotes 배열이 들어 있으며, 이를 사업자당 하나의 대표 숫자로 줄이는 일은 API가 아니라 여러분의 몫입니다.
Wise 환율 위에 만들기 전에 알아야 할 다섯 가지 한계
- 접근은 가입이 아니라 사업 관계다. 제휴 승인이나 Platform 온보딩이 모든 환율 호출에 선행합니다. 30초 만에 키를 발급하는 대시보드는 없습니다.
- 커버리지는 송금 경로를 따른다. Wise는 돈을 옮길 수 있는 통화를 지원합니다. 전용 데이터 제공자는 가격을 매길 수 있는 통화를 다루며, 이쪽이 더 넓은 집합입니다. Finexly는 170개 이상의 통화를 다루고, 여기에는 송금 회랑이 아예 없는 통화도 포함됩니다.
- 환율은 결제 API 안의 한 모듈이다. 그 주변에는 견적, 수취인, KYC, 카드, 웹훅이 있습니다. 원한 것이 숫자 하나뿐일 때, 이는 유지해야 할 크고 보안 민감한 연동입니다.
- 공개된 쿼터가 없다.
/rates레퍼런스는429응답을 문서화하지만 공개 요청 허용량은 밝히지 않습니다. 즉 명시되지 않은 상한을 상대로 용량을 산정하게 됩니다. 모든 응답에 헤더가 실리는 명시적 모델과 비교해 보세요. - 호출당 두 개 통화.
/rates는source와target을 하나씩만 받습니다. 여덟 개 통화로 가격을 표시하려면 여덟 번 호출하거나 전체 테이블을 받아 클라이언트에서 걸러야 합니다.
이 중 어느 것도 결함은 아닙니다. 결제 API를 데이터 API로 쓸 때 나타나는 자연스러운 모습일 뿐입니다.
Wise가 맞는 선택일 때, 그리고 아닐 때
| 사용 사례 | 최선의 선택 | 이유 |
|---|---|---|
| 비교 사이트 또는 "은행 vs Wise" 제휴 콘텐츠 | Wise 비교 API | 이 데이터의 유일한 출처이며, 제휴 경로가 바로 이를 위해 존재 |
| 실제로 Wise를 통해 송금 | Wise Quotes + Transfers | 가격이 매겨지고 만료되는 견적 객체가 필요 |
| 사용자가 원해서 Wise 브랜드 환율을 표시 | Wise /rates | 브랜드 귀속 자체가 목적 |
| 다중 통화 가격, 결제, 환산 화면 | 전용 통화 API | 넓은 커버리지, 즉시 발급 키, 단순한 계약이 필요 |
| 청구, 빌링, 매출 리포팅 | 전용 통화 API | 안정적인 과거 시계열과 감사 추적이 필요 |
| 백테스팅 또는 분석 | 둘 다 | Wise의 분 단위 히스토리는 강력하고, 데이터 API는 얻기 쉬움 |
대신 전용 환율 API 사용하기
데이터 API는 트레이드오프를 뒤집습니다. 온보딩 미팅이 없고, 커버리지가 넓고, 쿼터가 명시적이며, 응답에는 환율 외에 아무것도 없습니다.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/rate?from=EUR&to=USD"{ "pair": "EUR_USD", "rate": 1.0852 }여러 통화로 가격을 매기는 일은 쌍마다 호출하는 대신 왕복 한 번이면 됩니다.
const apiKey = process.env.FINEXLY_API_KEY;
async function priceTable(base, quotes) {
const q = quotes.map((c) => `${base}_${c}`).join(',');
const res = await fetch(`https://api.finexly.com/v1/convert?q=${q}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
if (!res.ok) throw new Error(`Finexly ${res.status}`);
return res.json();
}
const rates = await priceTable('USD', ['EUR', 'GBP', 'JPY', 'CAD', 'AUD']);
// { "USD_EUR": { "rate": 0.9215 }, "USD_GBP": { "rate": 0.7892 }, ... }그리고 배수가 아니라 환산된 금액이 필요하다면, 반올림이 한 곳에서만 일어나도록 API에 계산을 맡기세요.
import requests
def convert(amount, src, dst, api_key):
r = requests.get(
"https://api.finexly.com/v1/convert-amount",
params={"from": src, "to": dst, "amount": amount},
headers={"Authorization": f"Bearer {api_key}"},
timeout=10,
)
r.raise_for_status()
return r.json()["result"]
print(convert(100, "USD", "EUR", "YOUR_API_KEY"))모든 응답에 X-RateLimit-Limit, X-RateLimit-Used, X-RateLimit-Units가 실리므로 쿼터는 추론이 아니라 관측 대상입니다. 환율은 장중 매분 갱신됩니다. 무료 요금제는 월 1,000회 요청, 분당 10회이고, 유료 요금제는 월 6.99달러에 3,500회부터 Professional 요금제의 100,000회까지 있습니다. 전체 내역은 요금 페이지에 있습니다.
사용량에 관해 한마디. 월 1,000회는 캐시를 쓰기 전까지만 적게 들립니다. 전체 환율 테이블을 15분마다 갱신하는 예약 작업 하나는 월 약 2,900회를 소비하고, 60분마다면 약 730회입니다. 캐싱은 호출량을 트래픽이 아니라 시간의 함수로 바꾸며, 이것이 어떤 규모에서도 작은 요금제를 실현 가능하게 만드는 요인입니다. 관련 패턴은 통화 API 캐싱과 에러 처리에 정리되어 있습니다.
Wise /rates에서 마이그레이션하기
기존 연동을 옮긴다면 대응 관계는 거의 일대일입니다.
| Wise | 대응 | 참고 |
|---|---|---|
GET /rates | GET /v1/currencies 후 /v1/rate | Wise의 맨 /rates는 전부 반환; 통화 목록은 한 번만 조회 |
GET /rates?source=X&target=Y | GET /v1/rate?from=X&to=Y | 단일 요소 배열이 아니라 객체를 반환 |
| 여러 쌍, 여러 호출 | GET /v1/convert?q=X_Y,X_Z | 요청 한 번 |
수동 amount * rate | GET /v1/convert-amount | 반올림은 서버에서 처리 |
?time= 과거 시점 | 히스토리 엔드포인트 | 유료 요금제 필요; 과거 환율 가이드 참조 |
| Basic 또는 OAuth 토큰 | Authorization: Bearer | 대시보드에서 발급, 승인 단계 없음 |
마지막으로, wise.com을 스크래핑하지 마세요. 여러 마켓플레이스 리스팅이 정확히 그것을 제공하지만, 취약하고 법적으로 모호하며 페이지 마크업이 바뀌는 순간 깨집니다. Wise의 그 숫자가 꼭 필요하다면 제휴 경로를 밟아 API에서 제대로 받으세요. 어떤 숫자가 필요할 뿐이라면, 숫자를 제공하도록 만들어진 API를 쓰세요. 무료 통화 API 비교와 Frankfurter 대안 가이드에서 키 없는 선택지를 더 깊이 다룹니다.
자주 묻는 질문
Wise 환율 API는 무료인가요? 환율 엔드포인트에 대해 공개된 건당 요금은 없지만 접근이 개방되어 있지 않습니다. 승인된 Wise Platform 파트너이거나 승인된 제휴 파트너여야 하며, 이는 가입 양식이 아니라 신청과 심사를 뜻합니다. 대부분의 프로젝트에서 비용은 돈이 아니라 시간입니다.
계정 없이 Wise API를 쓸 수 있나요?
없습니다. 문서화된 두 경로 모두 자격 증명을 요구합니다. 플랫폼 파트너는 Bearer 토큰, 제휴 파트너는 Basic 인증의 client ID와 secret입니다. 문서 예시에서 authorization 헤더가 빠진 유일한 엔드포인트는 /comparisons지만, 그 전제로 프로덕션 트래픽을 올리는 것은 현명하지 않습니다.
Wise API는 wise.com에 표시되는 환율과 같은 값을 반환하나요?
/rates는 중간 시장 환율을 반환하며, 이는 Wise가 내세우는 대표 수치입니다. 고객이 실제로 받는 금액은 /quotes에서 나오고 Wise 수수료가 포함됩니다. 숫자가 웹사이트와 맞지 않는다면 거의 확실히 중간 시장 환율과 가격이 매겨진 견적을 비교하고 있는 것입니다.
Wise 과거 환율 데이터는 얼마나 거슬러 올라가나요?
엔드포인트는 임의의 from/to 타임스탬프를 day, hour, minute 그룹화와 함께 받습니다. Wise는 레퍼런스에 고정된 최초 날짜를 공개하지 않으므로, 커버리지를 가정하지 말고 필요한 구간을 직접 테스트하세요.
Wise 환율 API의 최선의 대안은 무엇인가요? 무엇을 대체하느냐에 따라 다릅니다. 경쟁사 가격 비교에는 대안이 없습니다. Wise의 비교 API는 유일무이합니다. 제품 안에서 쓰는 중간 시장 환율이라면, 전용 통화 데이터 API가 더 넓은 커버리지, 즉시 발급 키, 명시적 쿼터를 제공합니다. 선택지는 API 비교 페이지에서 견주어 보세요.
Wise 환율을 사용자에게 표시하는 것이 법적으로 괜찮나요? 승인된 제휴 또는 플랫폼 파트너라면 해당 계약의 조건 내에서 가능합니다. 같은 숫자를 얻으려고 공개 사이트를 스크래핑하는 것은 별개의 문제이며, 그 위에 사업을 세우는 것은 권하지 않습니다.
파트너 온보딩을 건너뛰고 바로 환율을 받을 준비가 되셨나요? 무료 Finexly API 키 받기 — 신용카드가 필요 없습니다. 170개 이상 통화에 대해 월 1,000회 무료 요청으로 시작하고, 트래픽이 늘 때만 업그레이드하세요. 통화 변환기로 브라우저에서 먼저 환율을 확인해 볼 수도 있습니다.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →