curl --request GET \
--url http://localhost:8080/api/v1/doctor \
--header 'x-api-key: <api-key>'import requests
url = "http://localhost:8080/api/v1/doctor"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('http://localhost:8080/api/v1/doctor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/api/v1/doctor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:8080/api/v1/doctor"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:8080/api/v1/doctor")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/v1/doctor")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"doctorVersion": 123,
"ranAt": "<string>",
"mode": "full",
"surface": {},
"summary": {
"ok": 123,
"warn": 123,
"error": 123,
"skip": 123
},
"checks": [
{
"id": "<string>",
"status": "ok",
"severity": "<string>",
"detail": "<string>",
"remediation": "<string>",
"surface": "<string>",
"ms": 123
}
]
}Server-side doctor report
The configuration and connectivity checks datris doctor runs, as JSON. This is the endpoint the datris doctor CLI, the Configuration → Doctor page and the run_doctor MCP tool call. It is authenticated: the report names environment keys, Vault paths and model ids, so when API keys are on the calling key must hold the config:read capability (401/403 otherwise).
curl --request GET \
--url http://localhost:8080/api/v1/doctor \
--header 'x-api-key: <api-key>'import requests
url = "http://localhost:8080/api/v1/doctor"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('http://localhost:8080/api/v1/doctor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/api/v1/doctor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:8080/api/v1/doctor"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:8080/api/v1/doctor")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/v1/doctor")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"doctorVersion": 123,
"ranAt": "<string>",
"mode": "full",
"surface": {},
"summary": {
"ok": 123,
"warn": 123,
"error": 123,
"skip": 123
},
"checks": [
{
"id": "<string>",
"status": "ok",
"severity": "<string>",
"detail": "<string>",
"remediation": "<string>",
"surface": "<string>",
"ms": 123
}
]
}Authorizations
Optional API key for authentication (enabled via application.yaml)
Query Parameters
quick runs only the cheap startup-safe checks
full, quick Comma-separated opt-in probe groups to include (currently ai, which spends a model call)
Version of the calling CLI, echoed under surface.cli and compared with the server
Version of the calling MCP server, echoed under surface.mcp
Version of the calling UI, echoed under surface.ui
