Developers

Put radiology intelligence inside your software.

One versioned REST API. Deterministic criteria verdicts with provenance, callable by your application or your agent.

  1. 1

    See the response

    Below: a real request and the engine's real answer.

    Jump to example
  2. 2

    Read the API

    Interactive OpenAPI reference. No account needed.

    API reference
  3. 3

    Get a key

    Passkeys, Google, GitHub or email. Keys are shown once and stored hashed.

    Developer portal
  4. 4

    Build

    A free monthly allowance of decisions, then metered per decision.

    Pricing

Example

POST /v1/inference/evaluate

POST /v1/inference/evaluate
curl https://api.radvector.ai/v1/inference/evaluate \
  -H "Authorization: Bearer $RADVECTOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "study": {
    "modality": "ct",
    "region": "thorax",
    "age_years": 64,
    "sex": "M",
    "attributes": {
      "risk": "high"
    }
  },
  "findings": [
    {
      "label": "nodule",
      "region": "thorax",
      "laterality": "right",
      "composition": "solid",
      "measurement": {
        "value_mm": 7
      },
      "attributes": {
        "multiplicity": "single"
      }
    }
  ]
}'
import os, requests

resp = requests.post(
    "https://api.radvector.ai/v1/inference/evaluate",
    headers={"Authorization": f"Bearer {os.environ['RADVECTOR_API_KEY']}"},
    json={
      "study": {
        "modality": "ct",
        "region": "thorax",
        "age_years": 64,
        "sex": "M",
        "attributes": {
          "risk": "high"
        }
      },
      "findings": [
        {
          "label": "nodule",
          "region": "thorax",
          "laterality": "right",
          "composition": "solid",
          "measurement": {
            "value_mm": 7
          },
          "attributes": {
            "multiplicity": "single"
          }
        }
      ]
    },
)
best = resp.json()["outcomes"][0]["best"]
print(best["impression_category"], best["provenance"]["pack_version"])
const resp = await fetch("https://api.radvector.ai/v1/inference/evaluate", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RADVECTOR_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "study": {
      "modality": "ct",
      "region": "thorax",
      "age_years": 64,
      "sex": "M",
      "attributes": {
        "risk": "high"
      }
    },
    "findings": [
      {
        "label": "nodule",
        "region": "thorax",
        "laterality": "right",
        "composition": "solid",
        "measurement": {
          "value_mm": 7
        },
        "attributes": {
          "multiplicity": "single"
        }
      }
    ]
  }),
});
const { outcomes } = await resp.json();
console.log(outcomes[0].best.recommendation);
Response 200 OKReal API output · abridged
{
  "trace_id": "site-example-1",
  "api_version": "v1",
  "outcomes": [
    {
      "best": {
        "schema_version": "1.0",
        "system": "Fleischner",
        "category_id": "FLE-SOLID-SINGLE-6TO8-HIGH",
        "impression_category": "Solid single nodule 6-8 mm, high risk",
        "canonical_language": "Single solid pulmonary nodule measuring 6 to 8 mm in a high-risk patient.",
        "recommendation": "CT at 6-12 months, then CT at 18-24 months.",
        "confidence": 0.85,
        "authoritative": true,
        "usable_for_output": true,
        "is_deferral": false,
        "provenance": {
          "system": "Fleischner",
          "pack_version": "fleischner-2017-r2",
          "validation_status": "validated",
          "validated_by": "Owner-directed (founding radiologist); size/risk table audited vs Fleischner 2017 (Radiology 2017;284:228-243)",
          "validation_date": "2026-08-18",
          "knowledge_release_id": "",
          "engine": "rc_algorithmic",
          "trace_id": "site-example-1",
          "citations": [],
          "is_clinically_validated": true
        },
        "evidence": {
          "type": "solid",
          "multiplicity": "single",
          "size_mm": 7,
          "risk": "high"
        },
        "notes": ""
      },
      "systems_considered": [
        "Fleischner"
      ],
      "engine_input": "CT of the chest. 64-year-old male. Patient is high-risk. Single solid pulmonary nodule on the right measuring 7 mm.",
      "engine": "rc_algorithmic"
    }
  ]
}

Captured from the RadVector API engine. verdicts[] and authoritative repeat this verdict and are omitted here. The contract has no field for a name, MRN or date of birth.

Reference

The /v1 surface.

Base URL https://api.radvector.ai. Authenticate with Authorization: Bearer rvk_… or X-API-Key.

RadVector API version 1 routes
RouteWhat it doesEngine
POST /v1/inference/evaluateThe central call. Structured findings (or text) plus study in; every applicable standard's verdict with provenance, the best and the authoritative verdict out.Deterministic
POST /v1/inference/evaluate/batchOne to 25 evaluate requests answered in order, each with its own result or error and each metered as if sent alone.Deterministic
POST /v1/results/normalizeAnother imaging AI system's output as FHIR R4 Observations or a DICOM SR TID 1500 measurement report in; findings graded by the same engine, each verdict naming its AI source.Deterministic
POST /v1/context/prepareThe pre-read: current order plus prior report texts in; comparable priors ranked, prior measurements, applicable standards, open recommendations and missing information out.Deterministic
POST /v1/findings/normalizeDe-identified report text in; canonical findings with honest confidence out.Deterministic
POST /v1/compareThe same finding on two studies; direction (grown, shrunk, stable, indeterminate), deltas and interval.Deterministic
POST /v1/qa/reportDeterministic cross-check advisories on report text, such as laterality conflicts and recommendation concordance.Deterministic
POST /v1/referencesPublished guidance and emerging evidence as two separate citation streams, with source, version and dates.Deterministic
POST /v1/best-practicesPublished best-practice entries for an imaging question, each citing the guideline version it rests on.Deterministic
POST /v1/impressionThe one language-model route: an IMPRESSION and RECOMMENDATIONS drafted around the verdicts, mechanically checked to stay inside them.Deterministic + constrained LLM
GET /v1/guidelinesThe criteria-pack catalogue: edition, source, validation status, rule version.Deterministic
GET /v1/guidelines/{system}One criteria pack in full: categories, canonical language, recommendations, applicability.Deterministic

Integration

FHIR out, DICOM SR and FHIR in, a sandbox to start.

  • FHIR R4 output (DiagnosticReport Bundle)

    Available via API: Callable today through RadVector API.

    Any evaluate answer as a FHIR R4 Bundle: a preliminary DiagnosticReport, an Observation per finding and per verdict, deferrals kept visible.

  • AI-vendor results in (FHIR R4 Observations or DICOM SR TID 1500)

    Available via API: Callable today through RadVector API.

    Another AI system's FHIR Observations or DICOM SR TID 1500 measurements, graded by the same engine; each verdict names its AI source.

  • Verified RadElement finding codes

    Available via API: Callable today through RadVector API.

    RadElement codes copied from the published Open Imaging Finding Models, re-verified at build; no code is sent rather than a wrong one.

  • Pre-read context from prior reports

    Available via API: Callable today through RadVector API.

    Priors ranked same-type first, prior measurements, applicable standards, open recommendations and missing information, before the read.

  • Sandbox keys and synthetic fixtures

    Available via API: Callable today through RadVector API.

    Same engine answers, never billed, with a published file of synthetic requests for every route.

  • Criteria-pack version pinning

    Available via API: Callable today through RadVector API.

    Pin a pack version; a stale pin answers 409 instead of silently changing recommendations.

  • Closed-set deferral codes

    Available via API: Callable today through RadVector API.

    Every verdict carries a code from a closed set, so integrations branch on a value, never on prose.

  • Batch evaluation and idempotent retries

    Available via API: Callable today through RadVector API.

    Up to 25 evaluations in one call; an Idempotency-Key replays the stored answer without re-running or re-billing.

Read the full developer guide on radvector.ai

Standards the engine applies: Lung-RADS, BI-RADS, TI-RADS, LI-RADS, O-RADS, PI-RADS, Bosniak, Fleischner, DEXA.