Training impulse TRIMP calculator
An hour at 70% of heart-rate reserve gives a man a Banister training impulse of just over 100 units, one number you can add up across a week of sessions. Enter minutes, reserve fraction and sex. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Duration min
- 60
- Hrr fraction
- 0.7
- Sex
- Male
- Weighting a
- 0.64 AU
- Weighting b
- 1.92
- Weighting y
- 2.4539841744
- Trimp
- 103.0673353252
The Banister training impulse, usually written TRIMP, turns a workout's length and how hard the heart worked into one comparable session-load number. Coaches, sports scientists, and endurance athletes use that score to add Monday's tempo run to Wednesday's intervals without pretending every minute is equal. This calculator applies the original Banister exponential model: duration in minutes times the heart-rate reserve fraction times a sex-specific weighting y equals 0.64 e to the 1.92 ΔHR for males or 0.86 e to the 1.67 ΔHR for females.
What Banister TRIMP measures and which inputs you need
Training impulse is a session-load score, not a target heart-rate zone and not a calorie estimate. Banister's original model asks two training questions and one biological one. How long did the athlete work, in minutes?
How large a share of heart-rate reserve did that work use, as a fraction from rest at zero to maximum at one? And which sex-specific exponential weighting should scale those minutes so that time near maximum heart rate counts more than the same minutes spent easy? Heart-rate reserve fraction, often written ΔHR, is exercise heart rate minus resting heart rate, divided by maximum heart rate minus resting heart rate.
Sex must be male or female; the engine also accepts m, f, man, and woman, then canonicalizes to male or female. Duration must be a positive finite number of minutes, at most ten thousand eighty, which is seven continuous days and is only a safety cap for ultra-endurance logs. The reserve fraction must lie in the closed interval from zero to one; send zero point seven, not seventy.
Where a training load score helps
Coaching platforms and training logs use a Banister TRIMP calculator so each session stores one load number next to duration and average reserve fraction, then weekly and monthly sums become simple additions instead of informal labels such as hard or easy. Wearable and lab pipelines that already compute ΔHR from measured exercise, rest, and maximum heart rates can send that fraction here instead of re-implementing the exponential in every language. Failed validation does not consume balance.
Keep requests small, pin the rounded trimp in tests, and treat the score as an educational planning tool rather than a diagnostic medical device: people with cardiac conditions, rate-altering medication, or physician restrictions should follow professional advice rather than any single impulse formula alone.
What you can do with it
Coaching logs and weekly load sums
Store one Banister TRIMP per session from duration and reserve fraction, then add the scores across a microcycle without treating every minute as equal.
FAQ
What is the Banister training impulse (TRIMP) formula?
TRIMP equals duration in minutes times the heart-rate reserve fraction ΔHR times a sex-specific weight y.
What is heart-rate reserve fraction ΔHR?
ΔHR is (exercise heart rate − resting heart rate) / (maximum heart rate − resting heart rate). It is a fraction from 0 at rest to 1 at maximum. Send 0.70 for seventy percent of reserve, not 70.
Why does the calculator require sex?
Banister published different exponential coefficients for males and females.
How do I use TRIMP to track a training week?
Store one score for each session and add them up across the week or month. Because hard minutes weigh more than easy ones, the sum compares an interval day and a long easy run fairly.
Is a TRIMP score the same as calories burned?
No. It is a session-load number in arbitrary units, not a calorie estimate and not a target heart-rate zone. Use it to compare and add up training loads, not to plan meals.
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/health/training-impulse-trimp \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"duration_min":60,"hrr_fraction":0.7,"sex":"male"}'const res = await fetch("https://api.kit.forhosting.com/health/training-impulse-trimp", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"duration_min": 60,
"hrr_fraction": 0.7,
"sex": "male"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/training-impulse-trimp",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"duration_min": 60,
"hrr_fraction": 0.7,
"sex": "male"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/training-impulse-trimp", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"duration_min":60,"hrr_fraction":0.7,"sex":"male"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"duration_min":60,"hrr_fraction":0.7,"sex":"male"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/training-impulse-trimp", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"duration_min": 60,
"hrr_fraction": 0.7,
"sex": "male"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.training_impulse_trimp",
"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
You send duration_min, hrr_fraction between zero and one, and sex. The response echoes the inputs, reports the weighting y, and returns the TRIMP score with a short formula string. The path is pure arithmetic—no network, no random seed, no clock—so coaching apps and lab notebooks get identical JSON every time. Invalid duration, a reserve fraction outside zero to one, or an unrecognized sex fails with invalid_input and is not billed.
What Banister TRIMP measures and which inputs you need
A steady aerobic hour at seventy percent of reserve is duration_min sixty and hrr_fraction zero point seven; a short all-out effort at reserve fraction one is a smaller duration with a larger weighting. Send required fields duration_min, hrr_fraction, and sex as a JSON object. Aliases duration, minutes, time_min, mins, and duration_minutes work for duration; hrr, delta_hr, fraction, intensity, and hr_reserve work for the reserve fraction; gender and sex_at_birth work for sex. Identical inputs always yield identical JSON because the algorithm never touches the network, a model, a clock, or a random generator.
Reading the Banister formula, the response fields, and the errors
On paper the Banister score is duration times ΔHR times y, where y is an exponential weight that grows with reserve fraction. For males y equals 0.64 times e to the power of 1.92 times ΔHR. For females y equals 0.86 times e to the power of 1.67 times ΔHR. The unit field is AU, arbitrary units, because TRIMP is a constructed load index rather than a physical SI quantity. The formula field restates the identity with both coefficient pairs, and method is always banister so downstream code can branch without sniffing shapes. Those two published coefficient pairs are the reason sex is required: the same sixty minutes at the same reserve fraction is not the same TRIMP for a male athlete and a female athlete, and this endpoint will not silently pick a default. On success the body echoes duration_min, hrr_fraction, and sex, then reports weighting_a and weighting_b so you can show the constants that were used, weighting_y as the evaluated exponential, and trimp as the session score. Missing fields, non-finite values, a non-positive duration, a duration above the seven-day cap, a reserve fraction outside zero to one, and an unrecognized sex all fail with invalid_input naming the field. Those failures are not billed. Do not confuse this endpoint with Edwards zone TRIMP, Lucia TRIMP, Banister's fitness-fatigue convolution over a season, or a Training Stress Score from power: those are different intents and different formulas.
Where a training-impulse API earns its keep
Sports-science classrooms ask students to recompute a worked example by hand and then call this endpoint as an oracle: sixty minutes at seventy percent of reserve for a male athlete must match the same weighting_y and trimp every time, which is why the implementation is pure parse with no clock. Because the implementation is tier A parse, every successful call costs the published $0.002 base price with no model tokens and no outbound network.
Integration use cases
Sports-science homework and lab oracles
Students recompute male and female Banister examples by hand and pin expected JSON against this deterministic training impulse TRIMP calculator.
Wearable and coaching SaaS backends
Pipelines that already know ΔHR call a prepaid endpoint for trimp instead of duplicating the sex-specific exponential in every service language.
Technical questions
What happens if hrr_fraction is greater than 1?
The task fails with invalid_input. A reserve fraction above 1 is not a valid share of heart-rate reserve; send a value between 0 and 1 inclusive. Invalid input is not billed.
What does the training impulse TRIMP calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.