Purchasing power parity exchange rate calculator
If a basket costs 50 at home and 5 abroad, purchasing power parity implies 10 units of domestic currency per foreign unit. Add a market rate to see whether the domestic currency looks undervalued or overvalued. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Domestic price
- 50
- Foreign price
- 5
- Ppp rate
- 10
- Inverse ppp rate
- 0.1
Purchasing power parity asks a price question that a market quote alone cannot answer: if the same basket of goods costs one amount in domestic currency and another amount in foreign currency, what exchange rate would make that basket equally expensive in both countries? The implied PPP exchange rate is the ratio of those two price levels, quoted as domestic currency units per one unit of foreign currency. Students, tutors, trade analysts, and exam authors need a deterministic way to turn two positive basket prices into that textbook rate without mixing quote conventions or confusing it with the real exchange rate, which also needs a market quote and two price indices. This purchasing power parity exchange rate calculator accepts those two prices, optionally a market rate for a Big Mac–style over- or undervaluation check, and returns the implied PPP rate, its inverse, and—when a market quote is supplied—the percentage gap versus absolute PPP.
What the PPP exchange rate measures and how the formula works
Absolute purchasing power parity is the exchange rate implied by the law of one price applied to a common basket. If a representative basket costs P in domestic currency and P* in foreign currency, the unique rate that equalizes the two money prices is S_PPP equals P divided by P*. That number is not a forecast and not a central-bank target: it is the rate at which one basket bought at home converts into exactly one basket bought abroad.
The quote convention here is domestic currency units per one unit of foreign currency, the same direction used in most intermediate open-economy textbooks when they write S or e as home per foreign. The inverse, P* over P, is the foreign-per-domestic twin and is returned so you do not have to flip the ratio by hand. When the two prices share a comparable basket—two Big Macs, two CPI-style consumption bundles, two identical construction packages—the ratio is a well-defined implied FX rate.
When the baskets differ in quality or coverage, the arithmetic is still well-defined but the economic reading is no longer absolute PPP. This calculator implements the textbook level identity only: it does not estimate relative PPP inflation differentials, Balassa–Samuelson effects, or convert between direct and indirect quotes. You supply two positive basket prices in their own currencies and receive the corresponding implied exchange rate, ready for problem sets, slides, and automated checks that must not invent a market quote the student never provided.
What you can do with it
Classroom absolute-PPP checks
Let students enter two basket prices and verify that the implied PPP rate is domestic over foreign, without requiring a market quote they were not given.
LMS and exam auto-grading
Mark PPP-rate items with a deterministic oracle that rejects non-positive prices and optionally checks a Big Mac–style valuation against a supplied market quote.
Basket-price notebooks and dashboards
Rebuild implied FX columns from published local prices in teaching dashboards without importing a full real-exchange-rate toolkit or a live FX feed.
FAQ
What happens if a basket price is zero or negative?
Both basket prices, and the optional market rate when supplied, must be strictly greater than zero; invalid input is not billed.
What is the formula for the PPP exchange rate?
Divide the domestic price of the basket by its foreign price. If the basket costs 50 at home and 5 abroad, the implied rate is 10 units of domestic currency per unit of foreign currency.
How do I compare the PPP rate with the market rate?
Enter the market rate in the same direction, domestic currency per foreign unit. You get the percentage gap versus parity: a negative value means the domestic currency is cheap relative to the basket, a positive one that it is expensive.
What does the inverse PPP rate mean?
It is the same parity seen from the other side: foreign currency per one unit of domestic currency. With prices of 50 and 5, the inverse is 0.1, so you never have to flip the ratio by hand.
Is the PPP rate a forecast of the exchange rate?
No. It is the rate at which one basket bought at home converts into exactly one basket abroad, not a forecast or a central bank target. It also leaves out inflation differences over time and gaps in basket quality.
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/econ/purchasing-power-parity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"domestic_price":50,"foreign_price":5}'const res = await fetch("https://api.kit.forhosting.com/econ/purchasing-power-parity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"domestic_price": 50,
"foreign_price": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/econ/purchasing-power-parity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"domestic_price": 50,
"foreign_price": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/econ/purchasing-power-parity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"domestic_price":50,"foreign_price":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"domestic_price":50,"foreign_price":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/econ/purchasing-power-parity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"domestic_price": 50,
"foreign_price": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "econ.purchasing_power_parity",
"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.
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
Input contract, quote convention, and optional market valuation
Both prices must be strictly greater than zero: a zero or negative basket price would make the implied rate undefined or meaningless, and a non-positive market rate is rejected for the same classroom domain. POST a JSON body with two required finite numbers: domestic_price (home basket price P) and foreign_price (abroad basket price P*). Optionally send market_rate as the observed nominal quote in the same direction—domestic currency per one foreign unit—and decimals as an integer from zero through twelve (default six) to control half-up rounding on every computed field. Missing fields, empty strings, non-finite values, and non-integer decimals outside the allowed range fail with invalid_input and are not billed. Common aliases are accepted: p_home, p_domestic, home_price, local_price, or p for domestic_price; p_foreign, p_star, abroad_price, or p_star_foreign for foreign_price; e, spot, nominal, fx_rate, exchange_rate, or nominal_rate for market_rate. On success the body returns the echoed prices (rounded), ppp_rate as domestic over foreign, inverse_ppp_rate as foreign over domestic, and formula. When market_rate is present the body also includes that quote, valuation_percent as (ppp_rate minus market_rate) over market_rate times one hundred—the standard Big Mac Index sign, negative when the domestic currency is cheap relative to the basket—and valuation_band as domestic_undervalued, at_ppp, or domestic_overvalued. Example: domestic fifty, foreign five yields ppp_rate ten and inverse_ppp_rate zero point one; add market_rate twenty and valuation_percent is minus fifty with domestic_undervalued. Omit market_rate and those three valuation keys are omitted, never null.
Where a PPP exchange-rate API earns its keep
Principles and intermediate open-economy courses use a purchasing power parity exchange rate calculator so students can convert any valid pair of basket prices into the implied FX rate without borrowing a market quote they were never given and without confusing the identity with the real exchange rate e times P-star over P. Exam generators and LMS plugins need a deterministic oracle that rejects zero or negative prices instead of inventing a hollow parity number that a buggy grader might treat as one-for-one. Failed validation does not consume balance. Trade and macro notebooks often rebuild textbook Big Mac or ICP-style tables from published local prices; pinning the arithmetic in a tiny parse API keeps spreadsheet drift out of the implied-rate column and makes the optional valuation gap reproducible in CI. Keep requests small, pin the rounded ppp_rate and, when you send a market quote, valuation_percent in tests, and you get reproducible implied-parity numbers for homework, LMS plugins, and edge workers without standing up a multi-country price-survey pipeline of your own.
Technical questions
How is the PPP exchange rate calculated?
Send positive numbers domestic_price (P) and foreign_price (P*). The API returns ppp_rate = domestic_price / foreign_price, quoted as domestic currency per one foreign unit, plus the inverse rate.
What quote convention does ppp_rate use?
Domestic currency units per one unit of foreign currency (for example pesos per dollar). inverse_ppp_rate is the foreign-per-domestic twin of the same pair.
How do I compare the implied rate with a market quote?
Optionally send market_rate in the same quote. The API then returns valuation_percent = (ppp_rate − market_rate) / market_rate × 100 and a coarse band: negative percent means the domestic currency is undervalued versus the basket.
What does the purchasing power parity exchange 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.