Epley one-rep max calculator
Lifting 100 kg for 5 clean reps puts your Epley one-rep max at about 116.67 kg. Enter the weight and reps of a hard set to plan your training percentages without risking a true max test. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Weight
- 100
- Reps
- 5
- One rep max
- 116.67
- Equation
- 1RM = weight × (1 + reps / 30)
- Decimal places
- 2
- Unit note
- same unit as weight (kg or lb)
A one-repetition maximum, or 1RM, is the heaviest load you can lift for a single clean repetition of a given exercise. Testing a true max every session is risky and fatiguing, so coaches and lifters estimate it from a submaximal set using a published formula. The Epley equation is one of the most widely taught estimators: one-rep max equals weight times one plus reps divided by thirty. This capability applies that formula exactly, offline and without randomness, from a positive weight and an integer rep count between one and thirty.
What the Epley formula estimates and when to trust it
The Epley one-rep max formula converts a successful multi-rep set into an estimated single-rep max. Algebraically it is one-rep max equals weight multiplied by one plus reps over thirty. Lifting one hundred for five clean reps therefore yields one hundred times one plus five over thirty, which is about one hundred sixteen point six seven after half-up rounding to two decimals.
The model assumes the set was performed near failure with solid technique; a deliberately easy set will understate true strength, and a grindy, form-breaking set will overstate it. Accuracy is best in the low-to-moderate rep range commonly used for strength work, roughly two through ten, and degrades as reps climb toward the upper bound this tool allows. Epley is unit-agnostic: enter kilograms or pounds and the estimate comes back in that same unit, so you never need a conversion step for programming.
This capability computes only the Epley estimator; it does not blend Brzycki, Lombardi, or other models, which keeps the landing and the machine contract focused on a single searchable intent. Use the result as a planning number for percentage-based loading, not as a medical diagnosis or a guarantee of a safe maximal attempt. Always warm up, progress loads gradually, and stop if pain or technique breaks down.
Where an Epley 1RM calculator fits in real workflows
Strength coaches and personal trainers convert a recent five-rep or three-rep working set into an Epley estimate before writing the next block of percentage-based sessions. Fitness apps collect onboarding lift history and need a defensible one-rep max without forcing users into a risky true max test on day one. Research and club logging pipelines batch-score many sets from a season of training so progression charts show estimated max over time instead of raw load alone.
The browser path is free for single interactive checks: enter one hundred for weight and five for reps and confirm the classic one hundred sixteen point six seven result at two decimals.
What you can do with it
Program percentage-based training loads
Turn a submaximal set into an Epley 1RM, then derive session loads as percentages of that estimate for the next training block.
Onboard lifters without a true max test
Estimate one-rep max from a safe multi-rep set during app or gym onboarding instead of forcing a single maximal attempt.
FAQ
What is the Epley one-rep max formula?
One-rep max equals weight times (1 + reps / 30). Example: 100 for 5 reps yields about 116.67 at two decimal places.
Which inputs are required?
Positive weight (same unit you lift in) and integer reps from 1 to 30. Optional decimals (0–4, default 2) controls rounding.
Does the unit matter, kilograms or pounds?
No. The formula is unit-agnostic; the estimate is returned in whatever unit you used for weight.
How many reps give the most accurate Epley estimate?
Roughly 2 to 10, the range used for most strength work. You can enter up to 30 reps, but the estimate becomes less reliable the closer you get to that limit.
Does it matter how hard the set was?
Yes. The formula assumes you finished the set close to failure with solid technique. An easy set will understate your strength, and a grinding set where your form broke down will overstate it.
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/one-rep-max-epley \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"weight":100,"reps":5}'const res = await fetch("https://api.kit.forhosting.com/health/one-rep-max-epley", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"weight": 100,
"reps": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/one-rep-max-epley",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"weight": 100,
"reps": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/one-rep-max-epley", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"weight":100,"reps":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"weight":100,"reps":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/one-rep-max-epley", 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": 100,
"reps": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.one_rep_max_epley",
"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 get a transparent estimate in the same unit you entered, suitable for programming percentages, logging progress, or batching a training history through the API. Failed validation returns a clear invalid_input error and is not billed.
Input fields, rounding, and error behaviour
Optional decimals, an integer from zero through four defaulting to two, controls how many fractional digits appear on the rounded one-rep max. There is no network hop, model call, clock read, or random source on the path, so latency stays in the pure edge-parse band and repeated calls never drift. Send a JSON object with two required fields: weight, a positive finite number for the load lifted, and reps, an integer from one through thirty for completed repetitions. Aliases such as load, mass, or w for weight and repetitions, r, or n for reps map to the same parameters so existing forms wire in without renaming. Non-positive weight, missing fields, non-integers for reps, reps outside one to thirty, and invalid decimals all fail immediately with invalid_input naming the problem; those failures are not charged against prepaid balance. On success the response echoes weight and reps, returns one_rep_max after half-up rounding, labels formula as epley, restates the equation string, echoes decimals, and includes a unit_note reminding you that the estimate shares the unit of the weight you entered. Pair the estimate with your own percentage tables if you need working sets at seventy, eighty, or ninety percent of estimated max; this endpoint stops at the Epley 1RM so product copy stays honest about what was computed.
Where an Epley 1RM calculator fits in real workflows
Developers embed the call in CRON jobs and webhooks so every microservice shares one definition of Epley rather than reimplementing float-sensitive multiplies that disagree on rounding. The API path costs $0.002 per successful request and is billed per item, which keeps bulk log scoring cheap while still covering edge execution. Because results are deterministic, audit logs can store the full response and re-run it years later without drift, and continuous-integration goldens pin exact JSON for regressions whenever the library is touched.
Integration use cases
Batch-score a training log
Feed each logged set through the API to chart estimated 1RM progression over weeks without hand-calculating Epley each time.
Technical questions
What happens with invalid input?
The task fails with invalid_input and a clear message (for example missing weight or reps out of range). Invalid input is not billed.
What does the Epley 1RM calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; failed validation is not charged.