Dilution calculator
Fill in three of the four dilution values and get the missing one: 10 mL of a 2 M stock diluted to 0.5 M makes 40 mL of solution. A built-in check confirms both sides of the equation match. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Initial
- 2
- V1
- 10
- Final
- 0.5
- V2
- 40
- Solved
- v2
- Product
- 20
- Equation
- M1·V1 = M2·V2
Solution dilution is the everyday lab move of taking a concentrated stock and adding solvent until the mixture reaches a target concentration or volume. The conservation relation that makes the arithmetic work is the product identity M1 times V1 equals M2 times V2, where M1 and V1 describe the stock aliquot and M2 and V2 describe the final diluted solution. This capability accepts any three of those four numbers, solves for the single missing quantity with deterministic floating-point arithmetic, and rejects zero volume so pipelines never divide by a dead measuring vessel.
How M1V1 equals M2V2 and which value to leave blank
Write the dilution in consistent concentration and volume units on both sides of the equation. M1 is the stock concentration, V1 is how much stock you measure into the flask, M2 is the concentration you want after dilution, and V2 is the final filled volume. Because moles of solute are conserved when only solvent is added, the product M1 times V1 must equal M2 times V2.
Concentrations must be non-negative; volumes must be strictly positive because a zero measuring volume is not a physical aliquot and would make the rearranged formulas undefined. Identical inputs always produce identical outputs because there is no network call, no model, no random seed, and no wall clock in the path.
Classroom examples include finding how many milliliters of a two molar stock you need to prepare forty milliliters of a zero point five molar working solution, or what final concentration you obtain when ten milliliters of stock are diluted to one hundred milliliters.
Reading the response: solved field, product check, and units
The product field reports M1 times V1 after stable rounding, equation restates the identity M1·V1 = M2·V2, and check is true when both sides match under that rounding so UI code can show a green consistency badge without reimplementing floating comparison. Use solved alone when a form only needs to highlight the calculated cell; use the full quartet when a prep sheet must print stock volume, stock molarity, target molarity, and flask volume together.
Concentrations and volumes are pure numbers: the engine does not convert molar to millimolar or milliliters to liters, so keep units aligned yourself and document them in your own UI. Validation failures such as zero volume mention the offending field so technicians can correct a zero entry in a volume column without reading a stack trace.
What you can do with it
Lab prep and stock dilution sheets
Technicians enter stock molarity, target molarity, and flask volume; the calculator returns the milliliters of stock to pipette before bringing to volume with solvent.
FAQ
How do I use the dilution calculator with M1V1=M2V2?
The response fills the missing quantity, sets solved to that field name, and reports a product check for both sides of the equation.
What happens if volume is zero?
Zero volume is not a valid aliquot or flask fill; both provided and solved volumes must be strictly positive.
Do I need to use the same units on both sides?
Yes. Keep concentration units consistent (for example both molar) and volume units consistent (for example both milliliters). The engine does not convert units for you.
Is the dilution calculator free?
The browser tool runs free on your device.
Can I solve for final concentration after a known dilution?
Yes. Provide m1, v1, and v2 and omit m2. The engine returns m2 = (m1·v1)/v2 along with the full quartet and solved set to m2.
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/chem/dilution \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"m1":2,"M1":1}'const res = await fetch("https://api.kit.forhosting.com/chem/dilution", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"m1": 2,
"M1": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/chem/dilution",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"m1": 2,
"M1": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/chem/dilution", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"m1":2,"M1":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"m1":2,"M1":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/chem/dilution", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"m1": 2,
"M1": 1
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "chem.dilution",
"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
Homework checkers, LIMS scripts, teaching apps, and prep-sheet generators can pin the same JSON in tests without embedding a chemistry CAS.
How M1V1 equals M2V2 and which value to leave blank
Send a JSON object that includes exactly three of the four fields m1, v1, m2, and v2 as finite numbers; omit the field you want the engine to compute. Aliases such as initial_concentration, final_volume, c1, and V2 are accepted when documented by the SDK so client code can speak laboratory English. Leaving two or more fields blank, or providing all four with nothing to solve, fails with invalid_input rather than guessing.
Reading the response: solved field, product check, and units
On success the response echoes numeric m1, v1, m2, and v2 after filling the missing value, plus a solved string naming which field was computed. The method label is always dilution_equation so downstream routers can branch without sniffing shapes. Negative concentrations and ambiguous all-zero concentration pairs that cannot uniquely determine a volume also raise invalid_input and are not charged after the engine rejects the request.
API usage, pricing, lab workflows, and practical limits
Call the free in-browser dilution calculator for homework checks, lecture demos, and quick bench prep without installing a spreadsheet formula library. Serial multi-stage dilutions are not modeled as a chain inside one call—run the identity once per stage or expand the products yourself—because each stage is still the same four-variable relation. Authors shipping SDKs can map the four fields into labeled inputs Stock M, Stock V, Final M, and Final V with the solved field auto-filled—the same columns students write when they rearrange M1V1 equals M2V2 by hand on paper. Send a JSON body with any three of m1, v1, m2, and v2 as numbers or numeric strings. Use the prepaid API when a LIMS integration, tutoring platform, media kitchen planner, or inventory system needs a stable contract under KIT balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Pair this endpoint with molar mass or unit conversion helpers in your own pipeline when the next step is converting grams of solid into stock molarity before the dilution step.
Integration use cases
Homework and exam verification
Students solve for the missing concentration or volume in M1V1=M2V2 problems and compare against structured JSON, with clear errors on zero volume entries.
LIMS and teaching app integrations
Scripts and curriculum tools call a stable prepaid endpoint instead of reimplementing dilution algebra in every language and spreadsheet.