Vitamin D calculator
Raising vitamin D from 20 to 40 ng/mL in a 70 kg adult takes about 2000 IU a day under the Holick rule of thumb. Enter your current level, your target and your weight to get the extra daily dose. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Current level
- 20
- Target level
- 40
- Weight
- 70
- Current ng ml
- 20 IU
- Target ng ml
- 40
- Weight (kg)
- 70
- Delta ng ml
- 20
Serum 25-hydroxyvitamin D is the lab marker people mean when they say vitamin D level, and a daily IU figure is what they need once they have a current result and a target. This vitamin D calculator accepts current 25(OH)D in nanograms per millilitre, a target in the same unit, and body weight in kilograms, then applies the Holick weight-adjusted rule of thumb used in educational dosing worksheets: one hundred international units per day raise 25(OH)D by about one ng/mL in a seventy-kilogram adult, scaled linearly with mass. Zero or missing weight also fails, because a body mass of zero is not a living adult. Treat every result as educational arithmetic from a published rule of thumb, never as a prescription, never as a substitute for a clinician, and never as advice about sunlight, diet, or prescription-strength loading packs.
Why daily vitamin D IU follows a 100 IU per ng/mL, 70 kg rule
Vitamin D is fat-soluble, stored in adipose tissue, and reported from blood as 25-hydroxyvitamin D rather than as the active hormone calcitriol. Clinicians and educators therefore talk about closing a gap in ng/mL, not about a single bottle size that fits every adult. Michael Holick and related Endocrine Society educational materials popularized a transparent rule of thumb: in a seventy-kilogram adult, roughly one hundred international units of vitamin D3 per day raise serum 25(OH)D by about one nanogram per millilitre.
That identity is linear in the gap and in body weight, which is why a ninety-kilogram adult is assigned a proportionally larger daily IU figure than a fifty-five-kilogram adult for the same ng/mL deficit. This calculator implements exactly that identity and nothing else: it does not add a loading week, does not convert nmol/L internally, does not apply a seasonal sunlight credit, and does not cap the result at a regulatory upper limit.
Those extra policies belong to a clinician who knows pregnancy, malabsorption, granulomatous disease, and the assay that produced the number. Negative current or target values cannot be a serum concentration in this model, and a negative kilogram mass cannot be a living body, so those requests fail instead of taking an absolute value that would hide a data-entry error.
Treat the IU as an educational daily extra from the Holick one-hundred IU per ng/mL at seventy kilograms definition, never as a prescription and never as clearance to start a high-dose regimen without a qualified professional.
Where a vitamin D dose calculator shows up in real work
Primary-care education, sports nutrition coursework, and employee-wellness sandboxes use a vitamin D calculator so learners can check a daily IU figure against a paper protocol without mixing sunlight minutes, fatty-fish servings, and prescription loading packs on the same page. Simulation labs and electronic-worksheet authors need a deterministic oracle that returns the same IU for the same ng/mL pair and kilogram mass every time a case is reset, rather than a spreadsheet cell that drifted when someone edited the one-hundred IU constant.
Product teams building educational supplement widgets want a documented step that clients can audit on paper: extra daily IU equals the 25(OH)D gap times one hundred times weight over seventy. Research assistants preparing synthetic clinic datasets need stable labels from known inputs without network calls or model drift. If you later need a one-time loading total, a nmol/L converter, or a calcium-intake screen, treat those as separate search intents and landings rather than overloading this vitamin D page.
Always present results as educational estimates from the Holick weight-adjusted rule of thumb; clinical supplementation requires a qualified professional, a recent assay, and eligibility context this tool does not collect. Keep requests small, pin the rounded IU in tests, and you get reproducible doses for homework, LMS plugins, and edge workers without standing up a pharmacy system of your own.
What you can do with it
Classroom 25(OH)D worksheet keys
Generate the extra daily IU from a stated current ng/mL, target ng/mL, and kilogram mass so instructors and auto-graders share one transparent Holick ground truth.
Wellness-program educational widgets
Show a documented daily vitamin D IU from a lab gap and body weight without mixing sunlight minutes, fatty-fish servings, or prescription loading packs on the same landing.
Synthetic clinic dataset labels
Stamp stable daily-IU labels onto known 25(OH)D pairs and weights for teaching files and pipeline tests, without network calls or model drift.
FAQ
What formula does this vitamin D calculator use?
One hundred IU per day raises 25(OH)D by about one ng/mL in a 70 kg adult.
Are the blood levels in ng/mL or nmol/L?
Nanograms per millilitre (ng/mL). Convert nmol/L to ng/mL by dividing by 2.5 before calling. The calculator does not switch units internally.
What happens if my current 25(OH)D is already at or above the target?
The extra daily dose is zero. The calculator never returns a negative IU figure; it only estimates supplementation needed to close an upward gap.
What if I enter a negative weight or a negative 25(OH)D?
Current level, target level, and weight must not be negative; weight must also be greater than zero.
How much vitamin D a day to go from 20 to 40 ng/mL?
For a 70 kg adult the rule gives 2000 IU a day: one hundred IU for each ng/mL of the gap, scaled to weight. A heavier person gets a proportionally larger figure. It is educational arithmetic, not a prescription.
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/vitamin-d \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"current_level":20,"target_level":40,"weight":70}'const res = await fetch("https://api.kit.forhosting.com/health/vitamin-d", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"current_level": 20,
"target_level": 40,
"weight": 70
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vitamin-d",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"current_level": 20,
"target_level": 40,
"weight": 70
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vitamin-d", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"current_level":20,"target_level":40,"weight":70}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"current_level":20,"target_level":40,"weight":70}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vitamin-d", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"current_level": 20,
"target_level": 40,
"weight": 70
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vitamin_d",
"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 JSON returns that extra daily IU of cholecalciferol. Any negative current, target, or weight fails with invalid_input and is not billed.
Why daily vitamin D IU follows a 100 IU per ng/mL, 70 kg rule
The implementation is pure floating-point arithmetic: no network lookup of a supplement table, no language model, and no clock, so identical inputs always yield identical JSON.
What you send and how the daily IU is returned
Numeric strings are coerced. If the current result already meets or exceeds the target, the extra daily dose is zero rather than a negative IU figure. A seventy-kilogram adult moving from twenty to forty ng/mL yields two thousand IU per day. An eighty-four-kilogram adult moving from fifteen to fifty ng/mL yields four thousand two hundred IU per day. Convert pounds to kilograms by dividing by 2.20462 before calling; convert nmol/L to ng/mL by dividing by 2.5. Provide three finite numbers. current_level is the latest 25(OH)D in ng/mL and may be zero when the assay reports an undetectable result; aliases current, current_ng_ml, serum_25ohd, baseline, and current_25ohd are accepted. target_level is the desired 25(OH)D in the same unit; aliases target, target_ng_ml, desired, desired_25ohd, and goal are accepted. weight is body mass in kilograms strictly greater than zero; aliases weight_kg, body_weight, mass, and kg are accepted. Empty strings, missing fields, NaN, and Infinity fail with invalid_input naming the field and are not charged. A negative current_level, target_level, or weight fails; weight must also be greater than zero. On success the service computes delta_ng_ml as target minus current and dose_iu as the nearest integer of max(0, delta times one hundred times weight divided by seventy). The JSON echoes current_ng_ml, target_ng_ml, and weight_kg, returns delta_ng_ml, dose_iu, unit equal to IU, and a formula string restating the Holick identity. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance. Because the arithmetic is tiny and fully local to the Worker, latency is dominated by the task handshake rather than by computation.
Where a vitamin D dose calculator shows up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume prepaid balance.
Technical questions
Is the vitamin D dose calculator free?
The browser tool is free. API calls cost $0.002 per successful request from your prepaid KIT balance; failed validation is never charged.