Date of birth calculator
Someone who is 30 on 20 March 2026 was born on 20 March 1996 at the latest and no earlier than 21 March 1995. Enter a whole-year age and the as-of date to get the estimated birth date and its one-year window. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 30
- Reference date
- 2026-03-20
- Date of birth
- 1996-03-20
- Birth year
- 1,996
- Birth month
- 3
- Birth day
- 20
This date of birth calculator estimates a person's birth date from their completed age on a given reference date. You enter a whole-number age in years and an as-of calendar day written as an ISO date. The engine subtracts that many civil years from the reference day on the proleptic Gregorian calendar and clamps the day of month when the destination month is shorter, so the twenty-ninth of February minus one year in a common year lands on the twenty-eighth, not on an invented twenty-ninth. A whole-year age is a one-year window, so the response also names the earliest and latest birth dates consistent with that age. A negative age or a fractional age is rejected as invalid input because this page answers only completed years.
What an estimated date of birth from age means
An estimated date of birth from age is the civil calendar day you get by walking a completed whole-year age backward from a stated as-of date. People search this landing when they have an age on a form, a census row, a school roster, or a medical note, and they need a reproducible birth date rather than a guess typed by hand.
The contract is deliberately the inverse of a chronological-age page: those tools take a known birth date and a reference date and return years, months, and leftover days; this tool takes the years and the reference date and returns the birth date those years imply. Because only completed years are known, the true birth day can sit anywhere in a one-year window. The earliest consistent day is the day after the previous anniversary: subtract one more year and add one civil day.
February twenty-nine is the only day that can vanish. Subtracting years from a leap-day reference into a common year clamps to the twenty-eighth of February instead of inventing a twenty-ninth that the calendar does not have. Pair this page with a years-months-days age tool when you already have both dates; keep this page when the search is “what is the date of birth if they are this old today.”
What you can do with it
Back-solve a birth date from a form age
Turn a whole-year age collected on a roster or application into a reproducible ISO birth date for the as-of day you already have.
Census and genealogy age windows
Recover the conventional birth day and the earliest–latest window from an age recorded on a census night or passenger list.
FAQ
How is the date of birth estimated from age?
Provide a non-negative whole-year age and an ISO reference date.
Why is there an earliest and a latest birth date?
A whole-year age is a one-year window. Someone who is 30 on 20 March 2026 was born on or after 21 March 1995 and on or before 20 March 1996. The estimate is the latest of those days, as if their birthday is the reference day.
What happens if the age is negative or not a whole number?
Date of birth from age is defined only for a non-negative integer age in years.
How is 29 February handled?
Subtracting civil years from a leap-day reference into a common year clamps to 28 February. Subtracting into another leap year keeps 29 February.
What does the date of birth calculator cost?
It is free in your browser on this page.
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/life/date-of-birth \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":30,"reference_date":"2026-03-20"}'const res = await fetch("https://api.kit.forhosting.com/life/date-of-birth", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 30,
"reference_date": "2026-03-20"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/date-of-birth",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 30,
"reference_date": "2026-03-20"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/date-of-birth", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":30,"reference_date":"2026-03-20"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":30,"reference_date":"2026-03-20"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/date-of-birth", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"age": 30,
"reference_date": "2026-03-20"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.date_of_birth",
"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
year_min | 1 |
year_max | 9999 |
age_min | 0 |
age_max | 9998 |
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
Successful API requests cost $0.002; failed validation is not charged.
What an estimated date of birth from age means
The conventional estimate, returned as date_of_birth and echoed as latest_date_of_birth, is the day the person would have been born if their birthday is the reference day itself — reference date minus age civil years.
How age and the reference date are read
Zero is valid and means the estimated birth date is the reference date itself. The twenty-ninth of February is accepted only in a leap year; the thirty-first of April and a two-digit year are rejected. Failed validation is never billed. POST a JSON body with two required fields. The completed age lives in age and may also arrive as years, age_years, or y. It must be a non-negative whole number from zero through nine thousand nine hundred ninety-eight. JSON integers and digit-only strings are accepted; a leading plus or minus is parsed, but a minus that yields a negative age fails. Fractions such as thirty point five, scientific notation with a remainder, empty strings, Infinity, and NaN fail with invalid_input that names the field. The as-of day lives in reference_date and may also arrive as as_of, on, date, or reference. It must be a string that matches four digits, a hyphen, two digits, a hyphen, and two digits, and it must name a real Gregorian day in the inclusive year range from one through nine thousand nine hundred ninety-nine. On success the body echoes the normalized age and reference date, the estimated date_of_birth, the split birth_year, birth_month, and birth_day, the latest_date_of_birth (identical to the estimate), the earliest_date_of_birth when that bound still falls inside years one through nine thousand nine hundred ninety-nine, and a formula string that documents the civil-year subtract and the plus-one-day earliest bound. If subtracting the age would push the estimated year before year one, the request fails rather than emitting a year zero. Each successful item costs $0.002.
Where a date-of-birth-from-age estimate is used
Genealogy and census projects back-solve a birth year and a conventional birth day from an age recorded on a census night or a passenger list, then keep the earliest and latest bounds so a later researcher can see the whole window. Product teams that already ship a chronological-age calculator still need this landing: searchers type date of birth calculator and date of birth from age, not age in years months and days, and they arrive with an age plus an as-of date rather than two complete dates. Classroom units on calendars use the leap-day clamp as a worked example: twenty-nine February two thousand twenty-four minus one year is twenty-eight February two thousand twenty-three, not an illegal twenty-ninth. Because the implementation is a pure parse engine, the work runs entirely in your browser on this page, and through the API each successful lookup costs $0.002 while a negative or fractional age does not consume balance. Nothing is stored after the response returns. This page is not a weekday-of-birthday tool, not a generation-cohort labeler, and not an exact civil-age breakdown from two known dates.
Integration use cases
Deterministic fixtures without a clock
Seed tests and demos with a birth date derived from age so goldens never depend on the host Date object.