Lerner index calculator
A product priced at 10 with a marginal cost of 6 has a markup of 4 and a Lerner index of 0.4. Read market power as a single number without units, from zero at competitive pricing up to one. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Price
- 10
- Marginal cost
- 6
- Markup
- 4
- Lerner index
- 0.4
The Lerner index is a unit-free measure of market power: how far a product's price sits above the cost of making one more unit, expressed as a share of that price. Abba Lerner's 1934 identity L = (P − MC) / P equals zero when a seller prices at marginal cost, the textbook competitive benchmark, and rises toward one as the markup grows relative to price. This Lerner index calculator takes a product's selling price and its marginal cost, subtracts, divides by the price, and returns the index so you can mark homework, screen a merger exhibit, or pin a pricing review without estimating a demand elasticity.
What the Lerner index measures: markup as a share of price
The Lerner index is the price-cost margin of a single product, not a market-share statistic and not a dollar markup sitting on an invoice. Price is the unit selling price in one currency. Marginal cost is the incremental cost of producing one more unit in that same currency.
Their gap is the markup; dividing the markup by price is the index that Abba Lerner proposed as a direct reading of monopoly power. When price equals marginal cost the index is zero: the firm has no pricing power on that product and is at the competitive benchmark. When marginal cost is zero and price is positive the index is one: the entire price is markup.
Values between zero and one are the usual monopoly and oligopoly cases taught in industrial organization. A negative index is allowed when marginal cost exceeds price — selling below incremental cost, as in a promotional loss leader or a predatory spell — and is reported rather than rejected. The identity is about one product at one moment.
It does not estimate the demand elasticity that a profit-maximizing monopolist would equate to one over L, does not sum firm shares into a Herfindahl-Hirschman Index, and does not convert a percent markup on cost into a margin on price. Those jobs use different inputs and answer different questions. You supply two finite numbers that already share one unit of account; the calculator subtracts them, divides by price, and rounds the index so goldens compare byte-for-byte across runtimes.
A negative selling price is rejected for the same reason. Zero marginal cost is allowed and then the index is one. Negative marginal cost is rejected because a unit production cost cannot be negative in this identity.
Where a Lerner index calculator earns its keep
Antitrust desks screening a merger exhibit use a Lerner index calculator to turn a posted price and an estimated marginal cost into one unit-free number before they open an elasticity model or a simulation of diversion ratios. Pricing teams pin that same index next to a contribution-margin case so a high sticker is not mistaken for market power when cost moved with it.
Tutors and exam-prep generators need a deterministic oracle that marks wrong a zero or negative price instead of silently returning Infinity that a buggy grader might treat as success. Product and strategy groups wire the contract into offer reviews and onboarding quizzes that must show L for a sample price and a unit cost without calling a demand-system estimator.
This is a different search and a different job from the HHI calculator that squares firm market-share percentages, from a markup-to-margin converter that never sees incremental cost, and from a consumer-surplus identity that subtracts price from willingness to pay: those tools start from different fields and answer different questions. Failed validation does not consume balance.
Keep price strictly positive, keep marginal cost non-negative, pin the rounded index in tests, and you get a reproducible market-power figure for teasers, homework checks, and edge workers without standing up an industrial-organization engine of your own. Multi-product cross elasticities, capacity constraints, and two-part tariffs stay outside this identity on purpose: fold them in your own layer after you have the raw Lerner number.
What you can do with it
Screen a posted price against unit cost
Enter the selling price and the incremental cost of one more unit, then pin the Lerner index so markup sits on a unit-free scale before you call the price market power.
Classroom and homework checks
Let students submit price and marginal cost and verify L = (P − MC) / P against the textbook identity, including the zero-power tie when price equals cost.
FAQ
Can the Lerner index be greater than one or negative?
With a non-negative marginal cost the index is at most one, and equals one when marginal cost is zero. When marginal cost exceeds price the index is negative, which this calculator reports as selling below incremental cost rather than rejecting.
Is this the same as the Herfindahl-Hirschman Index?
No. The Lerner index is a price-cost margin for one product. HHI is a concentration statistic from firm market-share percentages. They answer different searches and take different inputs.
What does a Lerner index of 0.4 mean?
It means four tenths of the selling price is markup over the cost of making one more unit. The closer the index is to one, the more pricing power the seller has on that product.
What happens if the marginal cost is zero?
The index is exactly one, because the whole price is markup. A zero marginal cost is accepted, but a negative one is rejected, since the cost of producing a unit cannot be below zero.
Can I enter a percentage markup on cost instead?
No. The index needs the selling price and the marginal cost in the same currency. It does not convert a markup expressed as a percent of cost into a margin on price.
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/fin/lerner-index \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"price":10,"marginal_cost":6}'const res = await fetch("https://api.kit.forhosting.com/fin/lerner-index", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"price": 10,
"marginal_cost": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/lerner-index",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"price": 10,
"marginal_cost": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/lerner-index", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"price":10,"marginal_cost":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"price":10,"marginal_cost":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/lerner-index", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"price": 10,
"marginal_cost": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.lerner_index",
"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.
Limits
max_abs | 1000000000000 |
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
A price that is zero or negative fails with invalid_input because the ratio is undefined.
What the Lerner index measures: markup as a share of price
A free good with price zero is not a valid Lerner observation under this contract: dividing by zero is undefined, so the task fails with invalid_input instead of inventing Infinity.
Input contract, response shape, and error behaviour
Zero marginal cost is allowed and then the index is one. Example: a price of ten and a marginal cost of six yield a markup of four and a Lerner index of zero point four. Example: a price of fifty and a marginal cost of twenty yield a markup of thirty and an index of zero point six. Keep requests small, pin the rounded index in tests, and you get a reproducible market-power figure for worksheets, LMS plugins, and edge workers without standing up a demand model of your own. POST a JSON body with two required finite numbers in one currency. price is the unit selling price and must be strictly greater than zero; aliases p, selling_price, and market_price map to the same field so a worksheet or a homework sheet can keep its column names. marginal_cost is the incremental unit cost in that same currency; aliases mc, unit_cost, and mc_unit are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values — NaN, Infinity, or text that does not parse as a number — fail with invalid_input naming the field. Those failures are not billed. On success the body echoes price and marginal_cost rounded to twelve decimal places, reports markup as price minus marginal cost, reports lerner_index as that markup divided by price, and includes a formula string restating L = (P − MC) / P. Pair the JSON with your own rule for which cost is truly marginal — short-run variable cost, long-run incremental cost, or a fully loaded unit cost — because this endpoint divides the two numbers you send; it does not look up list prices, convert currencies, or estimate an elasticity from quantity data. Pricing is a flat $0.002 per successful request.
Integration use cases
Merger exhibits and pricing reviews
Turn a sample price and an estimated marginal cost into one index in a data room or a CI fixture without estimating a demand elasticity.
Technical questions
How is the Lerner index calculated from price and marginal cost?
Send a finite price strictly greater than zero and a finite non-negative marginal_cost. The API returns lerner_index = (price − marginal_cost) / price, plus the markup and the formula L = (P − MC) / P.
What happens if the price is zero or negative?
The task fails with invalid_input. The Lerner index is undefined when price is zero or negative, because that amount is the denominator of (P − MC)/P, and the call is not billed.
What does the Lerner index calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.