diff --git a/src/libs/Speechify/Generated/Speechify.ISubpackageTtsSubpackageTtsAgentsClient.Create.g.cs b/src/libs/Speechify/Generated/Speechify.ISubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
index 5d3a5b6..0581525 100644
--- a/src/libs/Speechify/Generated/Speechify.ISubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
+++ b/src/libs/Speechify/Generated/Speechify.ISubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
@@ -23,7 +23,7 @@ public partial interface ISubpackageTtsSubpackageTtsAgentsClient
///
///
///
- /// Optional; auto-generated from name if omitted.
+ /// Optional. Server derives slug from name with a random suffix when omitted; if you supply your own, a collision returns 400 'slug already taken'.
///
///
///
diff --git a/src/libs/Speechify/Generated/Speechify.Models.TtsCreateAgentRequest.g.cs b/src/libs/Speechify/Generated/Speechify.Models.TtsCreateAgentRequest.g.cs
index 7bdc9f7..3fa5659 100644
--- a/src/libs/Speechify/Generated/Speechify.Models.TtsCreateAgentRequest.g.cs
+++ b/src/libs/Speechify/Generated/Speechify.Models.TtsCreateAgentRequest.g.cs
@@ -16,7 +16,7 @@ public sealed partial class TtsCreateAgentRequest
public required string Name { get; set; }
///
- /// Optional; auto-generated from name if omitted.
+ /// Optional. Server derives slug from name with a random suffix when omitted; if you supply your own, a collision returns 400 'slug already taken'.
///
[global::System.Text.Json.Serialization.JsonPropertyName("slug")]
public string? Slug { get; set; }
@@ -108,7 +108,7 @@ public sealed partial class TtsCreateAgentRequest
/// Voice slug from the VMS catalog (see GET /v1/voices). Required — the server rejects writes with an unknown or empty slug.
///
///
- /// Optional; auto-generated from name if omitted.
+ /// Optional. Server derives slug from name with a random suffix when omitted; if you supply your own, a collision returns 400 'slug already taken'.
///
///
///
diff --git a/src/libs/Speechify/Generated/Speechify.SubpackageTtsSubpackageTtsAgentsClient.Create.g.cs b/src/libs/Speechify/Generated/Speechify.SubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
index b06e3aa..ac43ded 100644
--- a/src/libs/Speechify/Generated/Speechify.SubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
+++ b/src/libs/Speechify/Generated/Speechify.SubpackageTtsSubpackageTtsAgentsClient.Create.g.cs
@@ -393,7 +393,7 @@ partial void ProcessCreateResponseContent(
///
///
///
- /// Optional; auto-generated from name if omitted.
+ /// Optional. Server derives slug from name with a random suffix when omitted; if you supply your own, a collision returns 400 'slug already taken'.
///
///
///
diff --git a/src/libs/Speechify/openapi.yaml b/src/libs/Speechify/openapi.yaml
index 94536f2..b6139d6 100644
--- a/src/libs/Speechify/openapi.yaml
+++ b/src/libs/Speechify/openapi.yaml
@@ -1 +1 @@
-{"openapi":"3.1.0","info":{"title":"API Reference","version":"1.0.0"},"paths":{"/v1/audio/speech":{"post":{"operationId":"speech","summary":"Speech","description":"Gets the speech data for the given input","tags":["subpackage_tts.subpackage_tts/audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetSpeechResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetSpeechRequest"}}}}}},"/v1/audio/stream":{"post":{"operationId":"stream","summary":"Stream","description":"Gets the stream speech for the given input","tags":["subpackage_tts.subpackage_tts/audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}},{"name":"Accept","in":"header","required":true,"schema":{"$ref":"#/components/schemas/tts:V1AudioStreamPostParametersAccept"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:audio_stream_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetStreamRequest"}}}}}},"/v1/auth/token":{"post":{"operationId":"create-access-token","summary":"Create Access Token","description":"WARNING: This endpoint is deprecated. Create a new API token for the logged in user.","tags":["subpackage_tts.subpackage_tts/auth"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Contains the details of the token which can be used by the user to access the API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AccessToken"}}}},"400":{"description":"Contains the details of the error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:OAuthError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequest"}}}}}},"/v1/voices":{"get":{"operationId":"list","summary":"List","description":"Gets the list of voices available for the user","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of voices","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoice"}}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a personal (cloned) voice for the user","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A created voice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreatedVoice"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the personal voice"},"locale":{"type":"string","default":"en-US","description":"Native language (locale) of the personal voice (e.g. en-US, es-ES, etc.)"},"gender":{"$ref":"#/components/schemas/tts:V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender","description":"Gender marker for the personal voice\nmale GenderMale\nfemale GenderFemale\nnotSpecified GenderNotSpecified"},"sample":{"type":"string","format":"binary","description":"Audio sample file"},"avatar":{"type":"string","format":"binary","description":"Avatar image file"},"consent":{"type":"string","description":"A **string** representing the user consent information in JSON format\nThis should include the fullName and email of the consenting individual.\nFor example, `{\"fullName\": \"John Doe\", \"email\": \"john@example.com\"}`"}},"required":["name","gender","sample","consent"]}}}}}},"/v1/voices/{id}":{"delete":{"operationId":"delete","summary":"Delete","description":"Delete a personal (cloned) voice","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"id","in":"path","description":"The ID of the voice to delete","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/voices/{id}/sample":{"get":{"operationId":"download-sample","summary":"Download Sample","description":"Download a personal (cloned) voice sample","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"id","in":"path","description":"The ID of the voice to download sample for","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Voice sample audio file","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}}},"/v1/agents":{"get":{"operationId":"list","summary":"List","description":"List voice agents owned by the caller.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of voice agents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentsResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a voice agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentRequest"}}}}}},"/v1/agents/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a voice agent by ID.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a voice agent. Conversations and attached tools remain.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a voice agent. Only fields present on the request body are changed.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentRequest"}}}}}},"/v1/agents/{id}/tools":{"get":{"operationId":"list-tools","summary":"List Tools","description":"List tools currently attached to the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Attached tools for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListToolsResponse"}}}}}}},"/v1/agents/{id}/tools/{toolId}":{"post":{"operationId":"attach-tool","summary":"Attach Tool","description":"Attach an existing tool to the agent so the LLM can call it.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"toolId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-tool","summary":"Detach Tool","description":"Detach a tool from the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"toolId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/agents/{id}/evaluation-config":{"get":{"operationId":"get-evaluation-config","summary":"Get Evaluation Config","description":"Retrieve the agent's post-call evaluation criteria + data-collection config.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evaluation config for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:EvaluationConfig"}}}}}},"patch":{"operationId":"update-evaluation-config","summary":"Update Evaluation Config","description":"Replace the agent's evaluation criteria + data-collection fields.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated evaluation config.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:EvaluationConfig"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateEvaluationConfigRequest"}}}}}},"/v1/agents/{id}/variables":{"get":{"operationId":"get-dynamic-variables","summary":"Get Dynamic Variables","description":"Retrieve the agent's customer-scope dynamic variables and the read-only\ncatalogue of reserved `system__*` keys. The system variables list is\nprovided so editor UIs can render the reference list without maintaining\na client-side copy of the catalogue.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListDynamicVariablesResponse"}}}}}},"patch":{"operationId":"update-dynamic-variables","summary":"Update Dynamic Variables","description":"Replace the agent's customer-scope dynamic variable definitions.\nThe supplied list overwrites the stored list wholesale (same\nsemantics as `updateEvaluationConfig`). Pass an empty array to\nclear all variables. Up to 20 variables per agent. Keys must\nmatch `[a-zA-Z0-9_]+` and must not start with the reserved\n`system__` prefix.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListDynamicVariablesResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateDynamicVariablesRequest"}}}}}},"/v1/agents/{id}/conversations":{"post":{"operationId":"create-conversation","summary":"Create Conversation","description":"Start a new voice conversation with the agent. Returns a realtime\nvoice session + short-lived client token so the caller can\nconnect the audio pipeline directly. The agent is dispatched\nserver-side; no additional client action required.\n\nPass `dynamic_variables` to supply per-session values that override\nthe agent's stored variable defaults for this one conversation.\nKeys in the `system__` namespace are rejected at this boundary.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created conversation with its realtime session token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationRequest"}}}}}},"/v1/agents/{id}/sessions":{"post":{"operationId":"create-session","summary":"Create Session","description":"Mint a realtime voice session for the given agent. Widget-friendly\ncounterpart to `createConversation` — same response shape, dual\nauthentication:\n\n* **Authenticated (Bearer)**: works for any agent the caller\n owns. Typical server-to-server flow where the embedding\n site's backend mints a token and hands it to the browser so\n the API key never reaches the client.\n* **Unauthenticated**: works only when `agent.is_public = true`\n AND the request's `Origin` header matches `agent.allowed_origins`\n (or that list is empty). When `agent.hostname_allowlist` is\n non-empty, the `Origin` hostname must additionally be a\n member of that list. Used directly by the\n `` web component.\n\nResponds with the same `CreateConversationResponse` as\n`createConversation`.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The created session with its realtime token + URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateSessionRequest"}}}}}},"/v1/agents/{id}/knowledge-bases":{"get":{"operationId":"list-agent-knowledge-bases","summary":"List Agent Knowledge Bases","description":"List knowledge bases attached to an agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The knowledge bases attached to the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBasesResponse"}}}}}}},"/v1/agents/{id}/knowledge-bases/{kbId}":{"post":{"operationId":"attach-knowledge-base","summary":"Attach Knowledge Base","description":"Attach a knowledge base to an agent. The `search_knowledge` tool\nis auto-registered on the next conversation and can only query the\nattached knowledge bases.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"kbId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-knowledge-base","summary":"Detach Knowledge Base","description":"Detach a knowledge base from an agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"kbId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/agents/{id}/memories":{"get":{"operationId":"list-memories","summary":"List Memories","description":"List per-caller memories extracted for an agent. Memories are\nwritten post-call by the built-in extractor when `memory_enabled`\nis true on the agent; the list is sorted newest-first.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows to return. Defaults to 100, capped at 200.","required":false,"schema":{"type":"integer","default":100}},{"name":"offset","in":"query","description":"Number of rows to skip. Combine with `limit` to page through older memories.","required":false,"schema":{"type":"integer","default":0}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Memories for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMemoriesResponse"}}}}}}},"/v1/agents/{id}/memories/delete-by-caller":{"post":{"operationId":"delete-memories-by-caller","summary":"Delete Memories By Caller","description":"Delete every memory ever extracted for a specific caller on\nthis agent. Privacy / GDPR surface. Returns the count of rows\nsoft-deleted; rows become permanently unreachable immediately\nand are hard-deleted by the retention job after the tenant's\nconfigured retention window.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deletion summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:DeleteMemoriesByCallerResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:DeleteMemoriesByCallerRequest"}}}}}},"/v1/agents/{id}/tests":{"get":{"operationId":"list-tests","summary":"List Tests","description":"List all tests configured for the agent. Each entry includes the\nmost recent run so the console can render pass/fail badges without\nan extra round-trip.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tests for the agent with last-run summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestsResponse"}}}}}},"post":{"operationId":"create-test","summary":"Create Test","description":"Create a new test for the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentTestRequest"}}}}}},"/v1/agents/{id}/tests/runs":{"post":{"operationId":"run-all-tests","summary":"Run All Tests","description":"Enqueue runs for every test on the agent concurrently. Up to 50\ntests are dispatched in one call. Each returned run starts in\n`queued` status; poll `GET /v1/test-runs/{id}` for the terminal\nresult.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Queued runs for all tests on the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunAgentTestsResponse"}}}}}}},"/v1/tests/{id}":{"get":{"operationId":"get-test","summary":"Get Test","description":"Retrieve a test by ID.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}}},"delete":{"operationId":"delete-test","summary":"Delete Test","description":"Delete a test and all its run history.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-test","summary":"Update Test","description":"Update a test. Only fields present on the request body are changed.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentTestRequest"}}}}}},"/v1/tests/{id}/runs":{"get":{"operationId":"list-test-runs","summary":"List Test Runs","description":"List the run history for a test, newest first.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run history for the test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestRunsResponse"}}}}}},"post":{"operationId":"run-test","summary":"Run Test","description":"Enqueue a single run of the test. The returned run starts in\n`queued` status. Poll `GET /v1/test-runs/{id}` until the status\nreaches a terminal state (`passed`, `failed`, or `error`).","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"The queued run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestRun"}}}}}}},"/v1/test-runs/{id}":{"get":{"operationId":"get-test-run","summary":"Get Test Run","description":"Retrieve a single test run by ID. Poll this endpoint until\n`status` reaches a terminal state (`passed`, `failed`, or `error`).\nThe `result` field is populated on terminal states.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The test run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestRun"}}}}}}},"/v1/tests":{"get":{"operationId":"list-all-tests","summary":"List All Tests","description":"Workspace-wide list of tests across every agent the caller owns.\nSupports filters (agent, type, last-run status, folder), full-text\nsearch on name/description, and cursor pagination. Each row carries\nits newest run and attached agent IDs so the list renders without\nN+1 round-trips.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"agent_id","in":"query","description":"Comma-separated agent IDs to filter on.","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","description":"Comma-separated test types (scenario|tool|simulation).","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Comma-separated last-run statuses.","required":false,"schema":{"type":"string"}},{"name":"folder_id","in":"query","description":"Folder ID to filter on, or \"root\" for unfiled tests.","required":false,"schema":{"type":"string"}},{"name":"updated_after","in":"query","description":"Only return tests updated after this RFC3339 timestamp.","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Substring match on name or description.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max tests per page (default 50, max 200).","required":false,"schema":{"type":"integer"}},{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListTestsResponse"}}}}}}},"/v1/tests/stats":{"get":{"operationId":"get-test-stats","summary":"Get Test Stats","description":"Aggregate pass-rate metrics over the last N days. Returns dense\ndaily buckets (one entry per day, zero-filled) plus totals and a\nper-type breakdown. Powers the header chart on the global tests\npage. Default window is 30 days, max 90.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"window_days","in":"query","description":"Trailing window in days (default 30, max 90).","required":false,"schema":{"type":"integer"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Stats payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TestStats"}}}}}}},"/v1/tests/runs:batch":{"post":{"operationId":"run-tests-batch","summary":"Run Tests Batch","description":"Queue runs for every (test, agent) pair in the body. Entries\nwithout an `agent_id` fan out to every agent the test is\nattached to. Total expanded runs are capped at 100 per call.\nEach entry in the response is a queued run; poll\n`GET /v1/test-runs/{id}` for each.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Runs queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunBatchResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunBatchRequest"}}}}}},"/v1/tests/{id}/attachments":{"get":{"operationId":"list-test-attachments","summary":"List Test Attachments","description":"List every agent a test is attached to.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Attachment list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestAttachmentsResponse"}}}}}}},"/v1/tests/{id}/attachments/{agentId}":{"post":{"operationId":"attach-test","summary":"Attach Test","description":"Attach a test to an additional agent. After this call, the test\nwill also run as part of that agent's regression suite (and\nagainst its prompt + tool config when invoked with\n`agent_id = {agentId}`). Idempotent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-test","summary":"Detach Test","description":"Detach a test from an agent. The owner agent (the agent the test\nwas authored against) cannot be detached; delete the test\ninstead.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/tests/{id}/move":{"post":{"operationId":"move-test","summary":"Move Test","description":"Move a test into a folder. Pass `folder_id: null` for root.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:MoveAgentTestRequest"}}}}}},"/v1/test-folders":{"get":{"operationId":"list-test-folders","summary":"List Test Folders","description":"List every test folder the caller owns. Flat list; build the tree client-side.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Folder list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestFoldersResponse"}}}}}},"post":{"operationId":"create-test-folder","summary":"Create Test Folder","description":"Create a test folder. Max depth is 3.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Created folder.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentTestFolderRequest"}}}}}},"/v1/test-folders/{id}":{"delete":{"operationId":"delete-test-folder","summary":"Delete Test Folder","description":"Soft-delete a folder. Child tests drop back to root.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-test-folder","summary":"Update Test Folder","description":"Rename or reparent a test folder. Cycles are rejected.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated folder.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentTestFolderRequest"}}}}}},"/v1/tools":{"get":{"operationId":"list","summary":"List","description":"List tools owned by the caller.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of tools.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListToolsResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a tool. For webhook tools, the response includes the HMAC\n`webhook_secret` exactly once — store it immediately; subsequent\nreads return a masked placeholder.\n","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateToolRequest"}}}}}},"/v1/tools/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a tool by ID. Webhook secrets are always masked here.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a tool. Agents that had it attached get a soft-detach.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a tool. Tool kind is immutable — create a new tool to change it.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateToolRequest"}}}}}},"/v1/conversations":{"get":{"operationId":"list","summary":"List","description":"List conversations owned by the caller, ordered by most recent.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of conversations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListConversationsResponse"}}}}}}},"/v1/conversations/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a conversation by ID.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Conversation"}}}}}}},"/v1/conversations/{id}/messages":{"get":{"operationId":"list-messages","summary":"List Messages","description":"Retrieve the full transcript for a conversation, in order.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The messages for the conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMessagesResponse"}}}}}}},"/v1/conversations/{id}/evaluations":{"get":{"operationId":"list-evaluations","summary":"List Evaluations","description":"Retrieve post-call evaluation results for a conversation.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evaluations for the conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListEvaluationsResponse"}}}}}}},"/v1/conversations/{id}/memories":{"get":{"operationId":"list-memories","summary":"List Memories","description":"List memories extracted from a specific conversation.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Memories written during this conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMemoriesResponse"}}}}}}},"/v1/knowledge-bases":{"get":{"operationId":"list","summary":"List","description":"List knowledge bases owned by the caller.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The knowledge bases for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBasesResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a new knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateKnowledgeBaseRequest"}}}}}},"/v1/knowledge-bases/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a knowledge base by ID.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Soft-delete a knowledge base. Documents and chunks are cascaded.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateKnowledgeBaseRequest"}}}}}},"/v1/knowledge-bases/{id}/documents":{"get":{"operationId":"list-documents","summary":"List Documents","description":"List documents ingested into a knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The documents in the knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBaseDocumentsResponse"}}}}}},"post":{"operationId":"upload-document","summary":"Upload Document","description":"Upload a document (PDF, plain text, markdown, or HTML) to a\nknowledge base. The document is extracted, chunked, embedded, and\nindexed synchronously; expect a few seconds per MB of input.\nMaximum 10 MB per upload.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The ingested document record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}}}},"/v1/knowledge-bases/documents/{docId}":{"get":{"operationId":"get-document","summary":"Get Document","description":"Retrieve a document by ID.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The document record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}}}}},"delete":{"operationId":"delete-document","summary":"Delete Document","description":"Delete a document and all its chunks.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/knowledge-bases/documents/{docId}/chunks":{"get":{"operationId":"list-chunks","summary":"List Chunks","description":"List the chunks for a document.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The chunks for the document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBaseChunksResponse"}}}}}}},"/v1/knowledge-bases/search":{"post":{"operationId":"search","summary":"Search","description":"Semantic search across a caller-owned list of knowledge bases.\nReturns ranked chunks with source filename and a cosine-similarity\nscore. Limited to 50 results per request.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ranked search hits across the selected knowledge bases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:SearchKnowledgeBasesResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:SearchKnowledgeBasesRequest"}}}}}},"/v1/memories/{memoryId}":{"delete":{"operationId":"delete","summary":"Delete","description":"Soft-delete one memory row.","tags":["subpackage_tts.subpackage_tts/memories"],"parameters":[{"name":"memoryId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/phone-numbers":{"get":{"operationId":"list","summary":"List","description":"List all phone numbers in the caller's workspace.","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The phone numbers for the workspace.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"post":{"operationId":"import","summary":"Import","description":"Import a phone number into the workspace. The `source` field\ndetermines the provisioning path:\n\n- `livekit` - LiveKit purchases the number on your behalf. US\n inbound only. Quickest path for local testing.\n- `twilio` - Provide your Twilio Account SID, Auth Token, and\n the E.164 number you already own. We provision an Elastic SIP\n Trunk on your Twilio account automatically.\n- `byoc` - Provide an existing SIP trunk ID. The number is\n registered against that trunk.\n\nReturns 402 when the workspace has reached the 100-number cap.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The imported phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/phone-numbers/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a phone number by ID.","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a phone number from the workspace. For Twilio and LiveKit\nnumbers this also deprovisions the backing SIP trunk and dispatch\nrule on LiveKit Cloud.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a phone number. Only `label` and `agent_id` are mutable;\n`source` and `e164` are immutable after import. Pass `null` for\n`agent_id` to unbind the number from its current agent.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/sip-trunks":{"get":{"operationId":"list","summary":"List","description":"List all SIP trunks in the caller's workspace.","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The SIP trunks for the workspace.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a SIP trunk. For `kind=byoc` supply `sip_address` plus\noptional digest credentials and IP allowlist. For `kind=twilio`\nuse `ImportPhoneNumber` with a `twilio` spec instead - trunk\ncreation is handled automatically. Returns 402 when the workspace\nhas reached the 20-trunk cap.\n","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created SIP trunk.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/sip-trunks/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a SIP trunk by ID.","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested SIP trunk.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a SIP trunk. This also removes the backing LiveKit inbound\ntrunk, outbound trunk, and dispatch rule if they were provisioned\nby us. Phone numbers attached to this trunk are left in place but\nbecome non-functional until rebound to a new trunk.\n","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/outbound-calls":{"post":{"operationId":"create","summary":"Create","description":"Place an outbound call from an agent to a phone number. LiveKit\noriginates the SIP INVITE through the outbound trunk bound to the\nagent's workspace; the agent worker is dispatched into the room\nautomatically.\n\nThe response is returned as soon as LiveKit accepts the INVITE.\nPoll `GET /v1/conversations/{conversation_id}` for status\ntransitions: `pending` → `active` (answered) → `completed`.\n\nRequires a Twilio or BYOC trunk. LiveKit-native numbers are\ninbound-only.\n","tags":["subpackage_tts.subpackage_tts/outboundCalls"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The outbound call was accepted by LiveKit.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/tenants":{"get":{"operationId":"list","summary":"List","description":"List every workspace the authenticated user belongs to. Powers the workspace switcher.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Workspaces for the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TenantsListResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a new workspace with the authenticated user as owner.\nThe caller must switch their active workspace client-side via\nthe `X-Tenant-ID` header to act on the new tenant.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The newly-created workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateWorkspaceRequest"}}}}}},"/v1/tenants/current":{"get":{"operationId":"get-current","summary":"Get Current","description":"Retrieve the workspace currently selected by the caller (via `X-Tenant-ID` or auto-resolved).","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The current workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}}},"patch":{"operationId":"update-current","summary":"Update Current","description":"Rename the current workspace. Owner or admin only.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateWorkspaceRequest"}}}}}},"/v1/tenants/current/members":{"get":{"operationId":"list-members","summary":"List Members","description":"List every member of the current workspace. Any member may call this.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Members of the current workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:MembersListResponse"}}}}}}},"/v1/tenants/current/members/leave":{"post":{"operationId":"leave","summary":"Leave","description":"Remove the authenticated caller from the current workspace.\nRefused with 409 when the caller is the last owner — promote\nanother member to owner first.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/tenants/current/members/{user_uid}":{"delete":{"operationId":"remove-member","summary":"Remove Member","description":"Remove a member from the current workspace. Owner or admin\nonly. The caller cannot remove themselves — use\n`POST /v1/tenants/current/members/leave` instead.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"user_uid","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-member-role","summary":"Update Member Role","description":"Change a member's role. Owner only — admins may add or remove\nmembers but may not change roles. Refused with 409 when\ndemoting the last remaining owner.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"user_uid","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated member.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Member"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateMemberRoleRequest"}}}}}},"/v1/tenants/current/invites":{"get":{"operationId":"list-invites","summary":"List Invites","description":"List outstanding invites for the current workspace. Invite tokens are redacted.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Outstanding invites.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:InvitesListResponse"}}}}}},"post":{"operationId":"create-invite","summary":"Create Invite","description":"Create an invite to the current workspace. Owner or admin only.\nThe response contains the invite token ONCE — subsequent list\ncalls redact it.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created invite (token included).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Invite"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateInviteRequest"}}}}}},"/v1/tenants/current/invites/{id}":{"delete":{"operationId":"revoke-invite","summary":"Revoke Invite","description":"Revoke an outstanding invite. Owner or admin only. Idempotent.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/invites/{token}/accept":{"post":{"operationId":"accept-invite","summary":"Accept Invite","description":"Accept a workspace invite. The authenticated caller is joined\nto the invite's workspace as a member. Expired, revoked, or\nalready-accepted tokens return 404 to avoid token enumeration.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The workspace the caller just joined.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}}}},"/v1/invites/{token}":{"get":{"operationId":"preview-invite","summary":"Preview Invite","description":"Preview a workspace invite without authenticating. Returns the\nworkspace name, inviter details, and expiry so the `/join/{token}`\npage can render before the recipient signs in. Anyone with the\ntoken can already accept, so this endpoint deliberately surfaces\nthe same information a caller would see after accepting. Invalid\ntokens (unknown, expired, revoked, already-accepted, or pointing\nat a soft-deleted workspace) collapse to a single 404 to prevent\nenumeration.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Preview metadata for a valid, active invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:InvitePreview"}}}}}}},"/v1/tenants/current/transfer-owner":{"post":{"operationId":"transfer-workspace-owner","summary":"Transfer Workspace Owner","description":"Transfer ownership of the current workspace atomically. Promotes\nthe target member to owner and demotes the caller to admin in a\nsingle transaction. Owner-only; admins cannot hand off a role\nthey were never granted. Prefer this over two PATCH calls to\n`/v1/tenants/current/members/{user_uid}`: a sole-owner caller\ncannot demote themselves first without tripping the last-owner\nguard, which this endpoint sidesteps by promoting before\ndemoting.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TransferOwnershipRequest"}}}}}}},"servers":[{"url":"https://api.speechify.ai"}],"components":{"schemas":{"tts:GetSpeechRequestAudioFormat":{"type":"string","enum":["wav","mp3","ogg","aac","pcm"],"default":"wav","description":"The format for the output audio. Note, that the current default is \"wav\", but there's no guarantee it will not change in the future. We recommend always passing the specific param you expect.","title":"GetSpeechRequestAudioFormat"},"tts:GetSpeechRequestModel":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"default":"simba-english","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead.","title":"GetSpeechRequestModel"},"tts:GetSpeechOptionsRequest":{"type":"object","properties":{"loudness_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the audio loudness to a standard level.\nWhen enabled, loudness normalization aligns the audio output to the following standards:\nIntegrated loudness: -14 LUFS\nTrue peak: -2 dBTP\nLoudness range: 7 LU\nIf disabled, the audio loudness will match the original loudness of the selected voice, which may vary significantly and be either too quiet or too loud.\nEnabling loudness normalization can increase latency due to additional processing required for audio level adjustments."},"text_normalization":{"type":"boolean","default":true,"description":"Determines whether to normalize the text. If enabled, it will transform numbers, dates, etc. into words. For example, \"55\" is normalized into \"fifty five\".\nThis can increase latency due to additional processing required for text normalization."}},"description":"GetSpeechOptionsRequest is the wrapper for request parameters to the client","title":"GetSpeechOptionsRequest"},"tts:GetSpeechRequest":{"type":"object","properties":{"audio_format":{"$ref":"#/components/schemas/tts:GetSpeechRequestAudioFormat","description":"The format for the output audio. Note, that the current default is \"wav\", but there's no guarantee it will not change in the future. We recommend always passing the specific param you expect."},"input":{"type":"string","description":"Plain text or SSML to be synthesized to speech.\nRefer to https://docs.speechify.ai/docs/api-limits for the input size limits.\nEmotion, Pitch and Speed Rate are configured in the ssml input, please refer to the ssml documentation for more information: https://docs.speechify.ai/docs/ssml#prosody"},"language":{"type":"string","description":"Language of the input. Follow the format of an ISO 639-1 language code and an ISO 3166-1 region code, separated by a hyphen, e.g. en-US.\nPlease refer to the list of the supported languages and recommendations regarding this parameter: https://docs.speechify.ai/docs/language-support."},"model":{"$ref":"#/components/schemas/tts:GetSpeechRequestModel","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead."},"options":{"$ref":"#/components/schemas/tts:GetSpeechOptionsRequest"},"voice_id":{"type":"string","description":"Id of the voice to be used for synthesizing speech. Refer to /v1/voices endpoint for available voices"}},"required":["input","voice_id"],"description":"GetSpeechRequest is the wrapper for request parameters to the client","title":"GetSpeechRequest"},"tts:GetSpeechResponseAudioFormat":{"type":"string","enum":["wav","mp3","ogg","aac","pcm"],"description":"The format of the audio data","title":"GetSpeechResponseAudioFormat"},"tts:NestedChunk":{"type":"object","properties":{"end":{"type":"integer","format":"int64"},"end_time":{"type":"number","format":"double"},"start":{"type":"integer","format":"int64"},"start_time":{"type":"number","format":"double"},"type":{"type":"string"},"value":{"type":"string"}},"description":"It details the type of segment, its start and end points in the text, and its start and end times in the synthesized speech audio.","title":"NestedChunk"},"tts:SpeechMarks":{"type":"object","properties":{"chunks":{"type":"array","items":{"$ref":"#/components/schemas/tts:NestedChunk"},"description":"Array of NestedChunk, each providing detailed segment information within the synthesized speech."},"end":{"type":"integer","format":"int64"},"end_time":{"type":"number","format":"double"},"start":{"type":"integer","format":"int64"},"start_time":{"type":"number","format":"double"},"type":{"type":"string"},"value":{"type":"string"}},"required":["chunks","end","end_time","start","start_time","type"],"description":"It is used to annotate the audio data with metadata about the synthesis process, like word timing or phoneme details.","title":"SpeechMarks"},"tts:GetSpeechResponse":{"type":"object","properties":{"audio_data":{"type":"string","format":"byte","description":"Synthesized speech audio, Base64-encoded"},"audio_format":{"$ref":"#/components/schemas/tts:GetSpeechResponseAudioFormat","description":"The format of the audio data"},"billable_characters_count":{"type":"integer","format":"int64","description":"The number of billable characters processed in the request."},"speech_marks":{"$ref":"#/components/schemas/tts:SpeechMarks"}},"required":["audio_data","audio_format","billable_characters_count","speech_marks"],"title":"GetSpeechResponse"},"tts:V1AudioStreamPostParametersAccept":{"type":"string","enum":["audio/mpeg","audio/ogg","audio/aac","audio/pcm"],"title":"V1AudioStreamPostParametersAccept"},"tts:GetStreamRequestModel":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"default":"simba-english","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead.","title":"GetStreamRequestModel"},"tts:GetStreamOptionsRequest":{"type":"object","properties":{"loudness_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the audio loudness to a standard level.\nWhen enabled, loudness normalization aligns the audio output to the following standards:\nIntegrated loudness: -14 LUFS\nTrue peak: -2 dBTP\nLoudness range: 7 LU\nIf disabled, the audio loudness will match the original loudness of the selected voice, which may vary significantly and be either too quiet or too loud.\nEnabling loudness normalization can increase latency due to additional processing required for audio level adjustments."},"text_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the text. If enabled, it will transform numbers, dates, etc. into words. For example, \"55\" is normalized into \"fifty five\".\nThis can increase latency due to additional processing required for text normalization."}},"description":"GetStreamOptionsRequest is the wrapper for request parameters to the client","title":"GetStreamOptionsRequest"},"tts:GetStreamRequest":{"type":"object","properties":{"input":{"type":"string","description":"Plain text or SSML to be synthesized to speech.\nRefer to https://docs.speechify.ai/docs/api-limits for the input size limits.\nEmotion, Pitch and Speed Rate are configured in the ssml input, please refer to the ssml documentation for more information: https://docs.speechify.ai/docs/ssml#prosody"},"language":{"type":"string","description":"Language of the input. Follow the format of an ISO 639-1 language code and an ISO 3166-1 region code, separated by a hyphen, e.g. en-US.\nPlease refer to the list of the supported languages and recommendations regarding this parameter: https://docs.speechify.ai/docs/language-support."},"model":{"$ref":"#/components/schemas/tts:GetStreamRequestModel","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead."},"options":{"$ref":"#/components/schemas/tts:GetStreamOptionsRequest"},"voice_id":{"type":"string","description":"Id of the voice to be used for synthesizing speech. Refer to /v1/voices endpoint for available voices"}},"required":["input","voice_id"],"description":"GetStreamRequest is the wrapper for request parameters to the client","title":"GetStreamRequest"},"tts:audio_stream_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"audio_stream_Response_200"},"tts:CreateAccessTokenRequestGrantType":{"type":"string","enum":["client_credentials"],"description":"in: body","title":"CreateAccessTokenRequestGrantType"},"tts:CreateAccessTokenRequestScope":{"type":"string","enum":["audio:speech","audio:stream","audio:all","voices:read","voices:create","voices:delete","voices:all"],"description":"The scope, or a space-delimited list of scopes the token is requested for\nin: body","title":"CreateAccessTokenRequestScope"},"tts:CreateAccessTokenRequest":{"type":"object","properties":{"grant_type":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequestGrantType","description":"in: body"},"scope":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequestScope","description":"The scope, or a space-delimited list of scopes the token is requested for\nin: body"}},"required":["grant_type"],"title":"CreateAccessTokenRequest"},"tts:AccessTokenScope":{"type":"string","enum":["audio:speech","audio:stream","audio:all","voices:read","voices:create","voices:delete","voices:all"],"description":"The scope, or a space-delimited list of scopes the token is issued for","title":"AccessTokenScope"},"tts:AccessTokenTokenType":{"type":"string","enum":["bearer"],"description":"Token type","title":"AccessTokenTokenType"},"tts:AccessToken":{"type":"object","properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64","description":"Expiration time, in seconds from the issue time"},"scope":{"$ref":"#/components/schemas/tts:AccessTokenScope","description":"The scope, or a space-delimited list of scopes the token is issued for"},"token_type":{"$ref":"#/components/schemas/tts:AccessTokenTokenType","description":"Token type"}},"title":"AccessToken"},"tts:OAuthErrorError":{"type":"string","enum":["invalid_client","unauthorized_client","invalid_request","unsupported_grant_type","invalid_scope"],"title":"OAuthErrorError"},"tts:OAuthError":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/tts:OAuthErrorError"},"error_description":{"type":"string"}},"title":"OAuthError"},"tts:GetVoiceGender":{"type":"string","enum":["male","female","notSpecified"],"title":"GetVoiceGender"},"tts:GetVoiceLanguage":{"type":"object","properties":{"locale":{"type":"string"},"preview_audio":{"type":["string","null"]}},"required":["locale"],"title":"GetVoiceLanguage"},"tts:GetVoicesModelName":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"title":"GetVoicesModelName"},"tts:GetVoicesModel":{"type":"object","properties":{"languages":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoiceLanguage"}},"name":{"$ref":"#/components/schemas/tts:GetVoicesModelName"}},"required":["languages","name"],"title":"GetVoicesModel"},"tts:GetVoiceType":{"type":"string","enum":["shared","personal"],"title":"GetVoiceType"},"tts:GetVoice":{"type":"object","properties":{"avatar_image":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"$ref":"#/components/schemas/tts:GetVoiceGender"},"locale":{"type":"string"},"id":{"type":"string"},"models":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoicesModel"}},"preview_audio":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"type":{"$ref":"#/components/schemas/tts:GetVoiceType"}},"required":["display_name","gender","locale","id","models","type"],"title":"GetVoice"},"tts:V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender":{"type":"string","enum":["male","female","notSpecified"],"description":"Gender marker for the personal voice\nmale GenderMale\nfemale GenderFemale\nnotSpecified GenderNotSpecified","title":"V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender"},"tts:CreatedVoiceGender":{"type":"string","enum":["male","female","notSpecified"],"title":"CreatedVoiceGender"},"tts:CreateVoiceLanguage":{"type":"object","properties":{"locale":{"type":"string"},"preview_audio":{"type":"string"}},"title":"CreateVoiceLanguage"},"tts:CreateVoiceModelName":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"title":"CreateVoiceModelName"},"tts:CreateVoiceModel":{"type":"object","properties":{"languages":{"type":"array","items":{"$ref":"#/components/schemas/tts:CreateVoiceLanguage"}},"name":{"$ref":"#/components/schemas/tts:CreateVoiceModelName"}},"title":"CreateVoiceModel"},"tts:CreatedVoiceType":{"type":"string","enum":["shared","personal"],"title":"CreatedVoiceType"},"tts:CreatedVoice":{"type":"object","properties":{"avatar_image":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"$ref":"#/components/schemas/tts:CreatedVoiceGender"},"locale":{"type":"string"},"id":{"type":"string"},"models":{"type":"array","items":{"$ref":"#/components/schemas/tts:CreateVoiceModel"}},"type":{"$ref":"#/components/schemas/tts:CreatedVoiceType"}},"required":["display_name","gender","locale","id","models","type"],"title":"CreatedVoice"},"tts:Agent":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"prompt":{"type":"string"},"first_message":{"type":"string"},"language":{"type":"string","description":"ISO 639-1 code, e.g. 'en'."},"llm_model":{"type":"string","description":"Chat model slug. Leave empty to use the Speechify default."},"voice_id":{"type":"string","description":"Speechify voice slug."},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Free-form agent config JSON (evaluation_config is read via its own endpoint)."},"is_public":{"type":"boolean","description":"When true, the `` web component can start a\nsession against this agent without an API key, subject to\nthe `allowed_origins` allowlist. When false (default), only\nauthenticated callers can start sessions.\n"},"allowed_origins":{"type":"array","items":{"type":"string"},"description":"Exact `Origin` header values (e.g. `https://example.com`)\nthat are allowed to start public sessions. Empty array\nwith `is_public = true` means any origin is accepted —\nintended for open demos. No subdomain wildcards.\n"},"hostname_allowlist":{"type":["array","null"],"items":{"type":"string"},"description":"Optional per-agent hostname allowlist enforced at\nsession-creation time. When set and non-empty, the\n`Origin` header's hostname must be an exact member.\nBare hostnames only — no scheme, port, or path. Up to\n10 entries. Omit (null) or leave empty for no\nenforcement (public agents accept any hostname).\n"},"memory_enabled":{"type":"boolean","description":"When true, the post-call extractor writes durable facts about\neach caller; at conversation-start the retriever injects the\ntop matches into the system prompt via the `{{memory}}`\ntemplate variable. Defaults to false.\n"},"memory_retention_days":{"type":"integer","description":"Maximum age (in days) of memories kept and surfaced to the\nretriever. 0 disables the cap. Defaults to 90.\n"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","slug","language","llm_model","voice_id","temperature","is_public","allowed_origins","memory_enabled","memory_retention_days","created_at","updated_at"],"title":"Agent"},"tts:ListAgentsResponse":{"type":"object","properties":{"agents":{"type":"array","items":{"$ref":"#/components/schemas/tts:Agent"}}},"required":["agents"],"title":"ListAgentsResponse"},"tts:CreateAgentRequest":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string","description":"Optional; auto-generated from name if omitted."},"prompt":{"type":"string"},"first_message":{"type":"string","description":"Spoken verbatim at session start — no LLM round trip."},"language":{"type":"string","default":"en"},"llm_model":{"type":"string","description":"Optional chat model slug. Leave empty to use the Speechify default."},"voice_id":{"type":"string","description":"Voice slug from the VMS catalog (see GET /v1/voices). Required — the server rejects writes with an unknown or empty slug."},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"}},"is_public":{"type":"boolean","default":false},"allowed_origins":{"type":"array","items":{"type":"string"}},"hostname_allowlist":{"type":"array","items":{"type":"string"},"description":"Optional per-agent hostname allowlist (see Agent schema)."},"memory_enabled":{"type":"boolean","default":false},"memory_retention_days":{"type":"integer","default":90}},"required":["name","voice_id"],"title":"CreateAgentRequest"},"tts:UpdateAgentRequest":{"type":"object","properties":{"name":{"type":"string"},"prompt":{"type":"string"},"first_message":{"type":"string"},"language":{"type":"string"},"llm_model":{"type":"string"},"voice_id":{"type":"string"},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"}},"is_public":{"type":"boolean"},"allowed_origins":{"type":"array","items":{"type":"string"}},"hostname_allowlist":{"type":"array","items":{"type":"string"},"description":"When supplied, replaces the stored list. Pass an empty\narray to clear enforcement (public agent is open again).\nOmit the field to leave the existing value unchanged.\n"},"memory_enabled":{"type":"boolean"},"memory_retention_days":{"type":"integer"}},"title":"UpdateAgentRequest"},"tts:ToolKind":{"type":"string","enum":["system","webhook","client"],"description":"Where the tool executes.\n- `system`: worker-resident built-in (e.g. end_call, transfer_to_number)\n- `webhook`: worker signs a payload and POSTs it to your URL\n- `client`: worker dispatches to the caller's browser/SDK via data channel\n","title":"ToolKind"},"tts:SystemToolConfigBuiltin":{"type":"string","enum":["end_call","transfer_to_number","transfer_to_agent","play_keypad_touch_tone","skip_turn"],"title":"SystemToolConfigBuiltin"},"tts:ToolParamType":{"type":"string","enum":["string","number","integer","boolean"],"title":"ToolParamType"},"tts:ToolParam":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:ToolParamType"},"description":{"type":"string"},"required":{"type":"boolean"},"enum":{"type":"array","items":{"type":"string"}}},"required":["name","type","description","required"],"description":"One argument the LLM can pass when calling the tool. Mirrors the JSON-Schema subset standard function-calling schemas support.","title":"ToolParam"},"tts:SystemToolConfig":{"type":"object","properties":{"builtin":{"$ref":"#/components/schemas/tts:SystemToolConfigBuiltin"},"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}},"builtin_config":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-builtin extras (e.g. allowed_numbers for transfer_to_number)."}},"required":["builtin"],"description":"Config shape for `kind=system`.","title":"SystemToolConfig"},"tts:WebhookToolConfigMethod":{"type":"string","enum":["POST","GET"],"default":"POST","title":"WebhookToolConfigMethod"},"tts:WebhookToolConfig":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"method":{"$ref":"#/components/schemas/tts:WebhookToolConfigMethod"},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Static headers sent with every call. `Authorization` and `X-Speechify-Signature` are reserved."},"timeout_ms":{"type":"integer","default":10000,"description":"Per-call timeout in milliseconds."},"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}}},"required":["url"],"description":"Config shape for `kind=webhook`.","title":"WebhookToolConfig"},"tts:ClientToolConfig":{"type":"object","properties":{"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}},"timeout_ms":{"type":"integer","default":10000}},"description":"Config shape for `kind=client`. Execution happens in the caller's browser / SDK.","title":"ClientToolConfig"},"tts:ToolConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"description":"One of `SystemToolConfig`, `WebhookToolConfig`, or `ClientToolConfig` depending on `kind`.","title":"ToolConfig"},"tts:Tool":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:ToolKind"},"config":{"$ref":"#/components/schemas/tts:ToolConfig","description":"One of `SystemToolConfig`, `WebhookToolConfig`, or `ClientToolConfig` depending on `kind`."},"webhook_secret":{"type":"string","description":"HMAC signing secret for `kind=webhook`. Returned in full **only** on the create\nresponse; all subsequent reads return a masked placeholder. Store it on first\ncreate — there is no way to retrieve it later.\n"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","description","kind","config","created_at","updated_at"],"title":"Tool"},"tts:ListToolsResponse":{"type":"object","properties":{"tools":{"type":"array","items":{"$ref":"#/components/schemas/tts:Tool"}}},"required":["tools"],"title":"ListToolsResponse"},"tts:EvaluationCriterion":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}},"required":["id","name","description"],"description":"One LLM-scored assertion about the call (\"Did the agent confirm the customer's name?\").","title":"EvaluationCriterion"},"tts:DataCollectionFieldType":{"type":"string","enum":["string","int","number","boolean"],"title":"DataCollectionFieldType"},"tts:DataCollectionField":{"type":"object","properties":{"key":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:DataCollectionFieldType"}},"required":["key","description","type"],"description":"A structured value the post-call evaluator should extract from the\ntranscript. `int` is distinct from `number` so downstream consumers\nreceive whole integers without a synthetic decimal.\n","title":"DataCollectionField"},"tts:EvaluationConfig":{"type":"object","properties":{"criteria":{"type":"array","items":{"$ref":"#/components/schemas/tts:EvaluationCriterion"}},"data_collection":{"type":"array","items":{"$ref":"#/components/schemas/tts:DataCollectionField"}}},"required":["criteria","data_collection"],"title":"EvaluationConfig"},"tts:UpdateEvaluationConfigRequest":{"type":"object","properties":{"criteria":{"type":"array","items":{"$ref":"#/components/schemas/tts:EvaluationCriterion"}},"data_collection":{"type":"array","items":{"$ref":"#/components/schemas/tts:DataCollectionField"}}},"required":["criteria","data_collection"],"title":"UpdateEvaluationConfigRequest"},"tts:DynamicVariableType":{"type":"string","enum":["string","number","boolean","json"],"description":"Declared type of a customer-scope variable. Enforced at save time\nand again at session-start when an override value is supplied.\n- `string` - plain text value; interpolated verbatim with `{{name}}`\n- `number` - numeric value; rendered as its decimal representation\n- `boolean` - `true` or `false`\n- `json` - any valid JSON value; use `{{name|json}}` to inject\n safely inside JSON tool bodies\n","title":"DynamicVariableType"},"tts:DynamicVariable":{"type":"object","properties":{"key":{"type":"string","description":"Variable name. Must match `[a-zA-Z0-9_]+`. The `system__` prefix\nis reserved for platform-populated variables and will be rejected.\n"},"type":{"$ref":"#/components/schemas/tts:DynamicVariableType"},"default":{"description":"Optional default value used when no per-session override is\nsupplied. Must conform to the declared `type`.\n"},"description":{"type":"string","description":"Human-readable note shown in the console variable editor."}},"required":["key","type"],"description":"One customer-scope variable definition on an agent. Referenced in\nprompts, first messages, and webhook tool configs via `{{key}}` or\n`{{key|json}}`. Missing variables render as empty string at dispatch\ntime - a typo never breaks a session.\n","title":"DynamicVariable"},"tts:SystemVariableDoc":{"type":"object","properties":{"key":{"type":"string","description":"The reserved variable key (always starts with `system__`)."},"description":{"type":"string","description":"What the variable contains and when it is populated."}},"required":["key","description"],"description":"Documents one reserved `system__*` variable that the platform\nauto-populates at session start. Customers cannot define or\noverride these keys.\n","title":"SystemVariableDoc"},"tts:ListDynamicVariablesResponse":{"type":"object","properties":{"variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:DynamicVariable"},"description":"Customer-defined variables for this agent."},"system_variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:SystemVariableDoc"},"description":"Platform-populated `system__*` variables, provided for\nreference. This list is the same for every agent.\n"}},"required":["variables","system_variables"],"description":"Response for `GET /v1/agents/{id}/variables`. Returns both the\ncustomer-scope variable catalogue and the read-only `system__*`\ncatalogue so the editor UI has a single source of truth.\n","title":"ListDynamicVariablesResponse"},"tts:UpdateDynamicVariablesRequest":{"type":"object","properties":{"variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:DynamicVariable"},"description":"The new variable list. Replaces the existing list entirely."}},"required":["variables"],"description":"PATCH body for `PATCH /v1/agents/{id}/variables`. Replaces the\nstored variable list wholesale. Pass an empty array to clear all\nvariables. Up to 20 variables per agent.\n","title":"UpdateDynamicVariablesRequest"},"tts:CreateConversationRequest":{"type":"object","properties":{"transport":{"type":["string","null"],"description":"Transport hint. Omit to use the agent's default."},"dynamic_variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-session variable overrides that merge on top of the agent's\nstored variable defaults for this one conversation. Keys in the\nreserved `system__` namespace are rejected. Values must match the\ndeclared type of the corresponding variable definition on the agent.\n"}},"description":"Optional body for `POST /v1/agents/{id}/conversations`.","title":"CreateConversationRequest"},"tts:ConversationStatus":{"type":"string","enum":["pending","active","completed","failed"],"title":"ConversationStatus"},"tts:ConversationTransport":{"type":"string","enum":["web","sip"],"title":"ConversationTransport"},"tts:Conversation":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"room_name":{"type":"string"},"room_sid":{"type":"string"},"status":{"$ref":"#/components/schemas/tts:ConversationStatus"},"transport":{"$ref":"#/components/schemas/tts:ConversationTransport"},"started_at":{"type":["string","null"],"format":"date-time","description":"Set when the first user participant joins the realtime\nvoice session. Null between CreateConversation and the\nparticipant-joined event, and stays null if no user ever\njoins.\n"},"ended_at":{"type":["string","null"],"format":"date-time"},"duration_ms":{"type":["integer","null"]},"cost_cents":{"type":["integer","null"]},"recording_url":{"type":["string","null"]},"metadata":{"type":"object","additionalProperties":{"description":"Any type"}}},"required":["id","agent_id","room_name","status","transport"],"title":"Conversation"},"tts:CreateConversationResponse":{"type":"object","properties":{"conversation":{"$ref":"#/components/schemas/tts:Conversation"},"room":{"type":"string"},"token":{"type":"string","description":"Short-lived realtime session access token (JWT)."},"url":{"type":"string","description":"Realtime session wss:// URL to connect to."}},"required":["conversation","room","token","url"],"description":"Returned when a conversation is created. The `token` + `url`\nlet the caller connect its browser/SDK directly to the\nrealtime voice session — the agent that answers is dispatched\nserver-side.\n","title":"CreateConversationResponse"},"tts:CreateSessionRequest":{"type":"object","properties":{"user_identity":{"type":"string","description":"Opaque identifier for the end-user (e.g. your app's user ID). Stamped onto the conversation. Optional - defaults to an anonymous per-session ID."},"dynamic_variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-session variable overrides that merge on top of the agent's\nstored variable defaults for this one session. Keys in the\nreserved `system__` namespace are rejected at this boundary.\nValues must match the declared type of the corresponding variable\ndefinition on the agent (a `string` type expects a JSON string,\n`number` expects a JSON number, etc.).\n"}},"description":"Optional body for `POST /v1/agents/{id}/sessions`. Widget embeds usually pass nothing.","title":"CreateSessionRequest"},"tts:KnowledgeBase":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"Human-readable label, shown in the console."},"description":{"type":"string","description":"Optional description."},"document_count":{"type":"integer","description":"Number of ingested documents."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","description","document_count","created_at","updated_at"],"description":"A bundle of documents that can be attached to one or more voice\nagents. Chunks across every document in the knowledge base are\nembedded and searched together.","title":"KnowledgeBase"},"tts:ListKnowledgeBasesResponse":{"type":"object","properties":{"knowledge_bases":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}},"required":["knowledge_bases"],"title":"ListKnowledgeBasesResponse"},"tts:Memory":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"caller_identity":{"type":"string","description":"Stable caller key (LiveKit participant identity) the memory is scoped to."},"fact":{"type":"string","description":"Short third-person statement about the caller."},"source_conversation_id":{"type":"string","description":"Conversation the memory was extracted from (may be empty if the source was deleted)."},"confidence":{"type":"number","format":"double","description":"LLM self-reported 0-1 confidence in the fact's durability and relevance."},"score":{"type":"number","format":"double","description":"Populated only on retrieval hits — recency-weighted cosine similarity."},"created_at":{"type":"string","format":"date-time"}},"required":["id","agent_id","caller_identity","fact","confidence","created_at"],"description":"One salient fact extracted post-call about a specific caller on\na specific agent. Retrieved at the next conversation-start for\nthe same caller and injected into the agent's system prompt via\nthe `{{memory}}` template variable.","title":"Memory"},"tts:ListMemoriesResponse":{"type":"object","properties":{"memories":{"type":"array","items":{"$ref":"#/components/schemas/tts:Memory"}}},"required":["memories"],"title":"ListMemoriesResponse"},"tts:DeleteMemoriesByCallerRequest":{"type":"object","properties":{"agent_id":{"type":"string"},"caller_identity":{"type":"string"}},"required":["agent_id","caller_identity"],"title":"DeleteMemoriesByCallerRequest"},"tts:DeleteMemoriesByCallerResponse":{"type":"object","properties":{"deleted":{"type":"integer","description":"Number of memories soft-deleted."}},"required":["deleted"],"title":"DeleteMemoriesByCallerResponse"},"tts:TestType":{"type":"string","enum":["scenario","tool","simulation"],"description":"Discriminates the shape of `AgentTest.config`.\n- `scenario` - send one message to the agent and judge the response with an LLM.\n- `tool` - assert that the agent calls a specific tool given a context.\n- `simulation` - run a multi-turn conversation between the agent and an AI caller.\n","title":"TestType"},"tts:SimulationMessageRole":{"type":"string","enum":["user","assistant"],"title":"SimulationMessageRole"},"tts:SimulationMessage":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/tts:SimulationMessageRole"},"content":{"type":"string"}},"required":["role","content"],"description":"One turn in a simulation conversation. `role` is `user` (the AI caller) or `assistant` (the agent).","title":"SimulationMessage"},"tts:ScenarioConfig":{"type":"object","properties":{"context":{"type":"string","description":"User message sent to the agent to trigger the behaviour under test. Optional when `initial_chat_history` already ends with a user message."},"success_criteria":{"type":"string","description":"Natural-language description of what a passing agent response looks like."},"success_examples":{"type":"array","items":{"type":"string"},"description":"Concrete examples of passing responses (few-shot for the judge)."},"failure_examples":{"type":"array","items":{"type":"string"},"description":"Concrete examples of failing responses (few-shot for the judge)."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation prepended before `context`. Lets you test the agent's reply mid-conversation rather than on a cold single-turn prompt."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only. Useful for regression-isolating prompt changes."},"first_message_override":{"type":"string","description":"Replaces the agent's first message for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["success_criteria"],"description":"Configuration for a `scenario` test. The runner sends `context` as\na user message and asks an LLM judge to evaluate the agent response\nagainst `success_criteria`. Optional few-shot examples sharpen the\njudge's calibration. Use `initial_chat_history` to prepend prior\nturns before `context`; when the history already ends with a user\nmessage, `context` may be omitted and the agent is evaluated on\nits reply to that last history turn.","title":"ScenarioConfig"},"tts:ParameterCheckMode":{"type":"string","enum":["exact","regex","llm"],"description":"How a `ParameterCheck` validates a tool argument.\n- `exact` - JSON equality.\n- `regex` - the argument stringified is matched against the pattern.\n- `llm` - an LLM judge decides whether the value semantically satisfies\n the criteria (e.g. \"is a plausible email address\").\n","title":"ParameterCheckMode"},"tts:ParameterCheck":{"type":"object","properties":{"path":{"type":"string","description":"Dotted JSON path to the argument being checked. Empty means the whole args object."},"mode":{"$ref":"#/components/schemas/tts:ParameterCheckMode"},"expected":{"type":"string","description":"Expected value string for `exact` and `regex` modes."},"criteria":{"type":"string","description":"Natural-language criteria for `llm` mode (e.g. \"is a valid email address\")."}},"required":["path","mode"],"description":"Validates one argument of an expected tool call. `path` is a\ndotted JSON path (e.g. `customer.email`); use zero-indexed\nnotation for arrays (`items.0.sku`). An empty path checks the\nwhole args object.","title":"ParameterCheck"},"tts:ToolCallConfig":{"type":"object","properties":{"context":{"type":"string","description":"User message that should cause the agent to invoke the expected tool. Optional when `initial_chat_history` already ends with a user message."},"expected_tool":{"type":"string","description":"Name of the tool the agent is expected to call."},"parameter_checks":{"type":"array","items":{"$ref":"#/components/schemas/tts:ParameterCheck"},"description":"Assertions on specific arguments of the tool call."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation prepended before `context`."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["expected_tool"],"description":"Configuration for a `tool` test. The runner sends `context` as a\nuser message and asserts that the agent calls `expected_tool` with\narguments matching all `parameter_checks`. Use\n`initial_chat_history` to test tool invocations that only make\nsense mid-conversation.","title":"ToolCallConfig"},"tts:SimulationConfig":{"type":"object","properties":{"scenario":{"type":"string","description":"Instructions for the AI caller describing who they are and what they want."},"success_condition":{"type":"string","description":"Natural-language description of what a passing conversation looks like."},"max_turns":{"type":"integer","default":5,"description":"Maximum agent turns before the simulation is cut off and judged."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation that precedes the AI caller's first generated message."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["scenario","success_condition","max_turns"],"description":"Configuration for a `simulation` test. An AI caller drives a\nmulti-turn conversation with the agent according to `scenario`.\nAfter `max_turns` exchanges (or when the agent ends the call), an\nLLM judge evaluates whether `success_condition` was met.\nUse `initial_chat_history` to seed the conversation at a specific\nmid-flow state.","title":"SimulationConfig"},"tts:AgentTestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Type-specific configuration document.","title":"AgentTestConfig"},"tts:MockingStrategy":{"type":"string","enum":["none","all","selected"],"description":"Controls which tool calls the runner intercepts during a run.\nSystem tools (`end_call`, `transfer_to_number`, etc.) are never\nmocked regardless of strategy.\n- `none` - no interception; all tools are called normally.\n- `all` - every non-system tool call is intercepted and matched\n against the `mocks` list.\n- `selected` - only tools explicitly listed in `mocks` are\n intercepted; others are called normally.\n","title":"MockingStrategy"},"tts:ToolMock":{"type":"object","properties":{"tool_name":{"type":"string","description":"Name of the tool to intercept."},"args_match":{"type":"string","description":"Optional substring of the JSON-serialised call arguments. When\nabsent the mock matches unconditionally for this tool."},"response":{"description":"JSON value returned to the agent as the tool result."}},"required":["tool_name","response"],"description":"A canned response returned when the agent calls `tool_name`. If\n`args_match` is set the mock only triggers when its value appears\nas a substring of the JSON-serialised call arguments (a deliberately\nsimple v1 matcher — full expression support is planned). A mock\nwithout `args_match` always matches for its tool.","title":"ToolMock"},"tts:NoMatchBehavior":{"type":"string","enum":["call_real_tool","finish_with_error","skip"],"description":"Fallback when a mockable tool is called but no configured mock\nmatches the call arguments.\n- `call_real_tool` - pass-through: actually invoke the underlying tool.\n- `finish_with_error` - fail: short-circuit the run to an `error`\n status. Useful when a test wants to assert that a specific mocked\n response path is taken - any unmocked tool call aborts the run.\n- `skip` - return an empty stub (`{\"skipped\":true}`) to the agent so\n the simulation proceeds without treating the call as a failure.\n Useful when a tool's output is irrelevant to the behaviour under\n test but the model may still decide to call it.\n","title":"NoMatchBehavior"},"tts:ToolMockConfig":{"type":"object","properties":{"strategy":{"$ref":"#/components/schemas/tts:MockingStrategy"},"mocks":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolMock"},"description":"Canned responses for specific tools (order matters - first match wins)."},"no_match_behavior":{"$ref":"#/components/schemas/tts:NoMatchBehavior"}},"required":["strategy","no_match_behavior"],"description":"Controls tool-call interception during a test run.","title":"ToolMockConfig"},"tts:TestRunStatus":{"type":"string","enum":["queued","running","passed","failed","error"],"description":"Lifecycle of a test run: `queued` - `running` - terminal.\n\nTerminal states:\n- `passed` - the agent behaviour met the success criteria.\n- `failed` - the agent behaviour did not meet the success criteria.\n- `error` - the runner itself could not complete (LLM outage, network error, etc.),\n distinct from `failed` which means the agent behaviour was judged and found lacking.\n","title":"TestRunStatus"},"tts:ScenarioResult":{"type":"object","properties":{"agent_response":{"type":"string","description":"The raw text response the agent produced."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM judge's explanation of the verdict."},"score":{"type":"number","format":"double","description":"0-1 judge confidence score."},"duration_ms":{"type":"integer","format":"int64","description":"Wall-clock time for the run in milliseconds."}},"required":["agent_response","passed","rationale","score","duration_ms"],"description":"Result details for a `scenario` test run.","title":"ScenarioResult"},"tts:ParameterCheckResult":{"type":"object","properties":{"path":{"type":"string"},"mode":{"$ref":"#/components/schemas/tts:ParameterCheckMode"},"actual_json":{"type":"string","description":"JSON-serialised actual value at `path`."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM rationale (populated for `llm` mode checks)."}},"required":["path","mode","actual_json","passed"],"description":"Result of one `ParameterCheck` within a tool-call test run.","title":"ParameterCheckResult"},"tts:ToolCallResult":{"type":"object","properties":{"tool_called":{"type":"string","description":"Name of the tool the agent actually called (may differ from `expected_tool`)."},"tool_args":{"description":"Arguments the agent passed to the tool, as a JSON object."},"expected_tool":{"type":"string","description":"Name of the tool the test expected the agent to call."},"tool_matched":{"type":"boolean","description":"True when `tool_called` equals `expected_tool`."},"parameter_results":{"type":"array","items":{"$ref":"#/components/schemas/tts:ParameterCheckResult"}},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"Explanation of the overall verdict."},"duration_ms":{"type":"integer","format":"int64"}},"required":["tool_called","expected_tool","tool_matched","parameter_results","passed","rationale","duration_ms"],"description":"Result details for a `tool` test run.","title":"ToolCallResult"},"tts:SimulationToolCall":{"type":"object","properties":{"turn_index":{"type":"integer","description":"Zero-based index of the conversation turn in which this call occurred."},"tool_name":{"type":"string"},"args":{"description":"Arguments passed to the tool, as a JSON object."},"response":{"description":"Response returned to the agent (absent for system tools that end the call)."},"mocked":{"type":"boolean"}},"required":["turn_index","tool_name","args","mocked"],"description":"One tool invocation that occurred during a simulation run.\n`mocked` is true when the call was intercepted by the run's\nmock config; false when the real tool was called or when the\ntool is a system tool.","title":"SimulationToolCall"},"tts:SimulationResult":{"type":"object","properties":{"transcript":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Full synthetic conversation in order."},"tool_calls":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationToolCall"},"description":"Every tool invocation across all turns."},"turns_used":{"type":"integer","description":"Number of agent turns that ran before the simulation ended."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM judge's explanation of the verdict."},"duration_ms":{"type":"integer","format":"int64"}},"required":["transcript","turns_used","passed","rationale","duration_ms"],"description":"Result details for a `simulation` test run.","title":"SimulationResult"},"tts:TestRunResult":{"type":"object","properties":{"test_type":{"$ref":"#/components/schemas/tts:TestType"},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"Top-level verdict explanation duplicated from the inner result for quick rendering."},"duration_ms":{"type":"integer","format":"int64"},"scenario":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioResult"},{"type":"null"}]},"tool_call":{"oneOf":[{"$ref":"#/components/schemas/tts:ToolCallResult"},{"type":"null"}]},"simulation":{"oneOf":[{"$ref":"#/components/schemas/tts:SimulationResult"},{"type":"null"}]}},"required":["test_type","passed","rationale","duration_ms"],"description":"Union-like result of a completed test run. Exactly one of\n`scenario`, `tool_call`, or `simulation` is populated, matching\nthe `test_type`.","title":"TestRunResult"},"tts:AgentTestRun":{"type":"object","properties":{"id":{"type":"string"},"test_id":{"type":"string"},"agent_id":{"type":"string"},"status":{"$ref":"#/components/schemas/tts:TestRunStatus"},"started_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"result":{"oneOf":[{"$ref":"#/components/schemas/tts:TestRunResult"},{"type":"null"}],"description":"Populated on terminal status only."},"error":{"type":"string","description":"Human-readable error message when status is `error`."},"created_at":{"type":"string","format":"date-time"}},"required":["id","test_id","agent_id","status","created_at"],"description":"One execution of a test. `result` is populated when `status`\nreaches a terminal state (`passed`, `failed`, or `error`).\nSee `TestRunResult` for the shape.","title":"AgentTestRun"},"tts:AgentTestWithLastRun":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:AgentTestConfig","description":"Type-specific configuration document."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during runs of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test dynamic-variable overrides. Keys substitute `{{key}}`\nplaceholders inside the test config at run-start. Unknown keys\nrender as empty string, matching session dispatch behaviour.\n"},"folder_id":{"type":["string","null"],"description":"Folder the test belongs to; null = root (unfiled)."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"last_run":{"oneOf":[{"$ref":"#/components/schemas/tts:AgentTestRun"},{"type":"null"}],"description":"The most recent run, or null if the test has never been run."},"attached_agent_ids":{"type":"array","items":{"type":"string"},"description":"Every agent this test runs against. Always includes the owner agent."}},"required":["id","agent_id","name","description","type","config","created_at","updated_at"],"description":"List-view projection of a test that includes the most recent run\nso the console can display pass/fail badges without an extra\nround-trip. On the global `/v1/tests` surface, also carries\n`attached_agent_ids` so the row can render agent chips without a\nfollow-up request.","title":"AgentTestWithLastRun"},"tts:ListAgentTestsResponse":{"type":"object","properties":{"tests":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestWithLastRun"}}},"required":["tests"],"title":"ListAgentTestsResponse"},"tts:CreateAgentTestRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Type-specific configuration. Must match the shape for the given `type`.","title":"CreateAgentTestRequestConfig"},"tts:CreateAgentTestRequest":{"type":"object","properties":{"name":{"type":"string","description":"Short human-readable label for the test."},"description":{"type":"string","description":"Optional longer description of what this test verifies."},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:CreateAgentTestRequestConfig","description":"Type-specific configuration. Must match the shape for the given `type`."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during every run of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test variable values substituted into string fields of the\nconfig at run-start. Keys use the same rules as agent-level\n`DynamicVariable` keys.\n"},"folder_id":{"type":["string","null"],"description":"Folder to place the test in. Omit for root."},"attached_agent_ids":{"type":"array","items":{"type":"string"},"description":"Optional list of additional agents this test should also run\nagainst. The owner agent (path param) is always attached\nimplicitly.\n"}},"required":["name","type","config"],"description":"Payload for `POST /v1/agents/{id}/tests`.","title":"CreateAgentTestRequest"},"tts:AgentTest":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:AgentTestConfig","description":"Type-specific configuration document."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during runs of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test dynamic-variable overrides. Keys substitute `{{key}}`\nplaceholders inside the test config at run-start. Unknown keys\nrender as empty string, matching session dispatch behaviour.\n"},"folder_id":{"type":["string","null"],"description":"Folder the test belongs to; null = root (unfiled)."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","agent_id","name","description","type","config","created_at","updated_at"],"description":"A configured test against a voice agent. `config` is a\ntype-specific document - see `ScenarioConfig`, `ToolCallConfig`,\nand `SimulationConfig` for the per-type shapes (discriminated by `type`).","title":"AgentTest"},"tts:RunAgentTestsResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"description":"Response from `POST /v1/agents/{id}/tests/runs`. Contains every\nnewly-queued run so the client can poll each for completion.\nCapped at 50 runs per call.","title":"RunAgentTestsResponse"},"tts:UpdateAgentTestRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Replaces the test config when present.","title":"UpdateAgentTestRequestConfig"},"tts:UpdateAgentTestRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"config":{"$ref":"#/components/schemas/tts:UpdateAgentTestRequestConfig","description":"Replaces the test config when present."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Replaces the tool-mock config when present."}},"description":"Payload for `PATCH /v1/tests/{id}`. All fields are optional;\nomitting a field leaves it unchanged.","title":"UpdateAgentTestRequest"},"tts:ListAgentTestRunsResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"title":"ListAgentTestRunsResponse"},"tts:ListTestsResponse":{"type":"object","properties":{"tests":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestWithLastRun"}},"next_cursor":{"type":"string"}},"required":["tests"],"description":"Workspace-wide paginated list of tests. `next_cursor` is the opaque\npage cursor; omit on the first call, then pass through to get the\nnext page until the field is absent.","title":"ListTestsResponse"},"tts:TestStatsBucket":{"type":"object","properties":{"day":{"type":"string","description":"ISO date (YYYY-MM-DD)."},"passed":{"type":"integer"},"failed":{"type":"integer"},"errored":{"type":"integer"}},"required":["day","passed","failed","errored"],"description":"One daily point on the aggregate pass-rate chart.","title":"TestStatsBucket"},"tts:TestStats":{"type":"object","properties":{"window_days":{"type":"integer"},"buckets":{"type":"array","items":{"$ref":"#/components/schemas/tts:TestStatsBucket"}},"total_runs":{"type":"integer"},"passed_runs":{"type":"integer"},"failed_runs":{"type":"integer"},"errored_runs":{"type":"integer"},"avg_duration_ms":{"type":"integer"},"by_type":{"type":"object","additionalProperties":{"type":"integer"}}},"required":["window_days","buckets","total_runs","passed_runs","failed_runs","errored_runs","avg_duration_ms"],"description":"Aggregate run metrics over the requested window. `buckets` is\ndense - one entry per day in the window, zero-filled, so a chart\nnever has gaps. `by_type` counts runs per test type across the\nwhole window.","title":"TestStats"},"tts:BatchRunEntry":{"type":"object","properties":{"test_id":{"type":"string"},"agent_id":{"type":"string"}},"required":["test_id"],"description":"One entry in a batch-run request. Omit `agent_id` to fan out to\nevery agent the test is attached to.","title":"BatchRunEntry"},"tts:RunBatchRequest":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/tts:BatchRunEntry"}}},"required":["entries"],"description":"Batch-run payload. Total expanded runs across all entries are\ncapped at 100 per call.","title":"RunBatchRequest"},"tts:RunBatchResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"title":"RunBatchResponse"},"tts:AgentTestAttachment":{"type":"object","properties":{"test_id":{"type":"string"},"agent_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"required":["test_id","agent_id","created_at"],"description":"One (test, agent) pair. Poll the `attached_agent_ids` field on `AgentTestWithLastRun` or hit `/v1/tests/{id}/attachments` for the authoritative set.","title":"AgentTestAttachment"},"tts:ListAgentTestAttachmentsResponse":{"type":"object","properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestAttachment"}}},"required":["attachments"],"title":"ListAgentTestAttachmentsResponse"},"tts:MoveAgentTestRequest":{"type":"object","properties":{"folder_id":{"type":["string","null"]}},"description":"Body for `POST /v1/tests/{id}/move`. `folder_id: null` moves the test to root.","title":"MoveAgentTestRequest"},"tts:AgentTestFolder":{"type":"object","properties":{"id":{"type":"string"},"parent_folder_id":{"type":["string","null"]},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","created_at","updated_at"],"description":"One organisational node in the per-owner tests tree.","title":"AgentTestFolder"},"tts:ListAgentTestFoldersResponse":{"type":"object","properties":{"folders":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}},"required":["folders"],"title":"ListAgentTestFoldersResponse"},"tts:CreateAgentTestFolderRequest":{"type":"object","properties":{"name":{"type":"string"},"parent_folder_id":{"type":["string","null"]}},"required":["name"],"title":"CreateAgentTestFolderRequest"},"tts:UpdateAgentTestFolderRequest":{"type":"object","properties":{"name":{"type":"string"},"parent_folder_id":{"type":["string","null"]}},"description":"PATCH body. Both fields optional; omit to leave unchanged.\nPass `parent_folder_id: null` to reparent to root.","title":"UpdateAgentTestFolderRequest"},"tts:CreateToolRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"title":"CreateToolRequestConfig"},"tts:CreateToolRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:ToolKind"},"config":{"$ref":"#/components/schemas/tts:CreateToolRequestConfig"}},"required":["name","description","kind","config"],"title":"CreateToolRequest"},"tts:UpdateToolRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"title":"UpdateToolRequestConfig"},"tts:UpdateToolRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"config":{"$ref":"#/components/schemas/tts:UpdateToolRequestConfig"}},"description":"All fields optional. `kind` is immutable — create a new tool to change it.","title":"UpdateToolRequest"},"tts:ListConversationsResponse":{"type":"object","properties":{"conversations":{"type":"array","items":{"$ref":"#/components/schemas/tts:Conversation"}}},"required":["conversations"],"title":"ListConversationsResponse"},"tts:MessageRole":{"type":"string","enum":["user","assistant","system","tool"],"title":"MessageRole"},"tts:Message":{"type":"object","properties":{"id":{"type":"string"},"conversation_id":{"type":"string"},"role":{"$ref":"#/components/schemas/tts:MessageRole"},"content":{"type":"string"},"tool_name":{"type":["string","null"]},"tool_args":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"tool_result":{"oneOf":[{"description":"Any type"},{"type":"null"}],"description":"Arbitrary JSON value returned by the tool (object, array, string, or primitive)."},"started_at":{"type":"string","format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"}},"required":["id","conversation_id","role","content","started_at"],"title":"Message"},"tts:ListMessagesResponse":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/tts:Message"}}},"required":["messages"],"title":"ListMessagesResponse"},"tts:EvaluationKind":{"type":"string","enum":["criterion","summary","data"],"title":"EvaluationKind"},"tts:EvaluationStatus":{"type":"string","enum":["success","failure","unknown"],"description":"Three-state criterion result. `unknown` means the criterion did not apply to this call.","title":"EvaluationStatus"},"tts:Evaluation":{"type":"object","properties":{"id":{"type":"string"},"conversation_id":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:EvaluationKind"},"criterion_id":{"type":["string","null"]},"name":{"type":"string"},"status":{"oneOf":[{"$ref":"#/components/schemas/tts:EvaluationStatus"},{"type":"null"}],"description":"Three-state criterion result. `unknown` means the criterion did not apply to this call."},"passed":{"type":["boolean","null"]},"score":{"type":["number","null"],"format":"double"},"rationale":{"type":"string"},"data":{"oneOf":[{"description":"Any type"},{"type":"null"}],"description":"Structured data-collection payload (present only on `kind=data` rows)."},"created_at":{"type":"string","format":"date-time"}},"required":["id","conversation_id","kind","name","rationale","created_at"],"description":"Three flavours coexist, discriminated by `kind`:\n- `criterion` rows carry `status` + `passed` + `score` + `rationale` for one criterion\n- `summary` row carries overall sentiment + rationale in `rationale`\n- `data` row carries the structured data-collection payload in `data`\n\n`status` is the canonical three-state result. `passed` is a\nderived boolean kept for backwards compatibility with earlier\nwebhook consumers: success→true, failure→false, unknown→null.\n","title":"Evaluation"},"tts:ListEvaluationsResponse":{"type":"object","properties":{"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/tts:Evaluation"}}},"required":["evaluations"],"title":"ListEvaluationsResponse"},"tts:CreateKnowledgeBaseRequest":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable label."},"description":{"type":"string","description":"Optional description."}},"required":["name"],"title":"CreateKnowledgeBaseRequest"},"tts:UpdateKnowledgeBaseRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"title":"UpdateKnowledgeBaseRequest"},"tts:KnowledgeBaseDocumentStatus":{"type":"string","enum":["embedding","ready","failed"],"title":"KnowledgeBaseDocumentStatus"},"tts:KnowledgeBaseDocument":{"type":"object","properties":{"id":{"type":"string"},"kb_id":{"type":"string"},"filename":{"type":"string"},"content_type":{"type":"string"},"byte_size":{"type":"integer","format":"int64"},"char_count":{"type":"integer"},"chunk_count":{"type":"integer"},"status":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocumentStatus"},"error":{"type":"string","description":"Populated when status is failed."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","kb_id","filename","content_type","byte_size","char_count","chunk_count","status","created_at","updated_at"],"title":"KnowledgeBaseDocument"},"tts:ListKnowledgeBaseDocumentsResponse":{"type":"object","properties":{"documents":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}},"required":["documents"],"title":"ListKnowledgeBaseDocumentsResponse"},"tts:KnowledgeBaseChunk":{"type":"object","properties":{"id":{"type":"string"},"document_id":{"type":"string"},"kb_id":{"type":"string"},"chunk_index":{"type":"integer"},"content":{"type":"string"}},"required":["id","document_id","kb_id","chunk_index","content"],"title":"KnowledgeBaseChunk"},"tts:ListKnowledgeBaseChunksResponse":{"type":"object","properties":{"chunks":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseChunk"}}},"required":["chunks"],"title":"ListKnowledgeBaseChunksResponse"},"tts:SearchKnowledgeBasesRequest":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query."},"kb_ids":{"type":"array","items":{"type":"string"},"description":"Knowledge bases to search across. Results scoped to caller-owned entries; unknown IDs are silently ignored."},"top_k":{"type":"integer","default":5,"description":"Max hits to return (default 5, capped at 50)."}},"required":["query","kb_ids"],"title":"SearchKnowledgeBasesRequest"},"tts:KnowledgeBaseSearchHit":{"type":"object","properties":{"chunk_id":{"type":"string"},"document_id":{"type":"string"},"kb_id":{"type":"string"},"filename":{"type":"string"},"chunk_index":{"type":"integer"},"content":{"type":"string"},"score":{"type":"number","format":"double","description":"Cosine similarity (higher = more relevant)."}},"required":["chunk_id","document_id","kb_id","filename","chunk_index","content","score"],"title":"KnowledgeBaseSearchHit"},"tts:SearchKnowledgeBasesResponse":{"type":"object","properties":{"hits":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseSearchHit"}}},"required":["hits"],"title":"SearchKnowledgeBasesResponse"},"tts:TenantPlan":{"type":"string","enum":["free","pro","business","enterprise"],"description":"Billing plan tier.","title":"TenantPlan"},"tts:TenantDataRegion":{"type":"string","enum":["us","eu","in"],"description":"Geographic region the workspace's data is pinned to.","title":"TenantDataRegion"},"tts:Tenant":{"type":"object","properties":{"id":{"type":"string","description":"Opaque workspace ID."},"name":{"type":"string","description":"Display name set by the workspace owner."},"plan":{"$ref":"#/components/schemas/tts:TenantPlan","description":"Billing plan tier."},"data_region":{"$ref":"#/components/schemas/tts:TenantDataRegion","description":"Geographic region the workspace's data is pinned to."},"hipaa_mode":{"type":"boolean","description":"When true, HIPAA-compliant retention and logging is enforced."},"zero_retention":{"type":"boolean","description":"When true, no transcript / audio payloads are retained server-side."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","plan","data_region","hipaa_mode","zero_retention","created_at","updated_at"],"description":"A workspace the caller belongs to.","title":"Tenant"},"tts:TenantsListResponse":{"type":"object","properties":{"tenants":{"type":"array","items":{"$ref":"#/components/schemas/tts:Tenant"}}},"required":["tenants"],"title":"TenantsListResponse"},"tts:CreateWorkspaceRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the new workspace. Trimmed; must be 120 characters or fewer."}},"description":"Body for POST /v1/tenants. The `name` field is optional; omitting it falls back to \"Workspace\".","title":"CreateWorkspaceRequest"},"tts:UpdateWorkspaceRequest":{"type":"object","properties":{"name":{"type":"string","description":"New display name. Required; must be 120 characters or fewer."}},"required":["name"],"description":"Body for PATCH /v1/tenants/current.","title":"UpdateWorkspaceRequest"},"tts:MemberRole":{"type":"string","enum":["owner","admin","member"],"description":"Member's role within the workspace.\n\n- `owner` - Full control, including deleting the workspace.\n- `admin` - Manage members and invites; cannot change roles.\n- `member` - Standard access, no administrative rights.\n","title":"MemberRole"},"tts:Member":{"type":"object","properties":{"user_uid":{"type":"string","description":"Firebase user ID."},"email":{"type":"string","description":"Member's email from Firebase. Empty when the account has been deleted."},"display_name":{"type":"string","description":"Member's display name from Firebase."},"role":{"$ref":"#/components/schemas/tts:MemberRole"},"created_at":{"type":"string","format":"date-time","description":"When the user joined the workspace."},"is_self":{"type":"boolean","description":"True when this row is the authenticated caller."}},"required":["user_uid","role","created_at","is_self"],"description":"A member of a workspace (joined from `tenant_users` + Firebase profile).","title":"Member"},"tts:MembersListResponse":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/tts:Member"}}},"required":["members"],"title":"MembersListResponse"},"tts:UpdateMemberRoleRequest":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/tts:MemberRole"}},"required":["role"],"title":"UpdateMemberRoleRequest"},"tts:Invite":{"type":"object","properties":{"id":{"type":"string","description":"Opaque invite ID."},"email":{"type":"string","description":"Invitee email."},"invited_by":{"type":"string","description":"Firebase UID of the member who created the invite."},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"accepted_at":{"type":"string","format":"date-time","description":"Populated once the invite has been accepted."},"revoked_at":{"type":"string","format":"date-time","description":"Populated once the invite has been revoked."},"token":{"type":"string","description":"Invite token. Returned ONLY on the create-invite response;\nsubsequent list calls redact it. Use the token to build the\n`/join/{token}` join URL.\n"}},"required":["id","email","invited_by","created_at","expires_at"],"description":"A pending or historical workspace invite.","title":"Invite"},"tts:InvitesListResponse":{"type":"object","properties":{"invites":{"type":"array","items":{"$ref":"#/components/schemas/tts:Invite"}}},"required":["invites"],"title":"InvitesListResponse"},"tts:CreateInviteRequest":{"type":"object","properties":{"email":{"type":"string","description":"Email of the person to invite. Validated as an RFC 5322 address."}},"required":["email"],"title":"CreateInviteRequest"},"tts:InvitePreview":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Opaque workspace id. Safe to echo back on the accept call."},"tenant_name":{"type":"string","description":"Workspace display name."},"invited_email":{"type":"string","description":"The email address the inviter typed when creating the invite."},"invited_by_email":{"type":"string","description":"Firebase email of the member who created the invite. May be\nabsent if the Firebase profile lookup failed transiently —\nclients should still render the preview in that case.\n"},"invited_by_display_name":{"type":"string","description":"Firebase display name of the member who created the invite."},"expires_at":{"type":"string","format":"date-time"}},"required":["tenant_id","tenant_name","invited_email","expires_at"],"description":"Unauthenticated preview of a workspace invite. Surfaces only what\nthe recipient needs to decide whether to accept (workspace name,\ninvited address, inviter, expiry). Billing, plan, data region,\nand invite token are deliberately omitted.\n","title":"InvitePreview"},"tts:TransferOwnershipRequest":{"type":"object","properties":{"user_uid":{"type":"string","description":"Firebase UID of the member who will become the new owner."}},"required":["user_uid"],"description":"Body for POST /v1/tenants/current/transfer-owner. The target\nmust already be a member of the current workspace — promote via\ninvite + accept first for external users.\n","title":"TransferOwnershipRequest"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'."}}}}
\ No newline at end of file
+{"openapi":"3.1.0","info":{"title":"API Reference","version":"1.0.0"},"paths":{"/v1/audio/speech":{"post":{"operationId":"speech","summary":"Speech","description":"Gets the speech data for the given input","tags":["subpackage_tts.subpackage_tts/audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetSpeechResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetSpeechRequest"}}}}}},"/v1/audio/stream":{"post":{"operationId":"stream","summary":"Stream","description":"Gets the stream speech for the given input","tags":["subpackage_tts.subpackage_tts/audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}},{"name":"Accept","in":"header","required":true,"schema":{"$ref":"#/components/schemas/tts:V1AudioStreamPostParametersAccept"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:audio_stream_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:GetStreamRequest"}}}}}},"/v1/auth/token":{"post":{"operationId":"create-access-token","summary":"Create Access Token","description":"WARNING: This endpoint is deprecated. Create a new API token for the logged in user.","tags":["subpackage_tts.subpackage_tts/auth"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Contains the details of the token which can be used by the user to access the API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AccessToken"}}}},"400":{"description":"Contains the details of the error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:OAuthError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequest"}}}}}},"/v1/voices":{"get":{"operationId":"list","summary":"List","description":"Gets the list of voices available for the user","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of voices","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoice"}}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a personal (cloned) voice for the user","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A created voice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreatedVoice"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the personal voice"},"locale":{"type":"string","default":"en-US","description":"Native language (locale) of the personal voice (e.g. en-US, es-ES, etc.)"},"gender":{"$ref":"#/components/schemas/tts:V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender","description":"Gender marker for the personal voice\nmale GenderMale\nfemale GenderFemale\nnotSpecified GenderNotSpecified"},"sample":{"type":"string","format":"binary","description":"Audio sample file"},"avatar":{"type":"string","format":"binary","description":"Avatar image file"},"consent":{"type":"string","description":"A **string** representing the user consent information in JSON format\nThis should include the fullName and email of the consenting individual.\nFor example, `{\"fullName\": \"John Doe\", \"email\": \"john@example.com\"}`"}},"required":["name","gender","sample","consent"]}}}}}},"/v1/voices/{id}":{"delete":{"operationId":"delete","summary":"Delete","description":"Delete a personal (cloned) voice","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"id","in":"path","description":"The ID of the voice to delete","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/voices/{id}/sample":{"get":{"operationId":"download-sample","summary":"Download Sample","description":"Download a personal (cloned) voice sample","tags":["subpackage_tts.subpackage_tts/voices"],"parameters":[{"name":"id","in":"path","description":"The ID of the voice to download sample for","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Voice sample audio file","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}}},"/v1/agents":{"get":{"operationId":"list","summary":"List","description":"List voice agents owned by the caller.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of voice agents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentsResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a voice agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentRequest"}}}}}},"/v1/agents/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a voice agent by ID.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a voice agent. Conversations and attached tools remain.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a voice agent. Only fields present on the request body are changed.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Agent"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentRequest"}}}}}},"/v1/agents/{id}/tools":{"get":{"operationId":"list-tools","summary":"List Tools","description":"List tools currently attached to the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Attached tools for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListToolsResponse"}}}}}}},"/v1/agents/{id}/tools/{toolId}":{"post":{"operationId":"attach-tool","summary":"Attach Tool","description":"Attach an existing tool to the agent so the LLM can call it.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"toolId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-tool","summary":"Detach Tool","description":"Detach a tool from the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"toolId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/agents/{id}/evaluation-config":{"get":{"operationId":"get-evaluation-config","summary":"Get Evaluation Config","description":"Retrieve the agent's post-call evaluation criteria + data-collection config.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evaluation config for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:EvaluationConfig"}}}}}},"patch":{"operationId":"update-evaluation-config","summary":"Update Evaluation Config","description":"Replace the agent's evaluation criteria + data-collection fields.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated evaluation config.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:EvaluationConfig"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateEvaluationConfigRequest"}}}}}},"/v1/agents/{id}/variables":{"get":{"operationId":"get-dynamic-variables","summary":"Get Dynamic Variables","description":"Retrieve the agent's customer-scope dynamic variables and the read-only\ncatalogue of reserved `system__*` keys. The system variables list is\nprovided so editor UIs can render the reference list without maintaining\na client-side copy of the catalogue.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListDynamicVariablesResponse"}}}}}},"patch":{"operationId":"update-dynamic-variables","summary":"Update Dynamic Variables","description":"Replace the agent's customer-scope dynamic variable definitions.\nThe supplied list overwrites the stored list wholesale (same\nsemantics as `updateEvaluationConfig`). Pass an empty array to\nclear all variables. Up to 20 variables per agent. Keys must\nmatch `[a-zA-Z0-9_]+` and must not start with the reserved\n`system__` prefix.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListDynamicVariablesResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateDynamicVariablesRequest"}}}}}},"/v1/agents/{id}/conversations":{"post":{"operationId":"create-conversation","summary":"Create Conversation","description":"Start a new voice conversation with the agent. Returns a realtime\nvoice session + short-lived client token so the caller can\nconnect the audio pipeline directly. The agent is dispatched\nserver-side; no additional client action required.\n\nPass `dynamic_variables` to supply per-session values that override\nthe agent's stored variable defaults for this one conversation.\nKeys in the `system__` namespace are rejected at this boundary.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created conversation with its realtime session token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationRequest"}}}}}},"/v1/agents/{id}/sessions":{"post":{"operationId":"create-session","summary":"Create Session","description":"Mint a realtime voice session for the given agent. Widget-friendly\ncounterpart to `createConversation` — same response shape, dual\nauthentication:\n\n* **Authenticated (Bearer)**: works for any agent the caller\n owns. Typical server-to-server flow where the embedding\n site's backend mints a token and hands it to the browser so\n the API key never reaches the client.\n* **Unauthenticated**: works only when `agent.is_public = true`\n AND the request's `Origin` header matches `agent.allowed_origins`\n (or that list is empty). When `agent.hostname_allowlist` is\n non-empty, the `Origin` hostname must additionally be a\n member of that list. Used directly by the\n `` web component.\n\nResponds with the same `CreateConversationResponse` as\n`createConversation`.\n","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The created session with its realtime token + URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateConversationResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateSessionRequest"}}}}}},"/v1/agents/{id}/knowledge-bases":{"get":{"operationId":"list-agent-knowledge-bases","summary":"List Agent Knowledge Bases","description":"List knowledge bases attached to an agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The knowledge bases attached to the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBasesResponse"}}}}}}},"/v1/agents/{id}/knowledge-bases/{kbId}":{"post":{"operationId":"attach-knowledge-base","summary":"Attach Knowledge Base","description":"Attach a knowledge base to an agent. The `search_knowledge` tool\nis auto-registered on the next conversation and can only query the\nattached knowledge bases.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"kbId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-knowledge-base","summary":"Detach Knowledge Base","description":"Detach a knowledge base from an agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"kbId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/agents/{id}/memories":{"get":{"operationId":"list-memories","summary":"List Memories","description":"List per-caller memories extracted for an agent. Memories are\nwritten post-call by the built-in extractor when `memory_enabled`\nis true on the agent; the list is sorted newest-first.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows to return. Defaults to 100, capped at 200.","required":false,"schema":{"type":"integer","default":100}},{"name":"offset","in":"query","description":"Number of rows to skip. Combine with `limit` to page through older memories.","required":false,"schema":{"type":"integer","default":0}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Memories for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMemoriesResponse"}}}}}}},"/v1/agents/{id}/memories/delete-by-caller":{"post":{"operationId":"delete-memories-by-caller","summary":"Delete Memories By Caller","description":"Delete every memory ever extracted for a specific caller on\nthis agent. Privacy / GDPR surface. Returns the count of rows\nsoft-deleted; rows become permanently unreachable immediately\nand are hard-deleted by the retention job after the tenant's\nconfigured retention window.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deletion summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:DeleteMemoriesByCallerResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:DeleteMemoriesByCallerRequest"}}}}}},"/v1/agents/{id}/tests":{"get":{"operationId":"list-tests","summary":"List Tests","description":"List all tests configured for the agent. Each entry includes the\nmost recent run so the console can render pass/fail badges without\nan extra round-trip.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tests for the agent with last-run summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestsResponse"}}}}}},"post":{"operationId":"create-test","summary":"Create Test","description":"Create a new test for the agent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentTestRequest"}}}}}},"/v1/agents/{id}/tests/runs":{"post":{"operationId":"run-all-tests","summary":"Run All Tests","description":"Enqueue runs for every test on the agent concurrently. Up to 50\ntests are dispatched in one call. Each returned run starts in\n`queued` status; poll `GET /v1/test-runs/{id}` for the terminal\nresult.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Queued runs for all tests on the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunAgentTestsResponse"}}}}}}},"/v1/tests/{id}":{"get":{"operationId":"get-test","summary":"Get Test","description":"Retrieve a test by ID.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}}},"delete":{"operationId":"delete-test","summary":"Delete Test","description":"Delete a test and all its run history.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-test","summary":"Update Test","description":"Update a test. Only fields present on the request body are changed.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTest"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentTestRequest"}}}}}},"/v1/tests/{id}/runs":{"get":{"operationId":"list-test-runs","summary":"List Test Runs","description":"List the run history for a test, newest first.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run history for the test.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestRunsResponse"}}}}}},"post":{"operationId":"run-test","summary":"Run Test","description":"Enqueue a single run of the test. The returned run starts in\n`queued` status. Poll `GET /v1/test-runs/{id}` until the status\nreaches a terminal state (`passed`, `failed`, or `error`).","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"The queued run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestRun"}}}}}}},"/v1/test-runs/{id}":{"get":{"operationId":"get-test-run","summary":"Get Test Run","description":"Retrieve a single test run by ID. Poll this endpoint until\n`status` reaches a terminal state (`passed`, `failed`, or `error`).\nThe `result` field is populated on terminal states.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The test run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestRun"}}}}}}},"/v1/tests":{"get":{"operationId":"list-all-tests","summary":"List All Tests","description":"Workspace-wide list of tests across every agent the caller owns.\nSupports filters (agent, type, last-run status, folder), full-text\nsearch on name/description, and cursor pagination. Each row carries\nits newest run and attached agent IDs so the list renders without\nN+1 round-trips.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"agent_id","in":"query","description":"Comma-separated agent IDs to filter on.","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","description":"Comma-separated test types (scenario|tool|simulation).","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Comma-separated last-run statuses.","required":false,"schema":{"type":"string"}},{"name":"folder_id","in":"query","description":"Folder ID to filter on, or \"root\" for unfiled tests.","required":false,"schema":{"type":"string"}},{"name":"updated_after","in":"query","description":"Only return tests updated after this RFC3339 timestamp.","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Substring match on name or description.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max tests per page (default 50, max 200).","required":false,"schema":{"type":"integer"}},{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListTestsResponse"}}}}}}},"/v1/tests/stats":{"get":{"operationId":"get-test-stats","summary":"Get Test Stats","description":"Aggregate pass-rate metrics over the last N days. Returns dense\ndaily buckets (one entry per day, zero-filled) plus totals and a\nper-type breakdown. Powers the header chart on the global tests\npage. Default window is 30 days, max 90.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"window_days","in":"query","description":"Trailing window in days (default 30, max 90).","required":false,"schema":{"type":"integer"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Stats payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TestStats"}}}}}}},"/v1/tests/runs:batch":{"post":{"operationId":"run-tests-batch","summary":"Run Tests Batch","description":"Queue runs for every (test, agent) pair in the body. Entries\nwithout an `agent_id` fan out to every agent the test is\nattached to. Total expanded runs are capped at 100 per call.\nEach entry in the response is a queued run; poll\n`GET /v1/test-runs/{id}` for each.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Runs queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunBatchResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:RunBatchRequest"}}}}}},"/v1/tests/{id}/attachments":{"get":{"operationId":"list-test-attachments","summary":"List Test Attachments","description":"List every agent a test is attached to.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Attachment list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestAttachmentsResponse"}}}}}}},"/v1/tests/{id}/attachments/{agentId}":{"post":{"operationId":"attach-test","summary":"Attach Test","description":"Attach a test to an additional agent. After this call, the test\nwill also run as part of that agent's regression suite (and\nagainst its prompt + tool config when invoked with\n`agent_id = {agentId}`). Idempotent.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"delete":{"operationId":"detach-test","summary":"Detach Test","description":"Detach a test from an agent. The owner agent (the agent the test\nwas authored against) cannot be detached; delete the test\ninstead.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/tests/{id}/move":{"post":{"operationId":"move-test","summary":"Move Test","description":"Move a test into a folder. Pass `folder_id: null` for root.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:MoveAgentTestRequest"}}}}}},"/v1/test-folders":{"get":{"operationId":"list-test-folders","summary":"List Test Folders","description":"List every test folder the caller owns. Flat list; build the tree client-side.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Folder list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListAgentTestFoldersResponse"}}}}}},"post":{"operationId":"create-test-folder","summary":"Create Test Folder","description":"Create a test folder. Max depth is 3.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Created folder.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateAgentTestFolderRequest"}}}}}},"/v1/test-folders/{id}":{"delete":{"operationId":"delete-test-folder","summary":"Delete Test Folder","description":"Soft-delete a folder. Child tests drop back to root.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-test-folder","summary":"Update Test Folder","description":"Rename or reparent a test folder. Cycles are rejected.","tags":["subpackage_tts.subpackage_tts/agents"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated folder.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateAgentTestFolderRequest"}}}}}},"/v1/tools":{"get":{"operationId":"list","summary":"List","description":"List tools owned by the caller.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of tools.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListToolsResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a tool. For webhook tools, the response includes the HMAC\n`webhook_secret` exactly once — store it immediately; subsequent\nreads return a masked placeholder.\n","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateToolRequest"}}}}}},"/v1/tools/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a tool by ID. Webhook secrets are always masked here.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a tool. Agents that had it attached get a soft-detach.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a tool. Tool kind is immutable — create a new tool to change it.","tags":["subpackage_tts.subpackage_tts/tools"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tool"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateToolRequest"}}}}}},"/v1/conversations":{"get":{"operationId":"list","summary":"List","description":"List conversations owned by the caller, ordered by most recent.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of conversations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListConversationsResponse"}}}}}}},"/v1/conversations/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a conversation by ID.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Conversation"}}}}}}},"/v1/conversations/{id}/messages":{"get":{"operationId":"list-messages","summary":"List Messages","description":"Retrieve the full transcript for a conversation, in order.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The messages for the conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMessagesResponse"}}}}}}},"/v1/conversations/{id}/evaluations":{"get":{"operationId":"list-evaluations","summary":"List Evaluations","description":"Retrieve post-call evaluation results for a conversation.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evaluations for the conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListEvaluationsResponse"}}}}}}},"/v1/conversations/{id}/memories":{"get":{"operationId":"list-memories","summary":"List Memories","description":"List memories extracted from a specific conversation.","tags":["subpackage_tts.subpackage_tts/conversations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Memories written during this conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListMemoriesResponse"}}}}}}},"/v1/knowledge-bases":{"get":{"operationId":"list","summary":"List","description":"List knowledge bases owned by the caller.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The knowledge bases for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBasesResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a new knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateKnowledgeBaseRequest"}}}}}},"/v1/knowledge-bases/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a knowledge base by ID.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Soft-delete a knowledge base. Documents and chunks are cascaded.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateKnowledgeBaseRequest"}}}}}},"/v1/knowledge-bases/{id}/documents":{"get":{"operationId":"list-documents","summary":"List Documents","description":"List documents ingested into a knowledge base.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The documents in the knowledge base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBaseDocumentsResponse"}}}}}},"post":{"operationId":"upload-document","summary":"Upload Document","description":"Upload a document (PDF, plain text, markdown, or HTML) to a\nknowledge base. The document is extracted, chunked, embedded, and\nindexed synchronously; expect a few seconds per MB of input.\nMaximum 10 MB per upload.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The ingested document record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}}}},"/v1/knowledge-bases/documents/{docId}":{"get":{"operationId":"get-document","summary":"Get Document","description":"Retrieve a document by ID.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The document record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}}}}},"delete":{"operationId":"delete-document","summary":"Delete Document","description":"Delete a document and all its chunks.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/knowledge-bases/documents/{docId}/chunks":{"get":{"operationId":"list-chunks","summary":"List Chunks","description":"List the chunks for a document.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"docId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The chunks for the document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:ListKnowledgeBaseChunksResponse"}}}}}}},"/v1/knowledge-bases/search":{"post":{"operationId":"search","summary":"Search","description":"Semantic search across a caller-owned list of knowledge bases.\nReturns ranked chunks with source filename and a cosine-similarity\nscore. Limited to 50 results per request.","tags":["subpackage_tts.subpackage_tts/knowledgeBases"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ranked search hits across the selected knowledge bases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:SearchKnowledgeBasesResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:SearchKnowledgeBasesRequest"}}}}}},"/v1/memories/{memoryId}":{"delete":{"operationId":"delete","summary":"Delete","description":"Soft-delete one memory row.","tags":["subpackage_tts.subpackage_tts/memories"],"parameters":[{"name":"memoryId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/phone-numbers":{"get":{"operationId":"list","summary":"List","description":"List all phone numbers in the caller's workspace.","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The phone numbers for the workspace.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"post":{"operationId":"import","summary":"Import","description":"Import a phone number into the workspace. The `source` field\ndetermines the provisioning path:\n\n- `livekit` - LiveKit purchases the number on your behalf. US\n inbound only. Quickest path for local testing.\n- `twilio` - Provide your Twilio Account SID, Auth Token, and\n the E.164 number you already own. We provision an Elastic SIP\n Trunk on your Twilio account automatically.\n- `byoc` - Provide an existing SIP trunk ID. The number is\n registered against that trunk.\n\nReturns 402 when the workspace has reached the 100-number cap.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The imported phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/phone-numbers/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a phone number by ID.","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a phone number from the workspace. For Twilio and LiveKit\nnumbers this also deprovisions the backing SIP trunk and dispatch\nrule on LiveKit Cloud.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update","summary":"Update","description":"Update a phone number. Only `label` and `agent_id` are mutable;\n`source` and `e164` are immutable after import. Pass `null` for\n`agent_id` to unbind the number from its current agent.\n","tags":["subpackage_tts.subpackage_tts/phoneNumbers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated phone number.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/sip-trunks":{"get":{"operationId":"list","summary":"List","description":"List all SIP trunks in the caller's workspace.","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The SIP trunks for the workspace.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a SIP trunk. For `kind=byoc` supply `sip_address` plus\noptional digest credentials and IP allowlist. For `kind=twilio`\nuse `ImportPhoneNumber` with a `twilio` spec instead - trunk\ncreation is handled automatically. Returns 402 when the workspace\nhas reached the 20-trunk cap.\n","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created SIP trunk.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/sip-trunks/{id}":{"get":{"operationId":"get","summary":"Get","description":"Retrieve a SIP trunk by ID.","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested SIP trunk.","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"delete":{"operationId":"delete","summary":"Delete","description":"Delete a SIP trunk. This also removes the backing LiveKit inbound\ntrunk, outbound trunk, and dispatch rule if they were provisioned\nby us. Phone numbers attached to this trunk are left in place but\nbecome non-functional until rebound to a new trunk.\n","tags":["subpackage_tts.subpackage_tts/sipTrunks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/outbound-calls":{"post":{"operationId":"create","summary":"Create","description":"Place an outbound call from an agent to a phone number. LiveKit\noriginates the SIP INVITE through the outbound trunk bound to the\nagent's workspace; the agent worker is dispatched into the room\nautomatically.\n\nThe response is returned as soon as LiveKit accepts the INVITE.\nPoll `GET /v1/conversations/{conversation_id}` for status\ntransitions: `pending` → `active` (answered) → `completed`.\n\nRequires a Twilio or BYOC trunk. LiveKit-native numbers are\ninbound-only.\n","tags":["subpackage_tts.subpackage_tts/outboundCalls"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The outbound call was accepted by LiveKit.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"description":"Any type"}}}}}},"/v1/tenants":{"get":{"operationId":"list","summary":"List","description":"List every workspace the authenticated user belongs to. Powers the workspace switcher.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Workspaces for the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TenantsListResponse"}}}}}},"post":{"operationId":"create","summary":"Create","description":"Create a new workspace with the authenticated user as owner.\nThe caller must switch their active workspace client-side via\nthe `X-Tenant-ID` header to act on the new tenant.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The newly-created workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateWorkspaceRequest"}}}}}},"/v1/tenants/current":{"get":{"operationId":"get-current","summary":"Get Current","description":"Retrieve the workspace currently selected by the caller (via `X-Tenant-ID` or auto-resolved).","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The current workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}}},"patch":{"operationId":"update-current","summary":"Update Current","description":"Rename the current workspace. Owner or admin only.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateWorkspaceRequest"}}}}}},"/v1/tenants/current/members":{"get":{"operationId":"list-members","summary":"List Members","description":"List every member of the current workspace. Any member may call this.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Members of the current workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:MembersListResponse"}}}}}}},"/v1/tenants/current/members/leave":{"post":{"operationId":"leave","summary":"Leave","description":"Remove the authenticated caller from the current workspace.\nRefused with 409 when the caller is the last owner — promote\nanother member to owner first.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/tenants/current/members/{user_uid}":{"delete":{"operationId":"remove-member","summary":"Remove Member","description":"Remove a member from the current workspace. Owner or admin\nonly. The caller cannot remove themselves — use\n`POST /v1/tenants/current/members/leave` instead.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"user_uid","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}},"patch":{"operationId":"update-member-role","summary":"Update Member Role","description":"Change a member's role. Owner only — admins may add or remove\nmembers but may not change roles. Refused with 409 when\ndemoting the last remaining owner.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"user_uid","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated member.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Member"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:UpdateMemberRoleRequest"}}}}}},"/v1/tenants/current/invites":{"get":{"operationId":"list-invites","summary":"List Invites","description":"List outstanding invites for the current workspace. Invite tokens are redacted.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Outstanding invites.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:InvitesListResponse"}}}}}},"post":{"operationId":"create-invite","summary":"Create Invite","description":"Create an invite to the current workspace. Owner or admin only.\nThe response contains the invite token ONCE — subsequent list\ncalls redact it.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created invite (token included).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Invite"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:CreateInviteRequest"}}}}}},"/v1/tenants/current/invites/{id}":{"delete":{"operationId":"revoke-invite","summary":"Revoke Invite","description":"Revoke an outstanding invite. Owner or admin only. Idempotent.","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}}}},"/v1/invites/{token}/accept":{"post":{"operationId":"accept-invite","summary":"Accept Invite","description":"Accept a workspace invite. The authenticated caller is joined\nto the invite's workspace as a member. Expired, revoked, or\nalready-accepted tokens return 404 to avoid token enumeration.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The workspace the caller just joined.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:Tenant"}}}}}}},"/v1/invites/{token}":{"get":{"operationId":"preview-invite","summary":"Preview Invite","description":"Preview a workspace invite without authenticating. Returns the\nworkspace name, inviter details, and expiry so the `/join/{token}`\npage can render before the recipient signs in. Anyone with the\ntoken can already accept, so this endpoint deliberately surfaces\nthe same information a caller would see after accepting. Invalid\ntokens (unknown, expired, revoked, already-accepted, or pointing\nat a soft-deleted workspace) collapse to a single 404 to prevent\nenumeration.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Preview metadata for a valid, active invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:InvitePreview"}}}}}}},"/v1/tenants/current/transfer-owner":{"post":{"operationId":"transfer-workspace-owner","summary":"Transfer Workspace Owner","description":"Transfer ownership of the current workspace atomically. Promotes\nthe target member to owner and demotes the caller to admin in a\nsingle transaction. Owner-only; admins cannot hand off a role\nthey were never granted. Prefer this over two PATCH calls to\n`/v1/tenants/current/members/{user_uid}`: a sole-owner caller\ncannot demote themselves first without tripping the last-owner\nguard, which this endpoint sidesteps by promoting before\ndemoting.\n","tags":["subpackage_tts.subpackage_tts/workspaces"],"parameters":[{"name":"Authorization","in":"header","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tts:TransferOwnershipRequest"}}}}}}},"servers":[{"url":"https://api.speechify.ai"}],"components":{"schemas":{"tts:GetSpeechRequestAudioFormat":{"type":"string","enum":["wav","mp3","ogg","aac","pcm"],"default":"wav","description":"The format for the output audio. Note, that the current default is \"wav\", but there's no guarantee it will not change in the future. We recommend always passing the specific param you expect.","title":"GetSpeechRequestAudioFormat"},"tts:GetSpeechRequestModel":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"default":"simba-english","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead.","title":"GetSpeechRequestModel"},"tts:GetSpeechOptionsRequest":{"type":"object","properties":{"loudness_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the audio loudness to a standard level.\nWhen enabled, loudness normalization aligns the audio output to the following standards:\nIntegrated loudness: -14 LUFS\nTrue peak: -2 dBTP\nLoudness range: 7 LU\nIf disabled, the audio loudness will match the original loudness of the selected voice, which may vary significantly and be either too quiet or too loud.\nEnabling loudness normalization can increase latency due to additional processing required for audio level adjustments."},"text_normalization":{"type":"boolean","default":true,"description":"Determines whether to normalize the text. If enabled, it will transform numbers, dates, etc. into words. For example, \"55\" is normalized into \"fifty five\".\nThis can increase latency due to additional processing required for text normalization."}},"description":"GetSpeechOptionsRequest is the wrapper for request parameters to the client","title":"GetSpeechOptionsRequest"},"tts:GetSpeechRequest":{"type":"object","properties":{"audio_format":{"$ref":"#/components/schemas/tts:GetSpeechRequestAudioFormat","description":"The format for the output audio. Note, that the current default is \"wav\", but there's no guarantee it will not change in the future. We recommend always passing the specific param you expect."},"input":{"type":"string","description":"Plain text or SSML to be synthesized to speech.\nRefer to https://docs.speechify.ai/docs/api-limits for the input size limits.\nEmotion, Pitch and Speed Rate are configured in the ssml input, please refer to the ssml documentation for more information: https://docs.speechify.ai/docs/ssml#prosody"},"language":{"type":"string","description":"Language of the input. Follow the format of an ISO 639-1 language code and an ISO 3166-1 region code, separated by a hyphen, e.g. en-US.\nPlease refer to the list of the supported languages and recommendations regarding this parameter: https://docs.speechify.ai/docs/language-support."},"model":{"$ref":"#/components/schemas/tts:GetSpeechRequestModel","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead."},"options":{"$ref":"#/components/schemas/tts:GetSpeechOptionsRequest"},"voice_id":{"type":"string","description":"Id of the voice to be used for synthesizing speech. Refer to /v1/voices endpoint for available voices"}},"required":["input","voice_id"],"description":"GetSpeechRequest is the wrapper for request parameters to the client","title":"GetSpeechRequest"},"tts:GetSpeechResponseAudioFormat":{"type":"string","enum":["wav","mp3","ogg","aac","pcm"],"description":"The format of the audio data","title":"GetSpeechResponseAudioFormat"},"tts:NestedChunk":{"type":"object","properties":{"end":{"type":"integer","format":"int64"},"end_time":{"type":"number","format":"double"},"start":{"type":"integer","format":"int64"},"start_time":{"type":"number","format":"double"},"type":{"type":"string"},"value":{"type":"string"}},"description":"It details the type of segment, its start and end points in the text, and its start and end times in the synthesized speech audio.","title":"NestedChunk"},"tts:SpeechMarks":{"type":"object","properties":{"chunks":{"type":"array","items":{"$ref":"#/components/schemas/tts:NestedChunk"},"description":"Array of NestedChunk, each providing detailed segment information within the synthesized speech."},"end":{"type":"integer","format":"int64"},"end_time":{"type":"number","format":"double"},"start":{"type":"integer","format":"int64"},"start_time":{"type":"number","format":"double"},"type":{"type":"string"},"value":{"type":"string"}},"required":["chunks","end","end_time","start","start_time","type"],"description":"It is used to annotate the audio data with metadata about the synthesis process, like word timing or phoneme details.","title":"SpeechMarks"},"tts:GetSpeechResponse":{"type":"object","properties":{"audio_data":{"type":"string","format":"byte","description":"Synthesized speech audio, Base64-encoded"},"audio_format":{"$ref":"#/components/schemas/tts:GetSpeechResponseAudioFormat","description":"The format of the audio data"},"billable_characters_count":{"type":"integer","format":"int64","description":"The number of billable characters processed in the request."},"speech_marks":{"$ref":"#/components/schemas/tts:SpeechMarks"}},"required":["audio_data","audio_format","billable_characters_count","speech_marks"],"title":"GetSpeechResponse"},"tts:V1AudioStreamPostParametersAccept":{"type":"string","enum":["audio/mpeg","audio/ogg","audio/aac","audio/pcm"],"title":"V1AudioStreamPostParametersAccept"},"tts:GetStreamRequestModel":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"default":"simba-english","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead.","title":"GetStreamRequestModel"},"tts:GetStreamOptionsRequest":{"type":"object","properties":{"loudness_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the audio loudness to a standard level.\nWhen enabled, loudness normalization aligns the audio output to the following standards:\nIntegrated loudness: -14 LUFS\nTrue peak: -2 dBTP\nLoudness range: 7 LU\nIf disabled, the audio loudness will match the original loudness of the selected voice, which may vary significantly and be either too quiet or too loud.\nEnabling loudness normalization can increase latency due to additional processing required for audio level adjustments."},"text_normalization":{"type":"boolean","default":false,"description":"Determines whether to normalize the text. If enabled, it will transform numbers, dates, etc. into words. For example, \"55\" is normalized into \"fifty five\".\nThis can increase latency due to additional processing required for text normalization."}},"description":"GetStreamOptionsRequest is the wrapper for request parameters to the client","title":"GetStreamOptionsRequest"},"tts:GetStreamRequest":{"type":"object","properties":{"input":{"type":"string","description":"Plain text or SSML to be synthesized to speech.\nRefer to https://docs.speechify.ai/docs/api-limits for the input size limits.\nEmotion, Pitch and Speed Rate are configured in the ssml input, please refer to the ssml documentation for more information: https://docs.speechify.ai/docs/ssml#prosody"},"language":{"type":"string","description":"Language of the input. Follow the format of an ISO 639-1 language code and an ISO 3166-1 region code, separated by a hyphen, e.g. en-US.\nPlease refer to the list of the supported languages and recommendations regarding this parameter: https://docs.speechify.ai/docs/language-support."},"model":{"$ref":"#/components/schemas/tts:GetStreamRequestModel","description":"Model used for audio synthesis. `simba-base` and `simba-turbo` are deprecated. Use `simba-english` or `simba-multilingual` instead."},"options":{"$ref":"#/components/schemas/tts:GetStreamOptionsRequest"},"voice_id":{"type":"string","description":"Id of the voice to be used for synthesizing speech. Refer to /v1/voices endpoint for available voices"}},"required":["input","voice_id"],"description":"GetStreamRequest is the wrapper for request parameters to the client","title":"GetStreamRequest"},"tts:audio_stream_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"audio_stream_Response_200"},"tts:CreateAccessTokenRequestGrantType":{"type":"string","enum":["client_credentials"],"description":"in: body","title":"CreateAccessTokenRequestGrantType"},"tts:CreateAccessTokenRequestScope":{"type":"string","enum":["audio:speech","audio:stream","audio:all","voices:read","voices:create","voices:delete","voices:all"],"description":"The scope, or a space-delimited list of scopes the token is requested for\nin: body","title":"CreateAccessTokenRequestScope"},"tts:CreateAccessTokenRequest":{"type":"object","properties":{"grant_type":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequestGrantType","description":"in: body"},"scope":{"$ref":"#/components/schemas/tts:CreateAccessTokenRequestScope","description":"The scope, or a space-delimited list of scopes the token is requested for\nin: body"}},"required":["grant_type"],"title":"CreateAccessTokenRequest"},"tts:AccessTokenScope":{"type":"string","enum":["audio:speech","audio:stream","audio:all","voices:read","voices:create","voices:delete","voices:all"],"description":"The scope, or a space-delimited list of scopes the token is issued for","title":"AccessTokenScope"},"tts:AccessTokenTokenType":{"type":"string","enum":["bearer"],"description":"Token type","title":"AccessTokenTokenType"},"tts:AccessToken":{"type":"object","properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64","description":"Expiration time, in seconds from the issue time"},"scope":{"$ref":"#/components/schemas/tts:AccessTokenScope","description":"The scope, or a space-delimited list of scopes the token is issued for"},"token_type":{"$ref":"#/components/schemas/tts:AccessTokenTokenType","description":"Token type"}},"title":"AccessToken"},"tts:OAuthErrorError":{"type":"string","enum":["invalid_client","unauthorized_client","invalid_request","unsupported_grant_type","invalid_scope"],"title":"OAuthErrorError"},"tts:OAuthError":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/tts:OAuthErrorError"},"error_description":{"type":"string"}},"title":"OAuthError"},"tts:GetVoiceGender":{"type":"string","enum":["male","female","notSpecified"],"title":"GetVoiceGender"},"tts:GetVoiceLanguage":{"type":"object","properties":{"locale":{"type":"string"},"preview_audio":{"type":["string","null"]}},"required":["locale"],"title":"GetVoiceLanguage"},"tts:GetVoicesModelName":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"title":"GetVoicesModelName"},"tts:GetVoicesModel":{"type":"object","properties":{"languages":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoiceLanguage"}},"name":{"$ref":"#/components/schemas/tts:GetVoicesModelName"}},"required":["languages","name"],"title":"GetVoicesModel"},"tts:GetVoiceType":{"type":"string","enum":["shared","personal"],"title":"GetVoiceType"},"tts:GetVoice":{"type":"object","properties":{"avatar_image":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"$ref":"#/components/schemas/tts:GetVoiceGender"},"locale":{"type":"string"},"id":{"type":"string"},"models":{"type":"array","items":{"$ref":"#/components/schemas/tts:GetVoicesModel"}},"preview_audio":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"type":{"$ref":"#/components/schemas/tts:GetVoiceType"}},"required":["display_name","gender","locale","id","models","type"],"title":"GetVoice"},"tts:V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender":{"type":"string","enum":["male","female","notSpecified"],"description":"Gender marker for the personal voice\nmale GenderMale\nfemale GenderFemale\nnotSpecified GenderNotSpecified","title":"V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender"},"tts:CreatedVoiceGender":{"type":"string","enum":["male","female","notSpecified"],"title":"CreatedVoiceGender"},"tts:CreateVoiceLanguage":{"type":"object","properties":{"locale":{"type":"string"},"preview_audio":{"type":"string"}},"title":"CreateVoiceLanguage"},"tts:CreateVoiceModelName":{"type":"string","enum":["simba-base","simba-english","simba-multilingual","simba-turbo"],"title":"CreateVoiceModelName"},"tts:CreateVoiceModel":{"type":"object","properties":{"languages":{"type":"array","items":{"$ref":"#/components/schemas/tts:CreateVoiceLanguage"}},"name":{"$ref":"#/components/schemas/tts:CreateVoiceModelName"}},"title":"CreateVoiceModel"},"tts:CreatedVoiceType":{"type":"string","enum":["shared","personal"],"title":"CreatedVoiceType"},"tts:CreatedVoice":{"type":"object","properties":{"avatar_image":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"$ref":"#/components/schemas/tts:CreatedVoiceGender"},"locale":{"type":"string"},"id":{"type":"string"},"models":{"type":"array","items":{"$ref":"#/components/schemas/tts:CreateVoiceModel"}},"type":{"$ref":"#/components/schemas/tts:CreatedVoiceType"}},"required":["display_name","gender","locale","id","models","type"],"title":"CreatedVoice"},"tts:Agent":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"prompt":{"type":"string"},"first_message":{"type":"string"},"language":{"type":"string","description":"ISO 639-1 code, e.g. 'en'."},"llm_model":{"type":"string","description":"Chat model slug. Leave empty to use the Speechify default."},"voice_id":{"type":"string","description":"Speechify voice slug."},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Free-form agent config JSON (evaluation_config is read via its own endpoint)."},"is_public":{"type":"boolean","description":"When true, the `` web component can start a\nsession against this agent without an API key, subject to\nthe `allowed_origins` allowlist. When false (default), only\nauthenticated callers can start sessions.\n"},"allowed_origins":{"type":"array","items":{"type":"string"},"description":"Exact `Origin` header values (e.g. `https://example.com`)\nthat are allowed to start public sessions. Empty array\nwith `is_public = true` means any origin is accepted —\nintended for open demos. No subdomain wildcards.\n"},"hostname_allowlist":{"type":["array","null"],"items":{"type":"string"},"description":"Optional per-agent hostname allowlist enforced at\nsession-creation time. When set and non-empty, the\n`Origin` header's hostname must be an exact member.\nBare hostnames only — no scheme, port, or path. Up to\n10 entries. Omit (null) or leave empty for no\nenforcement (public agents accept any hostname).\n"},"memory_enabled":{"type":"boolean","description":"When true, the post-call extractor writes durable facts about\neach caller; at conversation-start the retriever injects the\ntop matches into the system prompt via the `{{memory}}`\ntemplate variable. Defaults to false.\n"},"memory_retention_days":{"type":"integer","description":"Maximum age (in days) of memories kept and surfaced to the\nretriever. 0 disables the cap. Defaults to 90.\n"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","slug","language","llm_model","voice_id","temperature","is_public","allowed_origins","memory_enabled","memory_retention_days","created_at","updated_at"],"title":"Agent"},"tts:ListAgentsResponse":{"type":"object","properties":{"agents":{"type":"array","items":{"$ref":"#/components/schemas/tts:Agent"}}},"required":["agents"],"title":"ListAgentsResponse"},"tts:CreateAgentRequest":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string","description":"Optional. Server derives slug from name with a random suffix when omitted; if you supply your own, a collision returns 400 'slug already taken'."},"prompt":{"type":"string"},"first_message":{"type":"string","description":"Spoken verbatim at session start — no LLM round trip."},"language":{"type":"string","default":"en"},"llm_model":{"type":"string","description":"Optional chat model slug. Leave empty to use the Speechify default."},"voice_id":{"type":"string","description":"Voice slug from the VMS catalog (see GET /v1/voices). Required — the server rejects writes with an unknown or empty slug."},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"}},"is_public":{"type":"boolean","default":false},"allowed_origins":{"type":"array","items":{"type":"string"}},"hostname_allowlist":{"type":"array","items":{"type":"string"},"description":"Optional per-agent hostname allowlist (see Agent schema)."},"memory_enabled":{"type":"boolean","default":false},"memory_retention_days":{"type":"integer","default":90}},"required":["name","voice_id"],"title":"CreateAgentRequest"},"tts:UpdateAgentRequest":{"type":"object","properties":{"name":{"type":"string"},"prompt":{"type":"string"},"first_message":{"type":"string"},"language":{"type":"string"},"llm_model":{"type":"string"},"voice_id":{"type":"string"},"temperature":{"type":"number","format":"double"},"config":{"type":"object","additionalProperties":{"description":"Any type"}},"is_public":{"type":"boolean"},"allowed_origins":{"type":"array","items":{"type":"string"}},"hostname_allowlist":{"type":"array","items":{"type":"string"},"description":"When supplied, replaces the stored list. Pass an empty\narray to clear enforcement (public agent is open again).\nOmit the field to leave the existing value unchanged.\n"},"memory_enabled":{"type":"boolean"},"memory_retention_days":{"type":"integer"}},"title":"UpdateAgentRequest"},"tts:ToolKind":{"type":"string","enum":["system","webhook","client"],"description":"Where the tool executes.\n- `system`: worker-resident built-in (e.g. end_call, transfer_to_number)\n- `webhook`: worker signs a payload and POSTs it to your URL\n- `client`: worker dispatches to the caller's browser/SDK via data channel\n","title":"ToolKind"},"tts:SystemToolConfigBuiltin":{"type":"string","enum":["end_call","transfer_to_number","transfer_to_agent","play_keypad_touch_tone","skip_turn"],"title":"SystemToolConfigBuiltin"},"tts:ToolParamType":{"type":"string","enum":["string","number","integer","boolean"],"title":"ToolParamType"},"tts:ToolParam":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:ToolParamType"},"description":{"type":"string"},"required":{"type":"boolean"},"enum":{"type":"array","items":{"type":"string"}}},"required":["name","type","description","required"],"description":"One argument the LLM can pass when calling the tool. Mirrors the JSON-Schema subset standard function-calling schemas support.","title":"ToolParam"},"tts:SystemToolConfig":{"type":"object","properties":{"builtin":{"$ref":"#/components/schemas/tts:SystemToolConfigBuiltin"},"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}},"builtin_config":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-builtin extras (e.g. allowed_numbers for transfer_to_number)."}},"required":["builtin"],"description":"Config shape for `kind=system`.","title":"SystemToolConfig"},"tts:WebhookToolConfigMethod":{"type":"string","enum":["POST","GET"],"default":"POST","title":"WebhookToolConfigMethod"},"tts:WebhookToolConfig":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"method":{"$ref":"#/components/schemas/tts:WebhookToolConfigMethod"},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Static headers sent with every call. `Authorization` and `X-Speechify-Signature` are reserved."},"timeout_ms":{"type":"integer","default":10000,"description":"Per-call timeout in milliseconds."},"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}}},"required":["url"],"description":"Config shape for `kind=webhook`.","title":"WebhookToolConfig"},"tts:ClientToolConfig":{"type":"object","properties":{"params":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolParam"}},"timeout_ms":{"type":"integer","default":10000}},"description":"Config shape for `kind=client`. Execution happens in the caller's browser / SDK.","title":"ClientToolConfig"},"tts:ToolConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"description":"One of `SystemToolConfig`, `WebhookToolConfig`, or `ClientToolConfig` depending on `kind`.","title":"ToolConfig"},"tts:Tool":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:ToolKind"},"config":{"$ref":"#/components/schemas/tts:ToolConfig","description":"One of `SystemToolConfig`, `WebhookToolConfig`, or `ClientToolConfig` depending on `kind`."},"webhook_secret":{"type":"string","description":"HMAC signing secret for `kind=webhook`. Returned in full **only** on the create\nresponse; all subsequent reads return a masked placeholder. Store it on first\ncreate — there is no way to retrieve it later.\n"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","description","kind","config","created_at","updated_at"],"title":"Tool"},"tts:ListToolsResponse":{"type":"object","properties":{"tools":{"type":"array","items":{"$ref":"#/components/schemas/tts:Tool"}}},"required":["tools"],"title":"ListToolsResponse"},"tts:EvaluationCriterion":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}},"required":["id","name","description"],"description":"One LLM-scored assertion about the call (\"Did the agent confirm the customer's name?\").","title":"EvaluationCriterion"},"tts:DataCollectionFieldType":{"type":"string","enum":["string","int","number","boolean"],"title":"DataCollectionFieldType"},"tts:DataCollectionField":{"type":"object","properties":{"key":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:DataCollectionFieldType"}},"required":["key","description","type"],"description":"A structured value the post-call evaluator should extract from the\ntranscript. `int` is distinct from `number` so downstream consumers\nreceive whole integers without a synthetic decimal.\n","title":"DataCollectionField"},"tts:EvaluationConfig":{"type":"object","properties":{"criteria":{"type":"array","items":{"$ref":"#/components/schemas/tts:EvaluationCriterion"}},"data_collection":{"type":"array","items":{"$ref":"#/components/schemas/tts:DataCollectionField"}}},"required":["criteria","data_collection"],"title":"EvaluationConfig"},"tts:UpdateEvaluationConfigRequest":{"type":"object","properties":{"criteria":{"type":"array","items":{"$ref":"#/components/schemas/tts:EvaluationCriterion"}},"data_collection":{"type":"array","items":{"$ref":"#/components/schemas/tts:DataCollectionField"}}},"required":["criteria","data_collection"],"title":"UpdateEvaluationConfigRequest"},"tts:DynamicVariableType":{"type":"string","enum":["string","number","boolean","json"],"description":"Declared type of a customer-scope variable. Enforced at save time\nand again at session-start when an override value is supplied.\n- `string` - plain text value; interpolated verbatim with `{{name}}`\n- `number` - numeric value; rendered as its decimal representation\n- `boolean` - `true` or `false`\n- `json` - any valid JSON value; use `{{name|json}}` to inject\n safely inside JSON tool bodies\n","title":"DynamicVariableType"},"tts:DynamicVariable":{"type":"object","properties":{"key":{"type":"string","description":"Variable name. Must match `[a-zA-Z0-9_]+`. The `system__` prefix\nis reserved for platform-populated variables and will be rejected.\n"},"type":{"$ref":"#/components/schemas/tts:DynamicVariableType"},"default":{"description":"Optional default value used when no per-session override is\nsupplied. Must conform to the declared `type`.\n"},"description":{"type":"string","description":"Human-readable note shown in the console variable editor."}},"required":["key","type"],"description":"One customer-scope variable definition on an agent. Referenced in\nprompts, first messages, and webhook tool configs via `{{key}}` or\n`{{key|json}}`. Missing variables render as empty string at dispatch\ntime - a typo never breaks a session.\n","title":"DynamicVariable"},"tts:SystemVariableDoc":{"type":"object","properties":{"key":{"type":"string","description":"The reserved variable key (always starts with `system__`)."},"description":{"type":"string","description":"What the variable contains and when it is populated."}},"required":["key","description"],"description":"Documents one reserved `system__*` variable that the platform\nauto-populates at session start. Customers cannot define or\noverride these keys.\n","title":"SystemVariableDoc"},"tts:ListDynamicVariablesResponse":{"type":"object","properties":{"variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:DynamicVariable"},"description":"Customer-defined variables for this agent."},"system_variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:SystemVariableDoc"},"description":"Platform-populated `system__*` variables, provided for\nreference. This list is the same for every agent.\n"}},"required":["variables","system_variables"],"description":"Response for `GET /v1/agents/{id}/variables`. Returns both the\ncustomer-scope variable catalogue and the read-only `system__*`\ncatalogue so the editor UI has a single source of truth.\n","title":"ListDynamicVariablesResponse"},"tts:UpdateDynamicVariablesRequest":{"type":"object","properties":{"variables":{"type":"array","items":{"$ref":"#/components/schemas/tts:DynamicVariable"},"description":"The new variable list. Replaces the existing list entirely."}},"required":["variables"],"description":"PATCH body for `PATCH /v1/agents/{id}/variables`. Replaces the\nstored variable list wholesale. Pass an empty array to clear all\nvariables. Up to 20 variables per agent.\n","title":"UpdateDynamicVariablesRequest"},"tts:CreateConversationRequest":{"type":"object","properties":{"transport":{"type":["string","null"],"description":"Transport hint. Omit to use the agent's default."},"dynamic_variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-session variable overrides that merge on top of the agent's\nstored variable defaults for this one conversation. Keys in the\nreserved `system__` namespace are rejected. Values must match the\ndeclared type of the corresponding variable definition on the agent.\n"}},"description":"Optional body for `POST /v1/agents/{id}/conversations`.","title":"CreateConversationRequest"},"tts:ConversationStatus":{"type":"string","enum":["pending","active","completed","failed"],"title":"ConversationStatus"},"tts:ConversationTransport":{"type":"string","enum":["web","sip"],"title":"ConversationTransport"},"tts:Conversation":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"room_name":{"type":"string"},"room_sid":{"type":"string"},"status":{"$ref":"#/components/schemas/tts:ConversationStatus"},"transport":{"$ref":"#/components/schemas/tts:ConversationTransport"},"started_at":{"type":["string","null"],"format":"date-time","description":"Set when the first user participant joins the realtime\nvoice session. Null between CreateConversation and the\nparticipant-joined event, and stays null if no user ever\njoins.\n"},"ended_at":{"type":["string","null"],"format":"date-time"},"duration_ms":{"type":["integer","null"]},"cost_cents":{"type":["integer","null"]},"recording_url":{"type":["string","null"]},"metadata":{"type":"object","additionalProperties":{"description":"Any type"}}},"required":["id","agent_id","room_name","status","transport"],"title":"Conversation"},"tts:CreateConversationResponse":{"type":"object","properties":{"conversation":{"$ref":"#/components/schemas/tts:Conversation"},"room":{"type":"string"},"token":{"type":"string","description":"Short-lived realtime session access token (JWT)."},"url":{"type":"string","description":"Realtime session wss:// URL to connect to."}},"required":["conversation","room","token","url"],"description":"Returned when a conversation is created. The `token` + `url`\nlet the caller connect its browser/SDK directly to the\nrealtime voice session — the agent that answers is dispatched\nserver-side.\n","title":"CreateConversationResponse"},"tts:CreateSessionRequest":{"type":"object","properties":{"user_identity":{"type":"string","description":"Opaque identifier for the end-user (e.g. your app's user ID). Stamped onto the conversation. Optional - defaults to an anonymous per-session ID."},"dynamic_variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-session variable overrides that merge on top of the agent's\nstored variable defaults for this one session. Keys in the\nreserved `system__` namespace are rejected at this boundary.\nValues must match the declared type of the corresponding variable\ndefinition on the agent (a `string` type expects a JSON string,\n`number` expects a JSON number, etc.).\n"}},"description":"Optional body for `POST /v1/agents/{id}/sessions`. Widget embeds usually pass nothing.","title":"CreateSessionRequest"},"tts:KnowledgeBase":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"Human-readable label, shown in the console."},"description":{"type":"string","description":"Optional description."},"document_count":{"type":"integer","description":"Number of ingested documents."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","description","document_count","created_at","updated_at"],"description":"A bundle of documents that can be attached to one or more voice\nagents. Chunks across every document in the knowledge base are\nembedded and searched together.","title":"KnowledgeBase"},"tts:ListKnowledgeBasesResponse":{"type":"object","properties":{"knowledge_bases":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBase"}}},"required":["knowledge_bases"],"title":"ListKnowledgeBasesResponse"},"tts:Memory":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"caller_identity":{"type":"string","description":"Stable caller key (LiveKit participant identity) the memory is scoped to."},"fact":{"type":"string","description":"Short third-person statement about the caller."},"source_conversation_id":{"type":"string","description":"Conversation the memory was extracted from (may be empty if the source was deleted)."},"confidence":{"type":"number","format":"double","description":"LLM self-reported 0-1 confidence in the fact's durability and relevance."},"score":{"type":"number","format":"double","description":"Populated only on retrieval hits — recency-weighted cosine similarity."},"created_at":{"type":"string","format":"date-time"}},"required":["id","agent_id","caller_identity","fact","confidence","created_at"],"description":"One salient fact extracted post-call about a specific caller on\na specific agent. Retrieved at the next conversation-start for\nthe same caller and injected into the agent's system prompt via\nthe `{{memory}}` template variable.","title":"Memory"},"tts:ListMemoriesResponse":{"type":"object","properties":{"memories":{"type":"array","items":{"$ref":"#/components/schemas/tts:Memory"}}},"required":["memories"],"title":"ListMemoriesResponse"},"tts:DeleteMemoriesByCallerRequest":{"type":"object","properties":{"agent_id":{"type":"string"},"caller_identity":{"type":"string"}},"required":["agent_id","caller_identity"],"title":"DeleteMemoriesByCallerRequest"},"tts:DeleteMemoriesByCallerResponse":{"type":"object","properties":{"deleted":{"type":"integer","description":"Number of memories soft-deleted."}},"required":["deleted"],"title":"DeleteMemoriesByCallerResponse"},"tts:TestType":{"type":"string","enum":["scenario","tool","simulation"],"description":"Discriminates the shape of `AgentTest.config`.\n- `scenario` - send one message to the agent and judge the response with an LLM.\n- `tool` - assert that the agent calls a specific tool given a context.\n- `simulation` - run a multi-turn conversation between the agent and an AI caller.\n","title":"TestType"},"tts:SimulationMessageRole":{"type":"string","enum":["user","assistant"],"title":"SimulationMessageRole"},"tts:SimulationMessage":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/tts:SimulationMessageRole"},"content":{"type":"string"}},"required":["role","content"],"description":"One turn in a simulation conversation. `role` is `user` (the AI caller) or `assistant` (the agent).","title":"SimulationMessage"},"tts:ScenarioConfig":{"type":"object","properties":{"context":{"type":"string","description":"User message sent to the agent to trigger the behaviour under test. Optional when `initial_chat_history` already ends with a user message."},"success_criteria":{"type":"string","description":"Natural-language description of what a passing agent response looks like."},"success_examples":{"type":"array","items":{"type":"string"},"description":"Concrete examples of passing responses (few-shot for the judge)."},"failure_examples":{"type":"array","items":{"type":"string"},"description":"Concrete examples of failing responses (few-shot for the judge)."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation prepended before `context`. Lets you test the agent's reply mid-conversation rather than on a cold single-turn prompt."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only. Useful for regression-isolating prompt changes."},"first_message_override":{"type":"string","description":"Replaces the agent's first message for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["success_criteria"],"description":"Configuration for a `scenario` test. The runner sends `context` as\na user message and asks an LLM judge to evaluate the agent response\nagainst `success_criteria`. Optional few-shot examples sharpen the\njudge's calibration. Use `initial_chat_history` to prepend prior\nturns before `context`; when the history already ends with a user\nmessage, `context` may be omitted and the agent is evaluated on\nits reply to that last history turn.","title":"ScenarioConfig"},"tts:ParameterCheckMode":{"type":"string","enum":["exact","regex","llm"],"description":"How a `ParameterCheck` validates a tool argument.\n- `exact` - JSON equality.\n- `regex` - the argument stringified is matched against the pattern.\n- `llm` - an LLM judge decides whether the value semantically satisfies\n the criteria (e.g. \"is a plausible email address\").\n","title":"ParameterCheckMode"},"tts:ParameterCheck":{"type":"object","properties":{"path":{"type":"string","description":"Dotted JSON path to the argument being checked. Empty means the whole args object."},"mode":{"$ref":"#/components/schemas/tts:ParameterCheckMode"},"expected":{"type":"string","description":"Expected value string for `exact` and `regex` modes."},"criteria":{"type":"string","description":"Natural-language criteria for `llm` mode (e.g. \"is a valid email address\")."}},"required":["path","mode"],"description":"Validates one argument of an expected tool call. `path` is a\ndotted JSON path (e.g. `customer.email`); use zero-indexed\nnotation for arrays (`items.0.sku`). An empty path checks the\nwhole args object.","title":"ParameterCheck"},"tts:ToolCallConfig":{"type":"object","properties":{"context":{"type":"string","description":"User message that should cause the agent to invoke the expected tool. Optional when `initial_chat_history` already ends with a user message."},"expected_tool":{"type":"string","description":"Name of the tool the agent is expected to call."},"parameter_checks":{"type":"array","items":{"$ref":"#/components/schemas/tts:ParameterCheck"},"description":"Assertions on specific arguments of the tool call."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation prepended before `context`."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["expected_tool"],"description":"Configuration for a `tool` test. The runner sends `context` as a\nuser message and asserts that the agent calls `expected_tool` with\narguments matching all `parameter_checks`. Use\n`initial_chat_history` to test tool invocations that only make\nsense mid-conversation.","title":"ToolCallConfig"},"tts:SimulationConfig":{"type":"object","properties":{"scenario":{"type":"string","description":"Instructions for the AI caller describing who they are and what they want."},"success_condition":{"type":"string","description":"Natural-language description of what a passing conversation looks like."},"max_turns":{"type":"integer","default":5,"description":"Maximum agent turns before the simulation is cut off and judged."},"initial_chat_history":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Optional seed conversation that precedes the AI caller's first generated message."},"system_prompt_override":{"type":"string","description":"Replaces the agent's system prompt for this run only."},"model_override":{"type":"string","description":"Overrides the LLM model used by the agent for this run only."}},"required":["scenario","success_condition","max_turns"],"description":"Configuration for a `simulation` test. An AI caller drives a\nmulti-turn conversation with the agent according to `scenario`.\nAfter `max_turns` exchanges (or when the agent ends the call), an\nLLM judge evaluates whether `success_condition` was met.\nUse `initial_chat_history` to seed the conversation at a specific\nmid-flow state.","title":"SimulationConfig"},"tts:AgentTestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Type-specific configuration document.","title":"AgentTestConfig"},"tts:MockingStrategy":{"type":"string","enum":["none","all","selected"],"description":"Controls which tool calls the runner intercepts during a run.\nSystem tools (`end_call`, `transfer_to_number`, etc.) are never\nmocked regardless of strategy.\n- `none` - no interception; all tools are called normally.\n- `all` - every non-system tool call is intercepted and matched\n against the `mocks` list.\n- `selected` - only tools explicitly listed in `mocks` are\n intercepted; others are called normally.\n","title":"MockingStrategy"},"tts:ToolMock":{"type":"object","properties":{"tool_name":{"type":"string","description":"Name of the tool to intercept."},"args_match":{"type":"string","description":"Optional substring of the JSON-serialised call arguments. When\nabsent the mock matches unconditionally for this tool."},"response":{"description":"JSON value returned to the agent as the tool result."}},"required":["tool_name","response"],"description":"A canned response returned when the agent calls `tool_name`. If\n`args_match` is set the mock only triggers when its value appears\nas a substring of the JSON-serialised call arguments (a deliberately\nsimple v1 matcher — full expression support is planned). A mock\nwithout `args_match` always matches for its tool.","title":"ToolMock"},"tts:NoMatchBehavior":{"type":"string","enum":["call_real_tool","finish_with_error","skip"],"description":"Fallback when a mockable tool is called but no configured mock\nmatches the call arguments.\n- `call_real_tool` - pass-through: actually invoke the underlying tool.\n- `finish_with_error` - fail: short-circuit the run to an `error`\n status. Useful when a test wants to assert that a specific mocked\n response path is taken - any unmocked tool call aborts the run.\n- `skip` - return an empty stub (`{\"skipped\":true}`) to the agent so\n the simulation proceeds without treating the call as a failure.\n Useful when a tool's output is irrelevant to the behaviour under\n test but the model may still decide to call it.\n","title":"NoMatchBehavior"},"tts:ToolMockConfig":{"type":"object","properties":{"strategy":{"$ref":"#/components/schemas/tts:MockingStrategy"},"mocks":{"type":"array","items":{"$ref":"#/components/schemas/tts:ToolMock"},"description":"Canned responses for specific tools (order matters - first match wins)."},"no_match_behavior":{"$ref":"#/components/schemas/tts:NoMatchBehavior"}},"required":["strategy","no_match_behavior"],"description":"Controls tool-call interception during a test run.","title":"ToolMockConfig"},"tts:TestRunStatus":{"type":"string","enum":["queued","running","passed","failed","error"],"description":"Lifecycle of a test run: `queued` - `running` - terminal.\n\nTerminal states:\n- `passed` - the agent behaviour met the success criteria.\n- `failed` - the agent behaviour did not meet the success criteria.\n- `error` - the runner itself could not complete (LLM outage, network error, etc.),\n distinct from `failed` which means the agent behaviour was judged and found lacking.\n","title":"TestRunStatus"},"tts:ScenarioResult":{"type":"object","properties":{"agent_response":{"type":"string","description":"The raw text response the agent produced."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM judge's explanation of the verdict."},"score":{"type":"number","format":"double","description":"0-1 judge confidence score."},"duration_ms":{"type":"integer","format":"int64","description":"Wall-clock time for the run in milliseconds."}},"required":["agent_response","passed","rationale","score","duration_ms"],"description":"Result details for a `scenario` test run.","title":"ScenarioResult"},"tts:ParameterCheckResult":{"type":"object","properties":{"path":{"type":"string"},"mode":{"$ref":"#/components/schemas/tts:ParameterCheckMode"},"actual_json":{"type":"string","description":"JSON-serialised actual value at `path`."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM rationale (populated for `llm` mode checks)."}},"required":["path","mode","actual_json","passed"],"description":"Result of one `ParameterCheck` within a tool-call test run.","title":"ParameterCheckResult"},"tts:ToolCallResult":{"type":"object","properties":{"tool_called":{"type":"string","description":"Name of the tool the agent actually called (may differ from `expected_tool`)."},"tool_args":{"description":"Arguments the agent passed to the tool, as a JSON object."},"expected_tool":{"type":"string","description":"Name of the tool the test expected the agent to call."},"tool_matched":{"type":"boolean","description":"True when `tool_called` equals `expected_tool`."},"parameter_results":{"type":"array","items":{"$ref":"#/components/schemas/tts:ParameterCheckResult"}},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"Explanation of the overall verdict."},"duration_ms":{"type":"integer","format":"int64"}},"required":["tool_called","expected_tool","tool_matched","parameter_results","passed","rationale","duration_ms"],"description":"Result details for a `tool` test run.","title":"ToolCallResult"},"tts:SimulationToolCall":{"type":"object","properties":{"turn_index":{"type":"integer","description":"Zero-based index of the conversation turn in which this call occurred."},"tool_name":{"type":"string"},"args":{"description":"Arguments passed to the tool, as a JSON object."},"response":{"description":"Response returned to the agent (absent for system tools that end the call)."},"mocked":{"type":"boolean"}},"required":["turn_index","tool_name","args","mocked"],"description":"One tool invocation that occurred during a simulation run.\n`mocked` is true when the call was intercepted by the run's\nmock config; false when the real tool was called or when the\ntool is a system tool.","title":"SimulationToolCall"},"tts:SimulationResult":{"type":"object","properties":{"transcript":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationMessage"},"description":"Full synthetic conversation in order."},"tool_calls":{"type":"array","items":{"$ref":"#/components/schemas/tts:SimulationToolCall"},"description":"Every tool invocation across all turns."},"turns_used":{"type":"integer","description":"Number of agent turns that ran before the simulation ended."},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"LLM judge's explanation of the verdict."},"duration_ms":{"type":"integer","format":"int64"}},"required":["transcript","turns_used","passed","rationale","duration_ms"],"description":"Result details for a `simulation` test run.","title":"SimulationResult"},"tts:TestRunResult":{"type":"object","properties":{"test_type":{"$ref":"#/components/schemas/tts:TestType"},"passed":{"type":"boolean"},"rationale":{"type":"string","description":"Top-level verdict explanation duplicated from the inner result for quick rendering."},"duration_ms":{"type":"integer","format":"int64"},"scenario":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioResult"},{"type":"null"}]},"tool_call":{"oneOf":[{"$ref":"#/components/schemas/tts:ToolCallResult"},{"type":"null"}]},"simulation":{"oneOf":[{"$ref":"#/components/schemas/tts:SimulationResult"},{"type":"null"}]}},"required":["test_type","passed","rationale","duration_ms"],"description":"Union-like result of a completed test run. Exactly one of\n`scenario`, `tool_call`, or `simulation` is populated, matching\nthe `test_type`.","title":"TestRunResult"},"tts:AgentTestRun":{"type":"object","properties":{"id":{"type":"string"},"test_id":{"type":"string"},"agent_id":{"type":"string"},"status":{"$ref":"#/components/schemas/tts:TestRunStatus"},"started_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"result":{"oneOf":[{"$ref":"#/components/schemas/tts:TestRunResult"},{"type":"null"}],"description":"Populated on terminal status only."},"error":{"type":"string","description":"Human-readable error message when status is `error`."},"created_at":{"type":"string","format":"date-time"}},"required":["id","test_id","agent_id","status","created_at"],"description":"One execution of a test. `result` is populated when `status`\nreaches a terminal state (`passed`, `failed`, or `error`).\nSee `TestRunResult` for the shape.","title":"AgentTestRun"},"tts:AgentTestWithLastRun":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:AgentTestConfig","description":"Type-specific configuration document."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during runs of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test dynamic-variable overrides. Keys substitute `{{key}}`\nplaceholders inside the test config at run-start. Unknown keys\nrender as empty string, matching session dispatch behaviour.\n"},"folder_id":{"type":["string","null"],"description":"Folder the test belongs to; null = root (unfiled)."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"last_run":{"oneOf":[{"$ref":"#/components/schemas/tts:AgentTestRun"},{"type":"null"}],"description":"The most recent run, or null if the test has never been run."},"attached_agent_ids":{"type":"array","items":{"type":"string"},"description":"Every agent this test runs against. Always includes the owner agent."}},"required":["id","agent_id","name","description","type","config","created_at","updated_at"],"description":"List-view projection of a test that includes the most recent run\nso the console can display pass/fail badges without an extra\nround-trip. On the global `/v1/tests` surface, also carries\n`attached_agent_ids` so the row can render agent chips without a\nfollow-up request.","title":"AgentTestWithLastRun"},"tts:ListAgentTestsResponse":{"type":"object","properties":{"tests":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestWithLastRun"}}},"required":["tests"],"title":"ListAgentTestsResponse"},"tts:CreateAgentTestRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Type-specific configuration. Must match the shape for the given `type`.","title":"CreateAgentTestRequestConfig"},"tts:CreateAgentTestRequest":{"type":"object","properties":{"name":{"type":"string","description":"Short human-readable label for the test."},"description":{"type":"string","description":"Optional longer description of what this test verifies."},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:CreateAgentTestRequestConfig","description":"Type-specific configuration. Must match the shape for the given `type`."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during every run of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test variable values substituted into string fields of the\nconfig at run-start. Keys use the same rules as agent-level\n`DynamicVariable` keys.\n"},"folder_id":{"type":["string","null"],"description":"Folder to place the test in. Omit for root."},"attached_agent_ids":{"type":"array","items":{"type":"string"},"description":"Optional list of additional agents this test should also run\nagainst. The owner agent (path param) is always attached\nimplicitly.\n"}},"required":["name","type","config"],"description":"Payload for `POST /v1/agents/{id}/tests`.","title":"CreateAgentTestRequest"},"tts:AgentTest":{"type":"object","properties":{"id":{"type":"string"},"agent_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"$ref":"#/components/schemas/tts:TestType"},"config":{"$ref":"#/components/schemas/tts:AgentTestConfig","description":"Type-specific configuration document."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Optional tool-mocking config applied during runs of this test."},"variables":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Per-test dynamic-variable overrides. Keys substitute `{{key}}`\nplaceholders inside the test config at run-start. Unknown keys\nrender as empty string, matching session dispatch behaviour.\n"},"folder_id":{"type":["string","null"],"description":"Folder the test belongs to; null = root (unfiled)."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","agent_id","name","description","type","config","created_at","updated_at"],"description":"A configured test against a voice agent. `config` is a\ntype-specific document - see `ScenarioConfig`, `ToolCallConfig`,\nand `SimulationConfig` for the per-type shapes (discriminated by `type`).","title":"AgentTest"},"tts:RunAgentTestsResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"description":"Response from `POST /v1/agents/{id}/tests/runs`. Contains every\nnewly-queued run so the client can poll each for completion.\nCapped at 50 runs per call.","title":"RunAgentTestsResponse"},"tts:UpdateAgentTestRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:ScenarioConfig"},{"$ref":"#/components/schemas/tts:ToolCallConfig"},{"$ref":"#/components/schemas/tts:SimulationConfig"}],"description":"Replaces the test config when present.","title":"UpdateAgentTestRequestConfig"},"tts:UpdateAgentTestRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"config":{"$ref":"#/components/schemas/tts:UpdateAgentTestRequestConfig","description":"Replaces the test config when present."},"tool_mock_config":{"$ref":"#/components/schemas/tts:ToolMockConfig","description":"Replaces the tool-mock config when present."}},"description":"Payload for `PATCH /v1/tests/{id}`. All fields are optional;\nomitting a field leaves it unchanged.","title":"UpdateAgentTestRequest"},"tts:ListAgentTestRunsResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"title":"ListAgentTestRunsResponse"},"tts:ListTestsResponse":{"type":"object","properties":{"tests":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestWithLastRun"}},"next_cursor":{"type":"string"}},"required":["tests"],"description":"Workspace-wide paginated list of tests. `next_cursor` is the opaque\npage cursor; omit on the first call, then pass through to get the\nnext page until the field is absent.","title":"ListTestsResponse"},"tts:TestStatsBucket":{"type":"object","properties":{"day":{"type":"string","description":"ISO date (YYYY-MM-DD)."},"passed":{"type":"integer"},"failed":{"type":"integer"},"errored":{"type":"integer"}},"required":["day","passed","failed","errored"],"description":"One daily point on the aggregate pass-rate chart.","title":"TestStatsBucket"},"tts:TestStats":{"type":"object","properties":{"window_days":{"type":"integer"},"buckets":{"type":"array","items":{"$ref":"#/components/schemas/tts:TestStatsBucket"}},"total_runs":{"type":"integer"},"passed_runs":{"type":"integer"},"failed_runs":{"type":"integer"},"errored_runs":{"type":"integer"},"avg_duration_ms":{"type":"integer"},"by_type":{"type":"object","additionalProperties":{"type":"integer"}}},"required":["window_days","buckets","total_runs","passed_runs","failed_runs","errored_runs","avg_duration_ms"],"description":"Aggregate run metrics over the requested window. `buckets` is\ndense - one entry per day in the window, zero-filled, so a chart\nnever has gaps. `by_type` counts runs per test type across the\nwhole window.","title":"TestStats"},"tts:BatchRunEntry":{"type":"object","properties":{"test_id":{"type":"string"},"agent_id":{"type":"string"}},"required":["test_id"],"description":"One entry in a batch-run request. Omit `agent_id` to fan out to\nevery agent the test is attached to.","title":"BatchRunEntry"},"tts:RunBatchRequest":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/tts:BatchRunEntry"}}},"required":["entries"],"description":"Batch-run payload. Total expanded runs across all entries are\ncapped at 100 per call.","title":"RunBatchRequest"},"tts:RunBatchResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestRun"}}},"required":["runs"],"title":"RunBatchResponse"},"tts:AgentTestAttachment":{"type":"object","properties":{"test_id":{"type":"string"},"agent_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"required":["test_id","agent_id","created_at"],"description":"One (test, agent) pair. Poll the `attached_agent_ids` field on `AgentTestWithLastRun` or hit `/v1/tests/{id}/attachments` for the authoritative set.","title":"AgentTestAttachment"},"tts:ListAgentTestAttachmentsResponse":{"type":"object","properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestAttachment"}}},"required":["attachments"],"title":"ListAgentTestAttachmentsResponse"},"tts:MoveAgentTestRequest":{"type":"object","properties":{"folder_id":{"type":["string","null"]}},"description":"Body for `POST /v1/tests/{id}/move`. `folder_id: null` moves the test to root.","title":"MoveAgentTestRequest"},"tts:AgentTestFolder":{"type":"object","properties":{"id":{"type":"string"},"parent_folder_id":{"type":["string","null"]},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","created_at","updated_at"],"description":"One organisational node in the per-owner tests tree.","title":"AgentTestFolder"},"tts:ListAgentTestFoldersResponse":{"type":"object","properties":{"folders":{"type":"array","items":{"$ref":"#/components/schemas/tts:AgentTestFolder"}}},"required":["folders"],"title":"ListAgentTestFoldersResponse"},"tts:CreateAgentTestFolderRequest":{"type":"object","properties":{"name":{"type":"string"},"parent_folder_id":{"type":["string","null"]}},"required":["name"],"title":"CreateAgentTestFolderRequest"},"tts:UpdateAgentTestFolderRequest":{"type":"object","properties":{"name":{"type":"string"},"parent_folder_id":{"type":["string","null"]}},"description":"PATCH body. Both fields optional; omit to leave unchanged.\nPass `parent_folder_id: null` to reparent to root.","title":"UpdateAgentTestFolderRequest"},"tts:CreateToolRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"title":"CreateToolRequestConfig"},"tts:CreateToolRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:ToolKind"},"config":{"$ref":"#/components/schemas/tts:CreateToolRequestConfig"}},"required":["name","description","kind","config"],"title":"CreateToolRequest"},"tts:UpdateToolRequestConfig":{"oneOf":[{"$ref":"#/components/schemas/tts:SystemToolConfig"},{"$ref":"#/components/schemas/tts:WebhookToolConfig"},{"$ref":"#/components/schemas/tts:ClientToolConfig"}],"title":"UpdateToolRequestConfig"},"tts:UpdateToolRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"config":{"$ref":"#/components/schemas/tts:UpdateToolRequestConfig"}},"description":"All fields optional. `kind` is immutable — create a new tool to change it.","title":"UpdateToolRequest"},"tts:ListConversationsResponse":{"type":"object","properties":{"conversations":{"type":"array","items":{"$ref":"#/components/schemas/tts:Conversation"}}},"required":["conversations"],"title":"ListConversationsResponse"},"tts:MessageRole":{"type":"string","enum":["user","assistant","system","tool"],"title":"MessageRole"},"tts:Message":{"type":"object","properties":{"id":{"type":"string"},"conversation_id":{"type":"string"},"role":{"$ref":"#/components/schemas/tts:MessageRole"},"content":{"type":"string"},"tool_name":{"type":["string","null"]},"tool_args":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"tool_result":{"oneOf":[{"description":"Any type"},{"type":"null"}],"description":"Arbitrary JSON value returned by the tool (object, array, string, or primitive)."},"started_at":{"type":"string","format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"}},"required":["id","conversation_id","role","content","started_at"],"title":"Message"},"tts:ListMessagesResponse":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/tts:Message"}}},"required":["messages"],"title":"ListMessagesResponse"},"tts:EvaluationKind":{"type":"string","enum":["criterion","summary","data"],"title":"EvaluationKind"},"tts:EvaluationStatus":{"type":"string","enum":["success","failure","unknown"],"description":"Three-state criterion result. `unknown` means the criterion did not apply to this call.","title":"EvaluationStatus"},"tts:Evaluation":{"type":"object","properties":{"id":{"type":"string"},"conversation_id":{"type":"string"},"kind":{"$ref":"#/components/schemas/tts:EvaluationKind"},"criterion_id":{"type":["string","null"]},"name":{"type":"string"},"status":{"oneOf":[{"$ref":"#/components/schemas/tts:EvaluationStatus"},{"type":"null"}],"description":"Three-state criterion result. `unknown` means the criterion did not apply to this call."},"passed":{"type":["boolean","null"]},"score":{"type":["number","null"],"format":"double"},"rationale":{"type":"string"},"data":{"oneOf":[{"description":"Any type"},{"type":"null"}],"description":"Structured data-collection payload (present only on `kind=data` rows)."},"created_at":{"type":"string","format":"date-time"}},"required":["id","conversation_id","kind","name","rationale","created_at"],"description":"Three flavours coexist, discriminated by `kind`:\n- `criterion` rows carry `status` + `passed` + `score` + `rationale` for one criterion\n- `summary` row carries overall sentiment + rationale in `rationale`\n- `data` row carries the structured data-collection payload in `data`\n\n`status` is the canonical three-state result. `passed` is a\nderived boolean kept for backwards compatibility with earlier\nwebhook consumers: success→true, failure→false, unknown→null.\n","title":"Evaluation"},"tts:ListEvaluationsResponse":{"type":"object","properties":{"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/tts:Evaluation"}}},"required":["evaluations"],"title":"ListEvaluationsResponse"},"tts:CreateKnowledgeBaseRequest":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable label."},"description":{"type":"string","description":"Optional description."}},"required":["name"],"title":"CreateKnowledgeBaseRequest"},"tts:UpdateKnowledgeBaseRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"title":"UpdateKnowledgeBaseRequest"},"tts:KnowledgeBaseDocumentStatus":{"type":"string","enum":["embedding","ready","failed"],"title":"KnowledgeBaseDocumentStatus"},"tts:KnowledgeBaseDocument":{"type":"object","properties":{"id":{"type":"string"},"kb_id":{"type":"string"},"filename":{"type":"string"},"content_type":{"type":"string"},"byte_size":{"type":"integer","format":"int64"},"char_count":{"type":"integer"},"chunk_count":{"type":"integer"},"status":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocumentStatus"},"error":{"type":"string","description":"Populated when status is failed."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","kb_id","filename","content_type","byte_size","char_count","chunk_count","status","created_at","updated_at"],"title":"KnowledgeBaseDocument"},"tts:ListKnowledgeBaseDocumentsResponse":{"type":"object","properties":{"documents":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseDocument"}}},"required":["documents"],"title":"ListKnowledgeBaseDocumentsResponse"},"tts:KnowledgeBaseChunk":{"type":"object","properties":{"id":{"type":"string"},"document_id":{"type":"string"},"kb_id":{"type":"string"},"chunk_index":{"type":"integer"},"content":{"type":"string"}},"required":["id","document_id","kb_id","chunk_index","content"],"title":"KnowledgeBaseChunk"},"tts:ListKnowledgeBaseChunksResponse":{"type":"object","properties":{"chunks":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseChunk"}}},"required":["chunks"],"title":"ListKnowledgeBaseChunksResponse"},"tts:SearchKnowledgeBasesRequest":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query."},"kb_ids":{"type":"array","items":{"type":"string"},"description":"Knowledge bases to search across. Results scoped to caller-owned entries; unknown IDs are silently ignored."},"top_k":{"type":"integer","default":5,"description":"Max hits to return (default 5, capped at 50)."}},"required":["query","kb_ids"],"title":"SearchKnowledgeBasesRequest"},"tts:KnowledgeBaseSearchHit":{"type":"object","properties":{"chunk_id":{"type":"string"},"document_id":{"type":"string"},"kb_id":{"type":"string"},"filename":{"type":"string"},"chunk_index":{"type":"integer"},"content":{"type":"string"},"score":{"type":"number","format":"double","description":"Cosine similarity (higher = more relevant)."}},"required":["chunk_id","document_id","kb_id","filename","chunk_index","content","score"],"title":"KnowledgeBaseSearchHit"},"tts:SearchKnowledgeBasesResponse":{"type":"object","properties":{"hits":{"type":"array","items":{"$ref":"#/components/schemas/tts:KnowledgeBaseSearchHit"}}},"required":["hits"],"title":"SearchKnowledgeBasesResponse"},"tts:TenantPlan":{"type":"string","enum":["free","pro","business","enterprise"],"description":"Billing plan tier.","title":"TenantPlan"},"tts:TenantDataRegion":{"type":"string","enum":["us","eu","in"],"description":"Geographic region the workspace's data is pinned to.","title":"TenantDataRegion"},"tts:Tenant":{"type":"object","properties":{"id":{"type":"string","description":"Opaque workspace ID."},"name":{"type":"string","description":"Display name set by the workspace owner."},"plan":{"$ref":"#/components/schemas/tts:TenantPlan","description":"Billing plan tier."},"data_region":{"$ref":"#/components/schemas/tts:TenantDataRegion","description":"Geographic region the workspace's data is pinned to."},"hipaa_mode":{"type":"boolean","description":"When true, HIPAA-compliant retention and logging is enforced."},"zero_retention":{"type":"boolean","description":"When true, no transcript / audio payloads are retained server-side."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","plan","data_region","hipaa_mode","zero_retention","created_at","updated_at"],"description":"A workspace the caller belongs to.","title":"Tenant"},"tts:TenantsListResponse":{"type":"object","properties":{"tenants":{"type":"array","items":{"$ref":"#/components/schemas/tts:Tenant"}}},"required":["tenants"],"title":"TenantsListResponse"},"tts:CreateWorkspaceRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the new workspace. Trimmed; must be 120 characters or fewer."}},"description":"Body for POST /v1/tenants. The `name` field is optional; omitting it falls back to \"Workspace\".","title":"CreateWorkspaceRequest"},"tts:UpdateWorkspaceRequest":{"type":"object","properties":{"name":{"type":"string","description":"New display name. Required; must be 120 characters or fewer."}},"required":["name"],"description":"Body for PATCH /v1/tenants/current.","title":"UpdateWorkspaceRequest"},"tts:MemberRole":{"type":"string","enum":["owner","admin","member"],"description":"Member's role within the workspace.\n\n- `owner` - Full control, including deleting the workspace.\n- `admin` - Manage members and invites; cannot change roles.\n- `member` - Standard access, no administrative rights.\n","title":"MemberRole"},"tts:Member":{"type":"object","properties":{"user_uid":{"type":"string","description":"Firebase user ID."},"email":{"type":"string","description":"Member's email from Firebase. Empty when the account has been deleted."},"display_name":{"type":"string","description":"Member's display name from Firebase."},"role":{"$ref":"#/components/schemas/tts:MemberRole"},"created_at":{"type":"string","format":"date-time","description":"When the user joined the workspace."},"is_self":{"type":"boolean","description":"True when this row is the authenticated caller."}},"required":["user_uid","role","created_at","is_self"],"description":"A member of a workspace (joined from `tenant_users` + Firebase profile).","title":"Member"},"tts:MembersListResponse":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/tts:Member"}}},"required":["members"],"title":"MembersListResponse"},"tts:UpdateMemberRoleRequest":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/tts:MemberRole"}},"required":["role"],"title":"UpdateMemberRoleRequest"},"tts:Invite":{"type":"object","properties":{"id":{"type":"string","description":"Opaque invite ID."},"email":{"type":"string","description":"Invitee email."},"invited_by":{"type":"string","description":"Firebase UID of the member who created the invite."},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"accepted_at":{"type":"string","format":"date-time","description":"Populated once the invite has been accepted."},"revoked_at":{"type":"string","format":"date-time","description":"Populated once the invite has been revoked."},"token":{"type":"string","description":"Invite token. Returned ONLY on the create-invite response;\nsubsequent list calls redact it. Use the token to build the\n`/join/{token}` join URL.\n"}},"required":["id","email","invited_by","created_at","expires_at"],"description":"A pending or historical workspace invite.","title":"Invite"},"tts:InvitesListResponse":{"type":"object","properties":{"invites":{"type":"array","items":{"$ref":"#/components/schemas/tts:Invite"}}},"required":["invites"],"title":"InvitesListResponse"},"tts:CreateInviteRequest":{"type":"object","properties":{"email":{"type":"string","description":"Email of the person to invite. Validated as an RFC 5322 address."}},"required":["email"],"title":"CreateInviteRequest"},"tts:InvitePreview":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Opaque workspace id. Safe to echo back on the accept call."},"tenant_name":{"type":"string","description":"Workspace display name."},"invited_email":{"type":"string","description":"The email address the inviter typed when creating the invite."},"invited_by_email":{"type":"string","description":"Firebase email of the member who created the invite. May be\nabsent if the Firebase profile lookup failed transiently —\nclients should still render the preview in that case.\n"},"invited_by_display_name":{"type":"string","description":"Firebase display name of the member who created the invite."},"expires_at":{"type":"string","format":"date-time"}},"required":["tenant_id","tenant_name","invited_email","expires_at"],"description":"Unauthenticated preview of a workspace invite. Surfaces only what\nthe recipient needs to decide whether to accept (workspace name,\ninvited address, inviter, expiry). Billing, plan, data region,\nand invite token are deliberately omitted.\n","title":"InvitePreview"},"tts:TransferOwnershipRequest":{"type":"object","properties":{"user_uid":{"type":"string","description":"Firebase UID of the member who will become the new owner."}},"required":["user_uid"],"description":"Body for POST /v1/tenants/current/transfer-owner. The target\nmust already be a member of the current workspace — promote via\ninvite + accept first for external users.\n","title":"TransferOwnershipRequest"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Enter the key with the `Bearer` prefix, e.g. 'Bearer API_KEY|ACCESS_TOKEN'."}}}}
\ No newline at end of file