Coffee water from bean weight calculator
An 18 g dose of beans at sixteen parts water to one makes 288 ml of brew water. Weigh your coffee, keep the default ratio or set another, and read the kettle volume before the first bloom pour. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Bean weight
- 18
- Brew ratio
- 16
- Water volume
- 288
- Ratio label
- 1:16
Specialty coffee recipes almost always start from a brew ratio—how many parts of water you pour for each part of coffee by mass—not from a fixed cup size alone. Home baristas, café training programs, and recipe apps need a deterministic way to turn a bean dose into the water volume that matches a target strength. This coffee water from bean weight calculator multiplies bean weight by the chosen brew ratio (default sixteen to one) and returns water volume with a clear 1:N ratio label. When bean mass is in grams and water density is taken as one gram per millilitre, the result is millilitres of brew water ready for the kettle scale.
How bean weight and brew ratio become water volume
A brew ratio is a simple proportion: water mass relative to coffee mass. Writing the ratio as one to sixteen means one gram of beans pairs with sixteen grams of water; writing it as a single number sixteen means the same thing—sixteen water parts per one part coffee. Multiplying bean weight by that factor yields total brew water mass.
Changing the ratio changes strength without changing the cup geometry: a fifteen-to-one pour tastes fuller than a seventeen-to-one pour for the same grind and contact time. Immersion methods such as French press often sit near twelve to fifteen; pour-over and drip commonly use fifteen to seventeen; espresso concentrate is often near one to two by mass for the beverage, which is a different use of the same arithmetic.
Where a coffee water calculator earns its keep
Home baristas who buy beans by the bag and brew one or two cups need water volumes that track dose changes when they move from a fifteen-gram V60 to a twenty-two-gram Chemex without rewriting a spreadsheet. Café trainers print ratio cards for staff and want a live check when a guest asks for a stronger or weaker cup. Recipe sites and mobile apps store style presets as ratio numbers and call a tiny convert when rendering a brew guide or shopping list for filter paper and kettle size.
Prefer this capability when you already know bean mass and the water-to-coffee ratio; it is not a cups-to-grams density tool, not a caffeine dose calculator, and not a pizza dough hydration helper.
What you can do with it
Single-cup pour-over dose
Enter bean grams and a 1:16 (or custom) ratio to read the exact kettle water volume before the bloom pour.
Batch brew scaling
Scale café filter recipes by multiplying dose and ratio so total water matches the airpot or batch basket size.
FAQ
What does brew ratio 16 mean?
It means 1:16 — sixteen units of water for each unit of coffee by mass. Eighteen grams of beans at ratio 16 needs 288 mL of water (assuming 1 g/mL).
What if bean weight is zero or negative?
Bean weight must be a positive finite number; invalid input is not billed.
What happens to the water when I change my dose?
It follows the dose at the same ratio, so the strength stays put. Moving from a 15 g V60 to a 22 g Chemex, enter the new weight and the water grows with it, with no spreadsheet to rewrite.
Do I weigh whole beans or ground coffee?
Either one: enter the mass of the whole beans or of the ground dose. In grams, the result reads as millilitres of water, because water is taken as one gram per millilitre.
How do I make a stronger or lighter cup for a guest?
Change the ratio and keep the dose. Fewer parts of water give a fuller cup, so 15 to 1 tastes heavier than 17 to 1 with the same grind and contact time.
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/cook/coffee-water-from-beans \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"bean_weight":18}'const res = await fetch("https://api.kit.forhosting.com/cook/coffee-water-from-beans", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"bean_weight": 18
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/coffee-water-from-beans",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"bean_weight": 18
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/coffee-water-from-beans", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"bean_weight":18}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"bean_weight":18}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/coffee-water-from-beans", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"bean_weight": 18
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.coffee_water_from_beans",
"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
Non-positive bean weights and non-positive ratios fail with invalid_input instead of inventing a pour.
How bean weight and brew ratio become water volume
For practical kitchen work, water density near room temperature is close enough to one gram per millilitre that water mass in grams equals water volume in millilitres, so the calculator reports water_volume in those units when you dose in grams. This endpoint does not model extraction yield, TDS, or grind—it only scales water to beans so you can set the kettle and the scale before the first pour. The identity is water_volume equals bean_weight times brew_ratio, with stable twelve-decimal rounding so goldens and API clients match across runtimes.
Input contract, defaults, response shape, and errors
Example: eighteen grams of beans at the default ratio sixteen yields two hundred eighty-eight millilitres of brewing water. POST a JSON body with one required finite positive number: bean_weight (aliases beans, bean_g, dose, dose_g, coffee_weight, coffee_g, grounds)—the mass of whole beans or ground coffee dose. Optionally send brew_ratio (aliases ratio, water_ratio, ratio_water, brew, strength_ratio)—water parts per one part beans; it defaults to sixteen when omitted. Both fields may arrive as JSON numbers or numeric strings. Zero or negative bean_weight fails with invalid_input and a message that bean weight must be positive. Zero or negative brew_ratio fails the same way. Missing bean_weight, empty strings, non-finite values, and values above one trillion in absolute magnitude also fail validation and are not billed. On success the body echoes bean_weight and brew_ratio, returns water_volume as the product, ratio_label as a display string such as 1:16, formula as the closed-form identity, and message as a one-line English summary suitable for UI copy.
Where a coffee water calculator earns its keep
Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you deliberately send a zero dose to verify error handling.
Integration use cases
Recipe app brew cards
Store style presets as brew_ratio values and call the API to fill water_volume on each recipe card from user dose.
Technical questions
How do I calculate coffee water from bean weight?
Send bean_weight (positive mass) and optional brew_ratio (water parts per one part beans, default 16). The API returns water_volume = bean_weight × brew_ratio.
Is water_volume in millilitres?
When bean_weight is in grams and you treat water density as 1 g/mL, water_volume is millilitres. Keep units consistent if you dose in ounces or other mass units.
What does the coffee water calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.