Skinfold body fat calculator
A 30-year-old man whose seven skinfolds add up to 91 mm has a body density of 1.068323 and 13.34 % body fat by the Jackson-Pollock seven-site method. Age and sex adjust the result. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Sex
- Male
- Age
- 30
- Chest mm
- 10
- Midaxillary mm
- 12
- Triceps mm
- 8
- Subscapular mm
- 14
- Body fat percent
- 13.34
- Body density
- 1.068323
- Sum mm
- 91
The Jackson-Pollock seven-site skinfold method estimates body fat percentage from caliper readings at the chest, midaxillary, triceps, subscapular, abdomen, suprailiac, and thigh, together with age and biological sex. Unlike the US Navy circumference formula, which never uses a caliper, and unlike the Parrillo nine-site sum, which ignores age and sex, this protocol converts the seven-site millimeter sum into body density with sex-specific regression coefficients and then into percent fat with the Siri equation. Coaches, clinics, and fitness apps that already take multi-site skinfolds need a deterministic oracle that refuses to invent a percentage when any fold is missing, zero, or not a positive number.
What the Jackson-Pollock 7-site formula computes
The Jackson-Pollock seven-site protocol estimates total body fat percentage from subcutaneous fat sampled at seven standardized landmarks, then adjusts that sum for age and biological sex through a body-density regression published by Jackson and Pollock for men and by Jackson, Pollock, and Ward for women.
Measure each site with calibrated skinfold calipers in millimeters: chest (diagonal fold on the pectoral, roughly between the anterior axillary line and the nipple), midaxillary (vertical fold on the midaxillary line at the level of the xiphoid process), triceps (vertical fold on the posterior midline of the upper arm, midway between acromion and olecranon), subscapular (diagonal fold just below the inferior angle of the scapula), abdomen (vertical fold about two centimeters to the right of the umbilicus), suprailiac (diagonal fold immediately above the iliac crest along the midaxillary line), and thigh (vertical fold on the anterior midline of the thigh, midway between the inguinal crease and the proximal border of the patella).
Age matters because the density of fat-free mass changes across adulthood; sex matters because the original samples produced different intercepts and slopes. The result is a field estimate for tracking under consistent technique, not a medical diagnosis, and it should not replace dual-energy X-ray absorptiometry, air displacement, or hydrostatic weighing when those are indicated. Take the mean of two or three trials at each site when the first two differ by more than a millimeter so day-to-day noise does not masquerade as composition change.
Who still relies on caliper measurements
Strength coaches, sports-science labs, and physique competitors still prefer calipers because a seven-site protocol captures regional subcutaneous fat that a tape-measure Navy formula never sees, and it still fits in a gym bag. Remeasure with the same tester, the same calipers, and the same time of day so week-to-week changes reflect composition rather than protocol noise; hydration, recent exercise, and poor pinch technique move a fold by several millimeters.
Use the US Navy circumference calculator when you lack calipers, keep Parrillo when you already invest in nine sites and imperial body weight, and use this Jackson-Pollock path when you have seven careful folds plus age and sex. Do not treat a field estimate as a diagnosis or as a substitute for imaging when a clinical decision depends on fat mass.
What you can do with it
Gym and physique progress logs
Enter seven caliper sites, age, and sex after each check-in so athletes see a consistent Jackson-Pollock body fat percentage over a cut or bulk.
Research data entry and audits
Replay archived seven-site caliper sheets through a deterministic oracle to verify historical body fat percentages match the published Jackson-Pollock and Siri constants.
FAQ
Which sites do males and females use?
Both sexes use the same seven sites. The density equation itself branches: men use the Jackson and Pollock 1978 coefficients; women use Jackson, Pollock, and Ward 1980. Age is a linear term in both.
What happens if a skinfold is zero or negative?
Every skinfold must be a positive finite number of millimeters. Missing keys, empty strings, and non-numeric values are rejected the same way and are not billed.
How is this different from Parrillo or US Navy body fat?
Parrillo multiplies a nine-site millimeter sum by 27 and divides by weight in pounds, with no age or sex term. US Navy uses neck, waist, and hip circumferences, not calipers.
How many times should I measure each site?
Take two readings at each site, and a third when the first two differ by more than a millimetre, then use the average. That keeps day-to-day noise from looking like a real change in body fat.
How do I keep my results comparable week to week?
Use the same tester, the same calipers and the same time of day. Hydration, recent exercise and a poor pinch can move a fold by several millimetres, which is enough to blur a real change.
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/skinfold-body-fat \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"sex":"male","age":30,"chest_mm":10,"midaxillary_mm":12,"triceps_mm":8,"subscapular_mm":14,"abdomen_mm":20,"suprailiac_mm":15,"thigh_mm":12}'const res = await fetch("https://api.kit.forhosting.com/health/skinfold-body-fat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"sex": "male",
"age": 30,
"chest_mm": 10,
"midaxillary_mm": 12,
"triceps_mm": 8,
"subscapular_mm": 14,
"abdomen_mm": 20,
"suprailiac_mm": 15,
"thigh_mm": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/skinfold-body-fat",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"sex": "male",
"age": 30,
"chest_mm": 10,
"midaxillary_mm": 12,
"triceps_mm": 8,
"subscapular_mm": 14,
"abdomen_mm": 20,
"suprailiac_mm": 15,
"thigh_mm": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/skinfold-body-fat", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"sex":"male","age":30,"chest_mm":10,"midaxillary_mm":12,"triceps_mm":8,"subscapular_mm":14,"abdomen_mm":20,"suprailiac_mm":15,"thigh_mm":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"sex":"male","age":30,"chest_mm":10,"midaxillary_mm":12,"triceps_mm":8,"subscapular_mm":14,"abdomen_mm":20,"suprailiac_mm":15,"thigh_mm":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/skinfold-body-fat", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"sex": "male",
"age": 30,
"chest_mm": 10,
"midaxillary_mm": 12,
"triceps_mm": 8,
"subscapular_mm": 14,
"abdomen_mm": 20,
"suprailiac_mm": 15,
"thigh_mm": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.skinfold_body_fat",
"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 accepts the seven skinfolds plus age and sex, returns body fat percent rounded to two decimals with body density, the site sum, and a formula string, and fails with invalid_input when a measurement is absent or non-positive.
What the Jackson-Pollock 7-site formula computes
Sum those seven millimeter values to obtain sum_mm. Body density is then BD equals 1.112 minus 0.00043499 times sum_mm plus 0.00000055 times sum_mm squared minus 0.00028826 times age for males, or BD equals 1.097 minus 0.00046971 times sum_mm plus 0.00000056 times sum_mm squared minus 0.00012828 times age for females. Percent fat follows the Siri 1961 conversion body_fat_percent equals 495 divided by BD minus 450.
Input contract, response shape, and validation errors
Example: a thirty-year-old male with chest ten, midaxillary twelve, triceps eight, subscapular fourteen, abdomen twenty, suprailiac fifteen, and thigh twelve millimeters sums to ninety-one millimeters and yields a body density near 1.068 and about thirteen percent body fat. Failed validation is not billed. Optional fields are never returned as null; only the documented success keys appear. POST a JSON object with nine required fields: sex (male or female, also m, f, man, woman, or the alias gender), age in years (a finite number from zero through one hundred twenty), and seven positive finite skinfold thicknesses in millimeters named chest_mm, midaxillary_mm, triceps_mm, subscapular_mm, abdomen_mm, suprailiac_mm, and thigh_mm. Each numeric field may arrive as a JSON number or as a numeric string; common aliases such as chest, pectoral, midaxillary, tricep, abdomen, and thigh are accepted and mapped to the canonical names. Missing keys, empty strings, booleans, NaN, Infinity, zero, and negative skinfold values fail with invalid_input naming the field so clients can highlight the form control. That is the hard rule of this calculator: any skinfold measurement that is not a positive number is rejected rather than coerced. On success the body includes body_fat_percent rounded to two decimal places, body_density rounded to six decimals, sum_mm (the seven-site sum, also two decimals), age and sex echoed in canonical form, a sites object with each normalized millimeter reading, method set to jackson_pollock_7_site_siri, and a formula string restating the density polynomial and the Siri conversion. Pair the numeric result with your own category bands if you need ACSM-style labels; this endpoint returns the percentage, not a verbal risk class.
Where a skinfold body fat API earns its keep
Research assistants coding historical caliper sheets into spreadsheets benefit from a tiny parse endpoint instead of reimplementing the density coefficients in every notebook and silently drifting by a rounding choice. Content sites that rank for skinfold body fat calculator or Jackson-Pollock 7-site calculator can embed the free browser path and charge automation clients the published $0.002 base price per successful API call with no model tokens and no outbound network.
Integration use cases
Clinic and coaching software
Call the API from intake forms so staff never retype spreadsheet coefficients; invalid_input surfaces a non-positive skinfold before the visit is saved.
Technical questions
How does the skinfold body fat calculator work?
It sums seven skinfolds in millimeters (chest, midaxillary, triceps, subscapular, abdomen, suprailiac, thigh), computes Jackson-Pollock body density from that sum plus age and sex, then converts density to percent fat with Siri: body_fat_percent = (495 / BD) − 450.
What does the skinfold body fat calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.