Compensation data beyond a single median.
The Salary API returns structured compensation benchmarks for thousands of job-title and country combinations, together with the context needed to explain and compare those estimates.
Ranges and tiers
Median, minimum, maximum, hourly equivalents, bonuses, and experience levels.
Hiring context
Demand, growth direction, relevant industries, and remote-work availability.
Skills and benefits
Core, trending, and emerging skills, work settings, and common benefits.
Your first response in five steps.
Create a server-side key, normalize the requested title and country, and send a GET request over HTTPS.
- Create an API key Open the API Dashboard and create a key for the integration.
- Fund the API wallet Successful current-data lookups are charged to the wallet connected to the key.
- Load supported values Read the country and position metadata before storing production mappings.
- Send a GET request Include
title,country, and the Bearer token. - Cache the result Store the response and its
updated_atvalue instead of repeating requests unnecessarily.
curl -X GET "https://jobicy.com/api/v2/salary?title=ai-engineer&country=ca" \
-H "Authorization: Bearer YOUR_API_KEY"const response = await fetch(
"https://jobicy.com/api/v2/salary?title=ai-engineer&country=ca",
{
headers: {
Authorization: "Bearer YOUR_API_KEY",
Accept: "application/json"
}
}
);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const salary = await response.json();
console.log(salary);Keep the API key on the server.
Every salary lookup requires a Bearer token. Send it in the Authorization header and never expose a production key in
browser JavaScript, public repositories, or client-side mobile code.
Authorization: Bearer YOUR_API_KEYExpiration and revocation
Set an appropriate lifetime and revoke a key immediately if it may have been exposed.
IP allowlist
Restrict a production key to known server addresses when the deployment has stable outbound IPs.
Two required values define a lookup.
Use a supported position and country value. Normalize free-form user input before sending a billable request.
titlePosition name or supported slug, such as AI Engineer or ai-engineer.
countryCountry name or supported code, such as Germany, de, Canada, or ca.
Structured data for display and analysis.
A successful response combines numeric compensation estimates with experience tiers, skills, market information, and freshness metadata.
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the lookup completed successfully. |
request_cost | number | Amount charged for this response in USD. |
job_title | string | Normalized position used for the estimate. |
country | string | Normalized market name. |
currency | string | ISO currency code for compensation values. |
median | integer | Estimated median annual gross salary. |
min / max | integer | Estimated lower and upper annual boundaries. |
confidence | number | Confidence score for the estimate. |
hourly_rate_min / hourly_rate_max | number | Hourly equivalents in the response currency. |
updated_at | date | Freshness date for the underlying data. |
salary_tiers | object | Junior, middle, and senior compensation ranges. |
skills | object | Core, trending, and emerging role skills. |
benefits | object | Common and additional employee benefits when available. |
market_trends | object | Demand, growth, industries, and remote-work context. |
{
"success": true,
"request_cost": 0.109,
"job_title": "AI Engineer",
"country": "Canada",
"currency": "CAD",
"median": 142000,
"min": 92000,
"max": 205000,
"confidence": 0.95,
"hourly_rate_min": 44.23,
"hourly_rate_max": 98.56,
"updated_at": "2026-06-01",
"salary_tiers": {
"junior": {
"range": [92000, 118000],
"experience": "0–2 years"
},
"middle": {
"range": [121000, 158000],
"experience": "2–5 years"
},
"senior": {
"range": [162000, 205000],
"experience": "5+ years"
}
},
"skills": {
"core": ["Python", "Machine learning", "Data pipelines"],
"trending": ["LLM evaluation", "MLOps"],
"emerging": ["Agent orchestration"]
},
"market_trends": {
"demand": "High",
"growth_rate": "18% annual growth",
"remote_work": {
"availability": "Highly available",
"trend": "Expanding"
}
}
}Preview the request and response shape.
This browser demo generates a masked sample locally. It does not send an API request, expose a key, or consume wallet balance.
GET https://jobicy.com/api/v2/salary
{
"status": "Enter a title and country, then generate a preview"
}Usage-based access with free unchanged repeats.
Charges apply to successful lookups with current data. Cache responses by normalized title and country to reduce cost and latency.
$0.109 USD
Charged when the API returns a successful lookup with current salary data.
$0.000 USD
The same title and country lookup is free for 30 days when the data has not changed.
- Maximum 10 requests per second per API key.
- Requests above the threshold return HTTP 429.
- Bearer token authentication is required over HTTPS.
- Keys support expiration, revocation, and IP allowlists.
- Wallet balance and request history are available in the API Dashboard.
Global compensation with clear freshness data.
Coverage includes thousands of position mappings across more than twenty countries. Additional markets are added when reliable data becomes available.
supported country markets
of normalized position mappings
freshness value in every successful response
Salary values are estimates for product and research use. Show the currency, location, update date, and confidence alongside a range instead of presenting a single number as a guaranteed offer.
Handle validation, authentication, and limits.
Check the HTTP status first, then inspect the JSON response for an application-level result and message.
| Status | Meaning | Recommended action |
|---|---|---|
200 | Request completed or returned an application-level result. | Inspect the JSON success field. |
401 | The API key is invalid. | Verify the Bearer token and key status. |
429 | The rate limit was exceeded. | Reduce concurrency and apply exponential backoff. |
| Missing parameters | title or country was not supplied. | Validate inputs before sending the request. |
| Insufficient balance | The API wallet cannot fund the lookup. | Add funds in the API Dashboard. |
| IP restricted | The caller IP is not allowed by the key. | Update the allowlist or use an approved server. |
| Expired key | The key has expired or was revoked. | Create or activate a valid key. |
const retryable = [429, 500, 502, 503, 504];
if (retryable.includes(response.status)) {
const delay = Math.min(1000 * 2 ** attempt, 30000);
await new Promise((resolve) => setTimeout(resolve, delay));
}Built for compensation products and workflows.
Use the response as an input to a transparent product experience, with context and ranges visible wherever a compensation estimate is shown.
Job and career tools
Add salary context to job boards, career pages, offer comparison, and negotiation tools.
Compensation planning
Support initial role research, regional comparisons, and workforce planning dashboards.
Market analysis
Compare ranges, experience tiers, demand, and remote availability across supported markets.
Before moving to production.
Authentication, billing, supported mappings, and data freshness at a glance.
How often is salary data updated?
Data is refreshed as reliable market information becomes available. Use the response updated_at value to show freshness and manage caching.
Do repeated requests cost money?
An identical title and country lookup is free for up to 30 days when the underlying data has not changed.
Can I call the Salary API from a browser?
Production calls should go through your server. A browser request can expose the Bearer token to users and third-party scripts.
Can the API be used in a commercial product?
Yes. It can support SaaS products, HR software, recruiting tools, job boards, workforce analytics, and career applications.
Which countries and titles are supported?
Use the countries and positions metadata endpoints to retrieve the current supported values before creating production mappings.
Should I show a single salary number?
Ranges are more useful and honest. Show the currency, market, experience context, freshness date, and confidence with the estimate.
Build with global compensation data.
Create a server-side API key, review supported mappings, and preview the response shape before connecting a production workload.