Add 3D body scanning to your product with one API call.
Send two smartphone photos — base64-encoded inside a JSON body — and a height. Get back
body measurements, a full 3D body model, or both, shaped to exactly what your product needs,
in under 10 seconds.
// request — two photos and a height
{
"height": "174cm",
"company": "your-partner-code",
"images": [ // each photo as a base64 string
{ "fileName": "front.jpg", "data": "/9j/4AAQ…" },
{ "fileName": "side.jpg", "data": "/9j/4AAQ…" }
]
}
// response — the outputs your integration is set up for
{
"measurements": {
"chest circumference": 100.5,
"waist circumference": 88.6,
"hip circumference": 100.2,
"inside leg height": 76.5// …your set, in cm
},
"body_model": { "format": "obj", "points": "10,000" }
}
How it works
Your app captures. We measure. Your system keeps the result.
The scan engine is stateless: it reconstructs the body, computes what you asked for, returns it, and forgets it. Everything that persists lives on your side.
Your app or website
Capture
Your user takes a front and a side photo and enters their height — in your own capture screen, or ours under your brand.
Any smartphone camera
Everyday clothes work
HTTPS · JSON
SnapMeasureAI · stateless
Reconstruct & measure
Pose is detected in every photo, the views are fused into one 3D body model scaled to the height, and your measurements are computed on it.
Processed in memory
Photos never written to disk
JSON
Your system
Store & use
Measurements and the body model land in your system, joined to your own user or patient record, under your retention policy.
You hold the history
Size charts, CAD, progress views
Typically under 10 seconds from photos to result.
Quickstart
From two photos to measurements.
One request. Photos go as base64 strings inside a JSON body, so it works the same from a browser, a phone, or a server.
Get your endpoint and partner code
Onboarding gives you an endpoint, a partner code, and test access. The partner code carries your output configuration and your measurement set.
Turn each photo into a base64 string
Use whatever capture or upload flow your product already has — your own camera screen, a file picker, or images already in your storage. Base64-encode the bytes of the front and side photos; that text goes in the JSON. Optionally resize to 800 px on the longest side first: it's the resolution the engine works at, so larger photos only slow the request.
Send the request
POST the height, your partner code, and the base64 images. Allow up to 60 seconds of client timeout; typical scans return in under 10.
Use the result
Map measurements to your size chart, store them against your record, or hand the 3D body model to your CAD, pattern, or visualization pipeline.
const SNAPMEASURE_ENDPOINT = "https://…"; // issued at onboardingconst PARTNER_CODE = "your-partner-code";
// Shrink a photo (File or Blob) to 800 px and return it as base64 textasync function toBase64(file, maxSide = 800) {
const img = await createImageBitmap(file);
const scale = Math.min(1, maxSide / Math.max(img.width, img.height));
const canvas = Object.assign(document.createElement("canvas"), {
width: Math.round(img.width * scale), height: Math.round(img.height * scale),
});
canvas.getContext("2d").drawImage(img, 0, 0, canvas.width, canvas.height);
return canvas.toDataURL("image/jpeg", 0.94).split(",")[1];
}
// frontFile, sideFile: File or Blob objects from your own capture or upload UI,// e.g. document.querySelector("#front-photo").files[0]const res = await fetch(SNAPMEASURE_ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
height: "174cm", // or "68in"
company: PARTNER_CODE,
images: [
{ fileName: "front.jpg", data: await toBase64(frontFile) },
{ fileName: "side.jpg", data: await toBase64(sideFile) },
],
}),
});
if (!res.ok) throw new Error(await res.text());
const result = await res.json();
console.log(result.measurements["waist circumference"]); // 88.6 (cm)
import base64, requests
SNAPMEASURE_ENDPOINT = "https://…"# issued at onboarding
PARTNER_CODE = "your-partner-code"def to_base64(image_bytes):
# The raw bytes of a JPEG or PNG, as base64 textreturn base64.b64encode(image_bytes).decode("ascii")
# Photo bytes can come from anywhere: your upload handler, S3, a database, or diskwith open("front.jpg", "rb") as f:
front = f.read()
with open("side.jpg", "rb") as f:
side = f.read()
payload = {
"height": "174cm", # or "68in""company": PARTNER_CODE,
"images": [
{"fileName": "front.jpg", "data": to_base64(front)},
{"fileName": "side.jpg", "data": to_base64(side)},
],
}
res = requests.post(SNAPMEASURE_ENDPOINT, json=payload, timeout=60)
res.raise_for_status()
result = res.json()
print(result["measurements"]["waist circumference"]) # 88.6 (cm)
# Base64-encode each photo onto one line, then build the JSON body
FRONT=$(base64 < front.jpg | tr -d '\n')
SIDE=$(base64 < side.jpg | tr -d '\n')
printf '{"height":"174cm","company":"%s","images":[{"fileName":"front.jpg","data":"%s"},{"fileName":"side.jpg","data":"%s"}]}' \
"$PARTNER_CODE""$FRONT""$SIDE" > scan.json
curl -X POST "$SNAPMEASURE_ENDPOINT" \
-H "Content-Type: application/json" \
--max-time 60 \
-d @scan.json
Request
Three fields. That's the whole input.
A JSON body sent with Content-Type: application/json.
Photos go inside the JSON, as base64 text
Capture or upload photos however your product already does. When you call the API, send each photo's JPEG or PNG bytes as a base64 string in images[].data, not as a multipart/form-data file field. The quickstart code above does exactly this.
Field
Type
Description
heightRequired
string
The person's height with its unit: "174cm" or "68in". The body model is scaled to it, so every measurement comes out at real size — and in the same unit.
imagesRequired
array
Two to four photos of one person, front first, then side. A back view or the other side is optional and refines depth. Each item is { "fileName", "data" }, where data is the photo as a base64-encoded string of the JPEG or PNG bytes (a data:image/jpeg;base64, prefix is also accepted). Up to 30 MB per photo; 800 px on the longest side is all the engine uses.
companyPartner code
string
Your partner code, issued at onboarding. It selects your measurement set and the outputs your integration returns. Leave it blank to get the live demo's default output: the standard measurement set plus the embeddable 3D viewer.
No names, emails, or account IDs are needed. To join a result to your own record, keep your reference on your side and attach the response to it when it comes back.
Outputs
Measurements, the full 3D body, or both.
Every scan reconstructs a complete 3D body and computes a lot along the way — and anything computed during a scan can be returned. Each integration takes the combination its product needs, and that can grow as the product does.
Body measurements Core
Circumferences and lengths across the full body — chest, waist, hips, neck, bicep, forearm, wrist, thigh, calf, ankle, shoulder breadth, arm length, inside leg, torso lengths, foot length and width — in centimetres or inches, matching the height you send.
Custom measurement sets Core
Any circumference or length between any points on the body, defined once in the live demo's 3D viewer and saved as a JSON measurement profile. Your partner code applies it to every scan — 100+ measurements are available.
3D body model Core
The complete 10,000-point body mesh in a standard pose, scaled to the person's real height. Delivered as OBJ for CAD, pattern-making, virtual fitting, avatars, and digital twins.
Body composition & health indicators Health programs
Waist-to-height and waist-to-hip ratios come straight from the scan. Body-fat percentage, fat and lean mass, and estimated weight can be derived from the same scan — from girths, using established circumference-based equations, and from the 3D model's body volume — configured and validated with each program. A way to show change between visits, alongside clinical body-composition assessment rather than instead of it.
The model predicts a distribution for each measurement, not just a number, so every value can come with a calibrated range. Flag uncertain scans, or show a size range instead of a single size.
Photo quality feedback Available
Per-photo checks — person found, framing, estimated camera distance, and how much each photo contributed — so your app can ask for a better retake before a measurement is used.
Ground-referenced measurements Available
Leg circumferences at fixed heights from the floor, and the height above the floor of every circumference — the format compression-garment and medical-fit makers specify garments in.
Also available from every scan
A compact body shape code (a few hundred bytes — store it, then regenerate the 3D model or apply new measurement definitions later without new photos), 3D joint positions and per-photo keypoints, a body-part map of the 3D model, the exact ring or path each measurement was taken along, and named landmark points on the body surface. If it's computed during a scan, it can be in your response.
The interactive viewer from the live demo — rotating body model, measurement rings and lengths, a custom-measurement editor — returned as a self-contained page you can drop into an iframe, under your brand. Skip it if you render results yourself.
Your outputs are configured on your partner code, so a sizing integration and a health integration can call the same endpoint and get very different responses.
Uniform supplier: your garment measurement set, mapped to your size chart
Made-to-measure: measurements plus the OBJ body model for pattern software
E-commerce sizing: measurements with confidence ranges, so borderline customers see two sizes
Compression garments: leg girths at the exact heights from the floor your patterns use
GLP-1 program: tracking girths, waist-to-height ratio, and body-composition estimates for the patient record
Example response · measurements + 3D body model
{
"measurements": {
"height": 174.0,
"chest circumference": 100.5,
"waist circumference": 88.6,
"hip circumference": 100.2,
"neck circumference": 39.8,
"shoulder breadth": 36.4,
"arm right length": 54.2,
"inside leg height": 76.5,
"thigh left circumference": 57.5// …the rest of your measurement set, in cm (the height's unit)
},
"body_model": {
"format": "obj",
"data": "v 0.0213 1.5482 0.0871\nv …"
}
}
Illustrative. Field names and the exact contents of each response are agreed during onboarding.
Photo capture
Good photos in, precise measurements out.
Build these into your capture screen — or use our capture flow, which has a guided camera with a countdown timer built in.
Stand in an A-poseArms slightly away from the body in both photos. Raised arms lift the shirt and make the chest read larger.
Whole body in frameHead to toe, phone upright at about hip height. A shelf or a second person works well.
Everyday clothes workFitted clothing gives the best results; jeans, shorts, and T-shirts are fine. Take off coats and bulky layers.
One person, decent lightNo special background needed. Very dark photos or other people in frame can stop a scan.
Errors
What can go wrong, and what to do.
Input problems are rejected immediately with a readable message. Photos the engine can't measure come back as a successful response with no measurements, so your app can ask for a retake.
Status
When
What to do
200
Scan complete — your configured outputs are in the body.
Store and use the result.
200 · no measurements
A person couldn't be found in enough photos, or fewer than two usable photos were sent.
Ask the user to retake: full body in frame, A-pose, decent light, one person.
400
Height missing, no photos or more than four, or a photo over the size limit.
Fix the request; the message says which check failed.
500
The scan couldn't be completed on our side.
Retry once; if it repeats, send us the time of the request.
Data handling
Built so there's nothing to leak.
The simplest way to protect body photos is never to keep them. Here is exactly what happens to the data in a scan, end to end.
Photos are never stored
Images are decoded and processed in memory, never written to disk, and discarded as soon as the response is returned. In the demo and our capture flow they are also downscaled on the device first, so full-resolution originals never leave the phone.
No personal information required
A scan needs photos, a height, and your partner code — no name, email, account, or date of birth. Your own user or patient ID never has to reach us.
Your system holds the history
Results are returned to you, not kept by us as a record. Longitudinal tracking, deltas, and retention live in your environment, under your policies.
Encrypted in transit, deployable where you need
Requests travel over HTTPS. For enterprise agreements, the engine can run in a dedicated cloud tenancy or on your own infrastructure, with custom data-handling terms.
Your appPhotos and height, captured with the user's consent
SnapMeasureAIProcessed in memory · returned · forgotten
Your systemResults stored against your record, under your retention
Integration options
Fit it into the product you already have.
Start with whichever is fastest for your team; they share one engine and one partner code.
Fastest
White-label scan
Our capture flow, with the guided camera, under your brand — linked from an email, SMS, QR code, or your portal.
Most control
REST API
Your own capture screen calls the endpoint directly from your app or backend.
Visual
Embedded 3D viewer
Show the rotating body model and measurements inside your product, without building a 3D renderer.
Enterprise
Dedicated or on-premise
A dedicated cloud tenancy or your own infrastructure, with custom data-handling terms.
FAQ
Developer questions
Which languages and platforms are supported?
Anything that can make an HTTPS request with a JSON body: web, iOS, Android, or any backend language. There is no SDK to install. If you'd rather not build the capture screen, the white-label scan flow and 3D viewer can be embedded instead.
Can we get only the measurements, or only the 3D body model?
Yes. The response is configured per integration: measurements only, the 3D body model only, both, or any combination of the other outputs. Many partners take the measurements for sizing and keep the compact shape code so they can regenerate the body model later.
How do we define our own measurements?
In the live demo's 3D viewer, use Custom Measure to define circumferences or lengths between any points on the body, save them as a measurement profile (a JSON file), and send it to us. It is attached to your partner code, so every scan through your integration returns your set.
What units are measurements returned in?
The unit of the height you send. Send "174cm" and every measurement comes back in centimetres; send "68in" and they come back in inches.
Are photos or results stored?
No. Photos are decoded and processed in memory, never written to disk, and discarded when the response is returned. No account, name, or email is needed to run a scan, and results go back to your system rather than being kept by SnapMeasureAI.
How do we get access?
Contact us with your use case. Onboarding provides your endpoint, partner code, and test access, and we configure your outputs and measurement profile with you. You can run the live demo at any time to see the scan your users would get.
Ready to build it in?
Tell us what you're building. We'll set up your endpoint, partner code, and measurement set, and walk your team through the first integration.