/v1/salary-competitivenessAssess whether a salary offer is competitive for a role and location
Assess how a concrete salary offer positions against the market benchmark for a given role and location. This is the agent-first endpoint for answering 'Is this offer competitive?' questions — it accepts natural language job titles and locations and returns a percentile rank plus a categorical assessment. **When to use:** answer 'Is €65K competitive for a developer in Berlin?', flag below-market offers in an ATS before publishing, or build a 'salary score' widget for a candidate-facing dashboard. **How it works:** resolves the job title to a SOC (US) or ISCO (EU) code, resolves the location to a US metro or EU country, fetches the benchmark distribution (p10-p90), and computes the offered salary's percentile using log-normal interpolation. The `assessment` is one of `below_market` (<25th percentile), `competitive` (25th-75th), or `above_market` (>75th). **Currency handling:** if the offered `currency` differs from the benchmark currency (EUR for EU, USD for US), the response `methodology_note` will spell out that no FX conversion is applied — the caller must ensure semantic alignment. 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 |
|---|---|---|---|---|
| job | query | string | required | Job title in natural language, e.g. 'Software Developer', 'Data Scientist', 'Nurse' |
| location | query | string | required | City, country, or metro area in natural language, e.g. 'Berlin', 'Austin, TX', 'Germany' |
| salary | query | number | required | Offered salary amount in the supplied currency and period |
| salary_period | query | string | optional | Salary period: 'annual', 'monthly', or 'hourly' |
| currency | query | string | optional | Currency code: 'USD' or 'EUR' |
Example request
curl -X GET \
"https://salary.wageapi.com/api/v1/salary-competitiveness?job=%3Cjob%3E&location=%3Clocation%3E&salary=%3Csalary%3E&salary_period=annual¤cy=USD" \
-H "X-API-Key: YOUR_API_KEY"Responses
job_titlestringrequiredmatched_titlestringrequiredlocationstringrequiredoffered_salarynumberrequiredcurrencystringrequiredassessmentstringrequiredenum: below_market | competitive | above_marketpercentile_rankintegerrequiredEstimated percentile (0-100)
min 0 · max 100
benchmark_meananyoptionalbenchmark_mediananyoptionalbenchmark_p25anyoptionalbenchmark_p75anyoptionaldata_sourcestringrequireddata_yearanyoptionalmethodology_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)
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 →