ETA calculator
Leave at 09:30 with 180 km to go at an average of 90 km/h and you arrive at 11:30: the calculator adds the travel time to your leave time and gives an arrival clock to share with a passenger, hotel or receiver. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Departure time
- 09:30
- Remaining distance
- 180
- Average moving speed
- 90
- Departure hour
- 9
- Departure minute
- 30
- Travel time hours
- 2
- Travel time minutes
- 120
An estimated time of arrival calculator answers a simple travel question: if you leave at a known clock time with a given remaining distance and a realistic average speed, what clock time should you expect to arrive? Enter a 24-hour departure such as 09:30, the kilometres or miles still ahead, and your expected moving rate in matching units per hour; the tool divides distance by speed for pure travel hours, adds that duration to the departure clock with midnight wrap, and returns a zero-padded arrival time, day offset, duration labels, and substitution steps.
What estimated arrival clock time means
Estimated time of arrival in this tool is a closed-form clock result, not a live traffic feed. You supply when you leave on a 24-hour clock, how much distance remains, and the average speed you expect while moving. Travel time is remaining distance divided by average speed when both share a consistent unit system—kilometres with kilometres per hour, or miles with miles per hour.
Rejecting zero or negative speed protects callers from silent infinity, which would corrupt calendars, dispatch boards, and billing scripts that assume a finite positive travel interval. Compared with a pure driving-duration tool that only returns an offset in hours, this landing targets people who already have a leave time and need the arrival clock printed for the passenger, hotel, or receiver.
What you can do with it
Passenger and hotel check-in windows
Travellers enter leave time, remaining highway distance, and a conservative average speed to share a realistic arrival clock before booking dinner or early check-in.
Courier and last-mile dispatch
Dispatch scripts convert remaining leg distance and fleet average speed into an arrival HH:MM for the receiver without calling a maps vendor on every ping.
Classroom constant-velocity ETA problems
Teachers generate deterministic arrival-clock answers for distance-over-speed homework and show zero-speed rejection as a validation lesson.
FAQ
What happens if average speed is zero or negative?
Zero or negative speed cannot produce a finite travel time or arrival clock.
Does this use live traffic or GPS?
No. It is a closed formula on the three inputs you supply. No maps, no Date, and no network inside the solver.
Is the ETA calculator free?
The browser tool is free and runs locally.
What if the trip runs past midnight?
The arrival still comes out as a valid 24-hour time, and a day offset tells you it falls on the next day. A long overnight drive therefore never shows an impossible clock time.
Which units should distance and speed use?
The same family: kilometres with kilometres per hour, or miles with miles per hour. The tool divides one by the other without converting, so mixing miles with km/h gives a wrong arrival time.
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/travel/eta-calculator \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"remaining_distance":180,"average_speed":90}'const res = await fetch("https://api.kit.forhosting.com/travel/eta-calculator", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"remaining_distance": 180,
"average_speed": 90
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/eta-calculator",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"remaining_distance": 180,
"average_speed": 90
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/eta-calculator", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"remaining_distance":180,"average_speed":90}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"remaining_distance":180,"average_speed":90}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/eta-calculator", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"remaining_distance": 180,
"average_speed": 90
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.eta_calculator",
"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_distance | 1000000 |
max_speed | 10000 |
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 average speed is rejected with invalid_input because division by zero cannot produce a finite arrival.
What estimated arrival clock time means
That duration is added to the departure minutes since midnight; if the sum crosses midnight the response advances day_offset and still prints a valid HH:MM arrival. The model does not query congestion, weather, border queues, or elevation profiles; it is a transparent formula so planners and students can recompute the hours by hand and trust the same answer in the browser and on the API.
How to call the API and what comes back
Send a JSON body with remaining_distance (aliases distance, remaining, dist, d, leg_distance) and average_speed (aliases speed, avg_speed, v, velocity) as finite positive numbers within the published maxima. Provide departure either as departure_time string HH:MM (aliases depart, leave_at, start_time, time_out) or as departure_hour zero through twenty-three with optional departure_minute zero through fifty-nine defaulting to zero. On success the response echoes departure_time, departure_hour, departure_minute, rounded remaining_distance and average_speed, travel_time_hours, travel_time_minutes, a compact travel_time_formatted label, arrival_time as HH:MM, arrival_hour, arrival_minute, day_offset, day_note, the formula string arrival equals departure plus remaining_distance over average_speed, a short English message, and ordered substitution steps. Failed validation—missing departure, missing distance or speed, non-finite numbers, out-of-range values, malformed clock strings, or zero or negative speed—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request with unit item and zero marginal unit price.
Practical tips, limits, and related searches
Keep remaining distance and average speed in the same unit family; mixing miles of road with kilometres per hour silently warps the hours without the solver detecting the mismatch, because the formula is unit-agnostic by design. Prefer a conservative average speed when planning family pickups or tight check-in windows rather than the posted highway maximum. Absolute limits reject absurd inputs that would overflow intermediate results: multi-million unit distances or impossible speeds. Prefer this capability when you already know when you leave and need the arrival HH:MM; if you only need hours of driving without a clock, use a road-trip duration calculator instead. Use departure_time for human forms that collect a single clock field, and departure_hour plus departure_minute when your client already stores integers. Multi-day hauls simply increase day_offset while still returning a correct clock face. This landing targets people searching for an estimated time of arrival calculator, ETA from departure and speed, or arrival clock time online; it is not a turn-by-turn navigator, not a live traffic ETA, and not a pure duration-only road-trip offset tool that omits the leave clock. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you deliberately send speed zero to verify error handling.
Technical questions
How is estimated arrival time calculated?
Travel hours equal remaining_distance divided by average_speed. That duration is added to your departure clock on a 24-hour face; day_offset counts midnights crossed.
Can I send hour and minute instead of a HH:MM string?
Yes. Provide departure_hour (0–23) and optional departure_minute (0–59, default 0) when you omit departure_time.