Estimate leftover portions for freezing from recipe yield
Turn a recipe's batch yield into a practical freezer plan before food reaches the containers.
Run — free
Enter the total quantity made, the quantity you consider one standard serving, and the number of portions needed immediately. The calculator reports how many complete portions the batch contains, how many remain available to freeze, and whether a smaller amount is left over. It is useful for batch cooking, meal preparation, household planning, and reducing avoidable food waste.
Start with quantities that use the same unit
The total yield and serving size must describe the same kind of quantity. If a soup recipe produces 2,400 milliliters and one serving is 300 milliliters, enter 2400 and 300. You could instead use liters and enter 2.4 and 0.3, because the ratio is unchanged. Do not combine a weight with a volume, such as grams for the batch and cups for a portion, unless you have first converted one using a reliable recipe-specific conversion. Density varies between foods, so a generic conversion can make a plausible-looking answer inaccurate. The immediate-serving value is different: it is a count of complete portions, not a quantity of food. Use zero when the entire batch is intended for the freezer. Count everyone eating now, plus any complete portions being kept in the refrigerator for near-term use, if those should not be included in the freezing estimate. Clear, consistent inputs make the result a useful container count rather than merely an abstract division result.
Understand complete portions and the remainder
The calculator divides total yield by serving size and counts only complete standard portions. It rounds down rather than rounding to the nearest whole number, because a partial serving should not be presented as a full freezer portion. From that complete-portion total, it subtracts the number set aside for immediate use. The result called freezable portions is therefore the number of full containers you can prepare at the chosen size. A separate remainder value preserves the quantity that does not fill another standard portion. For example, a batch of 1,050 grams with a 300-gram serving contains three complete portions and a 150-gram remainder. If one portion is needed now, two full portions can be frozen and the 150 grams still remain. You might refrigerate that smaller amount, combine it with another batch, or intentionally distribute it among the full containers. The calculator does not silently enlarge portions, because doing so would undermine consistent meal planning and nutrition estimates.
Use the estimate for safe, practical freezer planning
Treat the result as a packaging estimate, then apply the storage guidance appropriate to the actual food. Arrange the reported number of freezer-safe containers or bags before portioning, label them with contents and a useful reference date, and follow trusted food-safety advice for cooling, freezing, thawing, and reheating. This capability performs arithmetic only; it does not decide whether a particular ingredient freezes well or how long a dish remains safe. If your household prefers different portion sizes, rerun the calculation with the size you will truly pack rather than relying on a recipe's promotional serving count. The validation also protects an important planning boundary: immediate servings cannot exceed the complete portions available from the batch. When that happens, the request returns an input error instead of a negative freezer quantity. That signal tells you to reduce the immediate count, choose a smaller standard serving, or increase the recipe yield before promising meals that the batch cannot provide.
What you can do with it
Plan a batch-cooking session
Calculate the exact number of full freezer containers needed after tonight's meal is reserved.
Scale meal-prep storage
Compare portion sizes and see how many standardized lunches can be frozen from one cooked batch.
Reduce leftover waste
Identify both complete freezable portions and the smaller remainder that needs another use.
FAQ
What does the API request cost?
The API price is $0.002 per request. The browser version can run locally on this page.
Which units can I use?
Any positive quantity unit works, including grams, ounces, milliliters, liters, cups, or trays, provided total_yield and serving_size use the same unit.
Why are partial servings not counted as freezable portions?
The estimate counts standardized complete portions so it never promises a full container when the remaining quantity is too small.
What happens to food smaller than one serving?
It appears as remainder_yield. You can refrigerate it, combine it with other food, or distribute it intentionally.
Why did my immediate-serving count cause an error?
The count was greater than the number of complete standard portions available from the total recipe yield.
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/final3/leftover-portion-freeze-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total_yield":2400,"serving_size":300,"immediate_servings":3}'const res = await fetch("https://api.kit.forhosting.com/final3/leftover-portion-freeze-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total_yield": 2400,
"serving_size": 300,
"immediate_servings": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/final3/leftover-portion-freeze-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total_yield": 2400,
"serving_size": 300,
"immediate_servings": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/final3/leftover-portion-freeze-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total_yield":2400,"serving_size":300,"immediate_servings":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total_yield":2400,"serving_size":300,"immediate_servings":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/final3/leftover-portion-freeze-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
{
"total_yield": 2400,
"serving_size": 300,
"immediate_servings": 3
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "final3.leftover_portion_freeze_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. |