/v1/best-cities-forRank cities or countries by salary for an occupation
Return a ranked list of locations (US metros, EU countries, or both) sorted by mean salary for a given occupation. Use this when a caller needs a 'top-N best-paying places' list for a job title — relocation research, labour-market briefings, or dashboards. **When to use:** answer 'Where should I move as a software developer?', 'What are the best-paying EU countries for nurses?', or 'Rank top 20 US metros for data engineers'. **Region selector:** `US` (BLS OES metro areas), `EU` (Eurostat SES by country), or `all` (a merged set of both — note that direct mean comparison across currencies is approximate). **Response:** a list of `RankedCity` items with `rank`, `location`, `region`, `salary_mean`, `currency`, and `data_source`, plus a top-level `methodology_note` describing how the ranking was computed. **Note:** this endpoint ranks on salary only. For cost-of-living adjusted rankings, use `GET /v1/salary-adjusted` on the top candidates, or combine with CostAPI. Source: BLS OES (US), Eurostat SES (EU). Required scope: `salary:read`.
Authentication
Requires API key via X-API-Key header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| occupation | query | string | required | Job title in natural language, e.g. 'Software Developer', 'Nurse' |
| region | query | string | optional | Region to search: 'US', 'EU', or 'all' |
| top | query | integer | optional | Number of results to return (1-50) |
Example request
curl -X GET \
"https://salary.wageapi.com/api/v1/best-cities-for?occupation=%3Coccupation%3E®ion=US&top=10" \
-H "X-API-Key: YOUR_API_KEY"Responses
occupationstringrequiredmatched_titlestringrequiredregionstringrequiredresultsarray<RankedCity>requiredrankintegerrequiredlocationstringrequiredregionstringrequiredenum: us | eusalary_meannumberrequiredcurrencystringrequireddata_sourcestringrequiredmethodology_notestringrequirederrorErrorDetailrequiredStructured 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 →