
Korea uses three different age systems, and they disagree: 만 나이 (international/legal age, the standard since June 2023), 세는 나이 (traditional “counting” age), and 연 나이 (year age). A birthday near New Year or computed in the wrong timezone gives the wrong number. This API supplies the one fact your arithmetic actually depends on — today's date in Korea (KST) — so all three ages come out right.
There is no single “age” endpoint on purpose — the three Korean age formulas are simple arithmetic, but they hinge on which day it is in Korea, and a server in another timezone can be a day off near midnight. So the pattern is: fetch /v1/today for the current KST date, then compute each age locally from the birth date. 만 나이 (international) = years since birth, minus one if this year's birthday hasn't happened yet. 세는 나이 (traditional) = current year − birth year + 1 (you are 1 at birth and gain a year every January 1). 연 나이 (year age) = current year − birth year. Keeping the formulas in your code lets you pick which system to display while the API guarantees the KST reference date.
| GET | /v1/today |
Today's Korean date (KST) — the reference date you compute every age against, correct in Korea time regardless of where your server runs. |
| GET | /v1/lunar/lunar-to-solar?date=2026-01-01&leap=false |
Optional: if the birthday is celebrated on the lunar calendar, resolve this year's solar birthday first (see the Korean Lunar Birthday API), then compute 만 나이 against it. |
# Get today in Korea (KST), then compute the three ages in your own code.
curl "https://korea-calendar-api.kunstudio.workers.dev/v1/today"
{
"date_kst": "2026-06-15",
"is_holiday": false,
"holiday": null
}
// Then in your app (JS), for a birth date of 1998-08-20:
// const today = "2026-06-15"; // from /v1/today (date_kst)
// const [ty, tm, td] = today.split("-").map(Number);
// const [by, bm, bd] = "1998-08-20".split("-").map(Number);
//
// // 만 나이 (international / legal — the standard since June 2023)
// let manAge = ty - by;
// if (tm < bm || (tm === bm && td < bd)) manAge -= 1; // birthday not reached yet
//
// const semeAge = ty - by + 1; // 세는 나이 (traditional counting age)
// const yeonAge = ty - by; // 연 나이 (year age)
//
// manAge -> 27 // hasn't turned 28 yet in 2026
// semeAge -> 29
// yeonAge -> 28
No API key is needed on the origin to try this — it is rate-limited for fair evaluation. See the OpenAPI spec for the full schema.
date_kst from /v1/today as the reference date so the age is correct in Korea time — a server in the US or EU can otherwise be a calendar day off, which flips the answer for birthdays right around midnight.Building a Korean fortune (사주/saju) app? Pair this with the KunStudio Saju API for a full four-pillars reading over REST.