Results delivery
Optional: have each member's scan result stored by Visualize and delivered to your backend. Off by default — without it, no measurement ever leaves the member's device.
Consent comes first
A scan result is your member's body data. Enabling delivery is a warranty you make: your app obtains each member's consent to this storage and delivery, and you honor deletion requests. The switch in the portal states exactly that — turning it on is the promise, per your terms with Visualize.
Enable it
Portal → your app → Configuration → tick "Store members' scan results and deliver them to our backend". You need a webhook URL configured — results arrive as signed webhook deliveries.

The event
After each scan, alongside the usual scan.completed, your endpoint receives scan.results_available with the result exactly as the member's app computed it. Join the two on scan_id. Verification is identical to every other webhook.
{
"type": "scan.results_available",
"data": {
"scan_id": "scan_7f3a...",
"host_user_ref": "user_842",
"result": {
"modelVersion": "2026.09.2",
"measurements": {
"bodyFatPercent": 27.9,
"bmi": 24.6,
"girths": { "waistCm": 84.2, "hipCm": 98.6 }
}
}
}
}Deletion
When a member asks you to delete their data, one call removes every stored result and queued delivery for them. Zero deletions is a success — the intent is already true.
curl -X DELETE "https://api.visualizeme.ai/v1/results?host_user_ref=user_842" \
-H "Authorization: Bearer sk_live_..."
# 200 {"host_user_ref": "user_842", "deleted": 3}| Guarantee | Detail |
|---|---|
| Off means off | An app that never enables delivery sends no measurement to Visualize — the SDK's upload is refused server-side and stops permanently. |
| Billing unaffected | scan.completed stays measurement-free either way; delivery is a separate channel. |
| Retries dedupe | A re-uploaded result is the same result — one row, one delivery. |