PPM to mg/L converter
For water and dilute water-like samples, 10 ppm is 10 mg/L, because one litre of water weighs one kilogram. Turn a ppm reading from a meter, a test kit or a reagent label into milligrams per litre for permits, logs or homework. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Ppm
- 10
- Mg per liter
- 10 mg/L
- Assumed density g per ml
- 1
This ppm to mg/L converter takes one non-negative parts-per-million concentration and returns milligrams per litre assuming the density of water is one gram per millilitre. Under that aqueous convention, one milligram of solute in one kilogram of solution occupies one litre of water, so one ppm equals one milligram per litre. Water-treatment plants, environmental labs, aquarium keepers, and chemistry classes use this identity when an instrument reports ppm and a regulation, log sheet, or homework problem wants milligrams per litre. Negative concentrations and tokens that are not finite numbers are rejected with invalid input and are not billed. Zero ppm is valid and yields zero milligrams per litre. There is no network call, no system clock, and no randomness — only multiply by the water density of one gram per millilitre.
How ppm becomes milligrams per litre in water
Parts per million on a mass basis means milligrams of solute per kilogram of solution: one million milligrams make one kilogram, so one ppm is one milligram per kilogram. Water near room temperature, and the laboratory tables used in environmental chemistry, is taken as one gram per millilitre, which is one kilogram per litre, so the mass of one litre of water is one kilogram. Multiplying the ppm reading by that density in grams per millilitre therefore yields milligrams per litre: milligrams per litre equals ppm times one.
That is the identity laboratories quote as one ppm equals one milligram per litre for dilute aqueous samples. This converter hard-codes the water density of one gram per millilitre and never asks you to type density. It is the page you want when the sample is water or a dilute water-like solution and you need the shortcut, not a density-aware calculator for brines, syrups, or organic solvents.
Zero ppm is zero milligrams per litre. Ten ppm is ten milligrams per litre. Two point five ppm is two point five milligrams per litre.
The function never consults the system clock, never calls a network service, and never uses randomness, so the same ppm always produces the same milligrams per litre, assumed density, formula, and unit.
Where a ppm to mg/L water converter earns its keep
People reach for a ppm to milligrams-per-litre converter whenever an instrument, reagent bottle, or homework problem quotes parts per million and the next consumer wants milligrams per litre for water. Drinking-water and wastewater plants log residual chlorine, nitrate, and dissolved metals in ppm on the bench, then report milligrams per litre against a permit or a public notice. Aquarium and hydroponics keepers mix stock solutions labeled in ppm and need the equivalent milligrams per litre for a dosing chart that assumes water.
Environmental field kits often print strips in ppm while a chain-of-custody form wants mg/L. Teachers assign the conversion so students practice the aqueous identity instead of guessing a factor of one thousand or confusing ppm with percent. Because the tool rejects Infinity, NaN, negative concentrations, and non-numeric tokens, it also doubles as a validator for intake forms that must not accept a blank or a unit suffix.
Pair this page with a density-aware ppm to milligrams-per-litre calculator if the liquid is a brine or solvent whose density is not one gram per millilitre, with a molarity converter if the next step needs moles per litre, or with a hardness converter if the reading is calcium carbonate rather than a generic solute.
What you can do with it
Drinking-water and wastewater logs
Turn a bench ppm reading for chlorine, nitrate, or a dissolved metal into milligrams per litre for a permit report that assumes dilute water.
Aquarium and hydroponics dosing
Convert a stock label in ppm into milligrams per litre for a dosing chart that treats the tank or reservoir as water at one gram per millilitre.
Classroom concentration checks
Let students verify that 10 ppm in water is 10 mg/L, that 2.5 ppm is 2.5 mg/L, and that a negative concentration is rejected.
FAQ
How do I convert ppm to mg/L for water?
Send a finite non-negative ppm value. Assuming water density of 1 g/mL, milligrams per litre equals ppm times one, so 10 ppm returns 10 mg/L and 2.5 ppm returns 2.5 mg/L.
Why does this converter assume water density?
If your liquid is a brine or solvent, use a density-aware calculator instead.
What happens if ppm is negative?
A concentration cannot be negative, so the conversion is rejected and is not billed.
Is 1 ppm always equal to 1 mg/L?
Only when solution density is 1 g/mL, the common dilute-water approximation this page uses. Denser or lighter liquids need multiplication by the actual density.
What does ppm mean on a mass basis?
It means milligrams of solute per kilogram of solution, since one million milligrams make one kilogram. Because a litre of water weighs one kilogram, that same figure reads as milligrams per litre.
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/conv/ppm-to-mgl-converter \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"ppm":10}'const res = await fetch("https://api.kit.forhosting.com/conv/ppm-to-mgl-converter", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"ppm": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/conv/ppm-to-mgl-converter",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"ppm": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/conv/ppm-to-mgl-converter", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"ppm":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"ppm":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/conv/ppm-to-mgl-converter", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"ppm": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "conv.ppm_to_mgl_converter",
"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_value | 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
Successful API requests cost $0.002.
How ppm becomes milligrams per litre in water
Milligrams per litre is a volumetric concentration: milligrams of solute dissolved in one litre of solution. Those two numbers are not automatically the same, because a kilogram of liquid is one litre only when the density is one kilogram per litre. The arithmetic is a single multiply by one, then a stable twelve-decimal round so JSON goldens compare byte for byte.
Input contract, finite numbers, and errors
The value is the mass-based parts-per-million concentration to convert, and it must be a finite non-negative number. Fractional ppm values are allowed and expected. Negative ppm is rejected because a concentration cannot be negative; those failures are not billed. Ten ppm maps to ten milligrams per litre. Two point five ppm maps to two point five milligrams per litre. Zero ppm maps to zero milligrams per litre. Invalid input is not billed. The request body carries one required number: ppm. Aliases value, concentration, and parts_per_million are accepted so a form, a query string, or a spreadsheet column can reuse the same contract without renaming the input. The value may arrive as a JSON number or as a decimal numeric string, including scientific notation; embedded spaces, hex prefixes, and non-numeric tokens fail with a message that names the field. Missing ppm, an empty string after trim, Infinity, and NaN fail with invalid_input and are not billed. Absolute values beyond the published magnitude limit are rejected so the product stays finite in IEEE double precision. On success the body echoes ppm, returns mg_per_liter as ppm times the assumed water density of one gram per millilitre, assumed_density_g_per_ml as one, a formula string you can print next to the answer, and unit as mg/L. Successful API calls use the published $0.002 base price.
Where a ppm to mg/L water converter earns its keep
That keeps latency at a handful of arithmetic operations and keeps the cost model honest at $0.002 per successful API request, while failed validation never consumes prepaid balance.
Technical questions
What does the ppm to mg/L converter cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.