Polymeric sand calculator
This polymeric sand calculator estimates how many whole bags are needed to fill the joints in a paver patio, path, or similar paved surface.
Run — free
Enter the paver length and width, average joint width, and total project area. The calculator models the repeating paver-and-joint pattern, estimates joint volume, converts that volume to sand weight, adds a practical allowance, and rounds up to purchasable bags. Defaults are provided for joint depth, bulk density, bag weight, and waste, but product-specific values should be used whenever they are available.
Measure the paved layout consistently
Start with the finished paved area in square metres, excluding large sections that will not contain pavers, such as planting beds or permanent structures. Measure one representative paver’s length and width in millimetres, then measure the clear gap between neighbouring pavers for the joint width. Use the average installed gap rather than the nominal spacer size when existing work varies. The calculator treats each paver and its surrounding share of joints as a repeating rectangular module. It compares the paver face with that module to estimate what fraction of the total surface consists of joints. This geometric method is more useful than applying one universal coverage figure because small pavers create more joint length per square metre than large pavers. Keep all linear dimensions in millimetres and the total area in square metres, as labelled. For mixed paver formats, run each substantial section separately using its dominant paver size, then add the resulting required sand weights before rounding for purchasing. Curves, borders, and irregular patterns usually justify a slightly larger waste allowance.
Use product and installation assumptions that match the job
Paver size, joint width, and patio area determine the joint footprint, but they do not by themselves determine the number of bags. The joints also have depth, sand has a bulk density, and products come in different bag weights. This calculator therefore exposes those assumptions instead of hiding them. Joint depth defaults to 25 millimetres, bulk density to 1.6 kilograms per litre, bag weight to 20 kilograms, and waste to 10 percent. Replace those figures with the manufacturer’s stated values and the actual prepared joint depth whenever possible. Measure depth after old material, bedding contamination, and loose debris have been removed. Polymeric sand normally needs adequate depth to lock correctly, but installation requirements vary by product, paver type, traffic, and climate. Bulk density is an estimating conversion, not a statement of cured performance. The waste allowance covers compaction, sweeping loss, uneven gaps, and small measurement errors. It should not be used to compensate for severely inaccurate area measurements or joints that have not been cleaned to a consistent depth.
Interpret the estimate before buying and installing
The result reports estimated joint surface area, joint volume in litres, net sand weight, weight after the waste allowance, the exact mathematical bag quantity, and whole bags required. Buy the whole-bag figure because partial retail bags are generally unavailable and opened polymeric sand can be vulnerable to moisture. The estimate assumes straight-sided rectangular pavers arranged as a regular repeating field. Tumbled edges, chamfers, permeable systems, unusually wide intersections, mixed modules, and deep voids can change actual consumption. Manufacturer coverage tables may incorporate the grading and compaction behaviour of a specific product, so compare this estimate with the bag label and follow the more job-appropriate guidance. Before installation, confirm that the selected sand supports the measured joint width and the paver application. This tool estimates material quantity only; it does not verify base preparation, drainage, weather conditions, activation water, or curing procedure. For a large project, a small test section provides the best calibration: record the area filled by one bag under real site conditions and revise the remaining purchase quantity accordingly.
What you can do with it
Plan a new patio
Estimate whole bags from the selected paver format, designed joint width, and measured project area before ordering materials.
Refill existing paver joints
Use measured cleaned-joint depth and actual gaps to estimate replacement polymeric sand after removing failed material.
Compare paver layouts
See how different paver sizes and joint widths change joint volume and polymeric sand demand for the same area.
FAQ
What does the calculator cost to use through the API?
The API base price is $0.002 per calculation. The browser version can use the same deterministic calculation locally.
Why does joint depth matter?
Joint depth directly controls volume. A joint filled twice as deep requires approximately twice as much sand when the other inputs remain unchanged.
Should I use the default bag weight and density?
Use the defaults for an early estimate only. Replace them with the net bag weight and bulk-density or coverage information supplied for the product you intend to buy.
Does the result include waste?
Yes. The default allowance is 10 percent and can be changed to reflect compaction, spillage, irregular joints, and site conditions.
Why can actual bag use differ from the estimate?
Real joints may vary in width and depth, while chamfered pavers, mixed patterns, residual joint material, compaction, and product grading all affect consumption.
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/polymeric-sand \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"paver_length":200,"paver_width":100,"joint_width":5,"area":40}'const res = await fetch("https://api.kit.forhosting.com/home/polymeric-sand", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"paver_length": 200,
"paver_width": 100,
"joint_width": 5,
"area": 40
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/polymeric-sand",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"paver_length": 200,
"paver_width": 100,
"joint_width": 5,
"area": 40
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/polymeric-sand", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"paver_length":200,"paver_width":100,"joint_width":5,"area":40}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"paver_length":200,"paver_width":100,"joint_width":5,"area":40}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/polymeric-sand", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"paver_length": 200,
"paver_width": 100,
"joint_width": 5,
"area": 40
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.polymeric_sand",
"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. |