Vaccine immunity calculator
A vaccine with 95% published efficacy, given as two doses, still provides about two-thirds protection six months later, because the model halves protection every 12 months. Enter efficacy, doses and months since the last dose. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Efficacy
- 95
- Doses
- 2
- Months
- 6
- Remaining percent
- 67.1751442127
- Peak percent
- 95
- Dose factor
- 1
- Waning factor
- 0.7071067812
Vaccine-induced protection is not a constant. Published vaccine efficacy describes peak protection around the time a primary series is completed; each additional month after the last dose lets that protection wane along a smooth exponential curve, and an incomplete series never reaches the published peak. This vaccine immunity calculator estimates remaining protection as a percentage from three numbers: efficacy between zero and one hundred, the count of doses received, and months elapsed since the last dose. It applies a fixed educational waning rate with a twelve-month half-life and a two-dose saturating series factor, then returns the remaining percentage together with the peak, the dose factor, and the waning factor so every step can be audited. No network lookup, no randomness, and no dependence on the current date—only arithmetic on the numbers you provide. Treat every result as an educational estimate of remaining vaccine-induced protection, never as a clinical titre, a booster recommendation, or a substitute for a clinician.
How remaining vaccine-induced protection is estimated
Published vaccine efficacy is a peak figure, not a lifetime constant. After a completed primary series the immune response is strongest near the last dose; neutralizing activity and clinical protection then decline along a curve that, for educational work, is well approximated by first-order exponential waning.
An incomplete series is scaled linearly toward that peak with a two-dose saturating factor: zero doses contribute nothing, one dose reaches half of published efficacy, two or more doses reach the full published efficacy, and further doses do not raise the peak above that published number because extra doses in this model only reset the clock that the caller already supplies as months since the last dose. Algebraically remaining percent equals efficacy times the minimum of one and doses over two, times the exponential waning factor.
That single expression covers fractional months as well as whole ones: six months after a completed series you still have about seventy-one percent of the peak, not half. Efficacy must sit in the closed interval from zero to one hundred because a percentage outside that range is not a vaccine efficacy. The implementation does not look up a pathogen, a brand, or a serotype; it only evaluates the formula with the numbers you send so dashboards, homework keys, and batch notebooks share one transparent definition of remaining vaccine-induced protection.
Treat every result as an educational percentage from this definition, never as a measured antibody titre or a medical recommendation.
What you can do with it
Classroom epidemiology half-life curves
Fix efficacy and a completed two-dose series, sweep months, and plot remaining vaccine-induced protection so learners see a twelve-month half-life instead of a flat efficacy number.
Journalism and public-explainers of waning
Show readers how a published ninety-five percent efficacy falls six or twelve months after the last dose using one auditable exponential formula.
FAQ
What formula does the vaccine immunity calculator use?
Peak protection is published efficacy scaled by a two-dose saturating series; waning uses a fixed twelve-month half-life.
How do extra doses after a two-dose series affect the estimate?
Doses at or above two saturate the peak at published efficacy.
How much protection does a single dose give?
In this model one dose reaches half of the published efficacy at its peak, and two or more doses reach the full figure. With no doses at all, the estimate is zero.
How fast does protection wane?
It halves every 12 months after the last dose, along a smooth exponential curve. Six months after a completed series about seventy-one percent of the peak remains, not half.
Does it account for age, vaccine brand or a weakened immune system?
No. There is no pathogen, brand, serotype, age or immune-status adjustment, and no calendar date. Only efficacy, doses and months enter the formula.
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/vaccine-immunity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"efficacy":95,"doses":2,"months":6}'const res = await fetch("https://api.kit.forhosting.com/health/vaccine-immunity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"efficacy": 95,
"doses": 2,
"months": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vaccine-immunity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"efficacy": 95,
"doses": 2,
"months": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vaccine-immunity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"efficacy":95,"doses":2,"months":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"efficacy":95,"doses":2,"months":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vaccine-immunity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"efficacy": 95,
"doses": 2,
"months": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vaccine_immunity",
"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_doses | 20 |
max_months | 600 |
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 free browser tool and the API share the same pure JavaScript library, so interactive checks and automated tasks always agree.
How remaining vaccine-induced protection is estimated
This calculator uses a fixed half-life of twelve months: remaining protection halves every year after the last dose, which is equivalent to multiplying the peak by the exponential of minus the natural logarithm of two times months divided by twelve.
Input contract, outputs, and error behaviour
Failed validation is not billed. There is no pathogen table, no age adjustment, no immunocompromise flag, and no calendar date in this capability—those are separate product intents. Send a JSON object with three required finite numbers: efficacy, the published vaccine efficacy in percent on the closed interval from zero to one hundred; doses, a non-negative integer count of doses received, at most twenty; and months, the non-negative elapsed time in months since the last dose, at most six hundred, with fractional months allowed. Aliases such as vaccine_efficacy, ve, efficacy_pct, n_doses, doses_received, dose_count, shots, months_since_last_dose, months_since, elapsed_months, and time_months are accepted so forms and scripts do not need a single field name. Missing required fields, empty strings, non-finite values, non-integer doses, negative doses or months, doses above twenty, months above six hundred, and efficacy outside zero to one hundred all fail with invalid_input and a message that names the problem. On success the response returns remaining_percent as the primary estimate, echoes efficacy, doses, and months, and includes peak_percent, dose_factor, waning_factor, half_life_months equal to twelve, waning_rate_per_month equal to the natural log of two divided by twelve, primary_series_doses equal to two, and a formula string restating remaining_percent equals efficacy times min of one and doses over two times exp of minus ln two times months over twelve. Pair remaining_percent with your own schedule if you need to compare the educational estimate against a booster policy you chose yourself. Successful API calls cost the published $0.002 per item; validation failures never consume prepaid balance.
Where teams use it and how pricing works
Public-health explainers, immunization dashboards, and journalism notebooks use a vaccine immunity calculator to show how remaining protection falls after the last dose without reinventing exponential-waning code in every client. Classroom epidemiology modules can fix efficacy and doses and sweep months to illustrate a twelve-month half-life without a spreadsheet cell that drifted when someone edited the rate. The interactive tool above runs free in the browser for exploratory checks. Source inputs and outputs are retained only for the documented retention window and are never used to train models. Research pipelines that log self-reported dose counts and last-dose ages can post many independent tasks—one per person and interval—and store remaining_percent next to the session for later analysis. Programmatic calls use the prepaid KIT balance per successful item; invalid input never consumes balance. Latency is dominated by the task handshake rather than by computation, which makes the endpoint suitable for form validation and batch reprocessing of historical immunization tables alike. Always present remaining_percent as an educational estimate from the fixed-waning definition; clinical decisions require qualified professionals, local schedules, and eligibility context this tool does not collect.
Integration use cases
Immunization dashboard remaining-protection labels
Convert logged efficacy, dose counts, and months since the last dose into a deterministic remaining_percent for each record without embedding waning math in every client.
Technical questions
Why does efficacy outside 0-100 fail?
Vaccine efficacy is a percentage. Values below 0 or above 100 are not a valid efficacy, so the task fails with invalid_input and is not billed.
Does remaining_percent equal a lab titre or a booster recommendation?
No. The result is an educational percentage from a fixed-waning formula. It is not a neutralizing-antibody titre, a diagnosis, or advice to take a booster.
Is the vaccine immunity 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.