自社プロダクトの中に Wise の為替レートを表示しようとしたことがあるなら、Wise 為替レート API が期待していたものとは少し違う、と気づいたはずです。Wise は確かに非常に質の高い仲値(ミッドマーケットレート)データを公開しており、REST エンドポイントで提供してもいます。しかしそれはパートナー審査の先にあり、マーケットデータ API ではなく決済 API の中に住んでおり、返ってくるレートは意図的に ユーザーが実際に支払う価格ではありません。
本記事では、Wise が何を公開しているのか、どう認証するのか、各エンドポイントが実際に何を返すのか、そして Wise が自分のプロジェクトに適した情報源かどうかを決める 5 つの構造的な制約を扱います。あわせて、多くの人が本当に知りたい問いにも率直に答えます。アプリで信頼できる仲値が欲しいだけなら、Wise はその仕事に適した道具なのか?
Wise 為替レート API とは実際のところ何なのか
Wise は送金会社です。その API — ブランド名は Wise Platform — はお金を動かすために作られています。見積もり(quote)の作成、受取人の登録、送金への資金充当、残高の照合、カードの発行。為替レートがこの API に含まれているのは、レートなしには送金の価格を決められないからであって、Wise がマーケットデータを売っているからではありません。
この位置づけが、開発者がぶつかるほぼすべての驚きを説明します。レートは決済プラットフォーム内の小さなモジュールであり、Wise が実際に対応している通貨ルートに限定されています。
3 つの別々の窓口、3 つの異なるアクセス経路
最大の混乱の原因は、「Wise のレート API」が少なくとも 3 つの別物を指していることです。
GET /rates— 為替レートのエンドポイント。ある通貨ペアについて Wise の仲値を、現在値または過去値で返します。多くの人が意味しているのはこれです。POST /quotes— 見積もりのエンドポイント。価格付きの送金を返します。レート、手数料、着金予定時間、そしてレートの有効期限タイムスタンプ。GET /comparisons— 比較のエンドポイント。あるルートについて、Wise および競合プロバイダーや銀行の価格・速度の推定値を返します。
3 つは同じリファレンスに書かれ、異なる認証方式を使い、まったく異なる問いに答えます。間違ったものを掴むのが、「なぜこのレートは wise.com の表示と違うのか」の典型的な原因です。
Wise のレートデータへのアクセス方法
セルフサービスの API キーはありません。アクセスは 2 つの経路に分かれます。
プラットフォームパートナー。 Wise Platform のパートナーとしてオンボーディングし、OAuth 2.0(client ID と client secret)で認証してトークンを取得します。/rates のリファレンスには、このエンドポイントは「アフィリエイト以外のパートナーに対しては Bearer 認証のみをサポートする」と記載され、User Token または Personal Token を用います。
アフィリエイトパートナー。 Wise アフィリエイトプログラムに参加し、その上で partnerwise@wise.com にメールして認証情報を申請します。Wise が申請を審査し、承認されると Basic 認証の認証情報が発行され、解放されるのはちょうど 2 つのエンドポイント、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 エンドポイントを呼ぶ
トークンさえあれば、エンドポイント自体は素直でよく設計されています。ドキュメントには 4 つの呼び出し形が示されています。
# 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>'レスポンスは配列で、区間ごとに 1 オブジェクトです。
[
{
"rate": 1.166,
"source": "EUR",
"target": "USD",
"time": "2018-08-31T10:43:31+0000"
}
]注目すべき点が 2 つ。第一に、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 は仲値(mid-market rate)を返します。インターバンク市場における売値と買値の中間点です。これが「本当の」レートであり、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 自身のドキュメント例には、顧客がレート保証付きの未完了送金を保持できるのは最大 3 件までで、それを超えるとライブレートに切り替わる、という警告が含まれています。
実務上の帰結はこうです。見積もりは送金に紐づく、短命でステートフルなオブジェクトであり、定期的にポーリングできるレート照会ではありません。ユースケースが「価格ページに今日の USD 価格を表示する」なら、見積もりは誤ったプリミティブでレートが正解です。「ユーザーが受け取る額を正確に伝える」なら、レートだけでは過大に見積もってしまいます。この区別の取り違えは、通貨の丸めと小数桁のガイドで説明した丸め・照合のズレのよくある原因です。
比較 API が実際に返しているもの
比較エンドポイントは、このプラットフォームで最も興味深く、最も誤解されている部分です。あるルートについて、銀行や送金サービスの価格・速度の推定値をプロバイダー単位で返します。
curl -X GET 'https://api.wise.com/2026Q3/comparisons?sourceCurrency=GBP&targetCurrency=EUR&sendAmount=10000&filter=POPULAR'この上に何かを作る前に、Wise 自身の方法論の注記を丁寧に読んでください。Wise は、第三者のウェブサイトから広告表示されているレートと手数料を収集し、収集時点の仲値に対する各プロバイダーの上乗せ率を計算したうえで、その保存した上乗せ率を現在の仲値に再適用して、あなたが受け取る数値を生成している、と述べています。収集はおよそ 1 時間に 1 回実行されます。
言い換えれば、このエンドポイントから得られる競合価格は毎時のスクレイプから導かれたモデル推定値であり、ライブの見積もりではありません。Wise がそれを明言しているのは誠実ですが、競合の数値についてあなたが責任を持たねばならない用途には使えない、ということでもあります。さらに Wise は推定を銀行振込による入出金のみに限定しており、多くのプロバイダーがカードや現金では大きく異なる価格を提示することにも触れています。
構造的にレスポンスは非正規化されています。価格と所要日数が仕向先の国によって変わるため、同一プロバイダーが同じ通貨ペアに対して複数の見積もりを返すことがあります。返ってくるのは providers 配列で、各要素が quotes 配列を持ちます。これをプロバイダーごとの代表値にまとめるのは、API ではなくあなたの仕事です。
Wise のレートの上に作る前に知っておくべき 5 つの制約
- アクセスは登録ではなく商談である。 アフィリエイト承認または Platform オンボーディングが、すべてのレート呼び出しの前提になります。30 秒でキーを発行できるダッシュボードはありません。
- カバレッジは送金ルートに従う。 Wise が対応するのは、お金を動かせる通貨です。専業のデータプロバイダーが対応するのは価格を付けられる通貨であり、こちらの方が広い集合です。Finexly は170 以上の通貨をカバーし、その中には送金回廊が存在しない通貨も含まれます。
- レートは決済 API の中の 1 モジュールにすぎない。 周囲には見積もり、受取人、KYC、カード、Webhook が並びます。ほしいのが数値ひとつだけなのに、保守すべきは大きくセキュリティ的にも重い統合になります。
- 公開されたクォータがない。
/ratesのリファレンスは429レスポンスを記載していますが、公開のリクエスト上限は示していません。つまり明示されていない上限に対して容量を見積もることになります。全レスポンスにヘッダーを載せる明示的なモデルと比べてみてください。 - 1 回の呼び出しで 2 通貨。
/ratesが受け取るのはsourceとtargetが 1 つずつです。8 通貨で価格を出すなら 8 回の呼び出しか、全表取得+クライアント側フィルタになります。
これらはどれも欠陥ではありません。決済 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 }複数通貨での価格表示は、ペアごとの呼び出しではなく 1 往復で済みます。
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 }, ... }倍率ではなく換算後の金額が欲しいときは、丸めが 1 か所で起きるように 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 からの移行
既存の実装を移すなら、対応関係はほぼ 1 対 1 です。
| 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 | 1 リクエスト |
手計算の amount * rate | GET /v1/convert-amount | 丸めはサーバー側で処理 |
?time= の過去時点 | 履歴エンドポイント | 有料プランが必要。過去レートのガイドを参照 |
| Basic または OAuth トークン | Authorization: Bearer | ダッシュボードで発行、承認ステップなし |
最後に。wise.com をスクレイピングするのはやめてください。いくつかのマーケットプレイス出品はまさにそれを提供していますが、脆く、法的にも曖昧で、ページのマークアップが変わった瞬間に壊れます。Wise の数値そのものが必要なら、アフィリエイト経路を通って正しく API から取得してください。何らかの数値が必要なだけなら、それを提供するために作られた API を使ってください。無料の通貨 API の比較と Frankfurter の代替ガイドで、キー不要の選択肢をより詳しく扱っています。
よくある質問
Wise の為替レート API は無料ですか? レートのエンドポイントについてリクエスト単価は公開されていませんが、アクセスは開かれていません。承認済みの Wise Platform パートナーか承認済みのアフィリエイトパートナーである必要があり、それは登録フォームではなく申請と審査を意味します。多くのプロジェクトにとってコストは時間であって金銭ではありません。
アカウントなしで Wise API を使えますか?
使えません。文書化された 2 つの経路はいずれも認証情報を要求します。Platform パートナーは 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 のレートをユーザーに表示することは法的に問題ありませんか? 承認済みのアフィリエイトまたは Platform パートナーであれば、その契約の条件の範囲内で可能です。同じ数値を得るために公開サイトをスクレイピングするのは別問題であり、それを土台に事業を築くことは推奨しません。
パートナーオンボーディングを飛ばして、すぐにレートを手に入れませんか?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 →