Chemex coffee ratio calculator
This Chemex coffee ratio calculator turns a cup count into an exact starting recipe for coffee grounds and water.
Run — free
It defines one Chemex cup as 150 millilitres and applies a fixed 1:16 coffee-to-water ratio, so the result is consistent every time. Enter the number of cups you plan to brew and receive the required coffee in grams and water in millilitres. The calculation is deterministic, quick, and useful for scaling the same balanced recipe up or down without mental arithmetic.
Understand the fixed Chemex recipe
This calculator uses one clear recipe: one part ground coffee for every sixteen parts water by mass. Because a millilitre of brewing water is approximately one gram for recipe planning, 150 millilitres per cup can be divided directly by sixteen to find the coffee dose. That gives 9.375 grams of coffee for one defined cup, with the displayed grounds rounded to two decimal places. The fixed ratio removes uncertainty when you only need a dependable baseline. It does not claim that every bean, grinder, or taste preference must use exactly the same recipe. Instead, it provides a repeatable reference that makes comparisons meaningful. If a six-cup brew tastes too strong or too light, you know the starting quantities and can adjust grind size or later change your personal recipe deliberately. The returned ratio is always shown as 1:16, while water is reported in millilitres and coffee in grams, the practical units most brewers and kitchen scales support.
Enter cups and measure the result
Enter a positive whole number for the cup count. In this calculator, a cup is a recipe unit of 150 millilitres, not a large household mug and not necessarily the numbered mark printed on every brewer. The tool multiplies your count by 150 to determine total water, then divides that water amount by sixteen to determine the grounds. For the most repeatable brew, place the Chemex on a scale, tare it, weigh the calculated coffee, and then pour until the scale reaches the returned water amount in grams. The millilitre result can also guide a measured kettle, although weighing water is usually easier during a pour-over. Remember that the finished drink will weigh less than the water you poured because the grounds retain some liquid. The output describes the brewing input, not the final beverage volume. Use fresh coffee, an appropriate filter, and an even pour while keeping the calculator’s quantities unchanged when comparing technique from one brew to the next.
Scale a brew without changing its balance
Scaling both ingredients together preserves the intended strength far better than guessing an extra scoop when more people arrive. Choose the total cup count before brewing, calculate once, and use the resulting numbers as the recipe for the entire batch. A larger batch may require a slower or more carefully controlled pour because the coffee bed is deeper, but the ingredient relationship remains the same. If the calculated water exceeds the comfortable working capacity of your Chemex, split the recipe into two equal brews rather than filling above a safe level. The function is deterministic: identical input always produces identical output, and it uses no network request, random value, or current date. That makes it suitable for a kitchen page, a café prep sheet, or an automated recipe workflow through the API at $0.002 per request. Non-positive counts are rejected instead of producing meaningless negative or empty recipes. This explicit error behaviour helps integrations distinguish an invalid order quantity from a legitimate brewing result.
What you can do with it
Prepare a consistent morning brew
Convert the number of cups you want into scale-ready grams of coffee and millilitres of water.
Scale coffee for guests
Increase a familiar Chemex recipe while preserving the same fixed coffee-to-water relationship.
Automate café prep notes
Generate deterministic ingredient quantities from an order or batch cup count through the API.
FAQ
What ratio does the calculator use?
It always uses one part coffee to sixteen parts water, written as 1:16.
How large is one cup?
One cup is defined as 150 millilitres of brewing water for this calculation.
Can I enter a fraction of a cup?
No. The input is a positive whole-number cup count so recipes and form validation stay unambiguous.
Why is coffee shown in grams?
Weight is more repeatable than scoops because bean density, roast, and grind can change the volume of the same mass.
Does the water amount equal the final drink volume?
No. Coffee grounds and the filter retain some water, so the brewed beverage will be smaller than the input water amount.
What does an API calculation cost?
Each API request costs $0.002; the same deterministic calculation is available free in the browser.
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/chemex-ratio \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"cup_count":6}'const res = await fetch("https://api.kit.forhosting.com/cook/chemex-ratio", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"cup_count": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/chemex-ratio",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"cup_count": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/chemex-ratio", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"cup_count":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"cup_count":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/chemex-ratio", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"cup_count": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.chemex_ratio",
"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. |