Bodygram

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%.

AspectBehavior
OutputA new scan with its own entry.id
Source scanReferenced by ID; the original scan is not modified
Other measurementsRecomputed automatically — Future You models how the rest of the body scales with your adjustments
AvatarRegenerated 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 weight
import 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 weight

Percentages, 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 sent
  • entry.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.


On this page