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 inAuthorization
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",
"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
weight
value 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
weight
value 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,
"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:
- 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,
"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",
"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,
"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:
- Request can be made only on measurements after they have completed successfully
- Only one request per measurement can be
in_progress
/pending
state. 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,
"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",
"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,
"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",
"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
}
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. |