← Back to DevelopersMigration Guide

Cardiac VHS — V2 to V3 Breaking Changes

Applies to the cardiac VHS / VLAS algorithm only. V3 is a backward-compatible superset of V2 for single-image prediction. The endpoint URL changes (now under /vhs/v3), but the request format is identical and the response adds new fields without removing any.

VHS / VLAS v3 is live in production as of May 1, 2026. The V2 deprecation timeline below remains in effect.

Architecture Changes

AreaV2V3
ModelSingle model with test-time augmentation3-fold deep learning ensemble
Landmarks11 landmarks7 landmarks
Image size512x512768x768 (letterboxed)
ConfidenceHIGH / MEDIUM / LOWEnsemble spread-based (optimal / good / review)
RegionsEUUS + EU
Batch modeNoneUp 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/predict

2. 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 TierV3 TierMeaning
HIGHoptimalAll folds agree closely; result is reliable
MEDIUMgoodMinor spread across folds; result is usable
LOWreviewLarge spread; manual review recommended

3. Removed Response Fields

The following fields are no longer present in V3 responses:

Removed FieldV3 Replacement
vhs_confidencemodel_confidence (unified)
vlas_confidencemodel_confidence (unified)
scoresNone — 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:

CodeDescription
0Abnormal result — unexpected prediction state.
1VHS and VLAS predicted successfully with high confidence.
2VHS and VLAS predicted successfully with moderate confidence.
3VHS and VLAS predicted but confidence is low — review recommended.
4VHS predicted successfully, VLAS could not be calculated.
5Neither VHS nor VLAS could be calculated — check image quality.
6Image rejected — not a valid radiograph.
7PoP 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": true

6. Health Check Endpoint

The health check endpoint has changed:

- GET https://api.radanalyzer.com/eu/health
+ GET https://api.radanalyzer.com/vhs/v3/health

Non-Breaking Changes

The following fields are new in V3 responses. They are additive and do not affect existing integrations:

New FieldTypeDescription
model_confidencestringUnified confidence tier: optimal, good, or review
spreadfloatEnsemble spread value used to derive confidence
pop_detectedbooleanWhether a Picture-of-Picture radiograph was detected
model_versionstringModel version identifier (e.g. "3.6.0-ensemble")
result_codeintegerNumeric result code (0–7)
result_descriptionstringHuman-readable description of the result code
vhs_statusstringV3.6+. "valid", "unusual", "error", or "no_measurement"
line_confidenceobjectV3.6+. Per-line confidence for long_axis, short_axis, vertebral, vlas
pipeline_versionstringV3.6+. Processing pipeline version
retake_guidancestring | nullV3.6+. Specific guidance for retaking the photo
show_resultbooleanV3.6+. Whether the client should display the VHS value to the end user
landmarks_detectedbooleanV3.6+. Whether all 7 landmarks were found
inference_time_msnumberV3.6+. Total inference time in milliseconds

New V3-Only Features

FeatureParameter / EndpointDescription
BatchPOST /vhs/v3/predict with {"images": [...]}Send up to 10 images in a single request
StreamingPOST /vhs/v3/predict/streamStream results as server-sent events
PoP SessionPOST /vhs/v3/pop-session/start + POST /vhs/v3/pop-sessionPicture-of-Picture capture session
Signed-URL Frame UploadPOST /vhs/v3/pop-session/frame/upload-url + POST /vhs/v3/pop-session/frame/by-keyV3.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/predict to /vhs/v3/predict
  • Update health check URL from /eu/health to /vhs/v3/health
  • Remove extended_run and enhancement_iterations from request bodies

If you parse confidence tiers

  • Replace vhs_confidence / vlas_confidence with model_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_render to render in 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_description for user-facing messages

Timeline

DateMilestone
May 1, 2026V3 GA — production-ready for all customers
May 8, 2026Migration announcement sent to all V2 customers
June 1, 2026Migration reminder — 60 days until V2 shutdown
July 1, 2026Final warning — 30 days until V2 shutdown
July 15, 2026V2 responses include deprecation headers
August 1, 2026V2 service scaled to zero (still accessible via cold start as a grace period for stragglers)
August 15, 2026V2 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..."
}