curl --request PATCH \
--url https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/"
headers = {"Authorization": "Bearer <token>"}
response = requests.patch(url, headers=headers)
print(response.text)const options = {method: 'PATCH', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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 := "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/"
req, _ := http.NewRequest("PATCH", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"detail": "Unknown questionnaire category: weight-lost"
}{
"detail": "Given token not valid for any token type",
"code": "token_not_valid",
"messages": [
{
"token_class": "AccessToken",
"token_type": "access",
"message": "Token is invalid"
}
]
}{
"detail": "No Consultation matches the given query."
}Replace saved answers
Replaces the entire saved answer array. This is not a merge: whatever you send becomes the complete set, and any answer you omit is erased. Always send the full cumulative set of answers, not just the new ones. Send an empty array to clear all saved progress.
Only question keys present in the served schema are accepted, plus a closed allowlist of synthetic keys. Anything else is rejected — stored answers feed the prescriber’s treatment baseline, so they must not carry client state.
The body must be {"data": [ … ]}. A body of another shape is accepted with 200 and the answers are silently discarded — data stays empty and nothing tells you the write did not happen. Read the response back and check answer_status rather than trusting the status code.
For a step of kind upload the value is a single document UUID string, not a list: upload the file to /v1/users/documents/ first and send the id it returns. A list, a malformed UUID, or a UUID belonging to another patient are each rejected with 400. Note that the server checks the UUID and its ownership but not the file type — the step schema’s accept list is a client-side hint, and /v1/users/documents/ itself also accepts PDF.
curl --request PATCH \
--url https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/"
headers = {"Authorization": "Bearer <token>"}
response = requests.patch(url, headers=headers)
print(response.text)const options = {method: 'PATCH', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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 := "https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/"
req, _ := http.NewRequest("PATCH", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hi-doctor.ai/v1/users/questionnaires/{slug}/progress/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"detail": "Unknown questionnaire category: weight-lost"
}{
"detail": "Given token not valid for any token type",
"code": "token_not_valid",
"messages": [
{
"token_class": "AccessToken",
"token_type": "access",
"message": "Token is invalid"
}
]
}{
"detail": "No Consultation matches the given query."
}