Annual pluviometric index calculator
The annual pluviometric index calculator turns twelve monthly rainfall totals into one clear measure of how wet or dry the observed year was relative to a long-term annual mean.
Run — free
It adds the monthly values, compares their annual total with the reference, and reports an index where 100 represents the mean. The result also includes the percentage deviation, a plain-language classification, and the formula used, making it suitable for quick climate summaries, station reports, agricultural records, and reproducible data workflows.
What the annual pluviometric index means
This calculator treats the long-term mean annual rainfall as the reference level and expresses the selected year's rainfall as a percentage of that reference. A pluviometric index of 100 means that the sum of the twelve monthly totals exactly matches the long-term annual mean. An index of 115 means the observed year received 15 percent more rainfall than the reference, while an index of 72 means it received 28 percent less. This relative form is useful because it gives immediate context that an annual total alone cannot provide. A total of 900 millimetres might be unusually wet at one station and seriously dry at another, depending on the local climate. All twelve monthly values and the mean annual value must use the same rainfall depth unit, such as millimetres or inches. The unit cancels in the ratio, so the index itself is unitless. The calculator preserves the annual total and reference in the result so the comparison remains transparent and easy to audit.
How to prepare and interpret the inputs
Enter exactly twelve non-negative monthly rainfall totals in calendar order, beginning with January and ending with December. Then provide a positive long-term mean annual rainfall for the same location, observation method, and preferably a stable climatological reference period. Do not mix millimetres with inches, station measurements with regional estimates, or incomplete months with complete monthly totals. A zero is valid when no measurable rain fell during a month, but a missing observation should not automatically be replaced with zero because that would bias the annual total downward. The output groups results near 100 as near the mean and uses broader labels for drier or wetter departures. Those bands offer a convenient descriptive summary: below 80 is much drier than the mean, 80 to below 95 is drier, 95 through 105 is near the mean, above 105 through 120 is wetter, and above 120 is much wetter. These labels are screening aids rather than official drought or flood categories, which normally require additional variables, time scales, and local thresholds.
Using the result responsibly in reports and automation
Use the index when you need a compact annual comparison that readers can understand without studying twelve separate values. In a station report, retain the returned annual total, mean annual rainfall, index, deviation, classification, and formula together so reviewers can reproduce the conclusion. In an automated workflow, validate that each monthly source record represents the same year and station before sending the array. The deterministic calculation makes repeated calls with identical inputs produce identical JSON, which is helpful for testing, caching, dashboards, and audit trails. The index describes total annual wetness relative to a reference, but it does not show when rain occurred. Two years can receive the same annual total even if one has evenly distributed rainfall and the other has a few extreme storms followed by long dry periods. For questions about seasonality, concentration, erosion, drought duration, flooding, or crop water availability, inspect the monthly series and use appropriate specialist indicators alongside this result. The browser version is available for individual checks, while API requests cost $0.002 each for repeatable integration into larger systems.
What you can do with it
Summarize a weather station year
Compare one complete year of monthly station totals with its established long-term annual rainfall mean.
Add context to an agricultural report
State whether the recorded year was broadly wetter or drier than the local reference while retaining the underlying totals.
Automate annual climate dashboards
Generate a stable index, deviation, and classification from validated monthly records in a repeatable data pipeline.
FAQ
What does an index of 100 mean?
It means the observed annual rainfall total is exactly equal to the supplied long-term mean annual rainfall.
Can I use inches instead of millimetres?
Yes. Use any rainfall depth unit, provided every monthly total and the mean annual rainfall use that same unit.
Why must I provide a separate long-term mean?
A separate climatological reference makes the comparison meaningful. Dividing the annual sum by the mean of those same twelve values would produce a fixed relationship rather than a wetness anomaly.
Can a monthly rainfall total be zero?
Yes. Zero is accepted for a genuinely rainless month. Do not use zero merely as a substitute for missing observations.
Does the classification define drought or flood conditions?
No. It is a descriptive comparison with the mean. Formal drought and flood assessments require additional indicators, periods, and locally defined thresholds.
What does an API calculation cost?
Each API request costs $0.002. You can also run the calculation free in your browser on this page.
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/earth/pluviometric-index \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"monthly_rainfall":[82,76,91,104,118,132,145,127,109,96,88,92],"mean_annual_rainfall":1200}'const res = await fetch("https://api.kit.forhosting.com/earth/pluviometric-index", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"monthly_rainfall": [
82,
76,
91,
104,
118,
132,
145,
127,
109,
96,
88,
92
],
"mean_annual_rainfall": 1200
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/pluviometric-index",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"monthly_rainfall": [
82,
76,
91,
104,
118,
132,
145,
127,
109,
96,
88,
92
],
"mean_annual_rainfall": 1200
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/pluviometric-index", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"monthly_rainfall":[82,76,91,104,118,132,145,127,109,96,88,92],"mean_annual_rainfall":1200}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"monthly_rainfall":[82,76,91,104,118,132,145,127,109,96,88,92],"mean_annual_rainfall":1200}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/pluviometric-index", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"monthly_rainfall": [
82,
76,
91,
104,
118,
132,
145,
127,
109,
96,
88,
92
],
"mean_annual_rainfall": 1200
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.pluviometric_index",
"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
max_items | 12 |
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. |