Patient Summary Generation
Generate Patient Summaries For Scheduled Appointments
Trigger bulk asynchronous generation of Patient Summaries for all scheduled appointments on a provider’s schedule
Listen to this pageabout 1 min
POST
/
api
/
v1
/
patient-summary
/
generate
/
provider-schedule
cURL
curl --request POST \
--url https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule \
--header 'Content-Type: application/json' \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>' \
--data '{"fhir_practitioner_id":"Practitioner/practitioner-1"}'import requests
url = "https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule"
payload = { "fhir_practitioner_id": "Practitioner/practitioner-1" }
headers = {
"sdp_suki_token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {sdp_suki_token: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({fhir_practitioner_id: 'Practitioner/practitioner-1'})
};
fetch('https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule', 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://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fhir_practitioner_id' => 'Practitioner/practitioner-1'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"sdp_suki_token: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule"
payload := strings.NewReader("{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("sdp_suki_token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule")
.header("sdp_suki_token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["sdp_suki_token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}"
response = http.request(request)
puts response.read_body{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "invalid token"
}{
"code": 403,
"message": "forbidden"
}{
"code": 500,
"message": "internal server error"
}Use this endpoint to generate Patient Summaries for all appointments on a provider’s ingested schedule. This pre-generates summaries for those appointments before the provider starts seeing patients.
The request starts an asynchronous summary generation job for every scheduled appointment and returns
Once the request is accepted, use the following endpoints to generate, check or retrieve the summaries.
202 Accepted.
To generate a Patient Summary for a single appointment, use the Generate Patient Summary for an Encounter endpoint.
Before calling this endpoint:
- Ingest FHIR data for all scheduled patients using the CKG Data Ingestion APIs.
- Ensure the provider’s schedule has been ingested into the Clinical Knowledge Graph (CKG).
Recommended workflow:
1
Ingest the provider's schedule
Upload the provider’s schedule using the CKG Data Ingestion APIs. Partners typically perform this once per day. Suki stores the schedule in Google Firestore.
2
Trigger Patient Summary Generation
Call this endpoint with the
fhir_practitioner_id. Suki retrieves all matching appointments from Firestore and starts generating Patient Summaries for each appointment.3
Wait for generation to complete
Patient summaries are generated asynchronously. Generation takes approximately 20 seconds per appointment after the request is accepted.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fhir_practitioner_id | string | Yes | FHIR Practitioner resource identifier for whom to generate summaries |
Authorizations
Suki access token (suki_token) from Login or Register. Expires after one hour.
Headers
Optional for standard partners.
Required for:
- Bearer authentication. Use the same
provider_idreturned by the Login or Register API. - Single Auth Token authentication. Include the same
provider_idon every request assdp_provider_id.
Example:
"provider-123"
Body
application/json
Request to trigger bulk asynchronous generation of patient summaries for all scheduled appointments on a provider's schedule.
FHIR Practitioner resource identifier for whom to generate summaries.
Example:
"Practitioner/practitioner-1"
Response
Accepted. Generation scheduled.
Last modified on August 20, 2026
Was this page helpful?
cURL
curl --request POST \
--url https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule \
--header 'Content-Type: application/json' \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>' \
--data '{"fhir_practitioner_id":"Practitioner/practitioner-1"}'import requests
url = "https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule"
payload = { "fhir_practitioner_id": "Practitioner/practitioner-1" }
headers = {
"sdp_suki_token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {sdp_suki_token: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({fhir_practitioner_id: 'Practitioner/practitioner-1'})
};
fetch('https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule', 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://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fhir_practitioner_id' => 'Practitioner/practitioner-1'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"sdp_suki_token: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule"
payload := strings.NewReader("{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("sdp_suki_token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule")
.header("sdp_suki_token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/patient-summary/generate/provider-schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["sdp_suki_token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fhir_practitioner_id\": \"Practitioner/practitioner-1\"\n}"
response = http.request(request)
puts response.read_body{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "invalid token"
}{
"code": 403,
"message": "forbidden"
}{
"code": 500,
"message": "internal server error"
}