Aggregate tonnage calculator
10 cubic metres of gravel weigh 16,800 kg, or 16.8 metric tonnes. Enter the volume in cubic metres, yards or feet, pick the material or your supplier's density, and compare quotes in metric, short and long tons at once. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Volume
- 10
- Material
- gravel
- Density
- 1,680
- Density source
- preset
- Volume unit
- m3
- Ton unit
- metric
An aggregate tonnage calculator turns a known bulk volume of gravel, sand, or crushed stone into the mass you must order from a quarry or landscape yard. Enter the cubic volume you already measured or estimated, pick the material (or supply a supplier bulk density in kilograms per cubic metre), choose cubic metres, cubic yards, or cubic feet, and select metric tonnes, US short tons, or long tons as the primary ton unit. The tool converts volume to cubic metres, multiplies by bulk density to obtain kilograms, divides by the chosen ton factor, and also reports metric, short, and long ton equivalents so procurement teams can compare quotes written in different markets.
How aggregate tonnage is computed from volume and bulk density
Bulk tonnage for loose aggregate is mass, not solid mineral mass of a single rock fragment. The calculator first normalises your volume into cubic metres using exact conversion factors: one cubic metre stays one, one cubic yard becomes about zero point seven six four six cubic metres, and one cubic foot becomes about zero point zero two eight three cubic metres. It then multiplies that cubic-metre volume by bulk density in kilograms per cubic metre—the mass of the product as sold or as placed, including voids between particles.
Default presets cover common landscaping and construction quotes: gravel at one thousand six hundred eighty kilograms per cubic metre, sand at one thousand six hundred, and crushed stone at one thousand six hundred fifty. When you pass a density field, that override replaces the preset and is labelled as an override in the response so audits show which number drove the ticket.
Primary tons equal mass in kilograms divided by one thousand for metric tonnes, by about nine hundred seven point one eight for a US short ton of two thousand pounds, or by about one thousand sixteen point zero five for a long ton of two thousand two hundred forty pounds. The product is net geometric bulk mass only: it does not add waste for compaction, spillage, or uneven subgrade, and it does not invent a plan area from length and width—you already supply volume.
What you can do with it
Order quarry tons from a known stockpile volume
Estimators convert surveyed cubic metres of gravel, sand, or crushed stone into metric or short tons before calling the yard, using supplier density when available.
FAQ
How is aggregate tonnage calculated from volume?
Convert volume to cubic metres, multiply by bulk density in kg/m³ to get mass in kilograms, then divide by the ton factor (1000 kg for metric, ~907.18 kg for US short ton, ~1016.05 kg for long ton).
What materials and default densities are supported?
Pass density to override any preset with a supplier bulk density.
What happens if volume or density is zero or negative?
Non-positive volume or density cannot define a physical bulk load, so the tool never invents tons.
Does this add compaction or waste factors?
No. It returns pure bulk mass from volume × density only.
Is the aggregate tonnage calculator free?
The browser tool is free and runs locally.
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/home/aggregate-tonnage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"volume":10,"material":"gravel"}'const res = await fetch("https://api.kit.forhosting.com/home/aggregate-tonnage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"volume": 10,
"material": "gravel"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/aggregate-tonnage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"volume": 10,
"material": "gravel"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/aggregate-tonnage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"volume":10,"material":"gravel"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"volume":10,"material":"gravel"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/aggregate-tonnage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"volume": 10,
"material": "gravel"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.aggregate_tonnage",
"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
Zero or negative volume and density are rejected with invalid_input instead of inventing a delivery ticket.
How aggregate tonnage is computed from volume and bulk density
The response always includes metric_tons, short_tons, and long_tons so a single call can feed both European and North American order forms. All numeric inputs must be strictly positive and finite within published absolute limits so intermediate products stay finite in IEEE double precision on the Worker and in the browser.
How to call the API and read the response
String forms of numbers are accepted when they match a strict finite numeric pattern without unit suffixes or thousand separators. POST a JSON body with two required fields: volume (aliases vol, v, qty, quantity, cubic) as a finite positive number, and material as gravel, sand, or crushed_stone (spaces and hyphens are accepted, for example crushed stone). Optional density (aliases rho, bulk_density, mass_density, kg_m3) overrides the material preset and must also be positive when present. Optional volume_unit defaults to m3 and also accepts yd3 and ft3 with common aliases such as cubic yard or cu ft. Optional ton_unit defaults to metric and also accepts short or long with aliases such as us, short_ton, imperial, or tonne. On success the body echoes rounded volume, material, density, density_source (preset or override), volume_unit, and ton_unit; publishes volume_m3, mass_kg, tons for the primary unit, plus metric_tons, short_tons, and long_tons; and includes formula, message, and steps as an ordered substitution log you can assert in tests or show on a quote. Failed validation—missing material or volume, non-finite numbers, zero or negative values, unknown material or unit tokens, or values outside absolute limits—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request with unit item. Prefer sending bare numbers when you control the client; convert mixed unit drawings to one volume unit before the call rather than mixing cubic feet of volume with a density that was quoted per cubic yard without conversion.
Practical tips, limits, and when to use this calculator
rather than “how many cubic metres for this pad?” Keep volume and density inside the published absolute range so products cannot overflow into non-finite results the solver must reject. Prefer sibling area-and-depth calculators when you still need volume from footprint and thickness; prefer this capability when volume is already known and procurement needs tonnage in one or more ton definitions. Round-trip checks are easy: convert volume to cubic metres by hand, multiply by density, divide by the ton factor, and confirm the published tons fields match within the same twelve-decimal rounding used for all numeric outputs. Measure or estimate bulk volume from drawings, stockpile surveys, or a prior area-times-depth take-off, then call this endpoint when the question is already “how many tons for this cubic quantity?” Use the supplier’s bulk density whenever the quote sheet lists one; fall back to the material preset only for early ballpark estimates and note density_source in your paperwork. If the contractor requires five or ten percent extra for compaction or waste, multiply tons yourself after the call so the geometric mass stays transparent. When teaching or writing tests, pair a metric cubic-metre gravel case with a cubic-yard sand case and a deliberate zero volume to prove the invalid_input path. This landing targets people searching for an aggregate tonnage calculator, volume to tons for gravel sand or crushed stone, or bulk density tonnage conversion online; it is not a plan-area gravel depth tool, not a concrete bag estimator, not a soil swell calculator, and not a structural rebar weight check. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you deliberately send a bad material string to verify error handling.
Integration use cases
Compare metric and US short-ton quotes
Procurement teams run one volume through the API and read metric_tons and short_tons side by side when suppliers quote in different ton definitions.
Golden fixtures for construction apps
Developers generate known-good volume-to-ton cases plus deliberate non-positive volume rejections for unit tests and CI against the isomorphic solve module.