Beer SRM color estimator
50 malt color units in a 5-gallon batch give an MCU of 10 and just over 7 SRM, an amber beer. Enter your grain bill's color units and the batch volume to place pale lagers, ambers and stouts on one scale. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Malt color units
- 50
- Batch volume
- 5
- Mcu
- 10 SRM
- Srm
- 7.239808
- Ebc
- 14.262421
- Color name
- amber
Homebrewers, recipe authors, and brewery planning tools often need a Standard Reference Method color before the first mash, not a photograph or a guessed adjective. Malt color units already fold grain weight and Lovibond rating into one number; dividing that total by batch volume in US gallons yields MCU, and the published Morey power law turns MCU into SRM so pale lagers, ambers, and stouts sit on the same numeric scale used on BJCP scoresheets and commercial labels. This beer SRM color estimator applies that fixed formula only: SRM equals 1.4922 times MCU raised to 0.6859. It also reports the European Brewery Convention figure as SRM times 1.97 and a short color-name band for display.
What malt color units, MCU, and SRM mean
MCU is that total divided by batch volume in US gallons, the same gallons used when homebrew software quotes a five-gallon or ten-gallon batch. Treating MCU itself as SRM is acceptable only for very pale beers; once MCU climbs, beer does not darken in a straight line because more light is absorbed and the visual scale compresses. Dan Morey's 1995 power law, now the default in recipe software, models that curve as SRM equals 1.4922 times MCU to the power 0.6859.
The companion EBC value is SRM times 1.97, the conventional ASBC-to-EBC factor, so European labels can sit next to American ones. Results are planning estimates; laboratory SRM is a spectrophotometer reading of diluted beer, and late specialty malts or fruit can still shift the glass after the grain bill is locked.
What to enter, what you get and when it fails
Numbers are rounded to six decimal places so goldens stay byte-stable across runtimes. Example: fifty malt color units in five US gallons yields MCU ten and SRM about 7.26, an amber band typical of a lightly kilned pale ale. Example: two hundred malt color units in five gallons yields MCU forty and a brown-range SRM.
Pin those deterministic products in tests so recipe cards and browser widgets stay aligned across releases.
Where a beer SRM color estimator earns its keep
Recipe sites and homebrew blogs need a single source of truth when a post lists a grain bill and a batch size so readers see a consistent SRM note instead of conflicting forum guesses. Brewery planning sheets and tap-room menus can attach estimated SRM and EBC to house recipes without standing up a spectrophotometer. Competition worksheets and BJCP study tools can convert MCU to SRM for style-range checks before a brew day.
Failed validation does not consume balance. Document that results are Morey estimates, keep US-gallon volume in product copy, and you get reproducible brewing math for homebrewers, CMS blocks, and edge workers without hosting your own color spreadsheet.
What you can do with it
Recipe sites and homebrew blogs
Turn a published grain-bill MCU total plus batch gallons into a stable SRM and color-name note so readers see the same estimate on every page load.
Tap-room menus and competition sheets
Attach estimated SRM and EBC to house beers and BJCP worksheets without a lab spectrophotometer reading of finished beer.
FAQ
What happens if batch volume is zero or negative?
Non-positive volume cannot form MCU and is not billed.
Is this a laboratory SRM reading?
No. It is the deterministic Morey estimate from the grain bill. Lab SRM is a spectrophotometer assay of diluted beer; specialty malts, fruit, and boil darkening can still shift the glass.
How do I work out malt color units?
For each malt, multiply its weight in pounds by its Lovibond rating and add the results together. Enter that total with the finished batch volume in US gallons; dividing one by the other gives the MCU.
Why doesn't the color rise in a straight line with more dark malt?
Because darker beer absorbs more light and the visual scale compresses. Treating MCU as SRM only works for very pale beers, so the Morey curve from 1995 bends the result as MCU climbs.
How do I get the EBC color?
Multiply the SRM by 1.97, the usual conversion factor. The result shows both figures, so a European label can sit next to an American one without a separate calculation.
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/beer-srm-color \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"malt_color_units":50,"batch_volume":5}'const res = await fetch("https://api.kit.forhosting.com/cook/beer-srm-color", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"malt_color_units": 50,
"batch_volume": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/beer-srm-color",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"malt_color_units": 50,
"batch_volume": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/beer-srm-color", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"malt_color_units":50,"batch_volume":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"malt_color_units":50,"batch_volume":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/beer-srm-color", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"malt_color_units": 50,
"batch_volume": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.beer_srm_color",
"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
Missing fields, non-numeric strings, negative malt color units, and a non-positive batch volume fail with invalid_input instead of inventing a tint.
What malt color units, MCU, and SRM mean
Malt color units are the brewing shorthand for grain color contribution: each malt addition adds pounds of grain times that malt's Lovibond rating, and the batch total is the number you send as malt_color_units. This endpoint applies those published constants and nothing else: no mash-efficiency fudge, no boil-length darkening, and no roast-oxidation term. A color_name band from colorless through pale straw, gold, amber, copper, brown, and black is derived from the computed SRM for UI copy.
Input contract, response shape, and error behaviour
POST a JSON body with two required finite numbers. malt_color_units is the grain-bill total of pounds times Lovibond and must be non-negative; aliases include mcu, color_units, mcu_total, and malt_mcu. batch_volume is finished-batch volume in US gallons and must be strictly positive; aliases include volume, volume_gal, gallons, batch_gal, and wort_volume. Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, non-numeric text, negative malt color units, and a zero or negative batch volume fail with invalid_input naming the field and are not billed. On success the body echoes malt_color_units and batch_volume, reports mcu as their quotient, srm from the Morey power law, ebc as SRM times 1.97, color_name as a short band, unit always SRM, formula restating the two-step rule, and message for UI copy.
Where a beer SRM color estimator earns its keep
Recipe-builder apps that already store pounds, Lovibond, and gallons can sum malt color units client-side and call this endpoint for the Morey transform instead of copying constants into every client.
Integration use cases
Recipe-builder and brew-log apps
Sum pounds times Lovibond in the client, send malt_color_units and batch_volume, and store the Morey SRM next to each recipe version.
Technical questions
How does the beer SRM color estimator work?
Send malt_color_units (non-negative Σ pounds × °Lovibond) and batch_volume (positive US gallons). The API computes MCU as their quotient, then SRM = 1.4922 × MCU^0.6859 (Morey 1995).
Are malt color units the same as MCU?
MCU is malt_color_units divided by batch volume in US gallons. Send the grain-bill total (pounds × Lovibond) as malt_color_units; do not pre-divide unless you also send volume as 1.
What does the beer SRM color estimator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.