Transferrin saturation calculator
Serum iron of 100 with a TIBC of 300 means 33.33% of transferrin's iron-binding sites are occupied. Enter both values from the same iron panel, in the same unit, to get the saturation. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Serum iron
- 100
- Tibc
- 300
- Saturation percent
- 33.3333333333
- Saturation rounded
- 33.33
- Unit saturation
- percent
Transferrin saturation, often abbreviated TSAT, is the percentage of iron-binding sites on circulating transferrin that currently carry iron. Clinical laboratories report it from two conventional measurements that already appear on a standard iron panel: serum iron and total iron-binding capacity (TIBC). This calculator divides serum iron by TIBC and multiplies by one hundred, returning a stable percentage you can pin in tests, worksheets, and educational apps. Both inputs must be finite numbers in the same concentration unit—typically micrograms per decilitre or micromoles per litre—because the ratio is dimensionless once the units match.
What transferrin saturation measures and which inputs you need
Transferrin is the plasma protein that carries ferric iron between the gut, storage sites, and the bone marrow. Total iron-binding capacity estimates how many transferrin binding sites are available in a serum sample; serum iron estimates how many of those sites already hold iron. Transferrin saturation is the occupancy percentage: serum iron divided by TIBC, then multiplied by one hundred.
When both measurements use the same concentration unit the units cancel, so a panel reported in micrograms per decilitre and a panel reported in micromoles per litre both yield the same percentage as long as you do not mix the two systems in one request. Teaching ranges often place many healthy adults near twenty to fifty percent, with lower values raising questions about iron deficiency and higher values about iron overload or a recent iron infusion—always as educational framing, never as a diagnosis.
Practical bounds keep classroom and consumer inputs sane: both fields from zero through two thousand in whatever matched unit you use. Negative serum iron or TIBC likewise fails. Serum iron of zero is valid and yields a saturation of zero percent.
What you can do with it
Health education apps and worksheets
Apps show learners how transferrin occupancy is computed without re-coding the iron-over-TIBC percentage on every client.
FAQ
How is transferrin saturation calculated?
Saturation (%) = (serum iron ÷ TIBC) × 100.
What happens if TIBC is zero or a value is negative?
Zero binding capacity would divide by zero; negative serum iron or TIBC is not valid. Those failures are not billed.
Do serum iron and TIBC need the same unit?
Yes. The ratio is dimensionless only when both concentrations use the same unit, typically µg/dL or µmol/L. Do not mix the two systems in one request.
Is the transferrin saturation calculator free?
The browser tool runs free on your device.
Can saturation be greater than 100 percent?
Yes. If serum iron exceeds TIBC the arithmetic result is reported without clamping. That can appear after intravenous iron or with assay artefacts; interpret it with your own clinical context.
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/health/transferrin \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"serum_iron":100,"tibc":300}'const res = await fetch("https://api.kit.forhosting.com/health/transferrin", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"serum_iron": 100,
"tibc": 300
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/transferrin",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"serum_iron": 100,
"tibc": 300
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/transferrin", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"serum_iron":100,"tibc":300}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"serum_iron":100,"tibc":300}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/transferrin", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"serum_iron": 100,
"tibc": 300
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.transferrin",
"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
A TIBC of zero cannot be used as a divisor, and negative iron or binding-capacity values are not physically meaningful, so those cases fail with invalid_input and are not billed.
What transferrin saturation measures and which inputs you need
This endpoint does not apply sex-specific reference intervals, does not convert between micrograms per decilitre and micromoles per litre, and does not estimate ferritin, soluble transferrin receptor, or hepcidin. It only returns the arithmetic saturation. Send required finite fields serum_iron and tibc; aliases such as iron, fe, serum_fe, total_iron_binding_capacity, tibc_ugdl, and iron_binding_capacity are accepted when documented. TIBC must be strictly greater than zero because the saturation is a division; a binding capacity of zero fails with invalid_input. Identical inputs always yield identical JSON because the path is pure arithmetic with no network, no model, no random seed, and no wall clock.
Reading saturation, response fields, and error behaviour
Saturation may exceed one hundred percent when serum iron is greater than TIBC, which can occur after intravenous iron or with certain assay artefacts; the calculator reports the arithmetic result rather than clamping, so clients that want a capped display can apply their own policy. Booleans, objects, NaN, and Infinity are rejected with a message that names the field so the form can highlight the control that failed. On success the response echoes serum_iron and tibc with stable rounding, reports saturation_percent as the full-precision percentage used for comparison, plus saturation_rounded to two decimal places for user-interface display. unit_saturation is always percent. formula restates the teaching equation as a single string, and method is always transferrin_saturation_iron_over_tibc so downstream code can branch without sniffing shapes. Use saturation_percent when you need stable numeric comparison in tests; use saturation_rounded when you show the number next to a lab card or chart. Missing required fields, empty strings, non-finite values, out-of-range readings, any negative serum iron or TIBC, and a TIBC equal to zero all fail with invalid_input and are not charged. Do not confuse this endpoint with ferritin interpreters, anemia classifiers, full iron-studies decision engines, or unit converters that map micrograms per decilitre to micromoles per litre—those are different search intents and different contracts. This product only divides two matched concentrations and multiplies by one hundred. POST a JSON body with the two required numbers; each field may arrive as a JSON number or as a numeric string.
API usage, pricing, product workflows, and practical limits
Call the free in-browser transferrin saturation calculator for classroom demos, nursing homework checks, and quick personal learning without reimplementing the division in every spreadsheet. Prefer consistent conventional units; if your user interface only collects whole numbers, send integers and the engine still accepts numeric strings. Keep expectations educational: this is a calculation and learning tool, not a diagnostic medical device, and people with symptoms, known anemia, suspected hemochromatosis, pregnancy, or a recent iron infusion should follow professional medical advice rather than any single automated percentage alone. Send a JSON body with required serum_iron and tibc values in the same concentration unit. Use the prepaid API when a health-education app, electronic worksheet, simulation lab, tutoring platform, or school LMS 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 your own laboratory units and clinical workflow—confirm that serum iron and TIBC were reported in the same unit, convert one of the two if a mixed SI and conventional panel was transcribed, then store saturation_percent and saturation_rounded alongside the raw inputs for dashboards and export columns. Authors shipping SDKs can show the formula string on a teaching card and map saturation_rounded into colour chips for educational thresholds you define yourself.
Integration use cases
Nursing and medical-school homework
Students submit serum iron and TIBC from an iron panel and pin expected saturation JSON in automated checkers with deterministic outputs.
Simulation labs and SaaS backends
Server pipelines that already store iron-study fields call a prepaid endpoint for transferrin saturation instead of duplicating the formula in every language.