Oxford Henry BMR calculator
Estimate your resting calories with the Oxford equations by Henry (2005), built on a broad multi-ethnic dataset: a 30-year-old man weighing 70 kg gets 1583.17 kcal, or 6.62 MJ, a day. Only weight, sex and age are needed. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Weight
- 70
- Sex
- Male
- Age
- 30
- Bmr kcal day
- 1,583.17 kcal/day
- Bmr mj day
- 6.62
- Equation
- oxford_henry
- Equation year
- 2,005
Basal metabolic rate is the energy your body expends at complete rest to sustain vital processes such as breathing, circulation, cellular repair and thermal regulation. The Oxford equations, published by Henry in 2005, estimate that daily calorie floor from body weight, biological sex and a discrete age band, using a large multi-ethnic dataset that deliberately reduced over-representation of European military cohorts found in older Schofield tables.
What the Oxford Henry equations compute and why they matter
The Oxford (Henry 2005) equations estimate basal metabolic rate from body mass, sex and chronological age band. For each combination of sex and band the formula is a simple linear model: BMR in megajoules per day equals coefficient a times weight in kilograms plus coefficient b. Six age bands are defined for each sex—zero to three years, three to ten, ten to eighteen, eighteen to thirty, thirty to sixty, and sixty and over—with lower bounds inclusive and upper bounds exclusive except for the open sixty-plus group.
Those coefficients come from a re-analysis of more than ten thousand BMR measurements that excluded heavily over-represented Italian military subjects from earlier Schofield databases and added thousands of observations from tropical and developing regions. The result is a resting energy floor, not total daily energy expenditure: it does not add exercise, non-exercise activity thermogenesis, the thermic effect of food or illness-related demand.
UK SACN guidance and many European dietetic manuals prefer Henry over older FAO tables for contemporary multi-ethnic adults because predicted values tend to run lower and closer to measured resting expenditure in validation cohorts. Use the number as a baseline, then layer activity factors or measured intake when you need a full calorie budget.
How to read your Oxford Henry result
Send three required fields: weight as a positive number in kilograms, sex as male or female (short forms m, f, man and woman are accepted), and age as a non-negative number of years at most one hundred thirty. Age is mapped automatically to the Henry band: for example age thirty selects the thirty-to-sixty band, age twenty-five selects eighteen-to-thirty, and age sixty selects the open sixty-plus band. There is no network hop, model call or randomness, so latency stays in the pure edge-parse band.
Pair this result with your own physical activity level multiplier if you need estimated total energy expenditure; this capability deliberately stops at BMR so product copy and clinical tools stay honest about what was measured.
Where it fits in real health and product workflows
Nutrition coaching apps collect onboarding anthropometrics and need a defensible resting calorie number that aligns with UK and European dietetic guidance before suggesting macros. Clinical research coordinators batch-convert study-subject measurements into BMR for secondary analysis without spreading spreadsheet formulas that diverge by cell or use outdated Schofield constants. Fitness platforms show members a transparent Oxford Henry baseline next to wearable burn estimates so users understand the resting floor versus the daily total.
Insurance and employer wellness portals can pre-fill educational calculators without shipping proprietary engines or calling external nutrition APIs. The browser path is free for single checks: enter seventy kilograms, male, age thirty, and confirm the thirty-to-sixty male coefficients produce a stable kcal-per-day figure.
What you can do with it
Onboarding calorie baselines
Convert weight, sex and age collected at signup into an Oxford Henry BMR before building a meal plan or macro target.
Wellness product transparency
Show users the exact age band, coefficients and kcal/day figure next to activity-adjusted totals in fitness dashboards.
FAQ
What does it cost?
The same calculation runs free in your browser on this page.
Which inputs does the formula expect?
Weight in kilograms (positive), sex as male or female (or m/f/man/woman), and age in years (non-negative, at most 130). Height is not required for the weight-only Oxford equations.
Is this total daily energy expenditure (TDEE)?
No. This returns basal metabolic rate only. Multiply by a physical activity level yourself if you need estimated TDEE.
Why was my request rejected?
Weight must be a positive number. Age must be non-negative and at most 130. Sex must be male or female (or m/f/man/woman).
How does Oxford Henry differ from Mifflin-St Jeor or Harris-Benedict?
Oxford Henry uses weight-only linear models stratified by six age bands and sex, derived from a large multi-ethnic dataset (Henry 2005). Mifflin and Harris-Benedict also use height and continuous age terms with different coefficients. This capability implements Oxford Henry only.
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/bmr-oxford-henry \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"weight":70,"sex":"male","age":30}'const res = await fetch("https://api.kit.forhosting.com/health/bmr-oxford-henry", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"weight": 70,
"sex": "male",
"age": 30
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/bmr-oxford-henry",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"weight": 70,
"sex": "male",
"age": 30
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/bmr-oxford-henry", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"weight":70,"sex":"male","age":30}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"weight":70,"sex":"male","age":30}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/bmr-oxford-henry", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"weight": 70,
"sex": "male",
"age": 30
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.bmr_oxford_henry",
"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 capability applies the published weight-only coefficients exactly: no fitness-tracker guesswork, no third-party nutrition API and no hidden activity multipliers.
How to call the API and interpret the fields
Aliases such as weight_kg, kg, mass, years, age_years and gender map to the same parameters so existing forms wire in without renaming. Non-positive weight fails immediately with invalid_input and is not charged; missing or unparseable sex or age also raise invalid_input with a clear field name. A successful response returns bmr_kcal_day and bmr_mj_day rounded to two decimal places, the normalized sex, the numeric weight and age used, the age_band label, the coefficients a and b applied, a human-readable formula string, the unit label kcal/day, and method and equation identifiers for audit trails.
Where it fits in real health and product workflows
Developers embed the call in scheduled jobs and webhooks so every microservice shares one definition of Henry 2005 instead of reimplementing float-sensitive multiplies that disagree on rounding and unit conversion. The API path costs $0.002 per successful request and is billed per item, which keeps bulk onboarding scripts cheap while still covering edge execution.
Integration use cases
Clinical and research pipelines
Batch-compute resting energy estimates for study subjects with audited Henry 2005 coefficients and stable JSON output.