For AI and foundation-model companies

Give general intelligence a maintained radiology layer.

Foundation models can reason over radiology. Maintaining radiology criteria, editions, applicability rules, validation and provenance is a different problem. RadVector API is built to be that layer, callable as a tool.

The problem

Recall is not the same as application.

A model that recites a guideline from its training data cannot tell you which edition it used, whether a draft rule was applied, or why it answered when it should have deferred. Keeping all of this current is continuous clinical work.

  • BI-RADS
  • Lung-RADS
  • PI-RADS
  • LI-RADS
  • O-RADS
  • TI-RADS
  • Fleischner
  • DEXA standards
  • Applicability rules
  • Edition changes
  • Validation
  • Versioning
  • Provenance

The tool

A radiology tool your model can call.

  • Deterministic answers

    The same structured input returns the same verdict, so model behavior on radiology criteria becomes testable.

  • Explicit deferrals

    When composition is missing or the patient is outside the pack's applicability, RadVector says so and why. Your agent learns when not to answer.

  • Provenance your users can see

    Pack version, validation status and trace id travel with every verdict, ready to cite in the model's response.

  • Constrained generation

    /v1/impression drafts prose around the verdicts and mechanically checks that every measurement, category and interval stayed inside them.

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.

Coverage today

Honest about what is validated.

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.

Questions from AI teams

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.

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.

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.

Which AI models does iTech use?

RadVector is model-neutral. It routes work across more than ten commercial model and speech vendors with cross-vendor fallback, and records on every report which model actually ran, with its tokens and cost. Enterprise groups can choose their vendors and models and bring their own keys. Deterministic criteria decisions never depend on a language model.

Instead of maintaining radiology criteria, call them.