curl --request GET \
--url https://api.peachdeskai.com/api/v1/voice/capture/readiness \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.peachdeskai.com/api/v1/voice/capture/readiness"
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('https://api.peachdeskai.com/api/v1/voice/capture/readiness', 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.peachdeskai.com/api/v1/voice/capture/readiness",
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 := "https://api.peachdeskai.com/api/v1/voice/capture/readiness"
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("https://api.peachdeskai.com/api/v1/voice/capture/readiness")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/voice/capture/readiness")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"stt": {
"ready": true,
"model_name": "<string>",
"display_name": "<string>",
"size": "<string>",
"size_mb": 123
},
"llm": {
"ready": true,
"model_name": "<string>",
"display_name": "<string>",
"size": "<string>",
"size_mb": 123
}
}Capture Readiness Endpoint
Whether the STT and LLM models the user has selected are downloaded.
The frontend gates the global hotkey on this — pressing the chord with a missing model would otherwise produce a stuck “transcribing” pill that waits forever for a download to finish. Checks on-disk cache, not RAM load, so the answer survives backend restarts.
curl --request GET \
--url https://api.peachdeskai.com/api/v1/voice/capture/readiness \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.peachdeskai.com/api/v1/voice/capture/readiness"
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('https://api.peachdeskai.com/api/v1/voice/capture/readiness', 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.peachdeskai.com/api/v1/voice/capture/readiness",
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 := "https://api.peachdeskai.com/api/v1/voice/capture/readiness"
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("https://api.peachdeskai.com/api/v1/voice/capture/readiness")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/voice/capture/readiness")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"stt": {
"ready": true,
"model_name": "<string>",
"display_name": "<string>",
"size": "<string>",
"size_mb": 123
},
"llm": {
"ready": true,
"model_name": "<string>",
"display_name": "<string>",
"size": "<string>",
"size_mb": 123
}
}Authorizations
Organization API key (bibha_...). Takes precedence over the session credential, and is refused outright on user-session-only and super-admin routes.
Response
Successful Response
Backend gates that must be green before the global hotkey will fire.
The frontend combines this with its own TCC permission checks (input monitoring, accessibility) into the full dictation readiness checklist. Hotkey-enabled is the user's intent toggle and lives outside this struct.
Per-model entry in the dictation readiness checklist.
model_name is the canonical id used by POST /models/download so the
frontend can wire a one-click "Download" button without a second lookup.
size is the model's variant id; display_name is what the checklist
row should show ("LIPI").
Show child attributes
Show child attributes
Per-model entry in the dictation readiness checklist.
model_name is the canonical id used by POST /models/download so the
frontend can wire a one-click "Download" button without a second lookup.
size is the model's variant id; display_name is what the checklist
row should show ("LIPI").
Show child attributes
Show child attributes

