Salary negotiation range calculator
With a market rate of 85,000 and the 75th percentile, you ask between 106,250 and 110,500 and aim for 108,375. You walk in with a floor you would accept and a ceiling that leaves room to concede. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Market rate
- 85,000
- Percentile
- 75
- Ask low
- 106,250
- Ask high
- 110,500
- Midpoint
- 108,375
- Percent above market low
- 25
The salary negotiation range calculator takes a market rate estimate for a role and a positioning percentile — where you believe you sit relative to the typical candidate — and returns a concrete ask range above the market rate, plus its midpoint. Instead of improvising a number in the room, you walk in with a low anchor you would still accept and a high anchor that leaves room to concede, both derived deterministically from the same inputs every time.
Why negotiate from a range, not a single number
Most candidates name one figure and immediately regret it: too low and they leave money on the table for years, too high and the offer cools before the conversation starts. A range solves both failure modes at once. The bottom of the range is the number you would genuinely accept, anchored to your market research; the top is the ambitious-but-defensible figure that gives the recruiter something to negotiate down from.
Because the salary negotiation range calculator derives both ends from your market rate and your chosen percentile, the range is internally consistent — you never end up with a top that contradicts your bottom. Anchoring research in negotiation science consistently shows that the first credible number on the table pulls the final agreement toward it, so the quality of that first anchor matters more than any argument you make afterwards.
How the percentile becomes a premium
The calculator maps that percentile linearly onto a premium above the market rate, so the 75th percentile on an 85,000 market rate yields a premium of 25 percent at the low end of the ask, which is an opening figure of 106,250. The range is then widened by five percentage points above that low end, giving you a negotiation corridor: concede from the top toward the bottom without ever dropping below your target positioning.
The mapping is deliberately linear and transparent, because a curve you cannot explain to yourself in ten seconds is a number you will not defend under pressure. All arithmetic is fixed and deterministic — no network calls, no randomness — so the same market rate and percentile always produce exactly the same range, which is what makes the result safe to quote in writing.
Using the result in a real conversation
Treat the midpoint as the outcome you are actually aiming for. Open near the high end, justify it with the same market data you fed into the calculator, and let the other side move you down toward the midpoint — a concession that costs you nothing because it was planned.
If the counter lands below your low end, that is a signal about the role or the data, not about your nerve: either your market rate estimate needs revisiting or the employer is benchmarking against a different market, and both possibilities deserve a calm follow-up question rather than a hurried yes. The tool accepts any positive market rate in any currency and rejects non-positive values outright, so it works for annual salaries, day rates and hourly contracts alike.
You can also tune the rounding precision when you want clean round numbers instead of cents.
What you can do with it
Prepare for an offer conversation
Turn a market rate estimate from salary surveys into a concrete low and high anchor before the recruiter asks for your expectations.
Benchmark a counter-offer
Check whether a proposed raise reaches the percentile you believe you occupy, instead of reacting to the number emotionally.
FAQ
Does it work for hourly or daily rates?
Yes. The market rate is unit-agnostic — annual salary, day rate or hourly wage all work, as long as it is a positive number.
Is the result the same every time?
Yes. The calculation is fully deterministic: the same market rate and percentile always return the same range.
How wide is the suggested range?
Five percentage points of premium: the low end is your target positioning and the high end leaves room to concede without dropping below it.
What percentile should I pick for a salary negotiation?
Pick the one that matches where you believe you sit against the typical candidate: 50 asks at the market rate itself and 99 at the highest premium you can still defend. If you leave it empty, the calculator uses 75.
How do I use the midpoint when negotiating salary?
Treat the midpoint as the outcome you are really aiming for. Open near the high end, back it with the same market data you entered, and let the other side move you down toward the midpoint, a concession you planned in advance.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/salary-negotiation-range \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"market_rate":85000}'const res = await fetch("https://api.kit.forhosting.com/life/salary-negotiation-range", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"market_rate": 85000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/salary-negotiation-range",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"market_rate": 85000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/salary-negotiation-range", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"market_rate":85000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"market_rate":85000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/salary-negotiation-range", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"market_rate": 85000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.salary_negotiation_range",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
How the percentile becomes a premium
The percentile expresses where you position yourself against the market: 50 means you ask at the market rate itself, while 99 means you ask at the highest defensible premium.
Using the result in a real conversation
Run it free in your browser on this page; automate it through the API at $0.002 per request when you need it inside an offer-comparison pipeline or an internal compensation tool.
Integration use cases
Standardize band proposals in HR tooling
Embed the API in an internal tool so every recruiter proposes ask ranges computed the same deterministic way.
Technical questions
What does it cost?
$0.002 per request via the API. It is also free to run in your browser on this page.
What happens if the market rate is zero or negative?
The request is rejected with an invalid_input error: a negotiation range above a non-positive market rate is meaningless.
What does the percentile mean?
It is your positioning within the market: 50 asks at the market rate, 99 asks at the top defensible premium. It defaults to 75.