Conception window calculator
Starting from a period on 1 March 2026 with a 28-day cycle, ovulation falls on 15 March and the fertile window runs from 10 to 16 March. It is a calendar estimate for planning and learning, not a diagnosis. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Last period
- 2026-03-01
- Cycle length
- 28
- Luteal phase (days)
- 14
- Ovulation date
- 2026-03-15
- Window start
- 2026-03-10
- Window end
- 2026-03-16
Planning around a likely conception window is one of the first calendar questions people ask when they start tracking a menstrual cycle. This conception window calculator takes the first day of the last menstrual period and an average cycle length in whole days, applies a fixed fourteen-day luteal-phase model with pure civil calendar arithmetic, and returns the estimated ovulation day, the multi-day fertile window that surrounds it, the projected next period, and a short formula string you can show next to the result. Use it for personal planning tools, educational demos of the calendar method, and automation that needs a transparent fertile-window baseline without shipping a full fertility library.
What the conception window model computes from last period and cycle length
The calendar method used here estimates when conception is most likely by anchoring everything to the first bleeding day of the last menstrual period and the reported average cycle length. Cycle length means whole days from the start of one period to the start of the next; when you omit it the tool defaults to twenty-eight days, the conventional textbook length.
The conception window then runs from five days before that ovulation day through one day after it, reflecting the common teaching that sperm can survive several days in the reproductive tract while the egg is viable for roughly a day after release. Every date is emitted as a strict YYYY-MM-DD string so clients never have to guess time zones.
This is a population-level calendar estimate only: it is not a diagnosis, not a guarantee of fertility or infertility on a given day, and not a substitute for clinical advice, ovulation kits, ultrasound, or basal-body-temperature tracking when those are indicated. Cycles that vary widely from month to month, postpartum cycles, and hormonal contraception all break the fixed-luteal assumption, so treat the output as an educational planning aid rather than a medical determination of fertile days.
Where a fertile-window estimate helps in apps and teaching
Fertility education sites and wellness apps often need a transparent first-pass fertile window the moment a user types a last period date, before any basal temperature series or LH test strip is available. Embedding this calculator gives a published formula, fixed luteal phase, and ISO date outputs that product copy and support teams can quote without reverse-engineering a black-box date library. Coaching portals, intake forms, and exam-prep materials can let learners change cycle length and immediately see how a shorter or longer cycle moves ovulation and the surrounding window.
Prefer clinical methods when medical decisions depend on timing, and treat this output as the conventional calendar estimate it is meant to be: simple, explainable, and deterministic.
What you can do with it
Personal planning and tracking apps
Show a first-pass fertile window from last period and average cycle length with ISO dates a UI can highlight on a calendar.
Classroom and health education
Demonstrate the calendar method with strict YYYY-MM-DD inputs and a deterministic oracle that rejects impossible days and out-of-range cycles.
Batch period archives
Recompute conception windows for coaching or research pipelines from stored last-period columns without timezone-sensitive Date libraries.
FAQ
How is the conception window calculated?
The window runs from five days before ovulation through one day after. All dates use civil calendar arithmetic.
Why is the luteal phase fixed at 14 days?
This tool implements the common textbook calendar model with a fixed 14-day luteal phase. It does not accept a custom luteal length; that keeps the contract simple and fully deterministic for goldens and SEO demos.
Is this a medical diagnosis of fertility?
No. It is an educational calendar estimate for planning and teaching. Irregular cycles, postpartum recovery, and contraception all change real fertility; use clinical tools when medical decisions depend on timing.
How does a longer or shorter cycle move my fertile days?
Ovulation is placed your cycle length minus 14 days after the first day of your period. A longer cycle therefore pushes ovulation and the whole window later, and a shorter one brings them earlier.
Why does the window start five days before ovulation?
Because sperm can survive several days in the reproductive tract while the egg stays viable for roughly a day. The window covers five days before ovulation through one day after, seven days in all.
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/conception-window \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"last_period":"2026-03-01"}'const res = await fetch("https://api.kit.forhosting.com/health/conception-window", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"last_period": "2026-03-01"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/conception-window",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"last_period": "2026-03-01"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/conception-window", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"last_period":"2026-03-01"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"last_period":"2026-03-01"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/conception-window", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"last_period": "2026-03-01"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.conception_window",
"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
Missing or impossible dates, and cycle lengths outside the supported twenty-one to forty-five day range, fail with invalid_input instead of inventing a window.
What the conception window model computes from last period and cycle length
Ovulation is placed cycle_length minus fourteen days after the last period, because the luteal phase after ovulation is treated as a fixed fourteen-day span for this estimate.
Input contract, validation, response shape, and deterministic errors
Month must fall between one and twelve; day must be real for that month, so values such as two thousand twenty-six February thirtieth are rejected, and two thousand twenty-three February twenty-ninth is rejected because that year is not a Gregorian leap year. Cycle lengths outside twenty-one to forty-five, non-integers, and non-finite numbers also fail with a clear message and are not billed. POST a JSON object whose required field last_period is a string matching four digits, hyphen, two-digit month, hyphen, two-digit day. Aliases lmp, period_start, and last_menstrual_period map to the same parse path so forms and integrations can keep their preferred names. Optional cycle_length is a whole integer from twenty-one through forty-five; aliases cycle_days and cycle are accepted, and omitting the field uses twenty-eight. Missing last_period, null, empty string, non-string objects, and strings that fail the pattern all throw invalid_input naming the field and the expected shape. On success the body always includes last_period, cycle_length, luteal_days (always fourteen), ovulation_date, window_start, window_end, next_period, window_days (inclusive count of calendar days in the window), method set to calendar_luteal_14, and a formula string restating the offsets. Example: last_period two thousand twenty-six March first with cycle_length twenty-eight yields ovulation on day fourteen of the cycle, a seven-day window from five days before ovulation through one day after, and next_period twenty-eight days after the last period.
Technical questions
Which input fields are required?
Only last_period (YYYY-MM-DD). Aliases lmp, period_start, and last_menstrual_period are accepted. cycle_length is optional and defaults to 28 (range 21–45). Invalid input returns invalid_input and is not billed.
What does the conception window calculator cost?
The browser widget is free. API calls use prepaid KIT balance at $0.002 per successful task; invalid input is not charged.