Kantesti APIs on OpenRouter
Use Kantesti AI through OpenRouter's OpenAI-compatible chat completions API, with the same OpenRouter key you already use for other models.
Kantesti AI has applied to OpenRouter's provider program. The models below go live on OpenRouter once the review is complete.
Models
| Model ID | What it returns |
|---|---|
kantesti/blood-test-v12 | Every result with its reference range and evaluation, a clinical interpretation, a health score with disease-risk indicators, a body map and the biological blood age (PhenoAge). |
kantesti/blood-test-extract | Every row exactly as printed (test name, result, unit, reference range) with the laboratory and patient details. No interpretation. |
Quick start
Attach the report to the user message as a PDF (file part) or as page images (image_url parts) and call the model like any other OpenRouter model.
curl https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kantesti/blood-test-v12",
"stream": true,
"language": "en",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Interpret this blood test."},
{"type": "file", "file": {"filename": "blood_test.pdf",
"file_data": "data:application/pdf;base64,JVBERi0xLjQK..."}}
]
}]
}'
import base64
from openai import OpenAI
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key="YOUR_OPENROUTER_API_KEY")
with open("blood_test.pdf", "rb") as f:
pdf = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="kantesti/blood-test-v12",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Interpret this blood test."},
{"type": "file", "file": {"filename": "blood_test.pdf",
"file_data": f"data:application/pdf;base64,{pdf}"}},
]}],
extra_body={"language": "en"},
timeout=600,
)
print(response.choices[0].message.content)
Input
- PDF: one report per request, up to 20 MB, as a
filecontent part (base64 data URL or https URL). - Images: up to 10 pages as PNG, JPEG or WebP
image_urlparts. Do not mix a PDF with images. - Language: set
languageto any of the 100 supported codes (defaulten). - JSON: set
response_formatto{"type": "json_object"}to receive the structured report instead of Markdown.
Output
The answer is a Markdown report (or JSON) from Kantesti AI, ending with a medical disclaimer. Results are for informational purposes only and do not replace professional medical advice.
Pricing and privacy
- A flat price per request, shown on the model page on OpenRouter.
- Zero data retention: uploaded files are deleted when the request ends, and no prompt, file or result is stored.
- Your data is never used for training.
Response times
A report takes 1–4 minutes: the pipeline reads, checks and interprets every row. Use "stream": true; the connection stays open with keep-alive messages until the report arrives. Without streaming, set a client timeout of at least 10 minutes.
Direct API
Need trends, comparisons, nutrition plans, DNA or family health? These are available through the Kantesti REST API.