Estimate homebrew ABV from original and final gravity readings
Estimate the alcohol by volume of a fermented beer, cider, mead, or other homebrew from two hydrometer or refractometer-corrected specific gravity readings.
Run — free
Enter the original gravity recorded before fermentation and the final gravity recorded after fermentation. The calculator applies the common brewing approximation, ABV equals the gravity difference multiplied by 131.25, and reports the result as a percentage. It also shows the gravity drop so you can review the inputs and calculation rather than accepting an unexplained number.
Take readings that represent the start and finish
Original gravity, commonly shortened to OG, is the specific gravity of the wort or must before fermentation starts. Final gravity, or FG, is the reading after yeast has consumed fermentable sugars and the batch has reached its finishing point. For a useful estimate, measure both samples at the calibration temperature of your hydrometer or apply the instrument's temperature correction first. Remove bubbles, avoid letting foam lift the hydrometer, and read at the appropriate point on the meniscus. If you use a refractometer after fermentation begins, correct its reading for the effect of alcohol before entering it here; an uncorrected post-fermentation Brix value is not interchangeable with hydrometer specific gravity. Record readings with enough decimal places, typically three digits after the decimal, because a difference of only a few gravity points changes the result. Confirm that fermentation is complete with stable readings on separate days when that is appropriate for your recipe and process. This calculator estimates strength from measurements; it does not determine whether a batch is safe or ready to package.
Understand the standard ABV approximation
The calculation uses ABV (%) = (original gravity - final gravity) x 131.25. For example, an original gravity of 1.052 and a final gravity of 1.012 produce a gravity drop of 0.040 and an estimated alcohol content of 5.25 percent by volume. The factor 131.25 is a widely used practical approximation for ordinary brewing ranges. It turns the observed reduction in liquid density into an accessible estimate, but it is not a laboratory assay. Results can differ from measured alcohol content because fermentation changes more than one component of the liquid, instruments have tolerances, sample temperature matters, and stronger beverages can depart further from the simple relationship. The calculator keeps the entered readings to six decimal places, reports the gravity drop to six places, and rounds the estimated percentage to two decimal places for a stable, readable answer. If final gravity exceeds original gravity, the input is rejected instead of returning a negative alcohol percentage, since that pair does not represent the expected gravity decline used by this approximation.
Use the estimate for records and recipe comparison
A gravity-based ABV estimate is most useful as part of a consistent brewing log. Save the original reading with the brew date, instrument, sample temperature, and any correction you applied. Add the final reading only when it is representative, then retain the estimated ABV beside batch volume, attenuation notes, and tasting observations. Using the same measurement procedure across batches makes comparisons more meaningful, even though the formula remains approximate. Recipe designers can compare expected and observed gravity drops to see whether yeast performance, mash fermentability, or ingredient changes moved a batch toward a drier or sweeter finish. Breweries and advanced hobbyists that need a value for regulated labeling, tax reporting, sales documentation, or tightly controlled quality assurance should use an approved measurement method and follow the rules in their jurisdiction rather than relying on this estimate alone. The browser calculator is convenient for occasional checks, while the API costs $0.002 per request and can add the same deterministic calculation to batch logs, brewing software, spreadsheets, or production workflows.
What you can do with it
Estimate a finished beer's strength
Turn brew-day OG and stable finishing FG readings into a quick ABV estimate for the batch log.
Compare recipe iterations
Use consistently collected gravity readings to compare estimated alcohol content across yeast, mash, or ingredient changes.
Automate brewing records
Call the deterministic API from brewing software or a spreadsheet workflow and store the returned gravity drop and ABV estimate.
FAQ
What formula does the calculator use?
It uses the common approximation ABV (%) = (original gravity - final gravity) x 131.25.
Why is final gravity above original gravity rejected?
The approximation expects gravity to fall during fermentation. Reversed readings would create a negative result and usually indicate swapped inputs, measurement conditions, or a process that this formula does not describe.
Can I enter refractometer readings?
Only after converting or correcting post-fermentation refractometer readings for alcohol. Raw final Brix is not the same as final specific gravity.
Is this accurate enough for legal labeling?
It is a practical brewing estimate, not a certified laboratory measurement. Use approved methods and applicable local rules for regulated labels, tax, or compliance work.
How much does it cost?
The calculator is free to use in the browser. Each API request costs $0.002.
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/home-brew-gravity-abv-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_gravity":1.052,"final_gravity":1.012}'const res = await fetch("https://api.kit.forhosting.com/cook/home-brew-gravity-abv-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_gravity": 1.052,
"final_gravity": 1.012
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/cook/home-brew-gravity-abv-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_gravity": 1.052,
"final_gravity": 1.012
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/cook/home-brew-gravity-abv-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_gravity":1.052,"final_gravity":1.012}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_gravity":1.052,"final_gravity":1.012}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/cook/home-brew-gravity-abv-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
{
"original_gravity": 1.052,
"final_gravity": 1.012
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "cook.home_brew_gravity_abv_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. |