GET/v1/ppp/compare

Compare Purchasing Power Parity across up to 20 countries

Compare Purchasing Power Parity factors and price level indices across multiple countries in a single request. Use this endpoint when a caller wants a flat PPP comparison table (e.g. 'how do G7 countries line up in 2024?') without the full per-year history. **Format:** `countries` is a comma-separated list of ISO country codes, between 2 and 20 entries. `year` is optional — omit for each country's latest available year. **When to use vs `/v1/compare-cost-of-living`:** this endpoint returns raw PPP data. For natural-language country comparisons with salary adjustment and category breakdowns, use `GET /v1/compare-cost-of-living`. Source: OECD Price Level Indices, World Bank ICP. Required scope: `costapi:read`.

Authentication

Requires API key via X-API-Key header.

Parameters

NameInTypeRequiredDescription
countriesquerystringrequiredComma-separated country codes (e.g., US,GB,DE). 2-20 entries.
yearqueryanyoptionalYear for comparison. Omit for latest per country.

Example request

curl
curl -X GET \
  "https://col.wageapi.com/api/v1/ppp/compare?countries=%3Ccountries%3E&year=%3Cyear%3E" \
  -H "X-API-Key: YOUR_API_KEY"

Responses

200Successful Response
dataPppCompareResponserequired
base_countrystringrequired
yearanyoptional

Comparison year (set when explicit year requested)

one of:
option 1:
integer
option 2:
null
comparisonsarray<PppCompareItem>optional
array of PppCompareItem
country_codestringrequired
country_namestringrequired
ppp_factoranyoptional
one of:
option 1:
number
option 2:
null
price_level_ratioanyoptional
one of:
option 1:
number
option 2:
null
data_yearanyoptional

Year of the data used for this country

one of:
option 1:
integer
option 2:
null
metadataMetadataSchemarequired
sourcesarray<SourceSchema>optional
array of SourceSchema
namestringrequired

Data source name (e.g., 'BLS', 'OECD', 'Eurostat')

datasetstringrequired

Specific dataset identifier

urlanyoptional

URL to the source dataset

one of:
option 1:
string
option 2:
null
last_updatedanyoptional

When this data was last refreshed

one of:
option 1:
string (date-time)
option 2:
null
request_idstringrequired

Unique request identifier

rate_limitanyoptional
one of:
option 1:
remainingintegerrequired

Remaining requests today

daily_limitintegerrequired

Total daily request limit

reset_atstring (date-time)required

When the rate limit resets

option 2:
null
paginationanyoptional
one of:
option 1:
pageintegerrequired
page_sizeintegerrequired
totalintegerrequired
total_pagesintegerrequired
option 2:
null
data_vintageanyoptional

Data freshness (e.g., 'CPI data from February 2026')

one of:
option 1:
string
option 2:
null
methodology_notesanyoptional

Methodology notes (e.g., 'CPI rebased to 2020=100')

one of:
option 1:
string
option 2:
null
401Missing or invalid API key.
errorErrorDetailrequired

Structured 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.

codestringrequired

Machine-readable error code (e.g. INVALID_API_KEY)

messagestringrequired

Human-readable error message

statusintegerrequired

HTTP status code

request_idstringrequired

Request identifier — include in support tickets

suggestionanyoptional

Actionable hint on how to resolve the error

one of:
option 1:
string
option 2:
null
doc_urlanyoptional

Link to full documentation for this error code

one of:
option 1:
string
option 2:
null
fieldanyoptional

Field that caused the error (if applicable)

one of:
option 1:
string
option 2:
null
errorsanyoptional

Per-field validation errors (only for 422 VALIDATION_ERROR responses)

one of:
option 1:
array of object
object
option 2:
null
403API key lacks the required scope for this endpoint.
errorErrorDetailrequired

Structured 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.

codestringrequired

Machine-readable error code (e.g. INVALID_API_KEY)

messagestringrequired

Human-readable error message

statusintegerrequired

HTTP status code

request_idstringrequired

Request identifier — include in support tickets

suggestionanyoptional

Actionable hint on how to resolve the error

one of:
option 1:
string
option 2:
null
doc_urlanyoptional

Link to full documentation for this error code

one of:
option 1:
string
option 2:
null
fieldanyoptional

Field that caused the error (if applicable)

one of:
option 1:
string
option 2:
null
errorsanyoptional

Per-field validation errors (only for 422 VALIDATION_ERROR responses)

one of:
option 1:
array of object
object
option 2:
null
422Too many or too few countries supplied.
errorErrorDetailrequired

Structured 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.

codestringrequired

Machine-readable error code (e.g. INVALID_API_KEY)

messagestringrequired

Human-readable error message

statusintegerrequired

HTTP status code

request_idstringrequired

Request identifier — include in support tickets

suggestionanyoptional

Actionable hint on how to resolve the error

one of:
option 1:
string
option 2:
null
doc_urlanyoptional

Link to full documentation for this error code

one of:
option 1:
string
option 2:
null
fieldanyoptional

Field that caused the error (if applicable)

one of:
option 1:
string
option 2:
null
errorsanyoptional

Per-field validation errors (only for 422 VALIDATION_ERROR responses)

one of:
option 1:
array of object
object
option 2:
null
429Daily rate limit exceeded for this API key.
errorErrorDetailrequired

Structured 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.

codestringrequired

Machine-readable error code (e.g. INVALID_API_KEY)

messagestringrequired

Human-readable error message

statusintegerrequired

HTTP status code

request_idstringrequired

Request identifier — include in support tickets

suggestionanyoptional

Actionable hint on how to resolve the error

one of:
option 1:
string
option 2:
null
doc_urlanyoptional

Link to full documentation for this error code

one of:
option 1:
string
option 2:
null
fieldanyoptional

Field that caused the error (if applicable)

one of:
option 1:
string
option 2:
null
errorsanyoptional

Per-field validation errors (only for 422 VALIDATION_ERROR responses)

one of:
option 1:
array of object
object
option 2:
null
500Unexpected server error. Includes a request_id for support.
errorErrorDetailrequired

Structured 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.

codestringrequired

Machine-readable error code (e.g. INVALID_API_KEY)

messagestringrequired

Human-readable error message

statusintegerrequired

HTTP status code

request_idstringrequired

Request identifier — include in support tickets

suggestionanyoptional

Actionable hint on how to resolve the error

one of:
option 1:
string
option 2:
null
doc_urlanyoptional

Link to full documentation for this error code

one of:
option 1:
string
option 2:
null
fieldanyoptional

Field that caused the error (if applicable)

one of:
option 1:
string
option 2:
null
errorsanyoptional

Per-field validation errors (only for 422 VALIDATION_ERROR responses)

one of:
option 1:
array of object
object
option 2:
null

Try this endpoint

Create a free Aethar account and generate an API key in 2 minutes.

Create free account →