Cross-currency rate calculator
With 0.92 euros and 150 yen to the dollar, one euro buys about 163 yen: the calculator divides one quote by the other and also gives the inverse, so a trip budget works when no direct pair is published. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- From rate
- 0.92
- To rate
- 150
- Amount
- 200
- Converted
- 32,608.695652
- Quote
- Units per base
- Cross rate
- 163.043478
- Inverse rate
- 0.006133
A cross-currency rate is the implied exchange rate between two currencies that are not quoted directly against each other but are each quoted against the same base, typically the US dollar, the euro, or another vehicle currency. Travelers, booking desks, and corporate treasurers use that triangular identity every day: if you know how many euros one dollar buys and how many yen one dollar buys, you can recover euros versus yen without waiting for a dedicated pair. This cross-currency rate calculator accepts the two positive rates against the shared base, an optional amount of the source currency, and a quote convention that says whether each rate is units of that currency per one base or units of the base per one currency unit. It returns the implied cross rate, the inverse rate, the converted amount, and the base-currency value of the source amount.
What a cross-currency rate measures and how the triangulation works
When two currencies do not trade as a published pair, markets and travelers still need a price between them. The standard construction is a cross rate: take each currency's quote against a common vehicle or base currency and recover the implied bilateral rate by division. The inverse rate is always the reciprocal, so you can convert in either direction without a second call.
This calculator implements only that textbook triangulation. It does not fetch live mid-market quotes, apply bid-ask spreads, or adjust for purchasing-power parity; that last job belongs to a real-exchange-rate identity that multiplies a nominal rate by a foreign-to-domestic price ratio. You supply two positive observed rates against the same base, and you receive the implied pair ready for a trip budget, a treasury worksheet, or an exam check.
What you can do with it
Trip budgets in a third currency
Restate a euro lodging total in yen or pesos from two quotes against the dollar when the booking site never prints a dedicated pair.
Classroom triangular-arbitrage checks
Let students enter both legs against the vehicle currency and verify the implied cross and its inverse under either quote convention.
Expense tools and travel desks
Convert a source amount through a shared base in automation without fetching a live feed or mixing PPP price levels into the cash quote.
FAQ
How is a cross-currency rate calculated?
Send two positive quotes against the same base.
Does this fetch live exchange rates?
No. You supply the two observed quotes. The calculator only performs the triangular identity. It does not call a market data feed, apply a bid-ask spread, or adjust for inflation or purchasing-power parity.
What if my screen shows dollars per euro instead of euros per dollar?
Switch the quote option to base units per currency unit. The identity then flips and the cross rate becomes the source quote divided by the destination quote. Both rates must follow the same convention.
How do I convert in the opposite direction?
Use the inverse rate, which is always the reciprocal of the cross rate and comes with every result. In the euro and yen example, one yen is worth 0.006133 euros, so you never need a second calculation.
Does the result include bank fees or the buy-sell spread?
No. It applies only the textbook triangulation to the two rates you enter. It does not add a buy-sell spread or adjust for purchasing power, so you get the implied rate, not an exchange counter's quote.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/travel/cross-currency-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"from_rate":0.92,"to_rate":150}'const res = await fetch("https://api.kit.forhosting.com/travel/cross-currency-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"from_rate": 0.92,
"to_rate": 150
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/cross-currency-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"from_rate": 0.92,
"to_rate": 150
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/cross-currency-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"from_rate":0.92,"to_rate":150}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"from_rate":0.92,"to_rate":150}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/cross-currency-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"from_rate": 0.92,
"to_rate": 150
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.cross_currency_rate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs | 1000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
What a cross-currency rate measures and how the triangulation works
If both quotes are expressed as units of that currency per one unit of the base, one unit of the source currency is worth one divided by from_rate units of the base, and that base amount buys to_rate divided by from_rate units of the destination currency. That quotient is the cross rate in destination units per one source unit. If both quotes are instead expressed as units of the base per one unit of the currency — the convention many dollar-per-euro and dollar-per-yen screens use — the identity flips: the cross rate is from_rate divided by to_rate.
Input contract, quote conventions, and response fields
Both rates and the amount must be strictly greater than zero: a zero or negative quote would make the implied pair undefined or reverse the economics of an exchange, and a non-positive amount is rejected for the same classroom domain. POST a JSON body with two required finite numbers: from_rate, the source-currency quote against the shared base, and to_rate, the destination-currency quote against that same base. Optionally send amount as the source quantity to convert (default one), quote as units_per_base or base_per_unit (default units_per_base), and decimals as an integer from zero through twelve (default six) to control half-up rounding on every numeric field. Missing fields, empty strings, non-finite values, an unknown quote token, and non-integer decimals outside the allowed range fail with invalid_input and are not billed. Common aliases are accepted: source_rate, rate_from, or from_vs_base for from_rate; dest_rate, target_rate, rate_to, or to_vs_base for to_rate; qty or quantity for amount; quote_mode or convention for quote. On success the body returns the echoed inputs, quote, cross_rate as destination units per one source unit, inverse_rate as the reciprocal, converted as amount times the cross rate, base_value as the source amount expressed in the base, and formula. Example: from_rate zero point nine two, to_rate one hundred fifty, amount two hundred, quote units_per_base yields a cross near one hundred sixty-three destination units per source unit because one hundred fifty divided by zero point nine two is the yen-per-euro identity when both legs are quoted per dollar. Pair the numbers with your own live feed if you need a timestamped mid; this endpoint computes only the implied pair from the two rates you already hold.
Where a cross-currency rate API earns its keep
Trip planners and multi-country itineraries use a cross-currency rate calculator so a budget written in euros can be restated in yen, pesos, or pounds from two quotes against the dollar without waiting for a dedicated pair that a boarding pass or hostel invoice never prints. Corporate travel desks and expense tools need a deterministic oracle that rejects a zero quote instead of inventing a hollow conversion a buggy sheet might treat as parity. Failed validation does not consume balance. Exam generators and open-economy problem sets ask for the triangular identity in both quote conventions; pinning the arithmetic in a tiny parse API keeps spreadsheet drift out of the mark scheme. Keep requests small, pin the rounded cross_rate and converted fields in tests, and you get reproducible implied pairs for homework, LMS plugins, and edge workers without standing up a live FX pipeline or confusing this identity with a purchasing-power real rate.
Technical questions
What is the difference between units_per_base and base_per_unit?
units_per_base means each rate is how many units of that currency equal one base (for example 150 yen per dollar). base_per_unit means each rate is how many units of the base equal one of that currency (for example 1.10 dollars per euro). Mixing the two conventions in one call is invalid because the identity would flip.
What happens if a rate or the amount is zero or negative?
The task fails with invalid_input. from_rate, to_rate, and amount must be strictly greater than zero; invalid input is not billed.
What does the cross-currency rate calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.