Architecture Changes
| Area | V2 | V3 |
|---|---|---|
| Model | Single model with test-time augmentation | 3-fold deep learning ensemble |
| Landmarks | 11 landmarks | 7 landmarks |
| Image size | 512x512 | 768x768 (letterboxed) |
| Confidence | HIGH / MEDIUM / LOW | Ensemble spread-based (optimal / good / review) |
| Regions | EU | US + EU |
| Batch mode | None | Up to 10 images per request |
Breaking Changes
1. Endpoint URL
The base path changes from /eu/predict to /vhs/v3/predict. The new path namespaces the cardiac algorithm under /vhs/ so that other algorithms (e.g. /usg/v1/) can coexist on the same host.
- POST https://api.radanalyzer.com/eu/predict
+ POST https://api.radanalyzer.com/vhs/v3/predict2. Confidence Tier Names
V2 returned separate vhs_confidence and vlas_confidence fields with values HIGH, MEDIUM, or LOW. V3 returns a single model_confidence field with values optimal, good, or review.
| V2 Tier | V3 Tier | Meaning |
|---|---|---|
| HIGH | optimal | All folds agree closely; result is reliable |
| MEDIUM | good | Minor spread across folds; result is usable |
| LOW | review | Large spread; manual review recommended |
3. Removed Response Fields
The following fields are no longer present in V3 responses:
| Removed Field | V3 Replacement |
|---|---|
vhs_confidence | model_confidence (unified) |
vlas_confidence | model_confidence (unified) |
scores | None — ensemble spread replaces scoring |
4. Result Codes Redesigned
V3 introduces a new set of numeric result codes (0–7) that replace V2's error handling:
| Code | Description |
|---|---|
| 0 | Abnormal result — unexpected prediction state. |
| 1 | VHS and VLAS predicted successfully with high confidence. |
| 2 | VHS and VLAS predicted successfully with moderate confidence. |
| 3 | VHS and VLAS predicted but confidence is low — review recommended. |
| 4 | VHS predicted successfully, VLAS could not be calculated. |
| 5 | Neither VHS nor VLAS could be calculated — check image quality. |
| 6 | Image rejected — not a valid radiograph. |
| 7 | PoP preprocessing failed — landmarks could not be detected from screen photo. |
5. Server-Side Rendering Parameter
The parameter to request a rendered overlay image has been renamed:
- "include_render": true
+ "render": true6. Health Check Endpoint
The health check endpoint has changed:
- GET https://api.radanalyzer.com/eu/health
+ GET https://api.radanalyzer.com/vhs/v3/healthNon-Breaking Changes
The following fields are new in V3 responses. They are additive and do not affect existing integrations:
| New Field | Type | Description |
|---|---|---|
model_confidence | string | Unified confidence tier: optimal, good, or review |
spread | float | Ensemble spread value used to derive confidence |
pop_detected | boolean | Whether a Picture-of-Picture radiograph was detected |
model_version | string | Model version identifier (e.g. "3.6.0-ensemble") |
result_code | integer | Numeric result code (0–7) |
result_description | string | Human-readable description of the result code |
vhs_status | string | V3.6+. "valid", "unusual", "error", or "no_measurement" |
line_confidence | object | V3.6+. Per-line confidence for long_axis, short_axis, vertebral, vlas |
pipeline_version | string | V3.6+. Processing pipeline version |
retake_guidance | string | null | V3.6+. Specific guidance for retaking the photo |
show_result | boolean | V3.6+. Whether the client should display the VHS value to the end user |
landmarks_detected | boolean | V3.6+. Whether all 7 landmarks were found |
inference_time_ms | number | V3.6+. Total inference time in milliseconds |
New V3-Only Features
| Feature | Parameter / Endpoint | Description |
|---|---|---|
| Batch | POST /vhs/v3/predict with {"images": [...]} | Send up to 10 images in a single request |
| Streaming | POST /vhs/v3/predict/stream | Stream results as server-sent events |
| PoP Session | POST /vhs/v3/pop-session/start + POST /vhs/v3/pop-session | Picture-of-Picture capture session |
| Signed-URL Frame Upload | POST /vhs/v3/pop-session/frame/upload-url + POST /vhs/v3/pop-session/frame/by-key | V3.6+. Upload raw JPEG frames directly to GCS via a short-lived signed URL, skipping base64 encoding. Optional alternative to POST /vhs/v3/pop-session; identical inference and billing. |
Migration Checklist
Minimal migration (5 minutes)
- Update the endpoint URL from
/eu/predictto/vhs/v3/predict - Update health check URL from
/eu/healthto/vhs/v3/health - Remove
extended_runandenhancement_iterationsfrom request bodies
If you parse confidence tiers
- Replace
vhs_confidence/vlas_confidencewithmodel_confidence - Update tier value comparisons: HIGH → optimal, MEDIUM → good, LOW → review
If you use landmark coordinates
- Update any code referencing landmarks by index — V3 only returns indices 0–6
- Remove references to any V2-only auxiliary landmarks
- Verify that your rendering logic handles 7 landmarks instead of 11
If you use server-side rendering
- Rename
include_rendertorenderin your request body - The response field is
rendered_image(base64 PNG) — unchanged from V2
If you use result_code
- Map your error handling to the new result codes (0–7)
- Add handling for new codes: 4 (VHS predicted, VLAS could not be calculated), 5 (neither VHS nor VLAS could be calculated). Code 7 is reserved and not emitted by V3.6.
- Use
result_descriptionfor user-facing messages
Timeline
| Date | Milestone |
|---|---|
| May 1, 2026 | V3 GA — production-ready for all customers |
| May 8, 2026 | Migration announcement sent to all V2 customers |
| June 1, 2026 | Migration reminder — 60 days until V2 shutdown |
| July 1, 2026 | Final warning — 30 days until V2 shutdown |
| July 15, 2026 | V2 responses include deprecation headers |
| August 1, 2026 | V2 service scaled to zero (still accessible via cold start as a grace period for stragglers) |
| August 15, 2026 | V2 infrastructure fully deleted |
Side-by-Side Examples
V2 Request
POST /eu/predict HTTP/1.1
Host: api.radanalyzer.com
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"image": "base64_encoded_image_data...",
"uuid": "patient-123",
"include_render": true,
"extended_run": true,
"enhancement_iterations": 3
}V2 Response
{
"vhs": 10.2,
"vlas": 2.8,
"vhs_confidence": "HIGH",
"vlas_confidence": "HIGH",
"scores": {
"vhs_ebm": 0.92,
"vlas_ebm": 0.88
},
"landmarks": [ ... ],
"render": "base64_rendered_image..."
}V3 Request
POST /vhs/v3/predict HTTP/1.1
Host: api.radanalyzer.com
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"image": "base64_encoded_image_data...",
"uuid": "patient-123",
"render": true
}V3 Response
{
"vhs": 10.2,
"vlas": 2.8,
"model_confidence": "optimal",
"spread": 0.003,
"pop_detected": false,
"model_version": "3.6.0-ensemble",
"result_code": 1,
"result_description": "VHS and VLAS predicted successfully with high confidence.",
"prediction": [
{ "x": 0.42, "y": 0.15, "class": "heart_top" },
{ "x": 0.41, "y": 0.44, "class": "heart_bottom" },
{ "x": 0.25, "y": 0.30, "class": "heart_right" },
{ "x": 0.57, "y": 0.29, "class": "heart_left" },
{ "x": 0.49, "y": 0.40, "class": "VLAS" },
{ "x": 0.36, "y": 0.12, "class": "Vertebra A" },
{ "x": 0.55, "y": 0.12, "class": "Vertebra B" }
],
"rendered_image": "base64_rendered_image..."
}