RadVector API

Radiology expertise your software can call.

Send a de-identified finding and its study. Get back the category a validated criteria pack reached, the pack and version that reached it, the exact text the engine read, and a trace id. Deterministic by default.

Built for humans, applications and agents.

Decision

Solid single nodule 6-8 mm, high risk

Input: 7 mm solid nodule, CT thorax, risk high

Criteria
Fleischner
Pack version
fleischner-2017-r2
Validation
validated · 2026-08-18
Category
FLE-SOLID-SINGLE-6TO8-HIGH
Confidence
0.85
Usable for output
true
Engine
rc_algorithmic
Trace id
site-example-1

RecommendationCT at 6-12 months, then CT at 18-24 months.

From a real RadVector API response. Clinical decision support for qualified professionals.

See the response

A language model recalls a guideline. RadVector applies one.

This is a real request and the response the RadVector engine returned for it: a 7 mm solid nodule in a high-risk 64-year-old, evaluated against Fleischner 2017.

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.

Design rules

Decisions, provenance and prose are separate things.

  • Deterministic by default

    The decision routes never call a language model. The same input returns the same verdict.

  • Provenance on every verdict

    Pack system, pack version, validation status, validator and date, engine and trace id.

  • Honest about uncertainty

    A deferral says why it deferred. A draft pack answers advisory. Silence is never dressed up as a decision.

  • PHI-free contract

    No field for a name, MRN or date of birth. Free text is masked before the engine reads it, or refused.

  • Versioned and additive

    The /v1 contract only grows by optional fields. A breaking change would be /v2.

  • Priced per decision

    Metered per clinical decision, with a free monthly allowance and no card to start. A call that reaches no decision costs nothing.

The /v1 surface

12 routes. One clinical engine.

The same engine powers RadVector Reporting. Full request and response schemas are in the public OpenAPI reference, readable before you sign up.

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

OpenAPI specification (opens in a new tab)

Built to be integrated

Standard formats in and out. Honest failure codes.

What a hospital integration team or an AI company needs before the first production call.

  • 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

Criteria packs

Validated where it matters. Marked where it is not.

Only a validated pack with a named validator and date can produce a verdict marked usable for output. Everything else answers as advisory or defers, and says why.

Validated · may drive output

  • Fleischner 2017
    Incidental pulmonary nodules · pack fleischner-2017-r6, validated 2026-10-04
  • BI-RADS ACR 5th ed.
    Breast imaging categories · pack 2026.1, validated 2026-08-18
  • DEXA WHO 1994 + ISCD 2019
    Bone density classification · pack 2026.2, validated 2026-10-01

Every verdict names who validated its pack and when.

Draft · answers as advisory

  • Lung-RADS v2022
  • TI-RADS
  • PI-RADS v2.1
  • O-RADS US
  • LI-RADS
  • Bosniak
  • C-RADS
  • NI-RADS

Draft packs are marked not usable for output. A deferral always says why.

Plain-language guides: Lung-RADS, BI-RADS, TI-RADS, LI-RADS, O-RADS, PI-RADS, Bosniak, Fleischner, DEXA.

Who calls it

We do not need to build and maintain this ourselves.

That is the conclusion RadVector API is designed to earn from platform teams, AI companies and imaging vendors.

Model and agent developers

Give the model a tool, not a memory.

Let a general-purpose model hand radiology criteria to a maintained, versioned engine. Explicit deferrals tell the agent when not to answer.

Learn more: Model and agent developers

PACS, RIS and enterprise imaging

Rules evaluation, not an inference queue.

Keep your viewer, worklist and report. Call RadVector for the criteria step, with no patient identifiers crossing your boundary.

Learn more: PACS, RIS and enterprise imaging

EHR and order entry

Answers stable enough to store.

Versioned verdicts with a trace id can sit next to the order or the result, and be audited later against the pack version that produced them.

Imaging-AI vendors

Turn detection into clinical action.

A detection model tells a clinician that something is there. It rarely tells them what to do about it. RadVector supplies the category and recommendation that follow.

Get started

From reading to building in four steps.

  1. 01

    See the response

    The example above is a real engine output.

  2. 02

    Read the API

    Interactive reference, no account needed.

  3. 03

    Get a key

    Developer portal: passkeys, Google, GitHub or email.

  4. 04

    Build

    Free monthly allowance, then pay per decision. Pricing.

RadVector API questions

What is RadVector API?

RadVector API is a clinical inference API for radiology from iTech Clinical Intelligence. You send a de-identified finding and its study; it returns the category a validated criteria pack reached, the pack and version that reached it, the exact text the engine read, a trace id, and optional references. Its deterministic routes never call a language model. Documentation is public at https://api.radvector.ai/v1/docs.

How is RadVector API different from asking a large language model about a guideline?

A language model recalls a guideline; RadVector applies one. RadVector API evaluates structured findings against a versioned criteria pack and returns the same answer for the same input, with the pack version, validation status and trace id attached. When the criteria do not apply, for example because a nodule has no stated composition or the patient is below the pack's minimum age, it returns a deferral that says why instead of guessing.

Which radiology criteria does RadVector API support?

Three criteria packs are validated and may drive output today: Fleischner 2017 for incidental pulmonary nodules, ACR BI-RADS 5th edition, and DEXA bone-density classification (WHO 1994 with ISCD 2019). Draft packs for Lung-RADS v2022, TI-RADS, PI-RADS v2.1, O-RADS US, LI-RADS, Bosniak 2019, C-RADS and NI-RADS answer as advisory and are marked not usable for output while they are validated. Each standard has a plain-language guide at itecclinical.com/standards.

Can AI agents and foundation models call RadVector API as a tool?

Yes. Agents calling RadVector API as a tool is a first-class use. The API takes structured input, returns structured verdicts with provenance, and says explicitly when it defers, which lets a general-purpose model hand radiology criteria to a maintained, versioned engine instead of reciting them from memory. The one language-model route, /v1/impression, drafts an impression constrained to the verdicts and mechanically checks that the prose stayed inside them.

Does RadVector API return FHIR?

Yes. Every POST /v1/inference/evaluate answer is available as a FHIR R4 Bundle (send Accept: application/fhir+json or add ?format=fhir): one preliminary DiagnosticReport, one Observation per finding and one per verdict, with the criteria pack, version and validation status on each verdict. A deferral is an Observation with dataAbsentReason, so an undecided finding stays visible. Findings carry verified RadElement codes where a verified code exists.

Can RadVector grade results from other imaging AI systems?

Yes. POST /v1/results/normalize accepts another AI system's output as FHIR R4 Observations or as a DICOM SR TID 1500 measurement report in the DICOM JSON model. Each finding keeps its source algorithm and version, is graded by the same engine against Lung-RADS, BI-RADS, TI-RADS, Fleischner and the other packs, and every verdict names both the AI source and the criteria pack. Patient fields are never read. RadVector grades findings another system reported; it detects nothing itself.

How do developers test RadVector API safely?

With a sandbox key and synthetic fixtures. A sandbox key returns the same engine answers as a live key, is never billed, and marks every answer X-RadVector-Sandbox: true; a published file of synthetic request bodies covers each route. Integrations can also pin criteria-pack versions (a stale pin answers 409 instead of silently changing recommendations), branch on closed-set deferral codes, send up to 25 evaluations in one batch, and retry safely with an Idempotency-Key. The developer guide is at https://radvector.ai/portal/developers.

What is the RadVector pre-read service?

POST /v1/context/prepare assembles what a radiologist needs before reading: from the current order and prior report texts it returns the comparable priors ranked same-type first with their intervals, prior measurements bound to their lesions, the reporting standards that apply with their required elements, recommendations from earlier reports that are still open, and missing-information warnings. It calls no language model.

Is RadVector FDA-cleared?

No. RadVector Reporting and RadVector API are clinical decision support for qualified professionals. They have not received FDA clearance or approval as a medical device, are not a diagnostic device, and must not be used for autonomous diagnosis, triage or unsupervised reporting. The radiologist remains the final clinical authority.

Does RadVector API accept patient identifiers, and will you sign a BAA?

RadVector API is built to need as little protected health information as possible. The contract has no field for a name, MRN, accession number or date of birth; age and sex are accepted because they change the clinical answer. Free text is passed through an identifier mask before the engine reads it, the call is refused if masking is unavailable, request text is never logged or stored, and customer data is never used for training. Self-serve keys are for de-identified input. For clinical deployments, including AI and clinical platforms that call RadVector on behalf of hospitals, iTech signs a Business Associate Agreement before PHI-bearing calls begin.

How can a developer try RadVector API?

Read the public reference at https://api.radvector.ai/v1/docs without an account, then create an account at https://radvector.ai/portal to mint a key. Every account includes a free monthly allowance of decisions with no card required. Pricing is metered per clinical decision; a call that reaches no decision is not billed.

Put radiology intelligence inside your software.

Built to need as little PHI as possible, with a BAA for clinical deployments. RadVector API is clinical decision support; it is not a diagnostic device, triage engine or unsupervised reporting workflow.