Brewed coffee caffeine estimator
18 g of coffee pulled as espresso gives an estimated 216 mg of caffeine, at 12 mg per gram. Enter the dry coffee weight and pick one of eleven brew methods to get a milligram figure for your recipe, menu or daily log. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Beans g
- 18
- Method key
- espresso mg
- Factor mg per g
- 12
- Caffeine mg
- 216
Home baristas, cafe operators, and wellness apps often need a quick caffeine number for a dose of coffee without a laboratory assay. Bean weight and brew method drive most of the practical range: eighteen grams of espresso-pulled coffee is not the same cup as a french-press immersion with the same mass, and cold brew steeps differently again. This brewed coffee caffeine estimator multiplies dry coffee grams by a fixed milligrams-per-gram factor for the chosen method—espresso, drip, filter, pour-over, french press, cold brew, AeroPress, moka, turkish, instant, or percolator—and returns a deterministic milligram total you can show next to a recipe, a menu, or a daily intake log.
What the caffeine estimate means and how the factors work
Coffee beans contain caffeine as a natural alkaloid; how much ends up in the cup depends on the dry mass you dose and how efficiently the brew method extracts soluble compounds. This capability does not assay beans or measure a finished beverage with chromatography. It applies a fixed factor table: caffeine in milligrams equals beans in grams times a method-specific milligrams-per-gram constant chosen as a stable rule of thumb for typical home and cafe extraction.
Espresso uses a higher factor because fine grind and short high-pressure contact extract aggressively from a small puck. Drip and paper filter methods sit near a standard ten milligrams per gram. French press immersion with a coarser grind uses a slightly lower factor.
Cold brew’s long steep uses a higher factor. Instant treats the powder as already processed solids with its own constant. These numbers are estimates for planning and education—not medical advice and not a substitute for laboratory measurement when you need certified content.
Where a caffeine estimate comes in handy
Recipe sites and specialty-coffee blogs need a single source of truth when a post lists dose in grams and a brew method so readers see a consistent caffeine note instead of conflicting blog guesses. Cafe menus and training decks can attach estimated milligrams to house espresso recipes and batch brew recipes without standing up a lab.
Wellness and habit apps that already log coffee events can convert stored grams and method tags into milligrams for daily totals with a pure multiply instead of a large language model that might invent factors. Meal-prep and corporate cafeteria tools can scale a staff coffee cart recipe by grams and method for rough intake guidance during wellness campaigns. Failed validation does not consume balance.
Document that results are fixed-factor estimates, keep method vocabulary stable in product copy, and you get reproducible kitchen math for home baristas, CMS blocks, and edge workers without hosting your own caffeine spreadsheet.
What you can do with it
Cafe training and menu cards
Attach fixed-factor caffeine estimates to house espresso and batch-brew recipes for staff education and guest-facing FAQ cards.
FAQ
What happens if bean weight is zero or negative?
Non-positive coffee weight cannot produce a meaningful caffeine estimate and is not billed.
Is this a laboratory caffeine assay?
No. It is a deterministic fixed-factor estimate for planning and education. Real cups vary with species, roast, grind, and extraction; use a lab assay when you need certified content.
Which brew methods can I choose?
Espresso, drip, filter, pour-over, French press, cold brew, AeroPress, moka, Turkish, instant and percolator. Everyday names work too: a V60 or a Chemex counts as pour-over, and a cafetière as French press.
Why does espresso get more caffeine per gram than drip?
The fine grind and short, high-pressure contact extract hard from a small puck, so espresso uses 12 mg per gram while drip and paper filter sit near 10. French press is a little lower and cold brew higher.
Can I estimate caffeine from the cup size instead?
No. The estimate needs the weight of dry beans or grounds in grams. If you only know the liquid volume, work out the coffee dose from your recipe first and enter that weight.
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-caffeine-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"beans_g":18,"method":"espresso"}'const res = await fetch("https://api.kit.forhosting.com/cook/coffee-caffeine-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"beans_g": 18,
"method": "espresso"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/coffee-caffeine-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"beans_g": 18,
"method": "espresso"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/coffee-caffeine-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"beans_g":18,"method":"espresso"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"beans_g":18,"method":"espresso"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/coffee-caffeine-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"beans_g": 18,
"method": "espresso"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.coffee_caffeine_estimate",
"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 weights and unknown methods fail with invalid_input instead of inventing a number.
What the caffeine estimate means and how the factors work
Species (arabica versus robusta), roast darkness, and grind distribution still move real cups; the API freezes those variables so clients get reproducible outputs for the same inputs every time. When you only know liquid volume, convert to dry dose first with your own recipe; this endpoint requires bean or ground weight in grams so the multiply stays honest.
Input contract, response shape, and error behaviour
Example: eighteen grams espresso yields two hundred sixteen milligrams because the espresso factor is twelve milligrams per gram. Example: twenty grams drip yields two hundred milligrams at ten milligrams per gram. Pin these deterministic products in tests so intake trackers and browser widgets stay byte-stable across releases. POST a JSON body with two required fields. beans_g is a finite positive number: grams of dry coffee beans or grounds. Aliases such as bean_weight_g, weight_g, grams, weight, coffee_g, and dose_g are accepted. method is a brew method string; matching is case-insensitive and spaces or hyphens normalize to the same keys, so french press, French-Press, and french_press all resolve to the french press row. Aliases include brew_method, brew, and method_name. Supported methods include espresso, drip, filter, pour_over, french_press, cold_brew, aeropress, moka, turkish, instant, and percolator, plus everyday aliases such as v60 or chemex for pour-over, moka pot for moka, and cafetiere for french press. On success the body includes beans_g and factor_mg_per_g as numbers, method as a human display label, method_key as the stable snake_case identifier, caffeine_mg as the product rounded for stable goldens, unit always mg, formula restating the multiply rule, and message for UI copy. Missing fields, non-numeric weights, zero or negative beans_g, empty method strings, and unknown method names fail with invalid_input and are not billed.
Integration use cases
Recipe sites and specialty blogs
Turn a published dose in grams plus brew method into a stable caffeine_mg note so readers see the same estimate on every page load.
Wellness and daily intake apps
Convert logged coffee events (grams and method tags) into milligrams for daily totals without inventing extraction factors per request.
Technical questions
How does the brewed coffee caffeine estimator work?
Send beans_g (positive grams of dry coffee) and method (e.g. espresso, drip, french_press). The API multiplies weight by a fixed method factor and returns caffeine_mg.
Which brew methods are supported?
Espresso, drip, filter, pour-over, french press, cold brew, AeroPress, moka, turkish, instant, and percolator, plus common aliases such as v60, chemex, and moka pot.
What does the coffee caffeine estimator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.