Download time calculator
Estimate how long a file takes to transfer: 10 MB over a 10 Mbps line takes 8 seconds, not 1, because the speed counts bits and the file counts bytes. Decimal and binary units both work. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Size
- 10
- Size unit
- MB
- Speed
- 10
- Speed unit
- Mbps
- Seconds
- 8
- Hours
- 0
- Minutes
- 0
- Remaining seconds
- 8
free online
Why bits and bytes change the answer
Connection speeds are usually quoted in bits per second, while file sizes are given in bytes, and mixing the two is the most common reason an estimate goes wrong. A byte is eight bits, so speeds in bits per second, such as bps, Kbps, Mbps or Gbps, are divided by eight to reach bytes per second, while speeds already in bytes per second are used as they are. That is why 10 MB over a 10 Mbps line takes 8 seconds rather than one: 10 megabytes are 80 megabits. If you do not change anything, the size is read in MB and the speed in Mbps, which matches how home internet speeds are normally advertised.
File units and how to read the result
File sizes come in two families. The decimal units KB, MB, GB and TB grow by powers of 1000, so a MB is 1,000,000 bytes. The binary units KiB, MiB, GiB and TiB grow by powers of 1024, so a MiB is 1,048,576 bytes. The result gives the total time in seconds, rounded to three decimals, the same time split into hours, minutes and seconds, and a short label such as 1h 5m 3s or simply 8s for quick transfers. It also shows the size in bytes and the speed in bytes per second, so you can verify the conversion. Use it before starting a backup or a large media file, or to compare plans before an upgrade.
From seconds to a readable duration
The human field is assembled from those parts: it shows hours only when present (for example 1h 5m 3s), minutes and seconds when under an hour, and just seconds for short transfers, exactly as the reference example turns 10 MB at 10 Mbps into seconds 8 and human 8s. This gives you both a precise numeric duration for further math and a compact label ready to display in a UI or log line, without any locale-specific formatting.
What you can do with it
Sizing a transfer
Estimate how long a backup, ISO or media file will take on a given connection before you start it, using the units your bandwidth is quoted in.
Bandwidth planning
Compare durations across Mbps tiers or byte-per-second links to justify an upgrade, reading the resolved bytes-per-second to check the math.
FAQ
Why does 10 MB at 10 Mbps take 8 seconds, not 1?
Mbps is megabits per second; the tool divides bit-based speeds by 8. 10 MB is 80 megabits, so at 10 Mbps it is 8 seconds.
What is the human field?
A readable duration string like 8s or 1h 5m 3s, built from the hours, minutes and secs breakdown with correct carry.
Does it account for overhead or latency?
No. It models ideal throughput only, so real transfers may be slower. Inputs are validated and results are deterministic.
What is the difference between MB and MiB for a file?
MB is a decimal unit of 1,000,000 bytes, while MiB is a binary unit of 1,048,576 bytes. Choose the unit your file size is really shown in, because picking the other one shifts the estimate.
How can I compare download times across internet plans?
Keep the same file size and change only the speed, for example between Mbps tiers. The tool also shows the size in bytes and the speed in bytes per second, so you can check the conversion behind each estimate.
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/dev/download-time \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"size":10,"speed":10}'const res = await fetch("https://api.kit.forhosting.com/dev/download-time", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"size": 10,
"speed": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/download-time",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"size": 10,
"speed": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/download-time", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"size":10,"speed":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"size":10,"speed":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/download-time", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"size": 10,
"speed": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.download_time",
"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
Estimates how long a transfer takes by converting size (with size_unit) to bytes and speed (with speed_unit) to bytes per second, dividing to get seconds, and returning an h/m/s breakdown plus a human-readable string.
Units: decimal, binary, bits and bytes
Size is read with size_unit, which accepts decimal units B, KB, MB, GB and TB (powers of 1000) as well as binary units KiB, MiB, GiB and TiB (powers of 1024), so a MB is 1,000,000 bytes while a MiB is 1,048,576. Speed is read with speed_unit and handles the bit-versus-byte distinction that trips up most estimates: bit-per-second units bps, Kbps, Mbps and Gbps are divided by 8 to reach bytes per second, while byte-per-second units Bps, KBps, MBps and GBps are used directly. That is why 10 MB over a 10 Mbps line is not one second but eight: 10 MB is 80 megabits. The defaults are MB for size and Mbps for speed, matching how consumer bandwidth is usually quoted, and the output reports the resolved size_bytes and speed_bytes_per_sec so you can verify the conversion.
From seconds to a readable duration
After converting, the tool computes size_bytes divided by speed_bytes_per_sec to get raw seconds, then rounds that to three decimals as the seconds field. It splits the total into whole hours and minutes and a fractional secs value, carrying overflow correctly so a secs that reaches 60 rolls into minutes and a minutes that reaches 60 rolls into hours.
Validation, rounding and determinism
Both size and speed must be finite numbers strictly greater than zero, and size_unit and speed_unit must be one of the enumerated keys; an unknown unit or a non-positive number throws a typed invalid_input error naming the problem, and a zero effective speed is guarded against division by zero. The calculation is a pure model of ideal throughput with no protocol overhead, latency, congestion or ramp-up, which keeps it fully deterministic: identical inputs always yield identical JSON.
Integration use cases
In-app estimates via API
Call the endpoint to show users a live 'about 8s' style estimate, feeding the human field straight into the interface.
Technical questions
Does it support binary units like MiB and GiB?
Yes. size_unit accepts decimal B/KB/MB/GB/TB (x1000) and binary KiB/MiB/GiB/TiB (x1024); speed_unit covers bps to Gbps and Bps to GBps.
Is the browser tool free?
Yes, the widget is free (tier A). The API runs on prepaid KIT balance from $0.002, charging only successful tasks.