Determine Chinese zodiac from year
Enter a birth year to determine its Chinese zodiac animal and element through the traditional 60-year cycle.
Run — free
The result goes beyond the familiar twelve animals by identifying the associated Wood, Fire, Earth, Metal, or Water element, its Yin or Yang polarity, and the corresponding Heavenly Stem and Earthly Branch. The calculation uses fixed modular arithmetic, so it is immediate, repeatable, and useful for lookups, educational material, forms, and applications that need structured zodiac data without relying on a calendar service.
Understand what the year result represents
The Chinese zodiac is often introduced as a repeating sequence of twelve animals, but a complete year designation also includes one of five elements and a Yin or Yang polarity. Those parts are produced by combining the twelve Earthly Branches with the ten Heavenly Stems. Because the two sequences repeat at different lengths, the same complete pairing returns only after sixty years. This calculator reports the animal, element, polarity, named stem, named branch, and the year position within that sixty-year sequence. For example, two people born twelve years apart normally share an animal, yet they may have different elements because the stem sequence has continued moving. The returned label gathers the most recognizable parts into a compact phrase, while the separate fields remain convenient for software, tables, filters, and display templates. Treat the result as a traditional year-cycle classification rather than a scientific personality assessment or a prediction about character, compatibility, health, luck, or future events.
How the 60-year calculation works
The calculation anchors the repeating system so that 1984 is the first position of a cycle: the Yang Wood Rat year, also named Jia-Zi from its Heavenly Stem and Earthly Branch. Subtracting four from the supplied year aligns the Gregorian year number with the conventional Rat and Jia starting indexes. A positive modulo twelve selects the animal and branch, modulo ten selects the stem, element, and polarity, and modulo sixty produces a human-readable position from one through sixty. Positive modulo is important because it keeps the sequence consistent even when a year before the usual modern examples is supplied. No current clock, locale, network request, random value, or external calendar database participates in the answer. The same valid integer therefore always produces the same object. The tool accepts integer numbers and strictly formatted integer strings, including surrounding whitespace or an explicit sign, but rejects decimals, exponential notation, missing values, unsafe integers, and text that merely begins with digits.
Use the answer accurately in real applications
Use this result when a project needs a conventional zodiac classification based only on a Gregorian birth year. It works well for profile enrichment, classroom exercises, event themes, greeting-card personalization, reference tables, and lightweight cultural-interest features. Remember that the traditional zodiac year changes at Lunar New Year rather than on January 1. Someone born in January or early February may belong to the preceding zodiac year, depending on the exact date and the applicable Lunar New Year boundary. Since this capability intentionally receives only a year, it cannot resolve that boundary case; ask for a full birth date and use a lunar-calendar-aware tool when exact classification around the new year matters. Store the structured animal and element fields instead of parsing the label, because separate fields are easier to translate and query later. Each API request costs $0.002. Invalid input produces an explicit input error rather than guessing, rounding a decimal, extracting digits from prose, or silently substituting the current year.
What you can do with it
Enrich a birth-year profile
Add structured animal, element, polarity, stem, and branch fields to a profile when only the birth year is available.
Build an educational cycle table
Generate consistent examples that demonstrate how twelve animals and ten stems combine into one repeating 60-year sequence.
Personalize themed content
Choose year-based artwork, copy, or categories from a stable result without maintaining a separate lookup table.
FAQ
What does one request cost?
Each API request costs $0.002.
Why does the result include an element as well as an animal?
The animal follows a twelve-year branch sequence, while the element comes from the ten Heavenly Stems. Together they participate in the complete 60-year cycle.
Does the calculator account for Lunar New Year?
No. It maps a Gregorian year number only. Births near Lunar New Year may require an exact birth date and a lunar-calendar-aware calculation.
Can I submit a year as text?
Yes. A string containing only an optional sign and digits is accepted. Decimal, exponential, empty, or mixed text is rejected.
What is cycle position?
It is the result's numbered place from 1 through 60 in the repeating stem-and-branch cycle anchored with 1984 as position 1.
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/misc2/chinese-zodiac-from-year \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"year":1990}'const res = await fetch("https://api.kit.forhosting.com/misc2/chinese-zodiac-from-year", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"year": 1990
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/misc2/chinese-zodiac-from-year",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"year": 1990
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/misc2/chinese-zodiac-from-year", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"year":1990}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"year":1990}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/misc2/chinese-zodiac-from-year", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"year": 1990
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "misc2.chinese_zodiac_from_year",
"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. |