Race predictor
A 10 km run in 40 minutes points to about 1:28:15 for a half marathon: this predictor turns one real result into a finish estimate at another distance with Riegel's 1977 formula. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Known distance
- 10
- Known time
- 2,400
- Target distance
- 21.0975
- Predicted time
- 5,295.36739456
- Predicted time formatted
- 1:28:15
- Distance ratio
- 2.10975
- Exponent
- 1.06
A race predictor answers the planning question every endurance athlete asks after a result: if I just ran this distance in this time, what should I expect at a different distance? Pete Riegel's 1977 power-law model remains the standard shortcut for that conversion. It takes a known race distance, a known finish time, and a target distance, then estimates the new finish time as T2 equals T1 times the ratio D2 over D1 raised to the power one point zero six. Distances may be kilometres, miles, or metres as long as both distances share the same unit; the time is a duration in seconds.
How the Riegel race predictor scales a known result
The Riegel race predictor converts one completed race into an estimated finish at a different distance using a published power law rather than a linear pace copy. You supply a known distance D1, a known finish time T1 in seconds, and a target distance D2. Distances may be kilometres, miles, metres, or any other length unit as long as both distances use the same unit, because the model only needs the dimensionless ratio D2 divided by D1.
The predicted finish time is T2 equals T1 multiplied by that ratio raised to the endurance exponent one point zero six. An exponent a little above one is the reason this tool exists: average pace is not constant as races get longer. Copying a ten-kilometre pace straight into a marathon almost always underestimates the clock, and copying a marathon pace straight into a five-kilometre almost always overestimates how slow the short race should be.
Riegel's 1977 identity slows projected pace as distance grows and quickens it as distance shrinks, without heart-rate files, VO2max estimates, or a multi-week training log. The arithmetic is one division, one power, and one multiply. There is no network call, no random seed, and no calendar Date in the result.
Frame every output as a planning estimate: hills, weather, fueling, and fitness changes can move a real clock well away from any closed-form projection.
Where a race predictor earns its keep in sport
Club coaches and self-coached runners need a reproducible race predictor so a winter ten-kilometre, a spring half-marathon goal, and a race-week briefing never disagree on the clock they wrote down. Event apps that show projected finish bands for pacing groups want a documented formula athletes can recompute by hand, not a black-box machine-learning estimate that changes when a model is retrained. Data engineers preparing synthetic race datasets for pacing dashboards need deterministic finish labels from known distances and times without network calls or model drift.
Failed validation does not consume balance. If you later need pure pace unit conversion, age-graded scoring, or multi-race custom exponent fitting, treat those as separate search intents rather than overloading this race predictor page.
What you can do with it
Next-race goal times
Turn a recent five-kilometre or ten-kilometre result into a half-marathon or marathon planning time you can write into a training block and a race-week briefing.
Pacing bands and event apps
Show projected finish bands for pacing groups from a documented Riegel identity athletes can recompute by hand, instead of a black-box estimate.
FAQ
How does the race predictor estimate a finish time?
Send a known distance, a known finish time in seconds, and a target distance in the same length unit. The predictor returns T2 = T1 × (D2/D1)^1.06, the classic Riegel power law, as seconds plus a clock string.
What units should I use for distance and time?
Clock strings such as 40:00 are not parsed as input.
What happens if a distance or time is zero or negative?
A real race cannot have a non-positive distance or finish time, so those values are rejected and are not billed.
Can I predict a shorter race from a longer one?
Yes. When the target is shorter than the known race, the distance ratio is less than one and the formula predicts a faster absolute time with a slightly quicker average pace. The exponent stays 1.06 either way.
Why doesn't my 10 km pace simply carry over to a half marathon?
Because average pace slows as races get longer. Riegel's formula raises the distance ratio to the power 1.06, so 40 minutes for 10 km becomes about 1:28:15 for 21.0975 km, a little slower than copying the same pace.
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/sports/race-predictor \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"known_distance":10,"known_time":2400,"target_distance":21.0975}'const res = await fetch("https://api.kit.forhosting.com/sports/race-predictor", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"known_distance": 10,
"known_time": 2400,
"target_distance": 21.0975
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/sports/race-predictor",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"known_distance": 10,
"known_time": 2400,
"target_distance": 21.0975
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/sports/race-predictor", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"known_distance":10,"known_time":2400,"target_distance":21.0975}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"known_distance":10,"known_time":2400,"target_distance":21.0975}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/sports/race-predictor", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"known_distance": 10,
"known_time": 2400,
"target_distance": 21.0975
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "sports.race_predictor",
"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
This race predictor applies that identity with no network, no model tokens, and no calendar clock, so a training spreadsheet, a race-week landing page, and an API client receive the same number. Non-positive distances or times fail with invalid_input and are not billed. Successful calls cost $0.002.
How the Riegel race predictor scales a known result
Zero, negative, missing, or non-finite inputs cannot describe a real race, so they fail with invalid_input instead of inventing a finish time.
Input contract, units, and the predicted-time response
Convert hours and minutes to total seconds before you call: a forty-minute ten-kilometre is two thousand four hundred seconds, and a three-hour marathon is ten thousand eight hundred seconds. Classic smoke checks include a ten-kilometre race in two thousand four hundred seconds projected to a half marathon at twenty-one point zero nine seven five kilometres, and a five-kilometre race in one thousand two hundred seconds projected to ten kilometres; both produce stable positive predicted times suitable for answer keys. Prefer bare numbers over formatted strings; percent signs, thousands separators, and clock strings such as 40:00 are not parsed as input. POST a JSON body with three required finite positive numbers. known_distance is the length of the race you already finished; aliases distance1, d1, and known_d are accepted. known_time is that finish in seconds; aliases time1, t1, known_time_seconds, and seconds are accepted. target_distance is the race length you want to predict, in the same unit as known_distance; aliases distance2, d2, and target_d are accepted. Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, non-numeric values, NaN, Infinity, zero, and negatives fail with invalid_input naming the field and are not billed. On success the body returns predicted_time as the cleaned second count, predicted_time_formatted as an H:MM:SS or M:SS clock string, the cleaned known_distance, known_time, and target_distance, the distance_ratio D2 over D1, the fixed exponent one point zero six, and a formula string you can print next to the answer. Pricing for a successful item is a flat $0.002.
Where a race predictor earns its keep in sport
Sports-science classrooms still teach Riegel scaling next to VDOT tables and critical-speed models, so matching hand arithmetic to API output matters more than asymptotic cost. Keep requests small, pin predicted_time in tests, and you get stable endurance arithmetic for widgets, recap pages, and edge workers without standing up a full training-platform service of your own.
Integration use cases
Coaching sheets and sports APIs
Pin known-good Riegel pairs in a spreadsheet or regression suite so a training journal, a widget, and a backend never disagree on the predicted clock.
Technical questions
What does the race predictor cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.