NAV
cURL Python JavaScript

Overview

Welcome to the FitXpress API Documentation! You can use API to create and view body measurements and body data.

Authentication

To access the FitXpress API, authentication is required. Please reach out to your assigned 3DLOOK contact to receive your access token.

Sample request with access token:

import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/"
payload = {}
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>'
}
response = requests.request("GET", url, headers=headers, data=payload)
curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/' \
--header 'Authorization: Token <ACCESS_TOKEN>'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow'
};
fetch("https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Make sure to replace <ACCESS_TOKEN> with your actual access token in Authorization header and <MEASUREMENT_ID> with your actual measurement id.

Measurements

Create

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/measurements/' \
--header 'Authorization: Token <ACCESS_TOKEN>' \
--form 'front_photo=@"/media/front_photo.jpg"' \
--form 'side_photo=@"/media/side_photo.jpg"' \
--form 'height="180"' \
--form 'weight="80"' \
--form 'gender="male"' \
--form 'age="25"'
import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/measurements/"

payload = {'height': '180',
'weight': '80',
'gender': 'male',
'age': '25'}
files=[
  ('front_photo',('front_photo.jpg',open('/media/front_photo.jpg','rb'),'image/jpeg')),
  ('side_photo',('side_photo.jpg',open('/media/side_photo.jpg','rb'),'image/jpeg'))
]
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>'
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
var myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");

var formdata = new FormData();
formdata.append("front_photo", fileInput.files[0], "front_photo.jpg");
formdata.append("side_photo", fileInput.files[0], "side_photo.jpg");
formdata.append("height", "180");
formdata.append("weight", "80");
formdata.append("gender", "male");
formdata.append("age", "25");

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,
  redirect: 'follow'
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/measurements/", requestOptions)
  .then(response => response.json())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Or in case of usage base64 encoded image

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/measurements/' \
--header 'Authorization: Token <ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
    "height": 180,
    "weight": 80,
    "age": 25,
    "gender":"male",
    "front_photo": "data:image/jpeg;base64<...>",
    "side_photo": "data:image/jpeg;base64<...>"
}'
import json
import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/measurements/"

payload = json.dumps({
  "height": 180,
  "weight": 80,
  "age": 25,
  "gender": "male",
  "front_photo": "data:image/jpeg;base64<...>",
  "side_photo": "data:image/jpeg;base64<...>"
})
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify({
  "height": 180,
  "weight": 80,
  "age": 25,
  "gender": "male",
  "front_photo": "data:image/jpeg;base64<...>",
  "side_photo": "data:image/jpeg;base64<...>"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/measurements/", requestOptions)
  .then((response) => response.json())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

HTTP REQUEST

POST https://backend.fitxpress.3dlook.me/api/1.0/measurements/

REQUEST BODY

The request body should be with a content-type of a multipart/form-data or application/json(in case you want to use base64 encoded images), containing the following items:

Parameter Type Validation Description
age integer optional, >=16, <=85 age of a person, is required for BMR
gender string required, male or female gender of person, male or female
height integer required, >= 150, <= 220 height of person, in cm
weight integer required, >=40, <=200 weight of person, in kg
front_image file (base64 image) correct image, filename with image extension (string containing base64 encoded image) front photo of person
side_image file (base64 image) correct image, filename with image extension (string containing base64 encoded image) side photo of person

Responses

Status code Description
201 A POST method successfully created a resource.
400 Validation error.
403 Authentication credentials were not provided.
403 Your subscription is inactive, please reach out to your assigned contact for the information
403 You exceeded your request limit, please reach out to your assigned contact for the information

Response 201

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "pending",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": null,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": null,
    "lean_body_mass": null,
    "model_3d_url": null,
    "front_photo_data": {},
    "side_photo_data": {},
    "circumference_params": {},
    "front_linear_params": {},
    "side_linear_params": {},
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": null,
    "updated_at": "2023-12-22T14:38:55.167158Z",
    "errors": [],
    "predicted_models": []
}

Response 400

Height validation

{
    "height": [
        "Height should be between 150 and 220 cm"
    ]
}

Weight validation

{
    "weight": [
        "Weight should be between 40 and 200 kg"
    ]
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Response 403

{
    "detail": "Your subscription is inactive, please reach out to your assigned contact for the information"
}

Response 403

{
    "detail": "You exceeded your request limit, please reach out to your assigned contact for the information"
}

Retrieve

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/' \
--header 'Authorization: Token <ACCESS_TOKEN>'
import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/"

headers = {
  'Authorization': 'Token <ACCESS_TOKEN>'
}
response = requests.request("GET", url, headers=headers)
var myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow'
};
fetch("https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/", requestOptions)
  .then(response => response.json())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

HTTP REQUEST

GET https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/

Response codes

Status code Description
200 The request succeeded.
403 Authentication credentials were not provided.

Response 200

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "successful",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": 23.31,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": 18.6,
    "lean_body_mass": 61.4,
    "model_3d_url": "https://saia-s3-prod.s3.amazonaws.com/persons/models/6526c288c3ce4c95b269507c286e53f0.obj",
    "front_photo_data": {
        "messages": []
    },
    "side_photo_data": {
        "messages": []
    },
    "circumference_params": {
        "calf": "36.18",
        "knee": "37.41",
        "neck": "38.13",
        "ankle": "27.14",
        "bicep": "30.77",
        "chest": "97.78",
        "thigh": "59.25",
        "waist": "89.13",
        "wrist": "17.44",
        "abdomen": "94.42",
        "forearm": "27.80",
        "low_hips": "100.57",
        "body_type": "triangle",
        "high_hips": "90.29",
        "neck_girth": "37.31",
        "elbow_girth": "27.36",
        "armscye_girth": "46.40",
        "overarm_girth": "122.53",
        "mid_thigh_girth": "51.87",
        "under_bust_girth": "88.14",
        "upper_knee_girth": "39.90",
        "upper_bicep_girth": "29.11",
        "upper_chest_girth": "99.37",
        "neck_girth_relaxed": "38.58",
        "alternative_waist_girth": "88.74",
        "thigh_1_inch_below_crotch": "62.62"
    },
    "front_linear_params": {
        "neck": "12.82",
        "rise": "25.81",
        "waist": "29.42",
        "inseam": "76.59",
        "outseam": "110.41",
        "chest_top": "31.59",
        "high_hips": "32.89",
        "shoulders": "43.41",
        "hip_height": "93.73",
        "body_height": "51.40",
        "bust_height": "130.55",
        "knee_height": "50.54",
        "neck_length": "9.01",
        "torso_height": "74.01",
        "waist_height": "112.26",
        "crotch_length": "32.62",
        "jacket_length": "80.72",
        "legs_distance": "20.95",
        "sleeve_length": "62.82",
        "shoulder_slope": "23.02",
        "waist_to_knees": "62.80",
        "shoulder_length": "15.68",
        "underarm_length": "51.37",
        "back_neck_height": "153.86",
        "lower_arm_length": "27.77",
        "upper_arm_length": "35.24",
        "upper_hip_height": "108.58",
        "across_back_width": "42.83",
        "inside_leg_height": "82.94",
        "shoulder_to_waist": "45.31",
        "waist_to_low_hips": "17.40",
        "back_crotch_length": "42.89",
        "front_torso_height": "82.97",
        "outer_ankle_height": "8.72",
        "back_shoulder_width": "46.75",
        "front_crotch_length": "35.54",
        "total_crotch_length": "79.51",
        "upper_knee_to_ankle": "47.20",
        "body_area_percentage": "0.76",
        "back_neck_to_hip_length": "63.54",
        "upper_hip_to_hip_length": "7.05",
        "nape_to_waist_centre_back": "44.54",
        "side_neck_point_to_armpit": "21.58",
        "across_back_shoulder_width": "46.61",
        "waist_to_upper_knee_length": "56.91",
        "abdomen_to_upper_knee_length": "49.66",
        "inside_crotch_length_to_calf": "47.31",
        "inside_crotch_length_to_knee": "32.08",
        "outseam_from_upper_hip_level": "103.13",
        "back_neck_point_to_wrist_length": "85.58",
        "inside_crotch_length_to_mid_thigh": "16.58",
        "back_neck_point_to_wrist_length_1_5_inch": "89.39",
        "inside_leg_length_to_the_1_inch_above_the_floor": "77.75"
    },
    "side_linear_params": {
        "neck_to_chest": "27.46",
        "chest_to_waist": "18.45",
        "waist_to_ankle": "107.68",
        "shoulders_to_knees": "107.90",
        "body_area_percentage": "0.79",
        "side_neck_point_to_upper_hip": "55.28",
        "side_upper_hip_level_to_knee": "53.90"
    },
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": "2023-12-22T14:39:40.102247Z",
    "updated_at": "2023-12-22T14:39:40.110852Z",
    "errors": [],
    "predicted_models": []
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Predicted model

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/predict_model/' \
--header 'Authorization: Token <ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
    "weight": 60
}'
import requests
import json

url = "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/predict_model/"

payload = json.dumps({
  "weight": 60
})
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
var myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "weight": 60
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/predict_model/", requestOptions)
  .then(response => response.json())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

HTTP REQUEST

POST https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/predict_model/

REQUEST BODY

Allowed only for measurements that completed successfully

The body request should be with a content-type of an application/json, containing the following item.

Weight parameter for predicted model should respect next rules:

Parameter Type Validation Description
weight integer required, >=40, <=200 expected weight of person, in kg

Response codes

Status code Description
201 A POST method successfully created a resource.
400 Validation error.
403 Authentication credentials were not provided.
403 Your subscription is inactive, please reach out to your assigned contact for the information
403 You exceeded your request limit, please reach out to your assigned contact for the information

Response 201

{
    "status": "pending",
    "model_3d_url": null,
    "weight": 60,
    "completed_at": null,
    "created_at": "2024-02-22T11:19:53.160493Z"
}

Response 400

Calculation is in progress

{
    "non_field_errors": [
        "Please wait until previous calculation is completed"
    ]
}

Weight validation

{
    "weight": [
        "Weight should be between 40 and 200 kg"
    ]
}
{
    "weight": [
        "Weight should be greater or less than measurement's weight more than 1 kg"
    ]
}
{
    "weight": [
        "The model with this predicted weight already exists"
    ]
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Response 403

{
    "detail": "Your subscription is inactive, please reach out to your assigned contact for the information"
}

Response 403

{
    "detail": "You exceeded your request limit, please reach out to your assigned contact for the information"
}

Body progress

3D

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/body_progress/' \
--header 'Authorization: Token <ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '
{
    "measurement_before_id": "<MEASUREMENT_ID_1>",
    "measurement_after_id": "<MEASUREMENT_ID_2>"
}'
import requests
import json

url = "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/"

payload = json.dumps({
  "measurement_before_id": "<MEASUREMENT_ID_1>",
  "measurement_after_id": "<MEASUREMENT_ID_2>"
})
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify({
  "measurement_before_id": "<MEASUREMENT_ID_1>",
  "measurement_after_id": "<MEASUREMENT_ID_2>"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/body_progress/", requestOptions)
  .then((response) => response.json())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Create

HTTP REQUEST

POST https://backend.fitxpress.3dlook.me/api/1.0/body_progress/

REQUEST BODY

Allowed only for measurements that both completed successfully

The body request should be with a content-type of an application/json, containing the following items:

Parameter Type Validation Description
measurement_before_id uuid required id of a measurement done before
measurement_after_id uuid required id of a measurement with which to compare

Responses

Status code Description
201 A Post method successfully created a resource.
400 Validation error.
403 Authentication credentials were not provided.
403 Your subscription is inactive, please reach out to your assigned contact for the information
403 You exceeded your request limit, please reach out to your assigned contact for the information

Response 201

{
    "id": "<BODY_PROGRESS_ID>",
    "status": "pending",
    "created_at": "2024-07-03T07:46:09.146766Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/",
    "model": null
}

Resonse 400

Measurements status validation (For measurements with statuses: failed, pending, in_progress)

{
  "measurement_before_id": [
    "Allowed only for measurements with successful status"
  ],
  "measurement_after_id": [
    "Allowed only for measurements with successful status"
  ]
}

Body progress entity already exists with such measurement_before_id, measurement_after_id

{
    "non_field_errors": ["Body progress with such measurements already exists"]
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Response 403

{
    "detail": "Your subscription is inactive, please reach out to your assigned contact for the information"
}

Response 403

{
    "detail": "You exceeded your request limit, please reach out to your assigned contact for the information"
}

Retrieve

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/' \
--header 'Authorization: Token <ACCESS_TOKEN>' 
import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/"

headers = {
  'Authorization': 'Token <ACCESS_TOKEN>'
}

response = requests.request("GET", url, headers=headers)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  redirect: "follow"
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/", requestOptions)
  .then((response) => response.json())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

HTTP REQUEST

GET https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/

Response codes

Status code Description
200 The request succeded.
403 Authentication credentials were not provided.

Response 200

{
    "id": "<BODY_PROGRESS_ID>",
    "status": "successful",
    "created_at": "2024-07-04T13:14:44.535642Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/",
    "model": "https://saia-s3.s3.amazonaws.com/persons/meshes/e76bffbc70c44b46b8a32f9951153aed.obj"
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

2D (Render)

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/' \
--header 'Authorization: Token <ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '
{
    "measurement_before_id": "<MEASUREMENT_ID_1>",
    "measurement_after_id": "<MEASUREMENT_ID_2>"
}'
import requests
import json

url = "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/"

payload = json.dumps({
  "measurement_before_id": "<MEASUREMENT_ID_1>",
  "measurement_after_id": "<MEASUREMENT_ID_2>"
})
headers = {
  'Authorization': 'Token <ACCESS_TOKEN>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify({
  "measurement_before_id": "<MEASUREMENT_ID_1>",
  "measurement_after_id": "<MEASUREMENT_ID_2>"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/", requestOptions)
  .then((response) => response.json())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Create

HTTP REQUEST

POST https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/

REQUEST BODY

Allowed only for measurements that both completed successfully

The body request should be with a content-type of an application/json, containing the following items:

Parameter Type Validation Description
measurement_before_id uuid required id of a measurement done before
measurement_after_id uuid required id of a measurement with which to compare

Responses

Status code Description
201 A Post method successfully created a resource.
400 Validation error.
403 Authentication credentials were not provided.
403 Your subscription is inactive, please reach out to your assigned contact for the information
403 You exceeded your request limit, please reach out to your assigned contact for the information

Response 201

{
    "id": "<BODY_PROGRESS_2D_ID>",
    "status": "pending",
    "created_at": "2024-07-03T07:46:09.146766Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/",
    "front_render": null,
    "side_render": null
}

Resonse 400

Measurements status validation (For measurements with statuses: failed, pending, in_progress)

{
  "measurement_before_id": [
    "Allowed only for measurements with successful status"
  ],
  "measurement_after_id": [
    "Allowed only for measurements with successful status"
  ]
}

Body progress entity already exists with such measurement_before_id, measurement_after_id

{
    "non_field_errors": ["Body progress with such measurements already exists"]
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Response 403

{
    "detail": "Your subscription is inactive, please reach out to your assigned contact for the information"
}

Response 403

{
    "detail": "You exceeded your request limit, please reach out to your assigned contact for the information"
}

Retrieve

curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/' \
--header 'Authorization: Token <ACCESS_TOKEN>' 
import requests

url = "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/"

headers = {
  'Authorization': 'Token <ACCESS_TOKEN>'
}

response = requests.request("GET", url, headers=headers)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Token <ACCESS_TOKEN>");

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  redirect: "follow"
};

fetch("https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/", requestOptions)
  .then((response) => response.json())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

HTTP REQUEST

GET https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/

Response codes

Status code Description
200 The request succeded.
403 Authentication credentials were not provided.

Response 200

{
    "id": "<BODY_PROGRESS_2D_ID>",
    "status": "successful",
    "created_at": "2024-07-04T13:14:44.535642Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/",
    "front_render": "https://saia-s3.s3.amazonaws.com/persons/render/12454ed548c24588b4b5eb5daf7a130c.png",
    "side_render": "https://saia-s3.s3.amazonaws.com/persons/render/01ab72c8e366478e85c1ca2f479928aa.png"
}

Response 403

{
    "detail": "Authentication credentials were not provided."
}

Guide

1. Create a measurement

To make a body measurement send a POST request to the Measurements create API endpoint with the required parameters. After successful measurement creation you will receive response with code 201 and status field with value pending

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "pending",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": null,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": null,
    "lean_body_mass": null,
    "model_3d_url": null,
    "front_photo_data": {},
    "side_photo_data": {},
    "circumference_params": {},
    "front_linear_params": {},
    "side_linear_params": {},
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": null,
    "updated_at": "2023-12-22T14:38:55.167158Z",
    "errors": [],
    "predicted_models": []
}

2. Retrieve Data

To get a measurement periodically send a GET request to the Measurements retrieve API endpoint with optimal timeout ~4 seconds until calculation is complete. When status is successful or failed it means completion of calculations.

status field in response json can take next values:

Example of responses

status: successful

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "successful",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": 23.31,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": 18.6,
    "lean_body_mass": 61.4,
    "model_3d_url": "https://saia-s3-prod.s3.amazonaws.com/persons/models/6526c288c3ce4c95b269507c286e53f0.obj",
    "front_photo_data": {
        "messages": []
    },
    "side_photo_data": {
        "messages": []
    },
    "circumference_params": {
        "calf": "36.18",
        "knee": "37.41",
        "neck": "38.13",
        "ankle": "27.14",
        "bicep": "30.77",
        "chest": "97.78",
        "thigh": "59.25",
        "waist": "89.13",
        "wrist": "17.44",
        "abdomen": "94.42",
        "forearm": "27.80",
        "low_hips": "100.57",
        "body_type": "triangle",
        "high_hips": "90.29",
        "neck_girth": "37.31",
        "elbow_girth": "27.36",
        "armscye_girth": "46.40",
        "overarm_girth": "122.53",
        "mid_thigh_girth": "51.87",
        "under_bust_girth": "88.14",
        "upper_knee_girth": "39.90",
        "upper_bicep_girth": "29.11",
        "upper_chest_girth": "99.37",
        "neck_girth_relaxed": "38.58",
        "alternative_waist_girth": "88.74",
        "thigh_1_inch_below_crotch": "62.62"
    },
    "front_linear_params": {
        "neck": "12.82",
        "rise": "25.81",
        "waist": "29.42",
        "inseam": "76.59",
        "outseam": "110.41",
        "chest_top": "31.59",
        "high_hips": "32.89",
        "shoulders": "43.41",
        "hip_height": "93.73",
        "body_height": "51.40",
        "bust_height": "130.55",
        "knee_height": "50.54",
        "neck_length": "9.01",
        "torso_height": "74.01",
        "waist_height": "112.26",
        "crotch_length": "32.62",
        "jacket_length": "80.72",
        "legs_distance": "20.95",
        "sleeve_length": "62.82",
        "shoulder_slope": "23.02",
        "waist_to_knees": "62.80",
        "shoulder_length": "15.68",
        "underarm_length": "51.37",
        "back_neck_height": "153.86",
        "lower_arm_length": "27.77",
        "upper_arm_length": "35.24",
        "upper_hip_height": "108.58",
        "across_back_width": "42.83",
        "inside_leg_height": "82.94",
        "shoulder_to_waist": "45.31",
        "waist_to_low_hips": "17.40",
        "back_crotch_length": "42.89",
        "front_torso_height": "82.97",
        "outer_ankle_height": "8.72",
        "back_shoulder_width": "46.75",
        "front_crotch_length": "35.54",
        "total_crotch_length": "79.51",
        "upper_knee_to_ankle": "47.20",
        "body_area_percentage": "0.76",
        "back_neck_to_hip_length": "63.54",
        "upper_hip_to_hip_length": "7.05",
        "nape_to_waist_centre_back": "44.54",
        "side_neck_point_to_armpit": "21.58",
        "across_back_shoulder_width": "46.61",
        "waist_to_upper_knee_length": "56.91",
        "abdomen_to_upper_knee_length": "49.66",
        "inside_crotch_length_to_calf": "47.31",
        "inside_crotch_length_to_knee": "32.08",
        "outseam_from_upper_hip_level": "103.13",
        "back_neck_point_to_wrist_length": "85.58",
        "inside_crotch_length_to_mid_thigh": "16.58",
        "back_neck_point_to_wrist_length_1_5_inch": "89.39",
        "inside_leg_length_to_the_1_inch_above_the_floor": "77.75"
    },
    "side_linear_params": {
        "neck_to_chest": "27.46",
        "chest_to_waist": "18.45",
        "waist_to_ankle": "107.68",
        "shoulders_to_knees": "107.90",
        "body_area_percentage": "0.79",
        "side_neck_point_to_upper_hip": "55.28",
        "side_upper_hip_level_to_knee": "53.90"
    },
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": "2023-12-22T14:39:40.102247Z",
    "updated_at": "2023-12-22T14:39:40.110852Z",
    "errors": [],
    "predicted_models": []
}

errors list contains errors that may raise during measurement processing, if measurement`s status is failed.   Each error has description and error_source fields. error_source field can take next values: front_photo, side_photo or null.

status: failed

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "failed",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": null,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": null,
    "lean_body_mass": null,
    "model_3d_url": null,
    "front_photo_data": {},
    "side_photo_data": {},
    "circumference_params": {},
    "front_linear_params": {},
    "side_linear_params": {},
    "created_at": "2023-12-23T09:39:30.356618Z",
    "completed_at": "2023-12-23T09:39:34.099611Z",
    "updated_at": "2023-12-23T09:39:34.099742Z",
    "errors": [
        {
            "error_source": "side_photo",
            "detail": "Сan not detect the human body"
        }
    ],
    "predicted_models": []
}

3. Create a prediction model of appearance for specific weight

To make a prediction model send a POST request to the Prediction model create API endpoint with the required parameters. After successful creation you will receive response with code 201 and status field with value pending.

Restrictions:

To get a predicted model link for exact weight periodically send a GET request to the Measurements retrieve API endpoint with optimal timeout ~4 seconds until calculation is complete. All predicted models will be in predicted_models field.

Example of responses

successfully created

{
    "status": "pending",
    "model_3d_url": null,
    "weight": 60,
    "completed_at": null,
    "created_at": "2024-02-22T11:19:53.160493Z"
}

Retrieve api: calculation of predicted model complete successfully

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "successful",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": 23.31,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": 18.6,
    "lean_body_mass": 61.4,
    "model_3d_url": "https://saia-s3-prod.s3.amazonaws.com/persons/models/6526c288c3ce4c95b269507c286e53f0.obj",
    "front_photo_data": {
        "messages": []
    },
    "side_photo_data": {
        "messages": []
    },
    "circumference_params": {
        "calf": "36.18",
        "knee": "37.41",
        "neck": "38.13",
        "ankle": "27.14",
        "bicep": "30.77",
        "chest": "97.78",
        "thigh": "59.25",
        "waist": "89.13",
        "wrist": "17.44",
        "abdomen": "94.42",
        "forearm": "27.80",
        "low_hips": "100.57",
        "body_type": "triangle",
        "high_hips": "90.29",
        "neck_girth": "37.31",
        "elbow_girth": "27.36",
        "armscye_girth": "46.40",
        "overarm_girth": "122.53",
        "mid_thigh_girth": "51.87",
        "under_bust_girth": "88.14",
        "upper_knee_girth": "39.90",
        "upper_bicep_girth": "29.11",
        "upper_chest_girth": "99.37",
        "neck_girth_relaxed": "38.58",
        "alternative_waist_girth": "88.74",
        "thigh_1_inch_below_crotch": "62.62"
    },
    "front_linear_params": {
        "neck": "12.82",
        "rise": "25.81",
        "waist": "29.42",
        "inseam": "76.59",
        "outseam": "110.41",
        "chest_top": "31.59",
        "high_hips": "32.89",
        "shoulders": "43.41",
        "hip_height": "93.73",
        "body_height": "51.40",
        "bust_height": "130.55",
        "knee_height": "50.54",
        "neck_length": "9.01",
        "torso_height": "74.01",
        "waist_height": "112.26",
        "crotch_length": "32.62",
        "jacket_length": "80.72",
        "legs_distance": "20.95",
        "sleeve_length": "62.82",
        "shoulder_slope": "23.02",
        "waist_to_knees": "62.80",
        "shoulder_length": "15.68",
        "underarm_length": "51.37",
        "back_neck_height": "153.86",
        "lower_arm_length": "27.77",
        "upper_arm_length": "35.24",
        "upper_hip_height": "108.58",
        "across_back_width": "42.83",
        "inside_leg_height": "82.94",
        "shoulder_to_waist": "45.31",
        "waist_to_low_hips": "17.40",
        "back_crotch_length": "42.89",
        "front_torso_height": "82.97",
        "outer_ankle_height": "8.72",
        "back_shoulder_width": "46.75",
        "front_crotch_length": "35.54",
        "total_crotch_length": "79.51",
        "upper_knee_to_ankle": "47.20",
        "body_area_percentage": "0.76",
        "back_neck_to_hip_length": "63.54",
        "upper_hip_to_hip_length": "7.05",
        "nape_to_waist_centre_back": "44.54",
        "side_neck_point_to_armpit": "21.58",
        "across_back_shoulder_width": "46.61",
        "waist_to_upper_knee_length": "56.91",
        "abdomen_to_upper_knee_length": "49.66",
        "inside_crotch_length_to_calf": "47.31",
        "inside_crotch_length_to_knee": "32.08",
        "outseam_from_upper_hip_level": "103.13",
        "back_neck_point_to_wrist_length": "85.58",
        "inside_crotch_length_to_mid_thigh": "16.58",
        "back_neck_point_to_wrist_length_1_5_inch": "89.39",
        "inside_leg_length_to_the_1_inch_above_the_floor": "77.75"
    },
    "side_linear_params": {
        "neck_to_chest": "27.46",
        "chest_to_waist": "18.45",
        "waist_to_ankle": "107.68",
        "shoulders_to_knees": "107.90",
        "body_area_percentage": "0.79",
        "side_neck_point_to_upper_hip": "55.28",
        "side_upper_hip_level_to_knee": "53.90"
    },
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": "2023-12-22T14:39:40.102247Z",
    "updated_at": "2023-12-22T14:39:40.110852Z",
    "errors": [],
    "predicted_models": [
        {
            "status": "successful",
            "model_3d_url": "https://saia-s3-prod.s3.amazonaws.com/persons/models/5a5fc46531e44c00864615d33fd3b552.obj",
            "weight": 60,
            "completed_at": "2024-02-22T12:06:13.732395Z",
            "created_at": "2024-02-22T12:05:08.624905Z"
        }
    ]
}

Retrieve api: calculation of predicted model failed

{
    "id": "<MEASUREMENT_ID>",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/measurements/<MEASUREMENT_ID>/",
    "status": "successful",
    "gender": "male",
    "height": 180,
    "weight": 80,
    "age": 25,
    "fat_percentage": 23.31,
    "bmi": 24.7,
    "bmr": 1805.0,
    "fat_body_mass": 18.6,
    "lean_body_mass": 61.4,
    "model_3d_url": "https://saia-s3-prod.s3.amazonaws.com/persons/models/6526c288c3ce4c95b269507c286e53f0.obj",
    "front_photo_data": {
        "messages": []
    },
    "side_photo_data": {
        "messages": []
    },
    "circumference_params": {
        "calf": "36.18",
        "knee": "37.41",
        "neck": "38.13",
        "ankle": "27.14",
        "bicep": "30.77",
        "chest": "97.78",
        "thigh": "59.25",
        "waist": "89.13",
        "wrist": "17.44",
        "abdomen": "94.42",
        "forearm": "27.80",
        "low_hips": "100.57",
        "body_type": "triangle",
        "high_hips": "90.29",
        "neck_girth": "37.31",
        "elbow_girth": "27.36",
        "armscye_girth": "46.40",
        "overarm_girth": "122.53",
        "mid_thigh_girth": "51.87",
        "under_bust_girth": "88.14",
        "upper_knee_girth": "39.90",
        "upper_bicep_girth": "29.11",
        "upper_chest_girth": "99.37",
        "neck_girth_relaxed": "38.58",
        "alternative_waist_girth": "88.74",
        "thigh_1_inch_below_crotch": "62.62"
    },
    "front_linear_params": {
        "neck": "12.82",
        "rise": "25.81",
        "waist": "29.42",
        "inseam": "76.59",
        "outseam": "110.41",
        "chest_top": "31.59",
        "high_hips": "32.89",
        "shoulders": "43.41",
        "hip_height": "93.73",
        "body_height": "51.40",
        "bust_height": "130.55",
        "knee_height": "50.54",
        "neck_length": "9.01",
        "torso_height": "74.01",
        "waist_height": "112.26",
        "crotch_length": "32.62",
        "jacket_length": "80.72",
        "legs_distance": "20.95",
        "sleeve_length": "62.82",
        "shoulder_slope": "23.02",
        "waist_to_knees": "62.80",
        "shoulder_length": "15.68",
        "underarm_length": "51.37",
        "back_neck_height": "153.86",
        "lower_arm_length": "27.77",
        "upper_arm_length": "35.24",
        "upper_hip_height": "108.58",
        "across_back_width": "42.83",
        "inside_leg_height": "82.94",
        "shoulder_to_waist": "45.31",
        "waist_to_low_hips": "17.40",
        "back_crotch_length": "42.89",
        "front_torso_height": "82.97",
        "outer_ankle_height": "8.72",
        "back_shoulder_width": "46.75",
        "front_crotch_length": "35.54",
        "total_crotch_length": "79.51",
        "upper_knee_to_ankle": "47.20",
        "body_area_percentage": "0.76",
        "back_neck_to_hip_length": "63.54",
        "upper_hip_to_hip_length": "7.05",
        "nape_to_waist_centre_back": "44.54",
        "side_neck_point_to_armpit": "21.58",
        "across_back_shoulder_width": "46.61",
        "waist_to_upper_knee_length": "56.91",
        "abdomen_to_upper_knee_length": "49.66",
        "inside_crotch_length_to_calf": "47.31",
        "inside_crotch_length_to_knee": "32.08",
        "outseam_from_upper_hip_level": "103.13",
        "back_neck_point_to_wrist_length": "85.58",
        "inside_crotch_length_to_mid_thigh": "16.58",
        "back_neck_point_to_wrist_length_1_5_inch": "89.39",
        "inside_leg_length_to_the_1_inch_above_the_floor": "77.75"
    },
    "side_linear_params": {
        "neck_to_chest": "27.46",
        "chest_to_waist": "18.45",
        "waist_to_ankle": "107.68",
        "shoulders_to_knees": "107.90",
        "body_area_percentage": "0.79",
        "side_neck_point_to_upper_hip": "55.28",
        "side_upper_hip_level_to_knee": "53.90"
    },
    "created_at": "2023-12-22T14:38:55.167128Z",
    "completed_at": "2023-12-22T14:39:40.102247Z",
    "updated_at": "2023-12-22T14:39:40.110852Z",
    "errors": [],
    "predicted_models": [
        {
            "status": "failed",
            "model_3d_url": null,
            "weight": 60,
            "completed_at": "2024-02-22T12:06:13.732395Z",
            "created_at": "2024-02-22T12:05:08.624905Z"
        }
    ]
}

4. Create a body progress appearance for specific measurements

To create a body progress send a POST request to the Body progress create API endpoint After successful creation you will receive response with code 201 and status field with value pending.

Restrictions

To get a result for exact body progress periodically send a GET request to the Body progress retrieve API endpoint with optimal timeout ~2 second until calculation is complete.

Example of responses

successfully created

{
    "id": "<BODY_PROGRESS_ID>",
    "status": "pending",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/",
    "model": null
}

Retrieve api: calculation of body progress complete successfully

{
    "id": "<BODY_PROGRESS_ID>",
    "status": "successful",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/",
    "model": "https://saia-s3.s3.amazonaws.com/persons/meshes/e76bffbc70c44b46b8a32f9951153aed.obj"
}

Retrieve api: calculation of body progress failed

{
    "id": "<BODY_PROGRESS_ID>",
    "status": "failed",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_ID>/",
    "model": null
}

5. Create a body progress rendered appearance for specific measurements

To create a body progress render send a POST request to the Body progress render create API endpoint After successful creation you will receive response with code 201 and status field with value pending.

Restrictions

To get a result for exact body progress periodically send a GET request to the Body progress render retrieve API endpoint with optimal timeout ~2 second until calculation is complete.

Example of responses

successfully created

{
    "id": "<BODY_PROGRESS_2D_ID>",
    "status": "pending",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/2d/<BODY_PROGRESS_2D_ID>/",
    "front_render": null,
    "side_render": null
}

Retrieve api: calculation of body progress complete successfully

{
    "id": "<BODY_PROGRESS_2D_ID>",
    "status": "successful",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_2D_ID>/",
    "front_render": "https://saia-s3.s3.amazonaws.com/persons/render/12454ed548c24588b4b5eb5daf7a130c.png",
    "side_render": "https://saia-s3.s3.amazonaws.com/persons/render/01ab72c8e366478e85c1ca2f479928aa.png"
}

Retrieve api: calculation of body progress failed

{
    "id": "<BODY_PROGRESS_2D_ID>",
    "status": "failed",
    "created_at": "2024-07-06T17:48:09.228411Z",
    "url": "https://backend.fitxpress.3dlook.me/api/1.0/body_progress/<BODY_PROGRESS_2D_ID>/",
    "front_render": null,
    "side_render": null
}

Errors

HTTP Errors

The FitXpress API uses the following error codes:

Status code Description
400 Bad Request — Your request is invalid.
401 Unauthorized — Your API key is incorrect.
403 Forbidden — Access to the requested API is forbidden.
404 Not Found — The specified item could not be found.
406 Not Acceptable — You requested a non-JSON format.
422 Unprocessable Entity — One or both of the taken photos could not be processed.
429 Too Many Requests — You are sending too many requests.
500 Internal Server Error — A server error occurred. Try again later.
503 Service Unavailable — We're temporarily offline for maintenance. Please try again later.

Image processing errors

In case measurement is failed — errors field will contain records with error_source (front_photo, side_photo or null) and description messages:

Message Description
The pose is wrong, check your <body_part> The pose of the human body in one or both of the taken photos is wrong and we cannot process the human body.
Сan not detect the human body The human body in the photo cannot be detected.
Side photo in the front The photo taken to the Front slot was detected to be a Side photo.
The body is not full The photo does not contain the whole body.