Adjusting a scan with Future You
Use the Future You endpoint to adjust an existing scan's weight or measurements by a percentage and get a new scan back, with updated measurements and avatar.
Experimental feature
Future You is experimental. It is available in the Bodygram Platform API for users who want to learn about it and integrate it into their applications. If you would like to try it out, contact us.
Future You lets you take a scan you've already created and ask: what would the measurements and avatar look like if this person's weight or one of their measurements changed by N%? You send the original scan's ID, a list of percentage adjustments, and you get back a brand-new scan with its own ID, recomputed measurements, and a new 3D avatar.
This guide assumes you've already made at least one scan via Your first scan (API). You'll need that scan's entry.id to adjust it.
How it works
Future You adjusts a scan by changing one or more of its weight and a subset of its measurements. Each adjustment is expressed as a percentage change — for example -5.0 reduces the value by 5%, +3.0 increases it by 3%.
| Aspect | Behavior |
|---|---|
| Output | A new scan with its own entry.id |
| Source scan | Referenced by ID; the original scan is not modified |
| Other measurements | Recomputed automatically — Future You models how the rest of the body scales with your adjustments |
| Avatar | Regenerated from the new weight and measurements |
What can be adjusted
Only the weight and a specific subset of measurements are adjustable. See the AdjustScanParameter schema in the API Reference for the full list of supported measurement names.
Eligible source scans
Only photo and stats scans can be adjusted. A scan that was itself produced by Future You cannot be adjusted again.
The original scan
You'll need the entry.id of the scan you want to adjust. It comes back in every successful scan response — for example:
{
"entry": {
"id": "scan_testIDFHsFggF",
"status": "success",
"input": {
"age": 29,
"gender": "female",
"height": 1640,
"weight": 54000
},
"measurements": [
{ "name": "acrossBackShoulderWidth", "unit": "mm", "value": 434 },
{ "name": "upperArmGirthR", "unit": "mm", "value": 253 },
{ "name": "waistGirth", "unit": "mm", "value": 622 }
],
"avatar": {
"data": "<BASE64_ENCODED_OBJ>",
"format": "obj",
"type": "highResolution"
}
}
}We'll refer to this scan as ${SCAN_ID} ("scan_testIDFHsFggF" in the example above) throughout the rest of this guide.
Adjusting a scan
Send a POST to /api/orgs/{ORG_ID}/scans/{SCAN_ID}/adjust with a parameters array describing the adjustments. The request below reduces weight by 5% and waistGirth by 4%:
curl -X POST "https://platform.bodygram.com/api/orgs/${ORG_ID}/scans/${SCAN_ID}/adjust" \
--header "Content-Type: application/json" \
--header "Authorization: ${API_KEY}" \
--data '{
"customScanId": "myFirstFutureYouScan",
"parameters": [
{ "name": "weight", "percentage": -5.0 },
{ "name": "waistGirth", "percentage": -4.0 }
]
}'const response = await fetch(
`https://platform.bodygram.com/api/orgs/${ORG_ID}/scans/${SCAN_ID}/adjust`,
{
method: 'POST',
headers: {
'Authorization': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
customScanId: 'myFirstFutureYouScan',
parameters: [
{ name: 'weight', percentage: -5.0 },
{ name: 'waistGirth', percentage: -4.0 },
],
}),
}
);
const { entry } = await response.json();
console.log(entry.id); // new scan ID
console.log(entry.measurements); // recomputed measurements
console.log(entry.outputStats); // adjusted weightimport requests
url = f"https://platform.bodygram.com/api/orgs/{ORG_ID}/scans/{SCAN_ID}/adjust"
response = requests.post(
url,
headers={"Authorization": API_KEY},
json={
"customScanId": "myFirstFutureYouScan",
"parameters": [
{"name": "weight", "percentage": -5.0},
{"name": "waistGirth", "percentage": -4.0},
],
},
)
entry = response.json()["entry"]
print(entry["id"]) # new scan ID
print(entry["measurements"]) # recomputed measurements
print(entry["outputStats"]) # adjusted weightPercentages, not absolute values
The percentage field is a relative change. To shrink a measurement use a negative number; to grow it, a positive one.
Response
The API takes a few seconds to compute the new scan and returns the standard entry shape, with two additions specific to Future You:
entry.input.adjustedScan— metadata describing the source scan and the parameters you sententry.outputStats— the resulting weight after applying the adjustments
{
"entry": {
"id": "scan_testBGs3fn2T9",
"status": "success",
"customScanId": "myFirstFutureYouScan",
"input": {
"adjustedScan": {
"baseScanId": "scan_testIDFHsFggF",
"baseScanType": "photo",
"age": 29,
"gender": "female",
"height": 1640,
"weight": 54000,
"parameters": [
{ "name": "weight", "percentage": -5.0 },
{ "name": "waistGirth", "percentage": -4.0 }
]
}
},
"measurements": [
{ "name": "acrossBackShoulderWidth", "unit": "mm", "value": 434 },
{ "name": "upperArmGirthR", "unit": "mm", "value": 246 },
{ "name": "waistGirth", "unit": "mm", "value": 597 }
],
"outputStats": {
"weight": 51300
},
"avatar": {
"data": "<BASE64_ENCODED_OBJ>",
"format": "obj",
"type": "highResolution"
}
}
}Interpreting the results
The new scan's entry.measurements, entry.outputStats and entry.avatar together describe the adjusted body.
entry.measurements contains every measurement, recomputed under your adjustment. The ones you asked for change exactly as requested — e.g. waistGirth went from 622 mm to 597 mm, a 4% drop. But measurements you didn't mention also change: in the example above, upperArmGirthR dropped from 253 mm to 246 mm. That's intentional — Future You models how the rest of the body scales with the adjustments you specified, rather than freezing every other measurement.
entry.outputStats.weight is the resulting weight in grams. Note that this can change even if you didn't include weight in your parameters, since some measurement adjustments imply a weight change.
entry.avatar is regenerated from the new weight and measurements, so it will look subtly different from the original scan's avatar.
entry.input.adjustedScan.baseScanId matches the original scan's entry.id, which is useful when you want to reconstruct the lineage of an adjusted scan later.
Related
- Your first scan (API) — create the original scan that you'll adjust
- API Reference —
AdjustScanParameterschema and the full list of adjustable measurements - Visualizing the avatar — render the new
.objmodel in three.js
