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 inAuthorizationheader 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, >= 145, <= 220 | height of person, in cm |
| weight | integer | optional, >=40, <=200 | weight of person, in kg. If not specified, we will calculate the weight on our end. |
| 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,
"estimated_weight": null,
"age": 25,
"fat_percentage": null,
"bmi": 24.7,
"estimated_bmi": null,
"bmr": 1805.0,
"estimated_bmr": null,
"fat_body_mass": null,
"estimated_fat_body_mass": null,
"lean_body_mass": null,
"estimated_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 145 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,
"estimated_weight": 82,
"age": 25,
"fat_percentage": 23.31,
"bmi": 24.7,
"estimated_bmi": 25.3,
"bmr": 1805.0,
"estimated_bmr": 1825.0,
"fat_body_mass": 18.6,
"estimated_fat_body_mass": 19.1,
"lean_body_mass": 61.4,
"estimated_lean_body_mass": 62.9,
"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",
"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",
"inseam_from_crotch_to_ankle": "74.42",
"inseam_from_crotch_to_floor": "80.80",
"new_jacket_length": "77.92",
"side_neck_point_to_thigh": "81.62"
},
"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",
"waist_depth": "24.09"
},
"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:
The
weightvalue should not be identical to that of the measurement. Instead, please utilize the model_3d_url from the measurement if a model for that weight is required.The
weightvalue must not match any previously recorded predictive model requests. Please reuse existing values instead.The variance between the predicted weight of the model and the actual measurement should exceed 1kg, as a difference of only 1kg is not visually or practically significant enough. For example, if the measurement's weight is 80kg, predicted models weighing 79kg or 81kg are not sufficiently distinct and weights equal to or less than 78kg are acceptable, while weights equal to or greater than 82kg are also acceptable.
| 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,
"estimated_weight": null,
"age": 25,
"fat_percentage": null,
"bmi": 24.7,
"estimated_bmi": null,
"bmr": 1805.0,
"estimated_bmr": null,
"fat_body_mass": null,
"estimated_fat_body_mass": null,
"lean_body_mass": null,
"estimated_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:
- pending
- in_progress
- successful
- failed
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,
"estimated_weight": 82,
"age": 25,
"fat_percentage": 23.31,
"bmi": 24.7,
"estimated_bmi": 25.3,
"bmr": 1805.0,
"estimated_bmr": 1825.0,
"fat_body_mass": 18.6,
"estimated_fat_body_mass": 19.1,
"lean_body_mass": 61.4,
"estimated_lean_body_mass": 62.9,
"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",
"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",
"inseam_from_crotch_to_ankle": "74.42",
"inseam_from_crotch_to_floor": "80.80",
"new_jacket_length": "77.92",
"side_neck_point_to_thigh": "81.62"
},
"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",
"waist_depth": "24.09"
},
"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,
"estimated_weight": null,
"age": 25,
"fat_percentage": null,
"bmi": 24.7,
"estimated_bmi": null,
"bmr": 1805.0,
"estimated_bmr": null,
"fat_body_mass": null,
"estimated_fat_body_mass": null,
"lean_body_mass": null,
"estimated_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:
- Request can be made only on measurements after they have completed successfully
- Only one request per measurement can be
in_progress/pendingstate. Please wait until it completes
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,
"estimated_weight": 82,
"age": 25,
"fat_percentage": 23.31,
"bmi": 24.7,
"estimated_bmi": 25.3,
"bmr": 1805.0,
"estimated_bmr": 1825.0,
"fat_body_mass": 18.6,
"estimated_fat_body_mass": 19.1,
"lean_body_mass": 61.4,
"estimated_lean_body_mass": 62.9,
"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",
"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",
"inseam_from_crotch_to_ankle": "74.42",
"inseam_from_crotch_to_floor": "80.80",
"new_jacket_length": "77.92",
"side_neck_point_to_thigh": "81.62"
},
"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",
"waist_depth": "24.09"
},
"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,
"estimated_weight": 82,
"age": 25,
"fat_percentage": 23.31,
"bmi": 24.7,
"estimated_bmi": 25.3,
"bmr": 1805.0,
"estimated_bmr": 1825.0,
"fat_body_mass": 18.6,
"estimated_fat_body_mass": 19.1,
"lean_body_mass": 61.4,
"estimated_lean_body_mass": 62.9,
"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",
"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",
"inseam_from_crotch_to_ankle": "74.42",
"inseam_from_crotch_to_floor": "80.80",
"new_jacket_length": "77.92",
"side_neck_point_to_thigh": "81.62"
},
"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",
"waist_depth": "24.09"
},
"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
- Request can be made only on measurements after they have completed successfully
- Request is allowed only for different measurements
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
- Request can be made only on measurements after they have completed successfully
- Request is allowed only for different measurements
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
}
Subscription
Current
Current active subscription info
curl --location 'https://backend.fitxpress.3dlook.me/api/1.0/subscriptions/current/' \
--header 'Authorization: Token <ACCESS_TOKEN>'
import requests
url = "https://backend.fitxpress.3dlook.me/api/1.0/subscriptions/current/"
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/subscriptions/current/", 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/subscriptions/current/
Response codes
| Status code | Description |
|---|---|
| 200 | The request succeeded. |
| 403 | Invalid token. |
| 403 | Authentication credentials were not provided. |
| 403 | Your subscription is inactive, please reach out to your assigned contact for the information |
Response 200
{
"available": 49,
"total_used": 1,
"measurements_used": 1,
"predicted_models_used": 0,
"body_progress_used": 0,
"body_progress_render_used": 0,
"end_dt": "2025-02-01T11:03:27Z"
}
Response 403
{
"detail": "Authentication credentials were not provided."
}
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. |