/v1/purchasing-powerCalculate PPP-adjusted equivalent salary between two countries
Calculate the equivalent salary needed in a target country to maintain the same standard of living as a source-country salary, using Purchasing Power Parity (PPP) conversion factors. Also returns a per-category breakdown showing which expense buckets are cheaper or more expensive in the target. **When to use:** answer 'What salary do I need in Germany to match $100K in the US?', 'How far does my EUR 60K salary go in Poland?', or 'Build a relocation bonus calculator'. **Inputs:** - `salary` — annual salary amount in the source currency. - `from` — source location (default `US`). - `to` — target location. - `currency` — ISO 4217 code for the salary (informational — no FX conversion is applied; the calculation is purely PPP-based). **Response shape:** a `PurchasingPowerResult` with `original_salary`, `equivalent_salary`, `adjustment_pct` (positive = target is more expensive), `adjustment_direction` (`higher` / `lower` / `equal`), `purchasing_power_ratio` (how much further money goes in target), and a `category_differences` list. Source: OECD PPP, World Bank ICP, BLS CPI, Eurostat HICP. Required scope: `costapi:read`.
Authentication
Requires API key via X-API-Key header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| salary | query | number | required | Annual salary amount |
| to | query | string | required | Target location — country name or ISO code |
| currency | query | string | optional | Currency ISO 4217 code |
| from | query | string | optional | Current location (default: US) |
Example request
curl -X GET \
"https://col.wageapi.com/api/v1/purchasing-power?salary=%3Csalary%3E&to=%3Cto%3E¤cy=USD&from=US" \
-H "X-API-Key: YOUR_API_KEY"Responses
dataPurchasingPowerResultrequiredResult of a purchasing power calculation.
original_salarynumberrequiredInput salary amount
equivalent_salarynumberrequiredSalary needed in target location for same purchasing power
adjustment_pctnumberrequiredPercentage adjustment needed (positive = target is MORE expensive)
adjustment_directionstringrequiredenum: higher | lower | equalWhether the target cost of living is higher, lower, or equal
purchasing_power_rationumberrequiredRatio of purchasing power (>1 = money goes further in target)
currencystringoptionalCurrency of the salary values
default "USD"
from_country_codestringrequiredfrom_country_namestringrequiredto_country_codestringrequiredto_country_namestringrequiredcategory_differencesarray<CategoryDifference>optionalCategory-by-category price differences
category_codestringrequiredcategory_namestringrequiredfrom_valueanyoptionalto_valueanyoptionaldifference_pctanyoptionalPercentage difference (positive = more expensive in target)
metadataMetadataSchemarequiredsourcesarray<SourceSchema>optionalnamestringrequiredData source name (e.g., 'BLS', 'OECD', 'Eurostat')
datasetstringrequiredSpecific dataset identifier
urlanyoptionalURL to the source dataset
last_updatedanyoptionalWhen this data was last refreshed
request_idstringrequiredUnique request identifier
rate_limitanyoptionalremainingintegerrequiredRemaining requests today
daily_limitintegerrequiredTotal daily request limit
reset_atstring (date-time)requiredWhen the rate limit resets
paginationanyoptionalpageintegerrequiredpage_sizeintegerrequiredtotalintegerrequiredtotal_pagesintegerrequireddata_vintageanyoptionalData freshness (e.g., 'CPI data from February 2026')
methodology_notesanyoptionalMethodology notes (e.g., 'CPI rebased to 2020=100')
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
errorErrorDetailrequiredStructured error payload returned by all Aethar APIs. Mirrors the shape produced by aethar_auth.exception_handlers so the OpenAPI spec accurately describes real error bodies for documentation readers and MCP clients.
codestringrequiredMachine-readable error code (e.g. INVALID_API_KEY)
messagestringrequiredHuman-readable error message
statusintegerrequiredHTTP status code
request_idstringrequiredRequest identifier — include in support tickets
suggestionanyoptionalActionable hint on how to resolve the error
doc_urlanyoptionalLink to full documentation for this error code
fieldanyoptionalField that caused the error (if applicable)
errorsanyoptionalPer-field validation errors (only for 422 VALIDATION_ERROR responses)
Try this endpoint
Create a free Aethar account and generate an API key in 2 minutes.
Create free account →