Create Form Filling Session
Create a Form filling session and obtain a session identifier for subsequent calls
curl --request POST \
--url https://sdp.suki.ai/api/v1/form-filling/session/create \
--header 'Content-Type: application/json' \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>' \
--data '{}'import requests
url = "https://sdp.suki.ai/api/v1/form-filling/session/create"
payload = {}
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({})
};
fetch('https://sdp.suki.ai/api/v1/form-filling/session/create', 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/form-filling/session/create",
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([
]),
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/form-filling/session/create"
payload := strings.NewReader("{}")
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/form-filling/session/create")
.header("sdp_suki_token", "<api-key>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/form-filling/session/create")
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 = "{}"
response = http.request(request)
puts response.read_body{
"ambient_session_id": "123dfg-456dfg-789dfg-012dfg"
}{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "invalid token"
}{
"code": 500,
"message": "internal server error"
}ambient_session_id. Use that value for context, streaming, end, status, structured data, feedback, and related session operations.
You can create a Form filling session with an empty request body. Suki generates ambient_session_id for you.
Add a field when you need the behavior it enables:
ambient_session_id: Supply your own Form filling session ID (Must be a valid UUID). If you omit it, Suki generates one and returns it.correlation_id: Supply a client value for tracing or correlating the session in your own systems.
ambient_session_id, but the values identify different sessions. Do not pass an Ambient API session ID here. Use only the Form filling ambient_session_id returned from this endpoint for Form filling REST calls and for /ws/stream.Code examples
sdp.suki-stage.com only as examples.
For credentials, base URLs, where to run Python or TypeScript, CORS, and cURL, refer to Using code examples in your integration in the API Reference Guidelines.- Python
- TypeScript
from typing import Any, Optional, TypedDict, cast
import requests
BASE_URL = "https://sdp.suki-stage.com"
class CreateFormFillingSessionRequest(TypedDict, total=False):
ambient_session_id: str
correlation_id: str
class CreateFormFillingSessionResponse(TypedDict):
ambient_session_id: str
class ApiHttpError(RuntimeError):
"""Wrong HTTP status; OpenAPI errors usually include JSON with message + code."""
def __init__(self, status: int, url: str, detail: str) -> None:
super().__init__(f"HTTP {status} {url}: {detail}")
self.status = status
self.url = url
def _post_json_expect(url: str, headers: dict[str, str], payload: dict[str, Any], expect_status: int) -> dict[str, Any]:
r = requests.post(url, json=payload, headers=headers, timeout=60)
if r.status_code == expect_status:
data = r.json()
if isinstance(data, dict):
return data
raise ApiHttpError(expect_status, url, "response JSON was not an object")
detail = ""
try:
err = r.json()
if isinstance(err, dict) and isinstance(err.get("message"), str):
detail = err["message"]
except ValueError:
detail = (r.text or "")[:500]
raise ApiHttpError(r.status_code, url, detail or "(no body)")
def login_for_suki_token(partner_id: str, partner_token: str, *, provider_id: Optional[str] = None) -> str:
"""POST /api/v1/auth/login -> suki_token (HTTP 200)."""
url = f"{BASE_URL}/api/v1/auth/login"
body: dict[str, Any] = {"partner_id": partner_id, "partner_token": partner_token}
if provider_id is not None:
body["provider_id"] = provider_id
data = _post_json_expect(url, {"Content-Type": "application/json"}, body, 200)
token = data.get("suki_token")
if not isinstance(token, str) or not token:
raise ValueError(f"{url}: 200 response missing suki_token")
return token
def create_form_filling_session(
suki_token: str,
body: Optional[CreateFormFillingSessionRequest] = None,
) -> CreateFormFillingSessionResponse:
"""POST /api/v1/form-filling/session/create (sdp_suki_token header required). HTTP 201."""
url = f"{BASE_URL}/api/v1/form-filling/session/create"
headers = {"sdp_suki_token": suki_token, "sdp_provider_id": "<sdp_provider_id>", "Content-Type": "application/json"}
data = _post_json_expect(url, headers, dict(body or {}), 201)
sid = data.get("ambient_session_id")
if not isinstance(sid, str) or not sid:
raise ValueError(f"{url}: 201 response missing ambient_session_id")
return cast(CreateFormFillingSessionResponse, {"ambient_session_id": sid})
if __name__ == "__main__":
try:
token = login_for_suki_token("<partner_id>", "<partner_token>")
session = create_form_filling_session(token, {})
print(session["ambient_session_id"])
except (ApiHttpError, ValueError) as e:
print(e)
const BASE_URL = "https://sdp.suki-stage.com";
type AuthenticationRequest = {
partner_id: string;
partner_token: string;
provider_id?: string;
};
type AuthenticationResponse = { suki_token: string };
type CreateFormFillingSessionRequest = {
ambient_session_id?: string;
correlation_id?: string;
};
type CreateFormFillingSessionResponse = { ambient_session_id: string };
/** POST helper: reads body once, checks status, returns parsed JSON object on success. */
async function postJsonExpect<T extends Record<string, unknown>>(
url: string,
init: RequestInit,
expectStatus: number,
): Promise<T> {
const res = await fetch(url, init);
const text = await res.text();
let data: unknown;
try {
data = text ? JSON.parse(text) : {};
} catch {
throw new Error(`HTTP ${res.status} ${url}: invalid JSON`);
}
if (res.status !== expectStatus) {
const msg =
data && typeof data === "object" && "message" in data
? String((data as { message?: string }).message)
: text.slice(0, 500);
throw new Error(`HTTP ${res.status} ${url}: ${msg || "(no body)"}`);
}
if (!data || typeof data !== "object") {
throw new Error(`${url}: expected JSON object`);
}
return data as T;
}
async function loginForSukiToken(body: AuthenticationRequest): Promise<string> {
const url = `${BASE_URL}/api/v1/auth/login`;
const data = await postJsonExpect<AuthenticationResponse>(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
}, 200);
if (!data.suki_token) throw new Error(`${url}: missing suki_token`);
return data.suki_token;
}
async function createFormFillingSession(
sukiToken: string,
body: CreateFormFillingSessionRequest = {},
): Promise<CreateFormFillingSessionResponse> {
const url = `${BASE_URL}/api/v1/form-filling/session/create`;
const data = await postJsonExpect<CreateFormFillingSessionResponse>(url, {
method: "POST",
headers: {
sdp_suki_token: sukiToken, sdp_provider_id: "<sdp_provider_id>",
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}, 201);
if (!data.ambient_session_id) throw new Error(`${url}: missing ambient_session_id`);
return data;
}
async function main(): Promise<void> {
try {
const token = await loginForSukiToken({
partner_id: "<partner_id>",
partner_token: "<partner_token>",
});
const session = await createFormFillingSession(token, {});
console.log(session.ambient_session_id);
} catch (e) {
console.error(e instanceof Error ? e.message : e);
}
}
void main();
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.
"provider-123"
Body
Optional form-filling session ID and correlation metadata. Suki generates a form-filling session ID when omitted.
Optional - Form-filling session ID in UUID format. Suki generates one when omitted and returns it in the ambient_session_id response field. Do not pass an ambient clinical documentation session ID.
"123dfg-456dfg-789dfg-012dfg"
Optional - Client-supplied identifier for tracing or correlating requests.
"123dfg-456dfg-789dfg-012dfg"
Response
Resource created successfully.
New form-filling session ID returned after create.
Form-filling session ID for subsequent form-filling API calls. Despite the field name, this is not an ambient clinical documentation session ID.
"123dfg-456dfg-789dfg-012dfg"
Was this page helpful?
curl --request POST \
--url https://sdp.suki.ai/api/v1/form-filling/session/create \
--header 'Content-Type: application/json' \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>' \
--data '{}'import requests
url = "https://sdp.suki.ai/api/v1/form-filling/session/create"
payload = {}
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({})
};
fetch('https://sdp.suki.ai/api/v1/form-filling/session/create', 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/form-filling/session/create",
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([
]),
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/form-filling/session/create"
payload := strings.NewReader("{}")
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/form-filling/session/create")
.header("sdp_suki_token", "<api-key>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/form-filling/session/create")
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 = "{}"
response = http.request(request)
puts response.read_body{
"ambient_session_id": "123dfg-456dfg-789dfg-012dfg"
}{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "invalid token"
}{
"code": 500,
"message": "internal server error"
}