Dog heat cycle calculator
If your dog's last heat began on 15 January 2026 and her cycle is six months, the next one is expected around 15 July 2026, with a watch window from 8 to 22 July. Plan breeding, boarding or shelter calendars ahead. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Last heat
- 2026-01-15
- Cycle length
- 6
- Predicted start
- 2026-07-15
- Window start
- 2026-07-08
- Window end
- 2026-07-22
- Window days
- 15
Intact female dogs typically return to heat on a roughly six-month rhythm, but the true interval is individual and can run from about four months in some small breeds to a year in some large ones. Breeders, shelters, and clinic staff therefore plan from the last observed heat start plus that bitch's own cycle length rather than from a single textbook date. This dog heat cycle calculator takes the first day of the last heat as a strict YYYY-MM-DD string and a positive cycle length in months, adds that interval with pure civil-calendar arithmetic, and returns the predicted next start together with a fifteen-day watch window seven days either side of that day. Use it for breeding-book checks, shelter intake calendars, and automation that needs a transparent next-heat baseline.
What a dog heat cycle is and how the next start window is computed
Unlike the human menstrual calendar, the interval that owners actually track is heat start to next heat start, commonly quoted as six months and ranging roughly four to twelve months by breed, size, and individual.
Whole months are added on the Gregorian civil calendar so that the fifteenth of January plus six months is the fifteenth of July; when the source day does not exist in the landing month, the day is clamped to that month's last valid day, so the thirty-first of January plus one month becomes the twenty-eighth or twenty-ninth of February.
A fractional remainder, if you record a cycle such as six and a half months, is converted with the mean Gregorian month of thirty point four three six eight seven five days and rounded to a whole day. The arithmetic never consults a wall clock, never reads the host timezone, and never calls a Date constructor, so a last-heat day near a daylight-saving boundary cannot shift the window.
This is a planning estimate, not a diagnosis: first heats are irregular, silent heats occur, and a veterinarian may refine timing with cytology or progesterone when breeding decisions depend on the exact fertile days.
What you can do with it
Breeding-book next-season planning
Turn each recorded heat start and that bitch's average interval in months into a predicted next start and a fifteen-day watch window for mating or boarding plans.
Shelter and rescue intake calendars
Project when an intact female may return to heat so housing, foster notes, and public-adoption listings can flag the coming season in advance.
Clinic reminders and education widgets
Let owners and students change cycle length in months and immediately see how a four-month versus twelve-month rhythm moves the next heat start range.
FAQ
Why months instead of a fixed 180 days?
Owners and kennel books record the interval as months (commonly 6, sometimes 4–12 by breed). Civil-month addition keeps the same calendar day when that day exists, which matches how people count “six months from 15 January.” A fixed 180-day offset would drift off that day.
Does the calculator handle leap years and month-end dates?
Yes. Month lengths and Gregorian leap days are applied in pure civil-calendar arithmetic. 2024-01-31 plus one month becomes 2024-02-29; 2026-01-31 plus one month becomes 2026-02-28. Year boundaries roll the same way.
How often does a female dog come into heat?
Typically about every six months, but the interval is individual and runs from about four months in some small breeds to a year in some large ones. Using your dog's own cycle length gives a better prediction.
Why does the result show a 15-day window instead of one date?
Heat timing varies from one cycle to the next, so the calculator gives the predicted start plus seven days on either side. Watch for signs throughout that window rather than on a single day.
Can this calculator tell me my dog's exact fertile days?
No. It is a planning estimate, not a diagnosis. First heats are irregular and silent heats occur; when breeding depends on exact timing, a veterinarian can refine it with cytology or progesterone testing.
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/bio/dog-heat-cycle \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"last_heat":"2026-01-15","cycle_length":6}'const res = await fetch("https://api.kit.forhosting.com/bio/dog-heat-cycle", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"last_heat": "2026-01-15",
"cycle_length": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/dog-heat-cycle",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"last_heat": "2026-01-15",
"cycle_length": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/dog-heat-cycle", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"last_heat":"2026-01-15","cycle_length":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"last_heat":"2026-01-15","cycle_length":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/dog-heat-cycle", 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_heat": "2026-01-15",
"cycle_length": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.dog_heat_cycle",
"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 missing date or a cycle length that is not positive fails with invalid_input instead of inventing a season.
What a dog heat cycle is and how the next start window is computed
Canine heat is the visible proestrus-plus-estrus phase of the estrous cycle: vulvar swelling, serosanguineous discharge, and, later, standing receptivity. This calculator treats that interval as cycle_length months measured from the first observed day of the last heat, not from ovulation and not from the last day of standing heat. Around the resulting predicted_start the tool opens a fixed seven-day watch on each side, because veterinary teaching tells owners to start looking a week before the expected date and to keep watching a week after.
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. POST a JSON object whose required field last_heat is a string matching four digits, hyphen, two-digit month, hyphen, two-digit day, naming the first observed day of the last heat. Aliases date, last_heat_date, and heat_date map to the same parse path so kennel forms can keep their preferred names. Required cycle_length is a finite number of months that must be strictly positive and at most thirty-six; aliases cycle_months, months, and cycle are accepted. Missing last_heat, null, empty string, non-string objects, and strings that fail the ISO pattern all throw invalid_input naming the field and the expected shape. A cycle length of zero, a negative length, a non-finite value, or a length above thirty-six months fails with a message that names cycle_length and is not billed. On success the body always includes last_heat, cycle_length, predicted_start, window_start, window_end, window_days (always fifteen), cycle_days (whole civil days from last heat to the predicted start), and a formula string restating the rule. Example: last_heat two thousand twenty-six January fifteenth with cycle_length six yields predicted_start two thousand twenty-six July fifteenth and a window from July eighth through July twenty-second.
Where a dog heat cycle calculator earns its keep in kennel work and education
Breeding programmes and intact-pet households often need a first-pass next-heat window the moment a technician records the start of a season, months before vaginal cytology or progesterone will time a mating. Embedding this calculator gives a transparent civil-month offset plus a published plus-or-minus seven-day watch range that kennel copy and support teams can quote without reverse-engineering a date library. Prefer progesterone timing and veterinary advice when a planned mating or elective spay depends on the exact fertile days, and treat the fifteen-day window as the conventional watch range it is meant to be: simple, explainable, and deterministic.
Technical questions
How is the next dog heat start window computed?
The calculator adds cycle_length civil months to last_heat (clamping the day when the landing month is shorter), converts any fractional month with the mean Gregorian month of 30.436875 days, and opens a watch window of 7 days before through 7 days after that predicted_start. window_days is always 15.
Which input fields are required?
last_heat (YYYY-MM-DD) and cycle_length (positive months, at most 36). Aliases date, last_heat_date, and heat_date are accepted for the date; cycle_months, months, and cycle are accepted for the interval. Missing, empty, impossible calendar days, or a non-positive cycle length return invalid_input and are not billed.
What does the dog heat cycle calculator cost?
The browser widget is free. API calls use prepaid KIT balance at $0.002 per successful task; invalid input is not charged.