Water conductivity & TDS converter
Turn a meter reading into the unit your log asks for: 500 µS/cm becomes 250 ppm of dissolved solids with the usual 0.5 factor, which you can change to match your meter. Covers reverse osmosis, hydroponics and aquariums. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Value
- 500
- Source unit
- uS/cm
- Target unit
- ppm
- Result
- 250
- From label
- microsiemens per centimeter
- To label
- parts per million
- From family
- conductivity
A water conductivity and TDS converter turns a laboratory or meter reading written in one unit into another without hunting conversion tables or rewriting spreadsheet formulas.
Supported units and how the conversion is computed
The converter accepts two families under stable canonical codes. Conductivity units are uS/cm for microsiemens per centimeter (ASCII form; Greek mu micro symbols and the name microsiemens are also accepted), mS/cm for millisiemens per centimeter, dS/m for decisiemens per meter, S/m for siemens per meter, and umho/cm for the historical micromho per centimeter. TDS units are ppm for parts per million, mg/L for milligrams per liter, ppt for parts per thousand, and gpg for grains per gallon on the US water-treatment scale.
When the source and target belong to different families the engine applies TDS_ppm equals factor times EC in microsiemens per centimeter, with default factor 0.5 following the common sodium-chloride meter convention; you may override factor with any positive finite number when a 442 standard, potassium-chloride, or site-specific scale is required. Because intermediates are always the family bases, converting A to B and B to A is consistent up to the published rounding of twelve decimal places, and there is no pairwise matrix that can drift out of sync.
Where these water readings come up
Use the free in-browser water conductivity and TDS converter when you need a quick microsiemens-to-ppm, millisiemens-to-grains-per-gallon, or siemens-per-meter-to-mg-per-liter check while reading a reverse-osmosis log, hydroponics recipe, aquarium test strip guide, municipal water report, soil salinity note, or lab procedure. Open the page, enter the number and units, optionally set the TDS scale factor when your meter documents 0.5, 0.64, or 0.7, and copy the result without installing a spreadsheet, a unit library, or a desktop calculator pack.
Source inputs follow the same retention rules as other KIT parse items, and results are safe to cache because the algorithm is fully deterministic. Authors shipping mobile apps or chatbots can map the result and formula fields directly into cards that show both the number and the conversion path technicians, growers, and homeowners expect on paper.
What you can do with it
RO, softeners, and home water treatment
Convert meter µS/cm readings to ppm TDS and grains per gallon so filter change logs and hardness targets share one conventional scale without hand factors.
FAQ
Which water conductivity and TDS units does this converter support?
Conductivity: uS/cm (µS/cm), mS/cm, dS/m, S/m, and umho/cm. TDS: ppm, mg/L, ppt, and gpg (grains per gallon).
How do you convert microsiemens per centimeter to ppm TDS?
Override with factor (for example 0.64 or 0.7) when your meter specifies another scale.
What happens if I send an unknown unit?
The message names the field and lists supported units. Validation failures are not charged.
Is the water conductivity and TDS converter free?
The browser tool runs free on your device.
Which TDS factor should I use for my meter?
Use the one your meter documents. The default 0.5 follows the common sodium chloride convention, while some meters use 0.64 or 0.7, and the 442 or potassium chloride scales need their own value.
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/water-conductivity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"value":500,"from":"uS/cm","to":"ppm"}'const res = await fetch("https://api.kit.forhosting.com/conv/water-conductivity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"value": 500,
"from": "uS/cm",
"to": "ppm"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/conv/water-conductivity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"value": 500,
"from": "uS/cm",
"to": "ppm"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/conv/water-conductivity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"value":500,"from":"uS/cm","to":"ppm"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"value":500,"from":"uS/cm","to":"ppm"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/conv/water-conductivity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"value": 500,
"from": "uS/cm",
"to": "ppm"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "conv.water_conductivity",
"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
The browser tool runs free on your device; the prepaid API charges $0.002 per successful item when pipelines need the same contract from servers and automation.
Supported units and how the conversion is computed
Friendly aliases such as microsiemens per centimeter, millisiemens, decisiemens per meter, siemens per meter, micromhos, parts per million, milligrams per liter, parts per thousand, grains per gallon, and grain/gallon are normalized case-insensitively so forms and APIs can pass either short codes or full names. Within the conductivity family every request multiplies the input by the exact microsiemens-per-centimeter factor for the source, then divides by the factor for the target: one millisiemens per centimeter is exactly one thousand microsiemens per centimeter, one decisiemens per meter equals one millisiemens per centimeter, one siemens per meter is ten thousand microsiemens per centimeter, and one micromho per centimeter equals one microsiemens per centimeter by definition. Within the TDS family the base is parts per million: milligrams per liter equal ppm for dilute aqueous solutions, one part per thousand is one thousand ppm, and one grain per gallon is exactly 17.1 ppm under the conventional US water-treatment identity used by this endpoint.
Request shape, response fields, and unknown-unit errors
The error message names the bad field and lists the supported set so clients can correct forms without guessing. Zero converts cleanly to zero in every target unit. Send a JSON body with three required fields: value as a finite non-negative number, from as the source unit string, and to as the target unit string. Optional factor (aliases tds_factor and k) supplies the EC-to-TDS scale when families differ; it is ignored for pure same-family work and defaults to one half when omitted. Aliases amount and quantity are accepted for value; unit_from and source for from; unit_to and target for to. On success the response echoes the canonical from and to codes, human-readable from_label and to_label strings, from_family and to_family tags, the converted result, intermediate ec_us_cm and tds_ppm quantities when applicable, the factor used for cross-family conversion or null within one family, a dimensionless conversion_factor for same-family pairs, the fixed gpg_ppm constant 17.1, a short formula line suitable for UI display, the method tag conductivity_si, tds_conventional, or ec_tds_scale, and the fixed list of units_supported. Missing value, non-finite numbers such as NaN or Infinity, negative values, missing unit fields, non-positive factor, and any token that does not map to a supported unit fail with invalid_input and are not charged after the engine rejects the request. Identical inputs always yield identical JSON because the path is pure arithmetic with no randomness, no remote lookup, and no dependence on the wall clock, which makes the endpoint safe to pin in continuous-integration goldens and SDK contract tests. Extreme magnitude pairs remain well-defined as long as IEEE double precision can represent the intermediate product.
Browser use, API pricing, and everyday workflows
Switch to the prepaid API when a water-treatment SCADA plugin, greenhouse controller, pool chemistry app, aquarium logger, environmental LIMS, or compliance pipeline must convert conductivity and dissolved solids at scale under a stable KIT contract at $0.002 per successful item; validation failures that raise invalid_input do not consume balance after rejection. Pair this endpoint with general unit converters when a product pipeline needs length or volume families as well, or call it alone when search traffic is specifically for water conductivity and TDS conversion—microsiemens, millisiemens, parts per million, and grains per gallon—rather than a general unit switchboard.
Integration use cases
Hydroponics, agriculture, and soil salinity
Normalize mS/cm and dS/m nutrient or soil EC into ppm and ppt for feed recipes and irrigation notes with a prepaid, deterministic API.
Aquaria, pools, and lab notebooks
Switch between microsiemens, mg/L, and gpg when instruments and test kits disagree, with clear invalid_input on unknown unit names.
Technical questions
How many ppm is one grain per gallon?
Exactly 17.1 ppm under this endpoint’s US water-treatment convention. Send value: 1, from: "gpg", to: "ppm" to see it in the result field.