Postage stamp calculator
This postage stamp calculator finds a practical set of stamps whose combined value meets or exceeds the postage you need.
Run — free
Enter the required postage and one stamp denomination for a quick count, or add other denominations when you have a mixed supply. The result shows the number of stamps, the amount covered, any unavoidable overpayment, and a denomination-by-denomination breakdown. Calculations use exact scaled monetary units rather than approximate floating-point comparisons, making repeat runs deterministic and suitable for shipping desks, mailrooms, collectors, and automated order workflows.
Enter the postage amount and stamps you actually have
Start with the total postage printed by your carrier, postal service, or shipping software. Then enter the value of the primary stamp you plan to use. If every stamp in your drawer has the same value, those two numbers are enough: the calculator determines the smallest count whose total reaches the required postage. When you have several stamp values available, add them as additional denominations. The tool treats every listed denomination as reusable, so it models a supply with no quantity limit for each stamp value. Monetary inputs may use up to three decimal places, which accommodates currencies and postal products priced more precisely than cents. Keep every denomination in the same currency as the required postage; the calculator handles numeric values, not exchange rates or currency conversion. Duplicate denominations are harmless and are consolidated before calculation. A required postage value of zero returns zero stamps, while every supplied denomination must be greater than zero because a zero or negative stamp can never advance a valid postage combination.
How the best combination is selected
The first objective is to minimize overpayment. The calculator searches for the lowest reachable stamp total that is equal to or greater than the required postage. An exact combination therefore always wins over any combination that pays too much, even if the exact combination uses more individual stamps. Once the lowest payable total is known, the second objective is to use the fewest stamps needed to produce that total. This ordering matches the usual mailing decision: avoid wasting postage first, then reduce the number of stamps that must be handled and placed on the envelope. Internally, all input values are converted to scaled integers before combinations are evaluated. For example, values with two decimal places are handled as whole hundredths. That design prevents familiar binary floating-point artifacts from turning an exact monetary match into a tiny apparent shortfall. The search is deterministic, has a declared bound, uses no network service, and returns the same breakdown for the same input on the browser and API paths.
Read the result and apply it safely
The result separates four useful facts. The stamps-needed value is the total number of physical stamps in the selected combination. Required postage repeats the normalized target so it is easy to compare records later. Postage total is the combined face value of the recommended stamps, and overpayment is the difference between that total and the target. The breakdown lists only denominations that are used, paired with their counts. Before mailing, confirm that the entered target still matches the current carrier quote and that each stamp is valid for the service, destination, mail class, and mailing date involved. This calculator performs arithmetic; it does not look up live postal prices, identify regional stamp restrictions, reserve postage, or print a label. It also assumes unlimited availability of each entered denomination. If your stock is limited, run the calculator with only denominations you can supply in sufficient quantity, then verify the physical count while assembling the envelope or parcel. Automated callers can use the same deterministic response for packing slips, fulfillment checks, or mailroom instructions at $0.002 per request.
What you can do with it
Prepare an envelope
Find the fewest same-value stamps that meet a known letter postage amount and see the overpayment before attaching them.
Use mixed stamp denominations
Combine several stamp values from an existing collection while prioritizing the smallest possible excess postage.
Automate mailroom instructions
Turn a carrier-provided postage total into a repeatable denomination breakdown for fulfillment or office mailing workflows.
FAQ
What does the calculator cost?
It runs free in the browser. API requests cost $0.002 each.
What happens when one denomination cannot make the exact amount?
The calculator chooses the smallest reachable total above the requirement, then minimizes the stamp count for that total.
Can I combine different stamp values?
Yes. Supply a primary denomination and list any other available values in additional_denominations.
Why must every denomination be positive?
A zero or negative denomination cannot contribute valid postage and would make stamp-count optimization meaningless, so it is rejected as invalid input.
Does the calculator check current postal rates?
No. Enter a postage requirement obtained from your carrier or postal service; this capability only calculates stamp combinations.
Does it account for a limited number of stamps in stock?
No. Each supplied denomination is assumed to be available without a quantity limit.
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/date/postage-stamp-count \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total_postage":2.73,"denomination":0.68}'const res = await fetch("https://api.kit.forhosting.com/date/postage-stamp-count", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total_postage": 2.73,
"denomination": 0.68
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/postage-stamp-count",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total_postage": 2.73,
"denomination": 0.68
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/postage-stamp-count", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total_postage":2.73,"denomination":0.68}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total_postage":2.73,"denomination":0.68}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/postage-stamp-count", 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_postage": 2.73,
"denomination": 0.68
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.postage_stamp_count",
"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.
Limits
max_amount | 100000 |
max_denominations | 20 |
max_decimal_places | 3 |
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. |