Coffee beans from water volume calculator
500 ml of brew water at 1:16 needs 31.25 g of coffee beans. Enter your kettle volume and the ratio you brew with and get the dry dose in grams and ounces, plus grams per liter. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Water ml
- 500
- Ratio
- 16
- Beans g
- 31.25
- Beans oz
- 1.1023113109
- Water g
- 500
- Water cups
- 2.1133764189
Home baristas, cafe trainers, and recipe apps often start from a kettle volume rather than a scale target: five hundred millilitres for a V60, a two-hundred-fifty millilitre mug pour-over, or a litre of batch brew. The missing number is how many grams of coffee to weigh for that water at a chosen brew ratio. This coffee beans from water volume calculator divides brew water in millilitres by the water-to-coffee ratio—treating one millilitre of water as one gram, the kitchen convention used on every barista scale—and returns the dry bean dose in grams and ounces plus the ratio label and grams per litre.
What brew ratio means and how bean weight is computed
A brew ratio is the mass of water relative to the mass of dry coffee. Specialty coffee writes it as one to sixteen, meaning one gram of beans for every sixteen grams of water, or as a single number sixteen with the same meaning. Because one millilitre of brew water is treated as one gram on a kitchen or barista scale, a target kettle volume in millilitres is already the water mass you will pour.
This calculator implements that identity: beans in grams equal water millilitres divided by the chosen ratio. Five hundred millilitres at sixteen to one is thirty-one point two five grams. Two hundred fifty millilitres at fifteen to one is sixteen and two thirds grams.
The engine does not assay extraction yield, total dissolved solids, or grind size; those change flavour but not the starting dose. It also does not guess a ratio for you. You pick the style—tighter French-press or immersion ratios around twelve to fifteen, classic pour-over fifteen to seventeen, espresso beverage ratios near one and a half to two and a half—and the divide returns a weighable number you can pin in a recipe card, a cafe SOP, or an automated kettle workflow.
Where a beans-from-water calculator earns its keep
Pour-over blogs and V60 recipe sites need a single source of truth when a post lists kettle volume and a house ratio so readers see the same gram dose on every page load instead of conflicting blog guesses. Cafe batch-brew boards and training decks can convert a litre urn or a five-hundred-millilitre decanter into a weighable hopper dose without a spreadsheet. Meal-prep and office coffee programs can scale a staff carafe from water volume alone when the bean bin is labelled in grams.
Failed validation does not consume balance. Document the one-millilitre-equals-one-gram convention, keep ratio vocabulary stable in product copy, and you get reproducible kitchen math for home kettles, CMS blocks, and edge workers without hosting your own brew-ratio spreadsheet.
What you can do with it
Cafe batch-brew and training boards
Convert an urn or decanter volume into a hopper dose at the shop brew ratio without opening a spreadsheet during service.
FAQ
What brew ratio should I use?
Pour-over and drip often use 15–17 (about 59–67 g/L). French press is commonly 12–15. Espresso beverage ratios sit near 1.5–2.5. The calculator does not pick a style; it applies the ratio you send.
Why is one millilitre of water treated as one gram?
Barista scales and brew recipes use that convention so kettle millilitres and gram doses stay interchangeable. The tool does not apply a temperature-corrected water density.
What happens if the water volume is zero or negative?
A non-positive water volume cannot compute bean weight, and the failure is not billed.
How much coffee do I need for 250 ml of water?
At a 1:15 ratio it is sixteen and two thirds grams, because the water is divided by the ratio. At a looser ratio the dose drops, so enter the ratio you actually brew with.
Does the calculator account for grind size or extraction?
No. It works out the starting dose only. Grind size, extraction and the strength of the finished cup change the flavour, but they do not change how many grams of beans the ratio calls for.
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-beans-from-water \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"water_ml":500,"ratio":16}'const res = await fetch("https://api.kit.forhosting.com/cook/coffee-beans-from-water", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"water_ml": 500,
"ratio": 16
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/coffee-beans-from-water",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"water_ml": 500,
"ratio": 16
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/coffee-beans-from-water", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"water_ml":500,"ratio":16}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"water_ml":500,"ratio":16}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/coffee-beans-from-water", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"water_ml": 500,
"ratio": 16
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.coffee_beans_from_water",
"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 water volumes fail with invalid_input instead of inventing a dose.
Input contract, response shape, and error behaviour
Example: five hundred millilitres at ratio sixteen yields thirty-one point two five grams. Example: two hundred fifty millilitres at ratio fifteen yields sixteen point six six six repeating grams, rounded stably for goldens. POST a JSON body with two required finite numbers. water_ml is the target brew-water volume in millilitres and must be strictly positive. Aliases such as water, volume, water_volume, ml, brew_water, and water_volume_ml are accepted so recipe importers need less field mapping. ratio is the water-to-coffee brew ratio as water parts per one part coffee; sixteen means sixteen to one. Aliases include brew_ratio, water_ratio, coffee_ratio, and brew. Numeric strings parse the same as JSON numbers. On success the body echoes the rounded inputs, beans_g as the primary dry dose, beans_oz as the same mass in avoirdupois ounces, water_g under the one-millilitre-equals-one-gram convention, water_cups as US customary cups of water, grams_per_liter as one thousand over the ratio, ratio_label as a one-to-N display string, formula restating beans_g equals water_ml divided by ratio, and a short message for UI copy. Missing fields, non-numeric values, Infinity, NaN, and a non-positive ratio fail with invalid_input and are not billed. A zero or negative water volume also fails with invalid_input and a message that a non-positive water volume cannot compute bean weight—those failures are the contract for empty kettles and sign errors, not a silent zero-gram success.
Where a beans-from-water calculator earns its keep
Brewing apps that already store cup size can turn a slider of millilitres plus a saved ratio into beans_g for a scale prompt. Pair this endpoint with a caffeine estimator only after you know the dose: caffeine depends on grams and method, while this page answers the prior question of how many grams the water requires.
Integration use cases
Pour-over and V60 recipes from kettle volume
Turn a published millilitre kettle target plus a house 1:16 or 1:15 ratio into a stable beans_g line so readers weigh the same dose on every visit.
Brewing apps and scale prompts
Map a cup-size slider and a saved ratio to beans_g so a phone or scale display can tell the user what to weigh.
Technical questions
How do I calculate coffee bean weight from water volume?
Send a positive water_ml and a positive ratio (water parts per one part coffee). The API returns beans_g = water_ml / ratio, treating one millilitre of water as one gram.
What does the coffee beans from water volume calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.