POST /api/chat/v3 runs Vera’s agentic engine: instead of a fixed pipeline, a model decides which
tools to call and how many times, then writes the answer. The tools request parameter decides
which switchable tools are on the table for that one request, so a single integration can offer a
different capability set at each step of a workflow.
Call it server to server. The endpoint sends no CORS headers, so a browser cannot read a
cross-origin response from it, and your API key must never reach a browser in the first place.
Switchable tools
Tool ids are the engine’s own tool names, so they are camelCase.
Requesting an id that is not in this table returns
400. Requesting one that is in the table but is
not provisioned for your key returns 403 with code tool_not_enabled.
Figure retrieval, clinical-trial search, decision pathways and slide decks are not available on
this endpoint yet. They exist in Vera’s product but are not part of the partner API, and sending
their ids is a
400 like any other unknown id.Tools that are always on
The agent cannot answer without these, so they are not in thetools vocabulary and cannot be
switched off:
Sending one of these ids in
tools is a 400: they are not switches, and Vera does not accept a
request that implies they are.
patientHandout and priorAuth deliver their whole result as a tool payload, not as answer
text. On those turns answer is empty by design. See
Reading the deliverable below.The three ways to send tools
Omitted, or an empty array: retrieval only
An explicit list
An id you are not provisioned for
403. Contact support@verahealth.ai to change what
your key is provisioned for. An id outside the table above is a 400 instead: that one is a typo in
your request, not a missing entitlement.
Driving tools from a workflow step
Each step sends the same endpoint a differenttools value.
Verifying which tools ran
A tool whose result you render appears in the non-streaming response undertool_outputs, and on
the stream as a frame carrying its payload: tool-input-available for patientHandout and
priorAuth, whose input is the deliverable, and tool-output-available for medcalc. Each payload
is trimmed to the fields documented for that tool in the
API reference, at every depth.
Retrieval is not reported: it produces no payload of its own, and what it found reaches you as
references and answer text. drug is not reported either, for the same reason: the monograph stays
on the model channel and the drug reaches you as a drug reference whose title is its name. A
switchable tool appearing that you did not enable is a bug worth reporting.
Reading the deliverable
For most tools the answer is inanswer and the sources behind it in references. Every
reference carries its sourceId (what a cite or calculator index in the answer resolves
against) and its kind. A paper adds title, firstAuthor, journal, year, its
doi when it has one, which is the only identifier to link out with, isGuideline, and
evidenceStrength when it has a graded level of evidence. A drug and a calculator carry only
their name as title; the id a card renders from arrives on that tool’s payload, not here.
patientHandout and priorAuth the model is instructed to let the
artifact speak for itself, so answer is empty and the artifact is the tool’s payload:
references is not empty on these turns: the agent still searches the literature to write the
artifact, so the sources behind it are reported even though answer is.
input field of the tool-input-available frame for
patientHandout and priorAuth, and the output field of tool-output-available for medcalc.
Follow-up questions
A request withoutthread_id starts a new thread, which Vera saves under your partner account. To
ask a follow-up, send the thread id from the earlier answer (the x-thread-id header, or
thread_id in a non-streaming body) back as thread_id:
x-thread-id; a non-streaming answer
also returns it as thread_id in the body.
tools and country apply to the request they are sent with: send them again on every follow-up
that needs them.
Guideline jurisdiction
Passcountry when you know where the clinician practises:
FR and IT are accepted, and anything else is a 400. Those are the jurisdictions whose
national authority publishes in its own language, so they are the only ones that change an answer:
a country we hold no localized authority for would weight nothing and quietly read as supported.
Case does not matter. Omit it and no jurisdiction weighting is applied.
Vera deliberately does not infer this from your server’s location, which would be wrong for most
integrations.
Errors
Error bodies are not all the same shape, because they come from different layers.A content-policy refusal only surfaces as
422 when stream is false. On the streaming path
the run has already begun, so the refusal arrives as a tool-input-available frame with
toolName: "stop" and no answer text follows.x-vera-request-id header. Quote it when you contact support. Error
responses do not carry it, so log the status and body instead.
Agentic streaming
The event format, which is not the same as
/api/chat/v2.API reference
Full request and response schemas.