{
	"openapi": "3.1.0",
	"info": {
		"contact": {
			"name": "MoreVoice",
			"url": "https://morevoice.ai"
		},
		"description": "The MoreVoice REST API. Every request is authenticated with a secret API key (`Authorization: Bearer mv_live_sk_…`, or `mv_test_sk_…` in test mode) and answers JSON.\n\n- **Versions.** Each key is pinned to the API version current when it was created. Send `MoreVoice-Version: <date>` to use another one; every response echoes the version it was rendered in.\n- **Errors.** Every error answers `{\"error\": {\"type\", \"code\", \"message\", \"param\", \"doc_url\", \"request_id\"}}` with a stable `code`.\n- **Idempotency.** Send `Idempotency-Key` on POST and DELETE requests to retry them safely for 24 hours.\n- **Pagination.** Lists answer `{\"object\": \"list\", \"data\", \"has_more\", \"next_cursor\"}`; pass `next_cursor` as `starting_after` for the next page.\n- **IDs.** Object IDs are prefixed by type (`call_…`, `asst_…`, `cmp_…`).\n\n## Resources\n\n- **Calls and AI agents:** [Calls](/api/operations/tags/calls/) · [Assistants](/api/operations/tags/assistants/) · [Tools](/api/operations/tags/tools/) · [Voices](/api/operations/tags/voices/) · [Flows](/api/operations/tags/flows/) · [Flow templates](/api/operations/tags/flow-templates/) · [Knowledge base](/api/operations/tags/knowledge-base/) · [Web calls](/api/operations/tags/web-calls/) · [Client tokens](/api/operations/tags/client-tokens/)\n- **Numbers and routing:** [Phone numbers](/api/operations/tags/phone-numbers/) · [Connections](/api/operations/tags/connections/) · [Inbound routes](/api/operations/tags/inbound-routes/)\n- **Campaigns and compliance:** [Campaigns](/api/operations/tags/campaigns/) · [Imports](/api/operations/tags/imports/) · [Consents](/api/operations/tags/consents/) · [Do not call](/api/operations/tags/do-not-call/) · [Callbacks](/api/operations/tags/callbacks/)\n- **Contact centre:** [Queues](/api/operations/tags/queues/) · [Agents](/api/operations/tags/agents/) · [Users](/api/operations/tags/users/) · [Teams](/api/operations/tags/teams/) · [Invitations](/api/operations/tags/invitations/) · [Conference rooms](/api/operations/tags/conference-rooms/) · [Copilot profiles](/api/operations/tags/copilot-profiles/) · [QA](/api/operations/tags/qa/) · [Insights](/api/operations/tags/insights/) · [Reports](/api/operations/tags/reports/)\n- **Webhooks and events:** [Webhook endpoints](/api/operations/tags/webhook-endpoints/) · [Webhook deliveries](/api/operations/tags/webhook-deliveries/) · [Events](/api/operations/tags/events/)\n- **Account and tools:** [Authentication](/api/operations/tags/authentication/) · [Usage](/api/operations/tags/usage/) · [Organizations](/api/operations/tags/organizations/) · [Audio assets](/api/operations/tags/audio-assets/) · [Secrets](/api/operations/tags/secrets/) · [Request logs](/api/operations/tags/request-logs/) · [CLI](/api/operations/tags/cli/) · [Test helpers](/api/operations/tags/test-helpers/) · [OpenAPI](/api/operations/tags/openapi/)\n\n## Using this reference\n\n- **Try it.** Send real requests with a test-mode key (`mv_test_…`) in the [API playground](/api/playground/). Live keys are refused there.\n- **SDK.** Every operation shows TypeScript (`@morevoice/sdk`), Python and cURL samples. The [Node.js SDK](/sdk/node/) page covers installation and the helpers.\n- **Webhooks.** The events MoreVoice sends are listed under *Webhooks* below and in the [event catalogue](/webhooks/events/); see [verifying signatures](/webhooks/verify/).\n- **Changes.** Every change is in the [changelog](/changelog/) ([RSS](/changelog/rss.xml)).",
		"summary": "One API for AI voice agents, a cloud PBX with human agents, and a real-time copilot.",
		"title": "MoreVoice API",
		"version": "2026-11-01",
		"x-api-versions": [
			"2026-11-01"
		]
	},
	"servers": [
		{
			"description": "Live and test mode (the API key decides)",
			"url": "https://api.morevoice.ai/v1"
		}
	],
	"security": [
		{
			"bearerAuth": []
		}
	],
	"tags": [
		{
			"description": "Inbound and outbound calls, their artefacts and live call control.",
			"name": "Calls"
		},
		{
			"description": "AI voice assistants: prompt, voice, tools and call behaviour.",
			"name": "Assistants"
		},
		{
			"description": "Custom tools assistants can call.",
			"name": "Tools"
		},
		{
			"description": "Voices assistants can speak with.",
			"name": "Voices"
		},
		{
			"description": "Call flows: drafts, published versions and simulation.",
			"name": "Flows"
		},
		{
			"description": "Starter flows to create a flow from.",
			"name": "Flow templates"
		},
		{
			"description": "Knowledge-base documents assistants answer from.",
			"name": "Knowledge base"
		},
		{
			"description": "Browser calls started with a publishable key.",
			"name": "Web calls"
		},
		{
			"description": "Short-lived tokens that let a browser start one call.",
			"name": "Client tokens"
		},
		{
			"description": "Phone numbers on your account.",
			"name": "Phone numbers"
		},
		{
			"description": "SIP trunks connecting MoreVoice to your carriers.",
			"name": "Connections"
		},
		{
			"description": "How inbound calls to your numbers are routed.",
			"name": "Inbound routes"
		},
		{
			"description": "Outbound calling campaigns.",
			"name": "Campaigns"
		},
		{
			"description": "Background contact-list imports and their results.",
			"name": "Imports"
		},
		{
			"description": "Recorded marketing consent (§30A).",
			"name": "Consents"
		},
		{
			"description": "The organisation's do-not-call list and registry checks.",
			"name": "Do not call"
		},
		{
			"description": "Callback requests and their scheduling.",
			"name": "Callbacks"
		},
		{
			"description": "Call queues and their live state.",
			"name": "Queues"
		},
		{
			"description": "Human agents' status and presence.",
			"name": "Agents"
		},
		{
			"description": "Users in the organisation.",
			"name": "Users"
		},
		{
			"description": "Teams of users.",
			"name": "Teams"
		},
		{
			"description": "Invitations to join your organisation (emailed; the link is never returned).",
			"name": "Invitations"
		},
		{
			"description": "Conference rooms, guests and AI notes.",
			"name": "Conference rooms"
		},
		{
			"description": "Real-time agent copilot configuration.",
			"name": "Copilot profiles"
		},
		{
			"description": "Post-call QA scorecards and rubric.",
			"name": "QA"
		},
		{
			"description": "Conversation analytics.",
			"name": "Insights"
		},
		{
			"description": "Scheduled reports, previews and runs.",
			"name": "Reports"
		},
		{
			"description": "URLs that receive signed events.",
			"name": "Webhook endpoints"
		},
		{
			"description": "Delivery attempts of events to your endpoints.",
			"name": "Webhook deliveries"
		},
		{
			"description": "The event log behind webhooks.",
			"name": "Events"
		},
		{
			"description": "The API key making the request.",
			"name": "Authentication"
		},
		{
			"description": "Metered usage.",
			"name": "Usage"
		},
		{
			"description": "Partner accounts: your client organisations. Act inside one with the `Mv-Account` header.",
			"name": "Organizations"
		},
		{
			"description": "Uploaded prompts and hold music.",
			"name": "Audio assets"
		},
		{
			"description": "Secret names available to tools and flows (values are never returned).",
			"name": "Secrets"
		},
		{
			"description": "Your recent API requests.",
			"name": "Request logs"
		},
		{
			"description": "The CLI's `listen` tunnel: events and tool calls forwarded to your machine.",
			"name": "CLI"
		},
		{
			"description": "Simulate calls and events in test mode.",
			"name": "Test helpers"
		},
		{
			"description": "This API description, as OpenAPI 3.1.",
			"name": "OpenAPI"
		},
		{
			"description": "Signed events MoreVoice POSTs to your webhook endpoints (Standard Webhooks).",
			"name": "Webhooks"
		}
	],
	"paths": {
		"/agents/{id}/status": {
			"get": {
				"description": "A user's presence as a human agent: available, busy on a call, in wrap-up, away or offline, and the queues they answer. `id` is the user's ID.\n\n[Try it in the API playground](/api/playground/?op=agents_retrieve_status) with a test-mode key.",
				"operationId": "agents_retrieve_status",
				"parameters": [
					{
						"description": "A user ID (`usr_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AgentStatus"
								},
								"example": {
									"call": {
										"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
										"direction": "inbound",
										"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"started": "2026-11-03T09:12:05.000Z"
									},
									"livemode": true,
									"object": "agent_status",
									"queue_ids": [
										"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"ringing": false,
									"since": "2026-11-03T09:12:05.000Z",
									"status": "busy",
									"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"wrap_up_until": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an agent's status",
				"tags": [
					"Agents"
				],
				"x-morevoice-scopes": [
					"agents:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst agentStatus = await mv.agents.retrieveStatus(\"usr_7Hk2Lm9Qp\");\nconsole.log(agentStatus);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nagent_status = client.agents.retrieve_status(\"usr_7Hk2Lm9Qp\")\nprint(agent_status)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/agents/usr_7Hk2Lm9Qp/status \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/assistants": {
			"get": {
				"description": "Your assistants, newest first.\n\n[Try it in the API playground](/api/playground/?op=assistants_list) with a test-mode key.",
				"operationId": "assistants_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AssistantList"
								},
								"example": {
									"data": [
										{
											"advanced": {
												"expression_tags": [
													"breath",
													"laugh"
												],
												"idle": {
													"max_messages": 3,
													"messages": [
														"את/ה עדיין איתי?"
													],
													"timeout_seconds": 7.5
												},
												"intelligent_turn_taking": false,
												"latency": {
													"acknowledgement_after_ms": 700,
													"acknowledgement_phrases": [
														"אממ…"
													],
													"acknowledgements": true,
													"early_start": true,
													"early_start_ms": 300,
													"first_chunk_max_words": 25
												},
												"llm_routing": {
													"complex_model": null,
													"mode": "off",
													"simple_model": "gpt-4.1-mini",
													"sticky_turns": 3
												},
												"max_endpoint_delay_ms": 1000,
												"silence_timeout_seconds": 30,
												"start_speaking_plan": {
													"on_no_punctuation_seconds": 1.5,
													"on_number_seconds": 0.5,
													"on_punctuation_seconds": 0.1,
													"smart_endpointing": "off",
													"wait_seconds": 0.4
												},
												"stop_speaking_plan": {
													"backoff_seconds": 1,
													"interruption_confirm_ms": 900,
													"num_words": 0,
													"voice_seconds": 0.2
												}
											},
											"answering_machine_detection": {
												"max_decision_ms": 3500,
												"message": "",
												"mode": "off"
											},
											"artifacts": {
												"logging": true,
												"recording": true,
												"summary": true,
												"transcript": true
											},
											"created": "2026-11-03T09:14:22.000Z",
											"end_call_message": "תודה ששוחחת איתי, יום נעים!",
											"end_call_phrases": [
												"להתראות"
											],
											"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
											"first_message_mode": "assistant_speaks_first",
											"flow_id": null,
											"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
											"language": "he",
											"livemode": true,
											"llm": {
												"max_output_tokens": 400,
												"model": "gpt-4.1",
												"provider": "openai",
												"temperature": 1
											},
											"max_duration_seconds": 600,
											"metadata": {
												"crm_id": "0031x00000AbCdE"
											},
											"name": "Clinic receptionist",
											"object": "assistant",
											"public": false,
											"system_prompt": "You book, move and cancel appointments. Keep answers short.",
											"tools": {
												"add_participant": null,
												"custom": [
													{
														"contract": "legacy",
														"description": "Find free appointment slots for a doctor and date",
														"enabled": true,
														"header_names": [
															"Authorization"
														],
														"mock_response": "{\"ok\": true}",
														"name": "find_slots",
														"parameters": {
															"properties": {
																"date": {
																	"type": "string"
																},
																"doctor": {
																	"type": "string"
																}
															},
															"required": [
																"date"
															],
															"type": "object"
														},
														"request_start_message": "רגע, אני בודקת",
														"timeout_seconds": 15,
														"type": "webhook",
														"url": "https://crm.example.com/voice/tools"
													}
												],
												"end_call": true,
												"get_current_time": false,
												"transfer_call": {
													"destination": "queue:reception"
												},
												"web_search": false
											},
											"transcriber": {
												"context": "",
												"language_hints": [
													"he",
													"en"
												],
												"model": "stt-rt-v5",
												"provider": "soniox",
												"strict_language_hints": false,
												"terms": [
													"השרון"
												]
											},
											"updated": "2026-11-03T09:14:22.000Z",
											"voice": {
												"expressions": true,
												"model": "gemini-3.8-flash-tts",
												"provider": "gemini",
												"style": "warm",
												"style_mode": "dynamic",
												"tier": "auto",
												"voice_id": "Kore"
											}
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/assistants"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List assistants",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const assistant of mv.assistants.list()) {\n\tconsole.log(assistant);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor assistant in client.assistants.list():\n    print(assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/assistants \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Creates an assistant. Only `name` is required; fields you leave out take their defaults (`GET /v1/assistants/{id}` shows them all).\n\n[Try it in the API playground](/api/playground/?op=assistants_create) with a test-mode key.",
				"operationId": "assistants_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AssistantCreateParamsInput"
							},
							"example": {
								"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
								"language": "he",
								"metadata": {
									"crm_id": "0031x00000AbCdE"
								},
								"name": "Clinic receptionist",
								"system_prompt": "You book, move and cancel appointments. Keep answers short.",
								"tools": {
									"custom": [
										{
											"description": "Find free appointment slots for a doctor and date",
											"headers": {
												"Authorization": "Bearer crm-secret"
											},
											"name": "find_slots",
											"parameters": {
												"properties": {
													"date": {
														"type": "string"
													},
													"doctor": {
														"type": "string"
													}
												},
												"required": [
													"date"
												],
												"type": "object"
											},
											"url": "https://crm.example.com/voice/tools"
										}
									],
									"end_call": true,
									"transfer_call": {
										"destination": "queue:reception"
									}
								},
								"voice": {
									"provider": "gemini",
									"style": "warm",
									"voice_id": "Kore"
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Assistant"
								},
								"example": {
									"advanced": {
										"expression_tags": [
											"breath",
											"laugh"
										],
										"idle": {
											"max_messages": 3,
											"messages": [
												"את/ה עדיין איתי?"
											],
											"timeout_seconds": 7.5
										},
										"intelligent_turn_taking": false,
										"latency": {
											"acknowledgement_after_ms": 700,
											"acknowledgement_phrases": [
												"אממ…"
											],
											"acknowledgements": true,
											"early_start": true,
											"early_start_ms": 300,
											"first_chunk_max_words": 25
										},
										"llm_routing": {
											"complex_model": null,
											"mode": "off",
											"simple_model": "gpt-4.1-mini",
											"sticky_turns": 3
										},
										"max_endpoint_delay_ms": 1000,
										"silence_timeout_seconds": 30,
										"start_speaking_plan": {
											"on_no_punctuation_seconds": 1.5,
											"on_number_seconds": 0.5,
											"on_punctuation_seconds": 0.1,
											"smart_endpointing": "off",
											"wait_seconds": 0.4
										},
										"stop_speaking_plan": {
											"backoff_seconds": 1,
											"interruption_confirm_ms": 900,
											"num_words": 0,
											"voice_seconds": 0.2
										}
									},
									"answering_machine_detection": {
										"max_decision_ms": 3500,
										"message": "",
										"mode": "off"
									},
									"artifacts": {
										"logging": true,
										"recording": true,
										"summary": true,
										"transcript": true
									},
									"created": "2026-11-03T09:14:22.000Z",
									"end_call_message": "תודה ששוחחת איתי, יום נעים!",
									"end_call_phrases": [
										"להתראות"
									],
									"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
									"first_message_mode": "assistant_speaks_first",
									"flow_id": null,
									"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"language": "he",
									"livemode": true,
									"llm": {
										"max_output_tokens": 400,
										"model": "gpt-4.1",
										"provider": "openai",
										"temperature": 1
									},
									"max_duration_seconds": 600,
									"metadata": {
										"crm_id": "0031x00000AbCdE"
									},
									"name": "Clinic receptionist",
									"object": "assistant",
									"public": false,
									"system_prompt": "You book, move and cancel appointments. Keep answers short.",
									"tools": {
										"add_participant": null,
										"custom": [
											{
												"contract": "legacy",
												"description": "Find free appointment slots for a doctor and date",
												"enabled": true,
												"header_names": [
													"Authorization"
												],
												"mock_response": "{\"ok\": true}",
												"name": "find_slots",
												"parameters": {
													"properties": {
														"date": {
															"type": "string"
														},
														"doctor": {
															"type": "string"
														}
													},
													"required": [
														"date"
													],
													"type": "object"
												},
												"request_start_message": "רגע, אני בודקת",
												"timeout_seconds": 15,
												"type": "webhook",
												"url": "https://crm.example.com/voice/tools"
											}
										],
										"end_call": true,
										"get_current_time": false,
										"transfer_call": {
											"destination": "queue:reception"
										},
										"web_search": false
									},
									"transcriber": {
										"context": "",
										"language_hints": [
											"he",
											"en"
										],
										"model": "stt-rt-v5",
										"provider": "soniox",
										"strict_language_hints": false,
										"terms": [
											"השרון"
										]
									},
									"updated": "2026-11-03T09:14:22.000Z",
									"voice": {
										"expressions": true,
										"model": "gemini-3.8-flash-tts",
										"provider": "gemini",
										"style": "warm",
										"style_mode": "dynamic",
										"tier": "auto",
										"voice_id": "Kore"
									}
								}
							}
						},
						"description": "The new assistant."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create an assistant",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst assistant = await mv.assistants.create({\n\tfirst_message: \"שלום, הגעתם למרפאת השרון. איך אפשר לעזור?\",\n\tlanguage: \"he\",\n\tmetadata: {\n\t\tcrm_id: \"0031x00000AbCdE\",\n\t},\n\tname: \"Clinic receptionist\",\n\tsystem_prompt: \"You book, move and cancel appointments. Keep answers short.\",\n\ttools: {\n\t\tcustom: [\n\t\t\t{\n\t\t\t\tdescription: \"Find free appointment slots for a doctor and date\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: \"Bearer crm-secret\",\n\t\t\t\t},\n\t\t\t\tname: \"find_slots\",\n\t\t\t\tparameters: {\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdate: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdoctor: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\n\t\t\t\t\t\t\"date\",\n\t\t\t\t\t],\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t},\n\t\t\t\turl: \"https://crm.example.com/voice/tools\",\n\t\t\t},\n\t\t],\n\t\tend_call: true,\n\t\ttransfer_call: {\n\t\t\tdestination: \"queue:reception\",\n\t\t},\n\t},\n\tvoice: {\n\t\tprovider: \"gemini\",\n\t\tstyle: \"warm\",\n\t\tvoice_id: \"Kore\",\n\t},\n});\nconsole.log(assistant);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nassistant = client.assistants.create({\n    \"first_message\": \"שלום, הגעתם למרפאת השרון. איך אפשר לעזור?\",\n    \"language\": \"he\",\n    \"metadata\": {\n        \"crm_id\": \"0031x00000AbCdE\",\n    },\n    \"name\": \"Clinic receptionist\",\n    \"system_prompt\": \"You book, move and cancel appointments. Keep answers short.\",\n    \"tools\": {\n        \"custom\": [\n            {\n                \"description\": \"Find free appointment slots for a doctor and date\",\n                \"headers\": {\n                    \"Authorization\": \"Bearer crm-secret\",\n                },\n                \"name\": \"find_slots\",\n                \"parameters\": {\n                    \"properties\": {\n                        \"date\": {\n                            \"type\": \"string\",\n                        },\n                        \"doctor\": {\n                            \"type\": \"string\",\n                        },\n                    },\n                    \"required\": [\n                        \"date\",\n                    ],\n                    \"type\": \"object\",\n                },\n                \"url\": \"https://crm.example.com/voice/tools\",\n            },\n        ],\n        \"end_call\": True,\n        \"transfer_call\": {\n            \"destination\": \"queue:reception\",\n        },\n    },\n    \"voice\": {\n        \"provider\": \"gemini\",\n        \"style\": \"warm\",\n        \"voice_id\": \"Kore\",\n    },\n})\nprint(assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/assistants \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"first_message\": \"שלום, הגעתם למרפאת השרון. איך אפשר לעזור?\",\n  \"language\": \"he\",\n  \"metadata\": {\n    \"crm_id\": \"0031x00000AbCdE\"\n  },\n  \"name\": \"Clinic receptionist\",\n  \"system_prompt\": \"You book, move and cancel appointments. Keep answers short.\",\n  \"tools\": {\n    \"custom\": [\n      {\n        \"description\": \"Find free appointment slots for a doctor and date\",\n        \"headers\": {\n          \"Authorization\": \"Bearer crm-secret\"\n        },\n        \"name\": \"find_slots\",\n        \"parameters\": {\n          \"properties\": {\n            \"date\": {\n              \"type\": \"string\"\n            },\n            \"doctor\": {\n              \"type\": \"string\"\n            }\n          },\n          \"required\": [\n            \"date\"\n          ],\n          \"type\": \"object\"\n        },\n        \"url\": \"https://crm.example.com/voice/tools\"\n      }\n    ],\n    \"end_call\": true,\n    \"transfer_call\": {\n      \"destination\": \"queue:reception\"\n    }\n  },\n  \"voice\": {\n    \"provider\": \"gemini\",\n    \"style\": \"warm\",\n    \"voice_id\": \"Kore\"\n  }\n}'\n"
					}
				]
			}
		},
		"/assistants/{id}": {
			"delete": {
				"description": "Deletes the assistant. Past calls keep their history; inbound routes and campaigns that used it need another assistant.\n\n[Try it in the API playground](/api/playground/?op=assistants_delete) with a test-mode key.",
				"operationId": "assistants_delete",
				"parameters": [
					{
						"description": "A assistant ID (`asst_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedAssistant"
								},
								"example": {
									"deleted": true,
									"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"object": "assistant"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete an assistant",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedAssistant = await mv.assistants.delete(\"asst_7Hk2Lm9Qp\");\nconsole.log(deletedAssistant);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_assistant = client.assistants.delete(\"asst_7Hk2Lm9Qp\")\nprint(deleted_assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/assistants/asst_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "assistants_retrieve",
				"parameters": [
					{
						"description": "A assistant ID (`asst_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Assistant"
								},
								"example": {
									"advanced": {
										"expression_tags": [
											"breath",
											"laugh"
										],
										"idle": {
											"max_messages": 3,
											"messages": [
												"את/ה עדיין איתי?"
											],
											"timeout_seconds": 7.5
										},
										"intelligent_turn_taking": false,
										"latency": {
											"acknowledgement_after_ms": 700,
											"acknowledgement_phrases": [
												"אממ…"
											],
											"acknowledgements": true,
											"early_start": true,
											"early_start_ms": 300,
											"first_chunk_max_words": 25
										},
										"llm_routing": {
											"complex_model": null,
											"mode": "off",
											"simple_model": "gpt-4.1-mini",
											"sticky_turns": 3
										},
										"max_endpoint_delay_ms": 1000,
										"silence_timeout_seconds": 30,
										"start_speaking_plan": {
											"on_no_punctuation_seconds": 1.5,
											"on_number_seconds": 0.5,
											"on_punctuation_seconds": 0.1,
											"smart_endpointing": "off",
											"wait_seconds": 0.4
										},
										"stop_speaking_plan": {
											"backoff_seconds": 1,
											"interruption_confirm_ms": 900,
											"num_words": 0,
											"voice_seconds": 0.2
										}
									},
									"answering_machine_detection": {
										"max_decision_ms": 3500,
										"message": "",
										"mode": "off"
									},
									"artifacts": {
										"logging": true,
										"recording": true,
										"summary": true,
										"transcript": true
									},
									"created": "2026-11-03T09:14:22.000Z",
									"end_call_message": "תודה ששוחחת איתי, יום נעים!",
									"end_call_phrases": [
										"להתראות"
									],
									"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
									"first_message_mode": "assistant_speaks_first",
									"flow_id": null,
									"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"language": "he",
									"livemode": true,
									"llm": {
										"max_output_tokens": 400,
										"model": "gpt-4.1",
										"provider": "openai",
										"temperature": 1
									},
									"max_duration_seconds": 600,
									"metadata": {
										"crm_id": "0031x00000AbCdE"
									},
									"name": "Clinic receptionist",
									"object": "assistant",
									"public": false,
									"system_prompt": "You book, move and cancel appointments. Keep answers short.",
									"tools": {
										"add_participant": null,
										"custom": [
											{
												"contract": "legacy",
												"description": "Find free appointment slots for a doctor and date",
												"enabled": true,
												"header_names": [
													"Authorization"
												],
												"mock_response": "{\"ok\": true}",
												"name": "find_slots",
												"parameters": {
													"properties": {
														"date": {
															"type": "string"
														},
														"doctor": {
															"type": "string"
														}
													},
													"required": [
														"date"
													],
													"type": "object"
												},
												"request_start_message": "רגע, אני בודקת",
												"timeout_seconds": 15,
												"type": "webhook",
												"url": "https://crm.example.com/voice/tools"
											}
										],
										"end_call": true,
										"get_current_time": false,
										"transfer_call": {
											"destination": "queue:reception"
										},
										"web_search": false
									},
									"transcriber": {
										"context": "",
										"language_hints": [
											"he",
											"en"
										],
										"model": "stt-rt-v5",
										"provider": "soniox",
										"strict_language_hints": false,
										"terms": [
											"השרון"
										]
									},
									"updated": "2026-11-03T09:14:22.000Z",
									"voice": {
										"expressions": true,
										"model": "gemini-3.8-flash-tts",
										"provider": "gemini",
										"style": "warm",
										"style_mode": "dynamic",
										"tier": "auto",
										"voice_id": "Kore"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an assistant",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:read"
				],
				"description": "Returns the assistant with every field, including the defaults of the fields you never set. Assistants are configuration shared by live and test mode.\n\n[Try it in the API playground](/api/playground/?op=assistants_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst assistant = await mv.assistants.retrieve(\"asst_7Hk2Lm9Qp\");\nconsole.log(assistant);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nassistant = client.assistants.retrieve(\"asst_7Hk2Lm9Qp\")\nprint(assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/assistants/asst_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Updates the fields you send. Nested objects merge with the stored values and arrays are replaced; `tools.custom` replaces the whole list (a tool sent without `headers` keeps the stored headers of the tool with the same name). Settings that are not part of the API are kept.\n\n[Try it in the API playground](/api/playground/?op=assistants_update) with a test-mode key.",
				"operationId": "assistants_update",
				"parameters": [
					{
						"description": "A assistant ID (`asst_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AssistantUpdateParamsInput"
							},
							"example": {
								"advanced": {
									"stop_speaking_plan": {
										"num_words": 2
									}
								},
								"metadata": {
									"stage": "beta"
								},
								"voice": {
									"style": "calm and reassuring"
								}
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Assistant"
								},
								"example": {
									"advanced": {
										"expression_tags": [
											"breath",
											"laugh"
										],
										"idle": {
											"max_messages": 3,
											"messages": [
												"את/ה עדיין איתי?"
											],
											"timeout_seconds": 7.5
										},
										"intelligent_turn_taking": false,
										"latency": {
											"acknowledgement_after_ms": 700,
											"acknowledgement_phrases": [
												"אממ…"
											],
											"acknowledgements": true,
											"early_start": true,
											"early_start_ms": 300,
											"first_chunk_max_words": 25
										},
										"llm_routing": {
											"complex_model": null,
											"mode": "off",
											"simple_model": "gpt-4.1-mini",
											"sticky_turns": 3
										},
										"max_endpoint_delay_ms": 1000,
										"silence_timeout_seconds": 30,
										"start_speaking_plan": {
											"on_no_punctuation_seconds": 1.5,
											"on_number_seconds": 0.5,
											"on_punctuation_seconds": 0.1,
											"smart_endpointing": "off",
											"wait_seconds": 0.4
										},
										"stop_speaking_plan": {
											"backoff_seconds": 1,
											"interruption_confirm_ms": 900,
											"num_words": 0,
											"voice_seconds": 0.2
										}
									},
									"answering_machine_detection": {
										"max_decision_ms": 3500,
										"message": "",
										"mode": "off"
									},
									"artifacts": {
										"logging": true,
										"recording": true,
										"summary": true,
										"transcript": true
									},
									"created": "2026-11-03T09:14:22.000Z",
									"end_call_message": "תודה ששוחחת איתי, יום נעים!",
									"end_call_phrases": [
										"להתראות"
									],
									"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
									"first_message_mode": "assistant_speaks_first",
									"flow_id": null,
									"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"language": "he",
									"livemode": true,
									"llm": {
										"max_output_tokens": 400,
										"model": "gpt-4.1",
										"provider": "openai",
										"temperature": 1
									},
									"max_duration_seconds": 600,
									"metadata": {
										"crm_id": "0031x00000AbCdE"
									},
									"name": "Clinic receptionist",
									"object": "assistant",
									"public": false,
									"system_prompt": "You book, move and cancel appointments. Keep answers short.",
									"tools": {
										"add_participant": null,
										"custom": [
											{
												"contract": "legacy",
												"description": "Find free appointment slots for a doctor and date",
												"enabled": true,
												"header_names": [
													"Authorization"
												],
												"mock_response": "{\"ok\": true}",
												"name": "find_slots",
												"parameters": {
													"properties": {
														"date": {
															"type": "string"
														},
														"doctor": {
															"type": "string"
														}
													},
													"required": [
														"date"
													],
													"type": "object"
												},
												"request_start_message": "רגע, אני בודקת",
												"timeout_seconds": 15,
												"type": "webhook",
												"url": "https://crm.example.com/voice/tools"
											}
										],
										"end_call": true,
										"get_current_time": false,
										"transfer_call": {
											"destination": "queue:reception"
										},
										"web_search": false
									},
									"transcriber": {
										"context": "",
										"language_hints": [
											"he",
											"en"
										],
										"model": "stt-rt-v5",
										"provider": "soniox",
										"strict_language_hints": false,
										"terms": [
											"השרון"
										]
									},
									"updated": "2026-11-03T09:14:22.000Z",
									"voice": {
										"expressions": true,
										"model": "gemini-3.8-flash-tts",
										"provider": "gemini",
										"style": "warm",
										"style_mode": "dynamic",
										"tier": "auto",
										"voice_id": "Kore"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update an assistant",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst assistant = await mv.assistants.update(\"asst_7Hk2Lm9Qp\", {\n\tadvanced: {\n\t\tstop_speaking_plan: {\n\t\t\tnum_words: 2,\n\t\t},\n\t},\n\tmetadata: {\n\t\tstage: \"beta\",\n\t},\n\tvoice: {\n\t\tstyle: \"calm and reassuring\",\n\t},\n});\nconsole.log(assistant);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nassistant = client.assistants.update(\"asst_7Hk2Lm9Qp\", {\n    \"advanced\": {\n        \"stop_speaking_plan\": {\n            \"num_words\": 2,\n        },\n    },\n    \"metadata\": {\n        \"stage\": \"beta\",\n    },\n    \"voice\": {\n        \"style\": \"calm and reassuring\",\n    },\n})\nprint(assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/assistants/asst_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"advanced\": {\n    \"stop_speaking_plan\": {\n      \"num_words\": 2\n    }\n  },\n  \"metadata\": {\n    \"stage\": \"beta\"\n  },\n  \"voice\": {\n    \"style\": \"calm and reassuring\"\n  }\n}'\n"
					}
				]
			}
		},
		"/assistants/{id}/duplicate": {
			"post": {
				"description": "Creates a copy with the same configuration, tools (including their stored headers) and metadata.\n\n[Try it in the API playground](/api/playground/?op=assistants_duplicate) with a test-mode key.",
				"operationId": "assistants_duplicate",
				"parameters": [
					{
						"description": "A assistant ID (`asst_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"name": "Clinic receptionist (evening)"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"name": {
										"description": "The copy's name (default: the original's name + \" (עותק)\").",
										"maxLength": 120,
										"minLength": 1,
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Assistant"
								},
								"example": {
									"advanced": {
										"expression_tags": [
											"breath",
											"laugh"
										],
										"idle": {
											"max_messages": 3,
											"messages": [
												"את/ה עדיין איתי?"
											],
											"timeout_seconds": 7.5
										},
										"intelligent_turn_taking": false,
										"latency": {
											"acknowledgement_after_ms": 700,
											"acknowledgement_phrases": [
												"אממ…"
											],
											"acknowledgements": true,
											"early_start": true,
											"early_start_ms": 300,
											"first_chunk_max_words": 25
										},
										"llm_routing": {
											"complex_model": null,
											"mode": "off",
											"simple_model": "gpt-4.1-mini",
											"sticky_turns": 3
										},
										"max_endpoint_delay_ms": 1000,
										"silence_timeout_seconds": 30,
										"start_speaking_plan": {
											"on_no_punctuation_seconds": 1.5,
											"on_number_seconds": 0.5,
											"on_punctuation_seconds": 0.1,
											"smart_endpointing": "off",
											"wait_seconds": 0.4
										},
										"stop_speaking_plan": {
											"backoff_seconds": 1,
											"interruption_confirm_ms": 900,
											"num_words": 0,
											"voice_seconds": 0.2
										}
									},
									"answering_machine_detection": {
										"max_decision_ms": 3500,
										"message": "",
										"mode": "off"
									},
									"artifacts": {
										"logging": true,
										"recording": true,
										"summary": true,
										"transcript": true
									},
									"created": "2026-11-03T09:14:22.000Z",
									"end_call_message": "תודה ששוחחת איתי, יום נעים!",
									"end_call_phrases": [
										"להתראות"
									],
									"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
									"first_message_mode": "assistant_speaks_first",
									"flow_id": null,
									"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"language": "he",
									"livemode": true,
									"llm": {
										"max_output_tokens": 400,
										"model": "gpt-4.1",
										"provider": "openai",
										"temperature": 1
									},
									"max_duration_seconds": 600,
									"metadata": {
										"crm_id": "0031x00000AbCdE"
									},
									"name": "Clinic receptionist",
									"object": "assistant",
									"public": false,
									"system_prompt": "You book, move and cancel appointments. Keep answers short.",
									"tools": {
										"add_participant": null,
										"custom": [
											{
												"contract": "legacy",
												"description": "Find free appointment slots for a doctor and date",
												"enabled": true,
												"header_names": [
													"Authorization"
												],
												"mock_response": "{\"ok\": true}",
												"name": "find_slots",
												"parameters": {
													"properties": {
														"date": {
															"type": "string"
														},
														"doctor": {
															"type": "string"
														}
													},
													"required": [
														"date"
													],
													"type": "object"
												},
												"request_start_message": "רגע, אני בודקת",
												"timeout_seconds": 15,
												"type": "webhook",
												"url": "https://crm.example.com/voice/tools"
											}
										],
										"end_call": true,
										"get_current_time": false,
										"transfer_call": {
											"destination": "queue:reception"
										},
										"web_search": false
									},
									"transcriber": {
										"context": "",
										"language_hints": [
											"he",
											"en"
										],
										"model": "stt-rt-v5",
										"provider": "soniox",
										"strict_language_hints": false,
										"terms": [
											"השרון"
										]
									},
									"updated": "2026-11-03T09:14:22.000Z",
									"voice": {
										"expressions": true,
										"model": "gemini-3.8-flash-tts",
										"provider": "gemini",
										"style": "warm",
										"style_mode": "dynamic",
										"tier": "auto",
										"voice_id": "Kore"
									}
								}
							}
						},
						"description": "The copy."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Duplicate an assistant",
				"tags": [
					"Assistants"
				],
				"x-morevoice-scopes": [
					"assistants:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst assistant = await mv.assistants.duplicate(\"asst_7Hk2Lm9Qp\", {\n\tname: \"Clinic receptionist (evening)\",\n});\nconsole.log(assistant);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nassistant = client.assistants.duplicate(\"asst_7Hk2Lm9Qp\", {\n    \"name\": \"Clinic receptionist (evening)\",\n})\nprint(assistant)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/assistants/asst_7Hk2Lm9Qp/duplicate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"name\": \"Clinic receptionist (evening)\"\n}'\n"
					}
				]
			}
		},
		"/audio_assets": {
			"get": {
				"operationId": "audio_assets_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only prompts or only music.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"enum": [
								"prompt",
								"music"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AudioAssetList"
								},
								"example": {
									"data": [
										{
											"created": "2026-11-03T09:14:22.000Z",
											"duration_ms": 4210,
											"id": "aud_8b2KxQ4mLp9",
											"kind": "prompt",
											"livemode": true,
											"name": "Welcome (Hebrew)",
											"object": "audio_asset",
											"sample_rate": 16000,
											"text": "שלום, הגעתם ל…"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/audio_assets"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List audio assets",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:read"
				],
				"description": "Returns a page of `AudioAsset` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=audio_assets_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const audioAsset of mv.audioAssets.list()) {\n\tconsole.log(audioAsset);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor audio_asset in client.audio_assets.list():\n    print(audio_asset)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/audio_assets \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Uploads a WAV (mono or stereo PCM 8–48 kHz, 8/16/24/32-bit or float, or G.711 μ-law / A-law), up to 20 MB and 10 minutes, as multipart/form-data (a `file` part) or as JSON with the file base64. It is stored as mono 16-bit PCM at up to 16 kHz. MP3 is not accepted: convert it to WAV first.\n\n[Try it in the API playground](/api/playground/?op=audio_assets_create) with a test-mode key.",
				"operationId": "audio_assets_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"file": {
									"content_base64": "UklGRiQAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQAAAAA=",
									"filename": "welcome.wav"
								},
								"kind": "prompt",
								"name": "Welcome (Hebrew)",
								"text": "שלום, הגעתם ל…"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"file": {
										"additionalProperties": false,
										"description": "The recording. JSON uploads send it base64; multipart/form-data uploads send a `file` part.",
										"properties": {
											"content_base64": {
												"description": "The WAV file, base64 (up to 20 MB of audio).",
												"minLength": 1,
												"type": "string"
											},
											"filename": {
												"maxLength": 200,
												"type": "string"
											}
										},
										"required": [
											"content_base64"
										],
										"type": "object"
									},
									"kind": {
										"description": "Default prompt.",
										"enum": [
											"prompt",
											"music"
										],
										"type": "string"
									},
									"name": {
										"description": "Default: “Prompt” / “Music” with the time.",
										"maxLength": 120,
										"type": "string"
									},
									"text": {
										"description": "What the recording says.",
										"maxLength": 4000,
										"type": "string"
									}
								},
								"required": [
									"file"
								],
								"type": "object"
							}
						},
						"multipart/form-data": {
							"schema": {
								"description": "The upload as multipart/form-data: the file part plus the other fields as text.",
								"properties": {
									"file": {
										"description": "The WAV file (up to 20 MB, up to 10 minutes).",
										"format": "binary",
										"type": "string"
									},
									"kind": {
										"enum": [
											"prompt",
											"music"
										],
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"text": {
										"type": "string"
									}
								},
								"required": [
									"file"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AudioAsset"
								},
								"example": {
									"created": "2026-11-03T09:14:22.000Z",
									"duration_ms": 4210,
									"id": "aud_8b2KxQ4mLp9",
									"kind": "prompt",
									"livemode": true,
									"name": "Welcome (Hebrew)",
									"object": "audio_asset",
									"sample_rate": 16000,
									"text": "שלום, הגעתם ל…"
								}
							}
						},
						"description": "Created."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Upload an audio asset",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst audioAsset = await mv.audioAssets.create({\n\tfile: {\n\t\tcontent_base64: \"UklGRiQAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQAAAAA=\",\n\t\tfilename: \"welcome.wav\",\n\t},\n\tkind: \"prompt\",\n\tname: \"Welcome (Hebrew)\",\n\ttext: \"שלום, הגעתם ל…\",\n});\nconsole.log(audioAsset);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\naudio_asset = client.audio_assets.create({\n    \"file\": {\n        \"content_base64\": \"UklGRiQAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQAAAAA=\",\n        \"filename\": \"welcome.wav\",\n    },\n    \"kind\": \"prompt\",\n    \"name\": \"Welcome (Hebrew)\",\n    \"text\": \"שלום, הגעתם ל…\",\n})\nprint(audio_asset)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/audio_assets \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"file\": {\n    \"content_base64\": \"UklGRiQAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQAAAAA=\",\n    \"filename\": \"welcome.wav\"\n  },\n  \"kind\": \"prompt\",\n  \"name\": \"Welcome (Hebrew)\",\n  \"text\": \"שלום, הגעתם ל…\"\n}'\n"
					}
				]
			}
		},
		"/audio_assets/{id}": {
			"delete": {
				"description": "Refused (409) while a flow (draft or a published version) or a queue's hold audio uses it; `details.used_by` lists them.\n\n[Try it in the API playground](/api/playground/?op=audio_assets_delete) with a test-mode key.",
				"operationId": "audio_assets_delete",
				"parameters": [
					{
						"description": "A audio asset ID (`aud_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^aud_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedAudioAsset"
								},
								"example": {
									"deleted": true,
									"id": "aud_8b2KxQ4mLp9",
									"object": "audio_asset"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete an audio asset",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedAudioAsset = await mv.audioAssets.delete(\"aud_7Hk2Lm9Qp\");\nconsole.log(deletedAudioAsset);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_audio_asset = client.audio_assets.delete(\"aud_7Hk2Lm9Qp\")\nprint(deleted_audio_asset)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/audio_assets/aud_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "audio_assets_retrieve",
				"parameters": [
					{
						"description": "A audio asset ID (`aud_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^aud_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AudioAsset"
								},
								"example": {
									"created": "2026-11-03T09:14:22.000Z",
									"duration_ms": 4210,
									"id": "aud_8b2KxQ4mLp9",
									"kind": "prompt",
									"livemode": true,
									"name": "Welcome (Hebrew)",
									"object": "audio_asset",
									"sample_rate": 16000,
									"text": "שלום, הגעתם ל…"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an audio asset",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:read"
				],
				"description": "Returns the `AudioAsset` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=audio_assets_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst audioAsset = await mv.audioAssets.retrieve(\"aud_7Hk2Lm9Qp\");\nconsole.log(audioAsset);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\naudio_asset = client.audio_assets.retrieve(\"aud_7Hk2Lm9Qp\")\nprint(audio_asset)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/audio_assets/aud_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Changes the name or the text (what it says). To replace the audio, upload a new asset.\n\n[Try it in the API playground](/api/playground/?op=audio_assets_update) with a test-mode key.",
				"operationId": "audio_assets_update",
				"parameters": [
					{
						"description": "A audio asset ID (`aud_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^aud_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"name": "Welcome (Hebrew, v2)"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"name": {
										"maxLength": 120,
										"minLength": 1,
										"type": "string"
									},
									"text": {
										"maxLength": 4000,
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AudioAsset"
								},
								"example": {
									"created": "2026-11-03T09:14:22.000Z",
									"duration_ms": 4210,
									"id": "aud_8b2KxQ4mLp9",
									"kind": "prompt",
									"livemode": true,
									"name": "Welcome (Hebrew)",
									"object": "audio_asset",
									"sample_rate": 16000,
									"text": "שלום, הגעתם ל…"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Rename an audio asset",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst audioAsset = await mv.audioAssets.update(\"aud_7Hk2Lm9Qp\", {\n\tname: \"Welcome (Hebrew, v2)\",\n});\nconsole.log(audioAsset);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\naudio_asset = client.audio_assets.update(\"aud_7Hk2Lm9Qp\", {\n    \"name\": \"Welcome (Hebrew, v2)\",\n})\nprint(audio_asset)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/audio_assets/aud_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Welcome (Hebrew, v2)\"\n}'\n"
					}
				]
			}
		},
		"/audio_assets/{id}/content": {
			"get": {
				"description": "The recording as a WAV file (mono 16-bit PCM at its stored rate).\n\n[Try it in the API playground](/api/playground/?op=audio_assets_retrieve_content) with a test-mode key.",
				"operationId": "audio_assets_retrieve_content",
				"parameters": [
					{
						"description": "A audio asset ID (`aud_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^aud_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"audio/wav": {
								"schema": {
									"description": "The recording as a WAV file (mono PCM16 at its stored rate).",
									"format": "binary",
									"type": "string"
								}
							}
						},
						"description": "The WAV file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Download an audio asset",
				"tags": [
					"Audio assets"
				],
				"x-morevoice-scopes": [
					"audio_assets:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.audioAssets.retrieveContent(\"aud_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.audio_assets.retrieve_content(\"aud_7Hk2Lm9Qp\")\nprint(len(data), \"bytes\")\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/audio_assets/aud_7Hk2Lm9Qp/content \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/callbacks": {
			"get": {
				"operationId": "callbacks_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only callbacks in this status: `pending` (waiting for its time), `offered` (ringing an agent), `dialing`, `connected` (on the call back), `completed`, `failed` (attempts used up), `cancelled` or `expired` (past its window, or too old).",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"pending",
								"offered",
								"dialing",
								"connected",
								"completed",
								"failed",
								"cancelled",
								"expired"
							],
							"type": "string"
						}
					},
					{
						"description": "Only callbacks from this source.",
						"in": "query",
						"name": "source",
						"required": false,
						"schema": {
							"enum": [
								"queue",
								"ivr",
								"flow",
								"ai",
								"web",
								"manual",
								"campaign",
								"voicemail",
								"api"
							],
							"type": "string"
						}
					},
					{
						"description": "Only callbacks routed to this queue.",
						"in": "query",
						"name": "queue_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "Only callbacks assigned to this agent.",
						"in": "query",
						"name": "agent_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "Only callbacks for this number (any common form).",
						"in": "query",
						"name": "phone",
						"required": false,
						"schema": {
							"maxLength": 40,
							"minLength": 3,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallbackList"
								},
								"example": {
									"data": [
										{
											"agent_id": null,
											"assistant_id": null,
											"attempts": 0,
											"call_id": null,
											"completed_at": null,
											"context": {
												"web": null
											},
											"created": "2026-11-03T09:14:22.000Z",
											"due_at": "2026-11-03T10:00:00.000Z",
											"id": "cb_2dXk9QmZ4rTv",
											"last_attempt_at": null,
											"last_result": null,
											"livemode": true,
											"max_attempts": 3,
											"merged_requests": 0,
											"metadata": {
												"crm_ticket": "T-1042"
											},
											"name": "Dana Levi",
											"notes": "Asked about the renewal offer.",
											"object": "callback",
											"origin_call_id": null,
											"phone": "+972501234567",
											"priority": 5,
											"queue_id": "q_3hRf8Kd2LmPq",
											"route": "agent_queue",
											"site_id": null,
											"sla_at": "2026-11-03T11:00:00.000Z",
											"source": "api",
											"status": "pending",
											"summary": null,
											"updated": "2026-11-03T09:14:22.000Z",
											"window_end": null
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/callbacks"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List callbacks",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:read"
				],
				"description": "Returns a page of `Callback` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=callbacks_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const callback of mv.callbacks.list()) {\n\tconsole.log(callback);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor callback in client.callbacks.list():\n    print(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/callbacks \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Books a call back to `phone`, routed like the dashboard's (to a queue's agents, an agent or an AI assistant). If the number already has an open callback, the request is merged into it and that callback is returned (`merged_requests` counts the merges). With `call_id`, repeating the request for the same call returns the first callback. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=callbacks_create) with a test-mode key.",
				"operationId": "callbacks_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"due_at": "2026-11-03T12:00:00+02:00",
								"metadata": {
									"crm_ticket": "T-1042"
								},
								"name": "Dana Levi",
								"note": "Asked about the renewal offer.",
								"phone": "+972501234567",
								"queue_id": "q_3hRf8Kd2LmPq",
								"route": "agent_queue"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"agent_id": {
										"description": "The agent who should call back (a member's user ID; `route` agent).",
										"maxLength": 200,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									"assistant_id": {
										"description": "The AI assistant that should call back (`route` assistant).",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									"call_id": {
										"description": "The call the request came from. One callback per call: repeating the request for the same call returns the first callback.",
										"maxLength": 200,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"due_at": {
										"description": "The earliest time to call back (default: now). Moved into business hours; at most 90 days ahead.",
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									"max_attempts": {
										"description": "How many times to try (default: the callback settings').",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"metadata": {
										"$ref": "#/components/schemas/MetadataInput"
									},
									"name": {
										"description": "The person's name.",
										"maxLength": 120,
										"type": "string"
									},
									"note": {
										"description": "A note for whoever returns it.",
										"maxLength": 2000,
										"type": "string"
									},
									"phone": {
										"description": "The number to call back: E.164 (`+972501234567`) or a local form (`050-123-4567`).",
										"maxLength": 40,
										"minLength": 3,
										"type": "string"
									},
									"priority": {
										"description": "1 (low) … 10 (urgent). Default: the callback settings' priority for API requests.",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"queue_id": {
										"description": "A queue ID (`q_…`).",
										"maxLength": 200,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									"route": {
										"description": "Who returns it: `agent_queue` (offered to the next free agent of `queue_id`, then dialled), `agent` (`agent_id` calls back) or `assistant` (the AI `assistant_id` calls back). Default: the callback settings' default route.",
										"enum": [
											"agent_queue",
											"agent",
											"assistant"
										],
										"type": "string"
									},
									"window_end": {
										"description": "Don't call after this time.",
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									}
								},
								"required": [
									"phone"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Request a callback",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.create({\n\tdue_at: \"2026-11-03T12:00:00+02:00\",\n\tmetadata: {\n\t\tcrm_ticket: \"T-1042\",\n\t},\n\tname: \"Dana Levi\",\n\tnote: \"Asked about the renewal offer.\",\n\tphone: \"+972501234567\",\n\tqueue_id: \"q_3hRf8Kd2LmPq\",\n\troute: \"agent_queue\",\n});\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.create({\n    \"due_at\": \"2026-11-03T12:00:00+02:00\",\n    \"metadata\": {\n        \"crm_ticket\": \"T-1042\",\n    },\n    \"name\": \"Dana Levi\",\n    \"note\": \"Asked about the renewal offer.\",\n    \"phone\": \"+972501234567\",\n    \"queue_id\": \"q_3hRf8Kd2LmPq\",\n    \"route\": \"agent_queue\",\n})\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/callbacks \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"due_at\": \"2026-11-03T12:00:00+02:00\",\n  \"metadata\": {\n    \"crm_ticket\": \"T-1042\"\n  },\n  \"name\": \"Dana Levi\",\n  \"note\": \"Asked about the renewal offer.\",\n  \"phone\": \"+972501234567\",\n  \"queue_id\": \"q_3hRf8Kd2LmPq\",\n  \"route\": \"agent_queue\"\n}'\n"
					}
				]
			}
		},
		"/callbacks/stats": {
			"get": {
				"description": "Totals for callbacks requested in a period (default: the last 7 days): outcomes, SLA, time to return, by source and by agent.\n\n[Try it in the API playground](/api/playground/?op=callbacks_stats) with a test-mode key.",
				"operationId": "callbacks_stats",
				"parameters": [
					{
						"description": "Start of the period (default: 7 days before `to`).",
						"example": "2026-11-03T09:00:00+02:00",
						"in": "query",
						"name": "from",
						"required": false,
						"schema": {
							"format": "date-time",
							"type": "string"
						}
					},
					{
						"description": "End of the period (default: now).",
						"example": "2026-11-03T09:00:00+02:00",
						"in": "query",
						"name": "to",
						"required": false,
						"schema": {
							"format": "date-time",
							"type": "string"
						}
					},
					{
						"description": "A queue ID (`q_…`).",
						"in": "query",
						"name": "queue_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallbackStats"
								},
								"example": {
									"attempts": 51,
									"avg_return_ms": 1860000,
									"breached_open": 1,
									"by_agent": [
										{
											"agent_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"count": 12
										}
									],
									"by_source": [
										{
											"completed": 24,
											"count": 30,
											"source": "queue"
										}
									],
									"cancelled": 1,
									"completed": 31,
									"expired": 2,
									"failed": 3,
									"from": "2026-10-27T09:00:00.000Z",
									"livemode": true,
									"object": "callback_stats",
									"open": 5,
									"sla_rate": 0.871,
									"to": "2026-11-03T09:00:00.000Z",
									"total": 42,
									"within_sla": 27
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Callback statistics",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callbackStats = await mv.callbacks.stats();\nconsole.log(callbackStats);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback_stats = client.callbacks.stats()\nprint(callback_stats)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/callbacks/stats \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/callbacks/{id}": {
			"get": {
				"operationId": "callbacks_retrieve",
				"parameters": [
					{
						"description": "A callback ID (`cb_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cb_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a callback",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:read"
				],
				"description": "Returns the `Callback` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=callbacks_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.retrieve(\"cb_7Hk2Lm9Qp\");\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.retrieve(\"cb_7Hk2Lm9Qp\")\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/callbacks/cb_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Reschedule, re-route or edit an open callback. A callback on a call right now can't be re-routed (409). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=callbacks_update) with a test-mode key.",
				"operationId": "callbacks_update",
				"parameters": [
					{
						"description": "A callback ID (`cb_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cb_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"due_at": "2026-11-04T09:30:00+02:00",
								"priority": 8
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"description": "A user ID (`usr_…`).",
												"maxLength": 200,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"description": "A assistant ID (`asst_…`).",
												"maxLength": 200,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"due_at": {
										"description": "Reschedule (moved into business hours).",
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									"max_attempts": {
										"description": "How many times to try (default: the callback settings').",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"name": {
										"maxLength": 120,
										"type": "string"
									},
									"notes": {
										"description": "Replaces the notes (use POST …/notes to add one).",
										"maxLength": 2000,
										"type": "string"
									},
									"priority": {
										"description": "1 (low) … 10 (urgent). Default: the callback settings' priority for API requests.",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"queue_id": {
										"anyOf": [
											{
												"description": "A queue ID (`q_…`).",
												"maxLength": 200,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"route": {
										"enum": [
											"agent_queue",
											"agent",
											"assistant"
										],
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a callback",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.update(\"cb_7Hk2Lm9Qp\", {\n\tdue_at: \"2026-11-04T09:30:00+02:00\",\n\tpriority: 8,\n});\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.update(\"cb_7Hk2Lm9Qp\", {\n    \"due_at\": \"2026-11-04T09:30:00+02:00\",\n    \"priority\": 8,\n})\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/callbacks/cb_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"due_at\": \"2026-11-04T09:30:00+02:00\",\n  \"priority\": 8\n}'\n"
					}
				]
			}
		},
		"/callbacks/{id}/cancel": {
			"post": {
				"description": "Cancels an open callback that is not on a call right now (409 otherwise). Emits `callback.cancelled`. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=callbacks_cancel) with a test-mode key.",
				"operationId": "callbacks_cancel",
				"parameters": [
					{
						"description": "A callback ID (`cb_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cb_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"reason": "Customer called us back"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"reason": {
										"description": "Why (kept in the callback's history).",
										"maxLength": 200,
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Cancel a callback",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.cancel(\"cb_7Hk2Lm9Qp\", {\n\treason: \"Customer called us back\",\n});\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.cancel(\"cb_7Hk2Lm9Qp\", {\n    \"reason\": \"Customer called us back\",\n})\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/callbacks/cb_7Hk2Lm9Qp/cancel \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"reason\": \"Customer called us back\"\n}'\n"
					}
				]
			}
		},
		"/callbacks/{id}/complete": {
			"post": {
				"description": "Closes an open callback that was resolved another way (409 while it is on a call). Emits `callback.completed`. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=callbacks_complete) with a test-mode key.",
				"operationId": "callbacks_complete",
				"parameters": [
					{
						"description": "A callback ID (`cb_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cb_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"note": "Reached by email"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"note": {
										"description": "How it was resolved (added to the notes).",
										"maxLength": 1000,
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Mark a callback done",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.complete(\"cb_7Hk2Lm9Qp\", {\n\tnote: \"Reached by email\",\n});\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.complete(\"cb_7Hk2Lm9Qp\", {\n    \"note\": \"Reached by email\",\n})\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/callbacks/cb_7Hk2Lm9Qp/complete \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"note\": \"Reached by email\"\n}'\n"
					}
				]
			}
		},
		"/callbacks/{id}/notes": {
			"post": {
				"description": "Appends a note, stamped with the time and the API key's name. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=callbacks_add_note) with a test-mode key.",
				"operationId": "callbacks_add_note",
				"parameters": [
					{
						"description": "A callback ID (`cb_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cb_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"text": "Prefers a call after 17:00."
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"text": {
										"description": "The note (stamped with the time and the API key's name).",
										"maxLength": 1000,
										"minLength": 1,
										"type": "string"
									}
								},
								"required": [
									"text"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Callback"
								},
								"example": {
									"agent_id": null,
									"assistant_id": null,
									"attempts": 0,
									"call_id": null,
									"completed_at": null,
									"context": {
										"web": null
									},
									"created": "2026-11-03T09:14:22.000Z",
									"due_at": "2026-11-03T10:00:00.000Z",
									"id": "cb_2dXk9QmZ4rTv",
									"last_attempt_at": null,
									"last_result": null,
									"livemode": true,
									"max_attempts": 3,
									"merged_requests": 0,
									"metadata": {
										"crm_ticket": "T-1042"
									},
									"name": "Dana Levi",
									"notes": "Asked about the renewal offer.",
									"object": "callback",
									"origin_call_id": null,
									"phone": "+972501234567",
									"priority": 5,
									"queue_id": "q_3hRf8Kd2LmPq",
									"route": "agent_queue",
									"site_id": null,
									"sla_at": "2026-11-03T11:00:00.000Z",
									"source": "api",
									"status": "pending",
									"summary": null,
									"updated": "2026-11-03T09:14:22.000Z",
									"window_end": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Add a note to a callback",
				"tags": [
					"Callbacks"
				],
				"x-morevoice-scopes": [
					"callbacks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callback = await mv.callbacks.addNote(\"cb_7Hk2Lm9Qp\", {\n\ttext: \"Prefers a call after 17:00.\",\n});\nconsole.log(callback);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncallback = client.callbacks.add_note(\"cb_7Hk2Lm9Qp\", {\n    \"text\": \"Prefers a call after 17:00.\",\n})\nprint(callback)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/callbacks/cb_7Hk2Lm9Qp/notes \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"text\": \"Prefers a call after 17:00.\"\n}'\n"
					}
				]
			}
		},
		"/calls": {
			"get": {
				"description": "The organisation's calls, newest first. Test-mode keys see only test calls. Filter by status, direction, type, assistant, campaign, agent, number or start time (`created[gte]`, `created[lt]`…).\n\n[Try it in the API playground](/api/playground/?op=calls_list) with a test-mode key.",
				"operationId": "calls_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "`in_progress`: calls that have not ended (queued, ringing or answered). `ended`: finished calls.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"in_progress",
								"ended"
							],
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "direction",
						"required": false,
						"schema": {
							"enum": [
								"inbound",
								"outbound",
								"browser"
							],
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "type",
						"required": false,
						"schema": {
							"enum": [
								"ai",
								"human",
								"ivr",
								"conference",
								"voicemail"
							],
							"type": "string"
						}
					},
					{
						"description": "A assistant ID (`asst_…`).",
						"in": "query",
						"name": "assistant_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "query",
						"name": "campaign_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A user ID (`usr_…`).",
						"in": "query",
						"name": "agent_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "Calls from this number, exactly as recorded on the call.",
						"in": "query",
						"name": "from",
						"required": false,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Calls to this number, exactly as recorded on the call.",
						"in": "query",
						"name": "to",
						"required": false,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Filter on started_at: created[gte], created[gt], created[lte], created[lt] (ISO-8601).",
						"explode": true,
						"in": "query",
						"name": "created",
						"required": false,
						"schema": {
							"additionalProperties": false,
							"properties": {
								"gt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"gte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								}
							},
							"type": "object"
						},
						"style": "deepObject"
					},
					{
						"description": "Fields to expand into objects, e.g. expand[]=assistant.",
						"in": "query",
						"name": "expand",
						"required": false,
						"schema": {
							"items": {
								"maxLength": 64,
								"type": "string"
							},
							"maxItems": 10,
							"type": "array"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallList"
								},
								"example": {
									"data": [
										{
											"agent_id": null,
											"ai_generated": true,
											"ai_segments": [
												{
													"end_ms": 99710,
													"source": "assistant",
													"start_ms": 0
												}
											],
											"answered_at": "2026-11-03T09:14:29.410Z",
											"answered_by": "human",
											"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
											"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"campaign_id": null,
											"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
											"contact_id": null,
											"cost": {
												"amount": 4,
												"amount_decimal": "4.2310",
												"currency": "USD",
												"estimate": true
											},
											"direction": "outbound",
											"disposition": null,
											"duration_ms": 99710,
											"end_reason": "customer-ended-call",
											"ended_at": "2026-11-03T09:16:02.120Z",
											"flow_id": null,
											"flow_version": null,
											"from": "+97237654321",
											"has_recording": true,
											"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
											"livemode": true,
											"metadata": {
												"crm_contact_id": "0031x00000AbCdE"
											},
											"object": "call",
											"purpose": "service",
											"queue_id": null,
											"started_at": "2026-11-03T09:14:22.000Z",
											"status": "ended",
											"summary": null,
											"to": "+972501234567",
											"transport": "sip",
											"type": "ai",
											"variables": {
												"customer_name": "Dana"
											}
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/calls"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List calls",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const call of mv.calls.list()) {\n\tconsole.log(call);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor call in client.calls.list():\n    print(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Places an outbound call with an assistant, or with a published voice flow and its assistant. `purpose` is required: it drives the outbound compliance checks (do-not-call list for every call; recorded consent and the national registry for marketing). The Idempotency-Key header is required, so a retried request never calls anyone twice. Test-mode keys place simulated calls that never reach a phone network.\n\n[Try it in the API playground](/api/playground/?op=calls_create) with a test-mode key.",
				"operationId": "calls_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey",
						"description": "Required on this endpoint (400 parameter_missing without it). A unique key (for example a UUID) for this request: for 24 hours, a retry with the same key and parameters returns the first response instead of acting twice."
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"examples": {
								"assistant": {
									"summary": "Call with an assistant",
									"value": {
										"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"from_number_id": "pn_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"metadata": {
											"crm_contact_id": "0031x00000AbCdE"
										},
										"purpose": "service",
										"to": "+972501234567",
										"variables": {
											"customer_name": "Dana"
										}
									}
								},
								"flow": {
									"summary": "Call with a published voice flow",
									"value": {
										"amd": {
											"enabled": true,
											"on_machine": "hangup"
										},
										"flow_id": "flow_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"purpose": "survey",
										"to": "+972501234567"
									}
								}
							},
							"schema": {
								"additionalProperties": false,
								"description": "An outbound call to place.",
								"properties": {
									"amd": {
										"additionalProperties": false,
										"description": "Answering-machine detection (default: the assistant's setting).",
										"properties": {
											"enabled": {
												"description": "Detect answering machines.",
												"type": "boolean"
											},
											"message": {
												"description": "Spoken after the beep with on_machine=leave_message (default: the assistant's message).",
												"maxLength": 1000,
												"type": "string"
											},
											"on_machine": {
												"description": "What to do on a machine (default hangup).",
												"enum": [
													"hangup",
													"leave_message"
												],
												"type": "string"
											}
										},
										"required": [
											"enabled"
										],
										"type": "object"
									},
									"assistant_id": {
										"description": "The assistant that handles the call. Pass this or flow_id.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									"caller_id": {
										"description": "The number to present; it must be allowed on the connection.",
										"maxLength": 64,
										"minLength": 1,
										"type": "string"
									},
									"connection_id": {
										"description": "The SIP connection to call out on (default: the organisation's default connection).",
										"maxLength": 200,
										"pattern": "^conn_[0-9A-Za-z]+$",
										"type": "string"
									},
									"flow_id": {
										"description": "A published voice flow; it runs on its linked assistant. Pass this or assistant_id.",
										"maxLength": 200,
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									"from_number_id": {
										"description": "The phone number to call from (`pn_…`, GET /v1/phone_numbers): it sets the connection and the caller ID. Or pass connection_id and caller_id.",
										"maxLength": 200,
										"pattern": "^pn_[0-9A-Za-z]+$",
										"type": "string"
									},
									"max_duration_s": {
										"description": "End the call after this many seconds (default: the assistant's limit).",
										"maximum": 14400,
										"minimum": 10,
										"type": "integer"
									},
									"metadata": {
										"$ref": "#/components/schemas/MetadataInput"
									},
									"purpose": {
										"description": "service, marketing or survey. Marketing calls need recorded consent and pass the national do-not-call registry (§30A).",
										"enum": [
											"service",
											"marketing",
											"survey"
										],
										"type": "string"
									},
									"to": {
										"description": "The number to call, E.164.",
										"pattern": "^\\+[1-9]\\d{6,14}$",
										"type": "string"
									},
									"variables": {
										"additionalProperties": {
											"maxLength": 1000,
											"type": "string"
										},
										"description": "Template variables for the prompt, first message and flow ({{customer_name}}); at most 50.",
										"maxProperties": 50,
										"propertyNames": {
											"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,39}$",
											"type": "string"
										},
										"type": "object"
									}
								},
								"required": [
									"to",
									"purpose"
								],
								"type": "object"
							}
						}
					},
					"description": "An outbound call to place.",
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Call"
								},
								"example": {
									"agent_id": null,
									"ai_generated": true,
									"ai_segments": [
										{
											"end_ms": 99710,
											"source": "assistant",
											"start_ms": 0
										}
									],
									"answered_at": "2026-11-03T09:14:29.410Z",
									"answered_by": "human",
									"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
									"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"campaign_id": null,
									"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
									"contact_id": null,
									"cost": {
										"amount": 4,
										"amount_decimal": "4.2310",
										"currency": "USD",
										"estimate": true
									},
									"direction": "outbound",
									"disposition": null,
									"duration_ms": 99710,
									"end_reason": "customer-ended-call",
									"ended_at": "2026-11-03T09:16:02.120Z",
									"flow_id": null,
									"flow_version": null,
									"from": "+97237654321",
									"has_recording": true,
									"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"livemode": true,
									"metadata": {
										"crm_contact_id": "0031x00000AbCdE"
									},
									"object": "call",
									"purpose": "service",
									"queue_id": null,
									"started_at": "2026-11-03T09:14:22.000Z",
									"status": "ended",
									"summary": null,
									"to": "+972501234567",
									"transport": "sip",
									"type": "ai",
									"variables": {
										"customer_name": "Dana"
									}
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create an outbound call",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst call = await mv.calls.create({\n\tassistant_id: \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n\tfrom_number_id: \"pn_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n\tmetadata: {\n\t\tcrm_contact_id: \"0031x00000AbCdE\",\n\t},\n\tpurpose: \"service\",\n\tto: \"+972501234567\",\n\tvariables: {\n\t\tcustomer_name: \"Dana\",\n\t},\n});\nconsole.log(call);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall = client.calls.create({\n    \"assistant_id\": \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n    \"from_number_id\": \"pn_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n    \"metadata\": {\n        \"crm_contact_id\": \"0031x00000AbCdE\",\n    },\n    \"purpose\": \"service\",\n    \"to\": \"+972501234567\",\n    \"variables\": {\n        \"customer_name\": \"Dana\",\n    },\n})\nprint(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"assistant_id\": \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n  \"from_number_id\": \"pn_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n  \"metadata\": {\n    \"crm_contact_id\": \"0031x00000AbCdE\"\n  },\n  \"purpose\": \"service\",\n  \"to\": \"+972501234567\",\n  \"variables\": {\n    \"customer_name\": \"Dana\"\n  }\n}'\n"
					}
				]
			}
		},
		"/calls/{id}": {
			"delete": {
				"description": "Deletes an ended call with its transcript, events and recording. A call in progress answers 409 `call_in_progress`: hang it up first.\n\n[Try it in the API playground](/api/playground/?op=calls_delete) with a test-mode key.",
				"operationId": "calls_delete",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallDeleted"
								},
								"example": {
									"deleted": true,
									"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"object": "call"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a call",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callDeleted = await mv.calls.delete(\"call_7Hk2Lm9Qp\");\nconsole.log(callDeleted);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_deleted = client.calls.delete(\"call_7Hk2Lm9Qp\")\nprint(call_deleted)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"description": "A call, live or ended. While it runs, `status` and `answered_at` come from the live call.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve) with a test-mode key.",
				"operationId": "calls_retrieve",
				"parameters": [
					{
						"description": "Fields to expand into objects, e.g. expand[]=assistant.",
						"in": "query",
						"name": "expand",
						"required": false,
						"schema": {
							"items": {
								"maxLength": 64,
								"type": "string"
							},
							"maxItems": 10,
							"type": "array"
						}
					},
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Call"
								},
								"example": {
									"agent_id": null,
									"ai_generated": true,
									"ai_segments": [
										{
											"end_ms": 99710,
											"source": "assistant",
											"start_ms": 0
										}
									],
									"answered_at": "2026-11-03T09:14:29.410Z",
									"answered_by": "human",
									"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
									"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"campaign_id": null,
									"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
									"contact_id": null,
									"cost": {
										"amount": 4,
										"amount_decimal": "4.2310",
										"currency": "USD",
										"estimate": true
									},
									"direction": "outbound",
									"disposition": null,
									"duration_ms": 99710,
									"end_reason": "customer-ended-call",
									"ended_at": "2026-11-03T09:16:02.120Z",
									"flow_id": null,
									"flow_version": null,
									"from": "+97237654321",
									"has_recording": true,
									"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"livemode": true,
									"metadata": {
										"crm_contact_id": "0031x00000AbCdE"
									},
									"object": "call",
									"purpose": "service",
									"queue_id": null,
									"started_at": "2026-11-03T09:14:22.000Z",
									"status": "ended",
									"summary": null,
									"to": "+972501234567",
									"transport": "sip",
									"type": "ai",
									"variables": {
										"customer_name": "Dana"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst call = await mv.calls.retrieve(\"call_7Hk2Lm9Qp\");\nconsole.log(call);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall = client.calls.retrieve(\"call_7Hk2Lm9Qp\")\nprint(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/consult/{action}": {
			"post": {
				"description": "After a warm transfer: `complete` hands the customer to the consulted party, `merge` makes a three-way call, `swap` alternates between them, `cancel` returns to the customer.\n\n[Try it in the API playground](/api/playground/?op=calls_consult) with a test-mode key.",
				"operationId": "calls_consult",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "complete: hand the customer over; merge: a three-way call; swap: alternate; cancel: back to the customer.",
						"in": "path",
						"name": "action",
						"required": true,
						"schema": {
							"enum": [
								"complete",
								"merge",
								"swap",
								"cancel"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {},
							"schema": {
								"additionalProperties": false,
								"description": "No parameters.",
								"properties": {},
								"type": "object"
							}
						}
					},
					"description": "No parameters.",
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Complete, merge, swap or cancel a consultation",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.consult(\"call_7Hk2Lm9Qp\", \"complete\", {});\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.consult(\"call_7Hk2Lm9Qp\", \"complete\", {})\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/consult/complete \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/calls/{id}/control": {
			"get": {
				"description": "Who is on the call, hold and consultation state. Ended calls answer status ended with no one connected.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_control) with a test-mode key.",
				"operationId": "calls_retrieve_control",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's control state",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.retrieveControl(\"call_7Hk2Lm9Qp\");\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.retrieve_control(\"call_7Hk2Lm9Qp\")\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/control \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/copilot_events": {
			"get": {
				"description": "What the real-time agent copilot showed on the call and what the agent did with it (cards used or dismissed, searches), newest first.\n\n[Try it in the API playground](/api/playground/?op=calls_list_copilot_events) with a test-mode key.",
				"operationId": "calls_list_copilot_events",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotEventList"
								},
								"example": {
									"data": [
										{
											"at_ms": 48200,
											"card_id": "c12",
											"copilot_profile_id": "cop_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"copilot_profile_version": 2,
											"created_at": "2026-11-03T09:14:22.000Z",
											"data": null,
											"kind": "kb",
											"latency_ms": 640,
											"object": "copilot_event",
											"type": "card.used"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/calls/call_8tRPaZp5hLMbrGqdJ9AmNa/copilot_events"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a call's copilot events",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const call of mv.calls.listCopilotEvents(\"call_7Hk2Lm9Qp\")) {\n\tconsole.log(call);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor call in client.calls.list_copilot_events(\"call_7Hk2Lm9Qp\"):\n    print(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/copilot_events \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/dtmf": {
			"post": {
				"description": "Calls handled by a human agent: plays the keys to the far end (for example to navigate another company's IVR).\n\n[Try it in the API playground](/api/playground/?op=calls_send_dtmf) with a test-mode key.",
				"operationId": "calls_send_dtmf",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"digits": "1234#"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"digits": {
										"description": "The keys to send to the far end; `,` pauses.",
										"pattern": "^[0-9*#A-Da-d,]{1,32}$",
										"type": "string"
									}
								},
								"required": [
									"digits"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Send DTMF tones",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.sendDtmf(\"call_7Hk2Lm9Qp\", {\n\tdigits: \"1234#\",\n});\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.send_dtmf(\"call_7Hk2Lm9Qp\", {\n    \"digits\": \"1234#\",\n})\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/dtmf \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"digits\": \"1234#\"\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/events": {
			"get": {
				"description": "Server-Sent Events for one call: `call.state_changed`, `transcript.partial`, `transcript.final`, `call.tool_called`, and `call.ended`, after which the stream closes. The stream starts with what already happened on the call. Reconnect with `Last-Event-ID` (EventSource does it for you) to get only what you missed. An ended call's stream sends `call.ended` at once. A call that has not started yet (a web call before the browser connects) is a 404: subscribe once it starts, or follow it on GET /v1/events/stream. Counts against the key's stream limit (`concurrency_limit`, `limit_type: api_streams`).\n\n[Try it in the API playground](/api/playground/?op=calls_stream) with a test-mode key.",
				"operationId": "calls_stream",
				"parameters": [
					{
						"description": "Only these event types (comma-separated or repeated): `call.state_changed`, `transcript.partial`, `transcript.final`, `call.tool_called`, `call.ended`, `transcript.*`, `call.*` or `*`. Default: all of them.",
						"in": "query",
						"name": "types",
						"required": false,
						"schema": {
							"anyOf": [
								{
									"type": "string"
								},
								{
									"items": {
										"type": "string"
									},
									"type": "array"
								}
							]
						}
					},
					{
						"description": "Resume after this event, for clients that cannot send the `Last-Event-ID` header (the header wins when both are sent).",
						"in": "query",
						"name": "last_event_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/event-stream": {
								"schema": {
									"description": "A text/event-stream. Each frame is `id: <call_…>:<n>`, `event: <type>` and one `data:` line with the event envelope (`id`, `object: \"event\"`, `type`, `created`, `api_version`, `livemode`, `org_id`, `data.object`). Comment lines (`: ping`) keep the connection alive every 15 s. The stream ends after `call.ended`.",
									"examples": [
										"retry: 3000\n\nid: call_8tRPaZp5hLMbrGqdJ9AmNa:1\nevent: call.state_changed\ndata: {\"id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa:1\",\"object\":\"event\",\"type\":\"call.state_changed\",\"created\":\"2026-11-03T09:14:22Z\",\"api_version\":\"2026-11-01\",\"livemode\":true,\"org_id\":\"org_0000000000000000000001\",\"data\":{\"object\":{\"call_id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa\",\"state\":\"listening\"}}}\n\nid: call_8tRPaZp5hLMbrGqdJ9AmNa:2\nevent: transcript.final\ndata: {\"id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa:2\",\"object\":\"event\",\"type\":\"transcript.final\",\"created\":\"2026-11-03T09:14:24Z\",\"api_version\":\"2026-11-01\",\"livemode\":true,\"org_id\":\"org_0000000000000000000001\",\"data\":{\"object\":{\"call_id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa\",\"utterance_id\":\"u1\",\"speaker\":\"customer\",\"role\":\"user\",\"text\":\"Hi, where is my order?\",\"final\":true,\"interrupted\":false}}}\n\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The event stream."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stream a call's live events",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.calls.stream(\"call_7Hk2Lm9Qp\")) {\n\tconsole.log(event.type, event.data.object);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "import os\n\nimport httpx\n\nurl = \"https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/events\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['MOREVOICE_API_KEY']}\", \"Accept\": \"text/event-stream\"}\nwith httpx.stream(\"GET\", url, headers=headers, timeout=None) as response:\n    response.raise_for_status()\n    for line in response.iter_lines():\n        if line.startswith(\"data:\"):\n            print(line[5:].strip())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/events \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Accept: text/event-stream\" -N\n"
					}
				]
			}
		},
		"/calls/{id}/flow_path": {
			"get": {
				"description": "The flow nodes the call went through, in order, with the edge taken into each. Calls without a flow answer `flow_id: null` and no steps.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_flow_path) with a test-mode key.",
				"operationId": "calls_retrieve_flow_path",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowPath"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"end": "end_ok",
									"flow_id": "flow_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"flow_version": 3,
									"live": false,
									"object": "flow_path",
									"steps": [
										{
											"at_ms": 0,
											"edge_id": null,
											"input": null,
											"node_id": "start",
											"turns": 1,
											"via": null
										},
										{
											"at_ms": 6400,
											"edge_id": "e2",
											"input": null,
											"node_id": "order_status",
											"turns": 2,
											"via": "llm"
										}
									],
									"transferred": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's flow path",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowPath = await mv.calls.retrieveFlowPath(\"call_7Hk2Lm9Qp\");\nconsole.log(flowPath);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_path = client.calls.retrieve_flow_path(\"call_7Hk2Lm9Qp\")\nprint(flow_path)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/flow_path \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/hangup": {
			"post": {
				"description": "Ends a live call for everyone on it (while it rings, cancels it) and returns the call. An ended call answers 409 call_not_active.\n\n[Try it in the API playground](/api/playground/?op=calls_hangup) with a test-mode key.",
				"operationId": "calls_hangup",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {},
							"schema": {
								"additionalProperties": false,
								"description": "No parameters.",
								"properties": {},
								"type": "object"
							}
						}
					},
					"description": "No parameters.",
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Call"
								},
								"example": {
									"agent_id": null,
									"ai_generated": true,
									"ai_segments": [
										{
											"end_ms": 99710,
											"source": "assistant",
											"start_ms": 0
										}
									],
									"answered_at": "2026-11-03T09:14:29.410Z",
									"answered_by": "human",
									"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
									"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"campaign_id": null,
									"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
									"contact_id": null,
									"cost": {
										"amount": 4,
										"amount_decimal": "4.2310",
										"currency": "USD",
										"estimate": true
									},
									"direction": "outbound",
									"disposition": null,
									"duration_ms": 99710,
									"end_reason": "customer-ended-call",
									"ended_at": "2026-11-03T09:16:02.120Z",
									"flow_id": null,
									"flow_version": null,
									"from": "+97237654321",
									"has_recording": true,
									"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"livemode": true,
									"metadata": {
										"crm_contact_id": "0031x00000AbCdE"
									},
									"object": "call",
									"purpose": "service",
									"queue_id": null,
									"started_at": "2026-11-03T09:14:22.000Z",
									"status": "ended",
									"summary": null,
									"to": "+972501234567",
									"transport": "sip",
									"type": "ai",
									"variables": {
										"customer_name": "Dana"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Hang up a call",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst call = await mv.calls.hangup(\"call_7Hk2Lm9Qp\", {});\nconsole.log(call);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall = client.calls.hangup(\"call_7Hk2Lm9Qp\", {})\nprint(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/hangup \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/calls/{id}/hold": {
			"post": {
				"description": "Calls handled by a human agent: the customer hears the hold music while `on` is true.\n\n[Try it in the API playground](/api/playground/?op=calls_hold) with a test-mode key.",
				"operationId": "calls_hold",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"on": true
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"on": {
										"default": true,
										"description": "true: put the customer on hold; false: take them off hold.",
										"type": "boolean"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Put a call on hold or take it off hold",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.hold(\"call_7Hk2Lm9Qp\", {\n\ton: true,\n});\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.hold(\"call_7Hk2Lm9Qp\", {\n    \"on\": True,\n})\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/hold \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"on\": true\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/participants": {
			"post": {
				"description": "Calls handled by a human agent: rings a phone number or an agent into the call (a conference of up to 8), or adds an AI assistant. The participant starts `ringing`; follow it in GET …/control.\n\n[Try it in the API playground](/api/playground/?op=calls_add_participant) with a test-mode key.",
				"operationId": "calls_add_participant",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"examples": {
								"number": {
									"summary": "Ring a phone number in",
									"value": {
										"announce": "Joining you to a customer call",
										"to": {
											"number": "+97235551234"
										}
									}
								}
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"announce": {
										"description": "A line said to them when they join.",
										"maxLength": 500,
										"type": "string"
									},
									"to": {
										"additionalProperties": false,
										"description": "Who to add: a phone number, an agent or an AI assistant (queues cannot join a call).",
										"properties": {
											"agent_id": {
												"description": "A user ID (`usr_…`).",
												"maxLength": 200,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											"assistant_id": {
												"description": "A assistant ID (`asst_…`).",
												"maxLength": 200,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											"number": {
												"pattern": "^\\+[1-9]\\d{6,14}$",
												"type": "string"
											},
											"queue_id": {
												"description": "A queue ID (`q_…`).",
												"maxLength": 200,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											}
										},
										"type": "object"
									}
								},
								"required": [
									"to"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallParticipantCreated"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"name": "035551234",
									"object": "call_participant",
									"participant_id": "L4f8k2",
									"state": "ringing"
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Add a participant",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callParticipantCreated = await mv.calls.addParticipant(\"call_7Hk2Lm9Qp\", {\n\tannounce: \"Joining you to a customer call\",\n\tto: {\n\t\tnumber: \"+97235551234\",\n\t},\n});\nconsole.log(callParticipantCreated);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_participant_created = client.calls.add_participant(\"call_7Hk2Lm9Qp\", {\n    \"announce\": \"Joining you to a customer call\",\n    \"to\": {\n        \"number\": \"+97235551234\",\n    },\n})\nprint(call_participant_created)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/participants \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"announce\": \"Joining you to a customer call\",\n  \"to\": {\n    \"number\": \"+97235551234\"\n  }\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/participants/{participant_id}": {
			"delete": {
				"description": "Drops a participant from the call. The customer (`client`) cannot be removed: hang up instead.\n\n[Try it in the API playground](/api/playground/?op=calls_remove_participant) with a test-mode key.",
				"operationId": "calls_remove_participant",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A participant_id from the call's control state.",
						"in": "path",
						"name": "participant_id",
						"required": true,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Remove a participant",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.removeParticipant(\"call_7Hk2Lm9Qp\", \"participant_id_123\");\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.remove_participant(\"call_7Hk2Lm9Qp\", \"participant_id_123\")\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/participants/participant_id_123 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"patch": {
				"operationId": "calls_update_participant",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A participant_id from the call's control state.",
						"in": "path",
						"name": "participant_id",
						"required": true,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"muted": true
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"held": {
										"type": "boolean"
									},
									"muted": {
										"type": "boolean"
									},
									"role": {
										"enum": [
											"moderator",
											"member"
										],
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Mute, hold or change the role of a participant",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"description": "Changes one participant of a call handled by a human agent: mute or unmute them (`muted`), put them on hold or take them off (`held`), or change their `role`. Send only what changes. The answer is the call's control state after the change. AI and IVR calls answer `400` with the code `unsupported_for_call_mode`.\n\n[Try it in the API playground](/api/playground/?op=calls_update_participant) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.updateParticipant(\"call_7Hk2Lm9Qp\", \"participant_id_123\", {\n\tmuted: true,\n});\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.update_participant(\"call_7Hk2Lm9Qp\", \"participant_id_123\", {\n    \"muted\": True,\n})\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/participants/participant_id_123 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"muted\": true\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/pci": {
			"get": {
				"operationId": "calls_retrieve_pci",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallPci"
								},
								"example": {
									"call_id": "call_2fT0a8Kq1Lb3Xc9Zp4Rm",
									"destination_participant_id": null,
									"object": "call_pci",
									"paused": true,
									"paused_at": "2026-10-05T12:00:00.000Z",
									"reason": "payment",
									"resumes_at": "2026-10-05T12:05:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's payment pause",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"description": "Returns the `CallPci` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_pci) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callPci = await mv.calls.retrievePci(\"call_7Hk2Lm9Qp\");\nconsole.log(callPci);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_pci = client.calls.retrieve_pci(\"call_7Hk2Lm9Qp\")\nprint(call_pci)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/pci \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "PCI DSS scope reduction: while paused the call is neither recorded nor transcribed, live listeners hear silence and keypad digits are logged masked; with DTMF masking on, keypad tones are removed for everyone except the payment line. Pausing a paused call (or resuming a running one) is a 409. Needs the organisation's PCI mode.\n\n[Try it in the API playground](/api/playground/?op=calls_pci) with a test-mode key.",
				"operationId": "calls_pci",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"action": "pause",
								"max_seconds": 180,
								"reason": "payment"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"action": {
										"description": "pause: stop recording and transcription for a card payment; resume: start them again.",
										"enum": [
											"pause",
											"resume"
										],
										"type": "string"
									},
									"destination_participant_id": {
										"description": "Human-handled calls: the participant (a payment IVR or keypad-capture line you added) that receives the caller's keys.",
										"maxLength": 80,
										"minLength": 1,
										"type": "string"
									},
									"max_seconds": {
										"description": "Resume by itself after this long (capped by the organisation's maximum, which is also the default).",
										"maximum": 900,
										"minimum": 5,
										"type": "integer"
									},
									"reason": {
										"description": "Shown in the call log (default `payment`).",
										"maxLength": 60,
										"minLength": 1,
										"type": "string"
									}
								},
								"required": [
									"action"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallPci"
								},
								"example": {
									"call_id": "call_2fT0a8Kq1Lb3Xc9Zp4Rm",
									"destination_participant_id": null,
									"object": "call_pci",
									"paused": true,
									"paused_at": "2026-10-05T12:00:00.000Z",
									"reason": "payment",
									"resumes_at": "2026-10-05T12:05:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Pause or resume recording for a card payment",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callPci = await mv.calls.pci(\"call_7Hk2Lm9Qp\", {\n\taction: \"pause\",\n\tmax_seconds: 180,\n\treason: \"payment\",\n});\nconsole.log(callPci);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_pci = client.calls.pci(\"call_7Hk2Lm9Qp\", {\n    \"action\": \"pause\",\n    \"max_seconds\": 180,\n    \"reason\": \"payment\",\n})\nprint(call_pci)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/pci \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"action\": \"pause\",\n  \"max_seconds\": 180,\n  \"reason\": \"payment\"\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/recording": {
			"get": {
				"description": "Redirects (302) to a signed URL that streams the recording for 15 minutes, with no API key. With `format=json`, answers that URL as a `recording_link` object instead. The recording is stereo: the customer on the left channel, the assistant or agent on the right.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_recording) with a test-mode key.",
				"operationId": "calls_retrieve_recording",
				"parameters": [
					{
						"description": "redirect (default): 302 to the signed URL. json: the signed URL as a recording_link object.",
						"in": "query",
						"name": "format",
						"required": false,
						"schema": {
							"default": "redirect",
							"enum": [
								"redirect",
								"json"
							],
							"type": "string"
						}
					},
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RecordingLink"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"channels": 2,
									"content_type": "audio/ogg",
									"duration_ms": 99710,
									"expires_at": "2026-11-03T09:30:00.000Z",
									"object": "recording_link",
									"url": "https://api.morevoice.ai/v1/recordings/AQAAAAABAAAAAAAAAAAAAAAAAAABVjFTdEdYUjhfWjVq.kH2pQ7xV9rT4mW1zB6nD8f"
								}
							}
						},
						"description": "With format=json: the signed link. Otherwise 302 Found, Location: the signed link."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's recording",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst recordingLink = await mv.calls.retrieveRecording(\"call_7Hk2Lm9Qp\");\nconsole.log(recordingLink);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nrecording_link = client.calls.retrieve_recording(\"call_7Hk2Lm9Qp\")\nprint(recording_link)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/recording \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/scorecard": {
			"get": {
				"description": "The call's post-call QA scorecard. Calls are scored automatically when the organisation's QA policy says so; 404 until one is.\n\n[Try it in the API playground](/api/playground/?op=qa_retrieve_scorecard) with a test-mode key.",
				"operationId": "qa_retrieve_scorecard",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Scorecard"
								},
								"example": {
									"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"coaching": [
										{
											"better": "Who else decides on this?",
											"tip": "Confirm the budget owner"
										}
									],
									"compliance": {
										"issues": [],
										"verdict": "pass"
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:16:40.000Z",
									"critical_failed": [],
									"customer_sentiment": "positive",
									"disposition": "appointment",
									"error": null,
									"id": "qa_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"items": [
										{
											"critical": false,
											"evidence": [
												{
													"line": 7,
													"offset_ms": 41200,
													"quote": "What do you pay today?",
													"speaker": "agent"
												}
											],
											"key": "discovery",
											"label": "Discovery",
											"model_score": 3,
											"override": {
												"at": "2026-11-03T10:02:00.000Z",
												"by": "Dana Levi",
												"note": "Also asked about the decision maker.",
												"score": 4
											},
											"reasoning": "Asked about the current provider and the budget before the offer.",
											"score": 4,
											"weight": 40
										}
									],
									"livemode": true,
									"model": "gpt-4.1",
									"model_score": 77.5,
									"next_steps": [
										"Send the demo invite"
									],
									"object": "scorecard",
									"objections": [
										{
											"agent_response": "Compared it with today's costs.",
											"handled": true,
											"text": "It sounds expensive"
										}
									],
									"pass_threshold": 70,
									"passed": true,
									"rubric_source": "default",
									"score": 82.5,
									"status": "done",
									"strengths": [
										"Clear opening"
									],
									"summary": "The customer agreed to a demo on Monday.",
									"updated": "2026-11-03T10:02:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's QA scorecard",
				"tags": [
					"QA"
				],
				"x-morevoice-scopes": [
					"qa:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst scorecard = await mv.qa.retrieveScorecard(\"call_7Hk2Lm9Qp\");\nconsole.log(scorecard);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nscorecard = client.qa.retrieve_scorecard(\"call_7Hk2Lm9Qp\")\nprint(scorecard)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/scorecard \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/scorecard/items/{item_key}": {
			"patch": {
				"description": "Sets one rubric item's score (0–5, or null for not applicable) as a supervisor would, or removes the override with `clear: true`. The call's score and pass are recomputed; the change is in the scorecard's history.\n\n[Try it in the API playground](/api/playground/?op=qa_override_scorecard_item) with a test-mode key.",
				"operationId": "qa_override_scorecard_item",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "The rubric item's key.",
						"in": "path",
						"name": "item_key",
						"required": true,
						"schema": {
							"pattern": "^[a-z0-9_-]{1,40}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ScorecardItemOverrideParamsInput"
							},
							"example": {
								"note": "Also asked about the decision maker.",
								"score": 4
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Scorecard"
								},
								"example": {
									"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"coaching": [
										{
											"better": "Who else decides on this?",
											"tip": "Confirm the budget owner"
										}
									],
									"compliance": {
										"issues": [],
										"verdict": "pass"
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:16:40.000Z",
									"critical_failed": [],
									"customer_sentiment": "positive",
									"disposition": "appointment",
									"error": null,
									"id": "qa_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"items": [
										{
											"critical": false,
											"evidence": [
												{
													"line": 7,
													"offset_ms": 41200,
													"quote": "What do you pay today?",
													"speaker": "agent"
												}
											],
											"key": "discovery",
											"label": "Discovery",
											"model_score": 3,
											"override": {
												"at": "2026-11-03T10:02:00.000Z",
												"by": "Dana Levi",
												"note": "Also asked about the decision maker.",
												"score": 4
											},
											"reasoning": "Asked about the current provider and the budget before the offer.",
											"score": 4,
											"weight": 40
										}
									],
									"livemode": true,
									"model": "gpt-4.1",
									"model_score": 77.5,
									"next_steps": [
										"Send the demo invite"
									],
									"object": "scorecard",
									"objections": [
										{
											"agent_response": "Compared it with today's costs.",
											"handled": true,
											"text": "It sounds expensive"
										}
									],
									"pass_threshold": 70,
									"passed": true,
									"rubric_source": "default",
									"score": 82.5,
									"status": "done",
									"strengths": [
										"Clear opening"
									],
									"summary": "The customer agreed to a demo on Monday.",
									"updated": "2026-11-03T10:02:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Override a scorecard item",
				"tags": [
					"QA"
				],
				"x-morevoice-scopes": [
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst scorecard = await mv.qa.overrideScorecardItem(\"call_7Hk2Lm9Qp\", \"item_key_123\", {\n\tnote: \"Also asked about the decision maker.\",\n\tscore: 4,\n});\nconsole.log(scorecard);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nscorecard = client.qa.override_scorecard_item(\"call_7Hk2Lm9Qp\", \"item_key_123\", {\n    \"note\": \"Also asked about the decision maker.\",\n    \"score\": 4,\n})\nprint(scorecard)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/scorecard/items/item_key_123 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"note\": \"Also asked about the decision maker.\",\n  \"score\": 4\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/scorecard/run": {
			"post": {
				"description": "Scores the call against its rubric now, even when it is too short for automatic scoring, and answers the scorecard (it can take a few seconds). A call that already has a finished scorecard is not scored again unless `force` is true. 409 while the call is in progress.\n\n[Try it in the API playground](/api/playground/?op=qa_run_scorecard) with a test-mode key.",
				"operationId": "qa_run_scorecard",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ScorecardRunParamsInput"
							},
							"example": {
								"force": false
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Scorecard"
								},
								"example": {
									"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"coaching": [
										{
											"better": "Who else decides on this?",
											"tip": "Confirm the budget owner"
										}
									],
									"compliance": {
										"issues": [],
										"verdict": "pass"
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:16:40.000Z",
									"critical_failed": [],
									"customer_sentiment": "positive",
									"disposition": "appointment",
									"error": null,
									"id": "qa_5Fh7Jk9Lm1Np3Qr5St7Vx9",
									"items": [
										{
											"critical": false,
											"evidence": [
												{
													"line": 7,
													"offset_ms": 41200,
													"quote": "What do you pay today?",
													"speaker": "agent"
												}
											],
											"key": "discovery",
											"label": "Discovery",
											"model_score": 3,
											"override": {
												"at": "2026-11-03T10:02:00.000Z",
												"by": "Dana Levi",
												"note": "Also asked about the decision maker.",
												"score": 4
											},
											"reasoning": "Asked about the current provider and the budget before the offer.",
											"score": 4,
											"weight": 40
										}
									],
									"livemode": true,
									"model": "gpt-4.1",
									"model_score": 77.5,
									"next_steps": [
										"Send the demo invite"
									],
									"object": "scorecard",
									"objections": [
										{
											"agent_response": "Compared it with today's costs.",
											"handled": true,
											"text": "It sounds expensive"
										}
									],
									"pass_threshold": 70,
									"passed": true,
									"rubric_source": "default",
									"score": 82.5,
									"status": "done",
									"strengths": [
										"Clear opening"
									],
									"summary": "The customer agreed to a demo on Monday.",
									"updated": "2026-11-03T10:02:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Score a call",
				"tags": [
					"QA"
				],
				"x-morevoice-scopes": [
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst scorecard = await mv.qa.run.scorecard(\"call_7Hk2Lm9Qp\", {\n\tforce: false,\n});\nconsole.log(scorecard);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nscorecard = client.qa.run.scorecard(\"call_7Hk2Lm9Qp\", {\n    \"force\": False,\n})\nprint(scorecard)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/scorecard/run \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"force\": false\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/streams": {
			"post": {
				"description": "Starts a media stream on a live call in `fork` mode: a one-way copy of the caller (`inbound`), what the caller hears (`outbound`), or both, sent to your `wss://` URL as Twilio Media Streams messages (`connected`, `start`, `media`, `stop`). The call goes on exactly as before: if your server is slow, frames older than 2 s are dropped (`frames_dropped`); if it disconnects, the stream reconnects (3 tries) and otherwise gives up (`failed`) without touching the call. The upgrade request is signed with your signing secret over its path and query (`webhook-id` is the stream's ID). The stream stops when the call ends or with DELETE. At most 2 streams per call.\n\n[Try it in the API playground](/api/playground/?op=calls_create_stream) with a test-mode key.",
				"operationId": "calls_create_stream",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/MediaStreamCreateParamsInput"
							},
							"example": {
								"custom_parameters": {
									"crm_id": "42"
								},
								"format": "mulaw_8000",
								"tracks": "both",
								"url": "wss://media.example.com/streams"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MediaStream"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"created": "2026-11-03T09:14:22.000Z",
									"custom_parameters": {
										"crm_id": "42"
									},
									"ended_reason": null,
									"format": "mulaw_8000",
									"frames_dropped": 0,
									"frames_sent": 0,
									"id": "ms_4fG7hJ2kL9mN3pQ6rS8tUv",
									"livemode": true,
									"mode": "fork",
									"object": "media_stream",
									"status": "connecting",
									"tracks": "both",
									"url": "wss://media.example.com/streams"
								}
							}
						},
						"description": "The stream, connecting."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stream a call's audio to your WebSocket",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst mediaStream = await mv.calls.createStream(\"call_7Hk2Lm9Qp\", {\n\tcustom_parameters: {\n\t\tcrm_id: \"42\",\n\t},\n\tformat: \"mulaw_8000\",\n\ttracks: \"both\",\n\turl: \"wss://media.example.com/streams\",\n});\nconsole.log(mediaStream);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nmedia_stream = client.calls.create_stream(\"call_7Hk2Lm9Qp\", {\n    \"custom_parameters\": {\n        \"crm_id\": \"42\",\n    },\n    \"format\": \"mulaw_8000\",\n    \"tracks\": \"both\",\n    \"url\": \"wss://media.example.com/streams\",\n})\nprint(media_stream)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/streams \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"custom_parameters\": {\n    \"crm_id\": \"42\"\n  },\n  \"format\": \"mulaw_8000\",\n  \"tracks\": \"both\",\n  \"url\": \"wss://media.example.com/streams\"\n}'\n"
					}
				]
			}
		},
		"/calls/{id}/streams/{stream_id}": {
			"delete": {
				"description": "Stops the stream: what is queued is flushed, your server gets `stop`, and the socket closes. The call is not affected. Streams also stop on their own when the call ends.\n\n[Try it in the API playground](/api/playground/?op=calls_delete_stream) with a test-mode key.",
				"operationId": "calls_delete_stream",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "The stream's ID (`ms_…`).",
						"example": "ms_4fG7hJ2kL9mN3pQ6rS8tUv",
						"in": "path",
						"name": "stream_id",
						"required": true,
						"schema": {
							"pattern": "^ms_[0-9A-Za-z]{22}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MediaStream"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"created": "2026-11-03T09:14:22.000Z",
									"custom_parameters": {
										"crm_id": "42"
									},
									"ended_reason": null,
									"format": "mulaw_8000",
									"frames_dropped": 0,
									"frames_sent": 0,
									"id": "ms_4fG7hJ2kL9mN3pQ6rS8tUv",
									"livemode": true,
									"mode": "fork",
									"object": "media_stream",
									"status": "connecting",
									"tracks": "both",
									"url": "wss://media.example.com/streams"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stop a media stream",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst mediaStream = await mv.calls.deleteStream(\"call_7Hk2Lm9Qp\", \"ms_4fG7hJ2kL9mN3pQ6rS8tUv\");\nconsole.log(mediaStream);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nmedia_stream = client.calls.delete_stream(\"call_7Hk2Lm9Qp\", \"ms_4fG7hJ2kL9mN3pQ6rS8tUv\")\nprint(media_stream)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/streams/ms_4fG7hJ2kL9mN3pQ6rS8tUv \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/calls/{id}/summary": {
			"get": {
				"description": "The AI summary written when the call ended (when the assistant's summary artefact is on), or the last one created with POST.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_summary) with a test-mode key.",
				"operationId": "calls_retrieve_summary",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallSummary"
								},
								"example": {
									"action_items": [],
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"generated_at": "2026-11-03T09:14:22.000Z",
									"intent": "Order status",
									"key_points": [
										"Order A-1042 ships on Monday"
									],
									"object": "call_summary",
									"outcome": "Customer informed; no follow-up needed",
									"sentiment": "positive",
									"text": "The customer asked about the status of order A-1042. The assistant confirmed it ships on Monday."
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's summary",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callSummary = await mv.calls.retrieveSummary(\"call_7Hk2Lm9Qp\");\nconsole.log(callSummary);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_summary = client.calls.retrieve_summary(\"call_7Hk2Lm9Qp\")\nprint(call_summary)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/summary \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Writes a new AI summary from the transcript and returns it (it replaces the stored one). Send an Idempotency-Key: a retry then returns the same summary instead of writing another.\n\n[Try it in the API playground](/api/playground/?op=calls_create_summary) with a test-mode key.",
				"operationId": "calls_create_summary",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {},
							"schema": {
								"additionalProperties": false,
								"description": "No parameters.",
								"properties": {},
								"type": "object"
							}
						}
					},
					"description": "No parameters.",
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallSummary"
								},
								"example": {
									"action_items": [],
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"generated_at": "2026-11-03T09:14:22.000Z",
									"intent": "Order status",
									"key_points": [
										"Order A-1042 ships on Monday"
									],
									"object": "call_summary",
									"outcome": "Customer informed; no follow-up needed",
									"sentiment": "positive",
									"text": "The customer asked about the status of order A-1042. The assistant confirmed it ships on Monday."
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Summarise a call again",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callSummary = await mv.calls.createSummary(\"call_7Hk2Lm9Qp\", {});\nconsole.log(callSummary);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_summary = client.calls.create_summary(\"call_7Hk2Lm9Qp\", {})\nprint(call_summary)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/summary \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/calls/{id}/transcript": {
			"get": {
				"description": "Everything said on the call, in order, with the speaker of each segment. While the call runs, the transcript so far.\n\n[Try it in the API playground](/api/playground/?op=calls_retrieve_transcript) with a test-mode key.",
				"operationId": "calls_retrieve_transcript",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Transcript"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"language": "he",
									"object": "transcript",
									"segments": [
										{
											"end_ms": 3900,
											"interrupted": false,
											"speaker": "assistant",
											"start_ms": 820,
											"text": "שלום, כאן דנה ממוקד השירות. במה אפשר לעזור?",
											"tool": null
										},
										{
											"end_ms": 6100,
											"interrupted": false,
											"speaker": "customer",
											"start_ms": 4400,
											"text": "רציתי לבדוק מה עם ההזמנה שלי",
											"tool": null
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a call's transcript",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst transcript = await mv.calls.retrieveTranscript(\"call_7Hk2Lm9Qp\");\nconsole.log(transcript);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ntranscript = client.calls.retrieve_transcript(\"call_7Hk2Lm9Qp\")\nprint(transcript)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/transcript \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/calls/{id}/transcript/stream": {
			"get": {
				"description": "Server-Sent Events with what is said on a call as it is said: `transcript.partial` while a line is spoken (its text so far) and `transcript.final` when it is complete. A final supersedes the partials with the same `utterance_id`. `speaker` is `customer` (the caller), `assistant` (the AI), `agent` (a human agent), `supervisor` or `external` (a transfer party); AI and human calls alike. `start_ms` and `end_ms` are when the line began and became final, in milliseconds from the call's start, as observed live (null for lines spoken before the stream connected; the call's transcript has the exact times after the call). The stream starts with the conversation so far and ends with `call.ended`. Reconnect with `Last-Event-ID` to get only what you missed. Send `partials=false` for complete lines only. Counts against the key's stream limit (`concurrency_limit`, `limit_type: api_streams`).\n\n[Try it in the API playground](/api/playground/?op=calls_transcript_stream) with a test-mode key.",
				"operationId": "calls_transcript_stream",
				"parameters": [
					{
						"description": "`false`: only complete lines (`transcript.final`), no partials. Default `true`.",
						"in": "query",
						"name": "partials",
						"required": false,
						"schema": {
							"enum": [
								"true",
								"false"
							],
							"type": "string"
						}
					},
					{
						"description": "Resume after this event, for clients that cannot send the `Last-Event-ID` header (the header wins when both are sent).",
						"in": "query",
						"name": "last_event_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/event-stream": {
								"schema": {
									"description": "A text/event-stream of `transcript.partial` and `transcript.final` events, then `call.ended`. Each frame is `id: <call_…>:<n>`, `event: <type>` and one `data:` line with the event envelope; `data.object` is the line: `call_id`, `utterance_id` (a final supersedes the partials with the same id), `speaker` (`customer`, `assistant`, `agent`, `supervisor` or `external`), `role` (the internal role), `text`, `final`, `interrupted` (the caller cut the assistant off), `start_ms` and `end_ms` (ms from the call's start, observed live; null when unknown) and `language` (the call's configured language, BCP 47; null when unknown). Comment lines (`: ping`) keep the connection alive every 15 s.",
									"examples": [
										"retry: 3000\n\nid: call_8tRPaZp5hLMbrGqdJ9AmNa:2\nevent: transcript.partial\ndata: {\"id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa:2\",\"object\":\"event\",\"type\":\"transcript.partial\",\"created\":\"2026-11-03T09:14:23Z\",\"api_version\":\"2026-11-01\",\"livemode\":true,\"org_id\":\"org_0000000000000000000001\",\"data\":{\"object\":{\"call_id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa\",\"utterance_id\":\"u1\",\"speaker\":\"customer\",\"role\":\"user\",\"text\":\"Hi, where is\",\"final\":false,\"interrupted\":false,\"start_ms\":4120,\"end_ms\":null,\"language\":\"en-US\"}}}\n\nid: call_8tRPaZp5hLMbrGqdJ9AmNa:3\nevent: transcript.final\ndata: {\"id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa:3\",\"object\":\"event\",\"type\":\"transcript.final\",\"created\":\"2026-11-03T09:14:24Z\",\"api_version\":\"2026-11-01\",\"livemode\":true,\"org_id\":\"org_0000000000000000000001\",\"data\":{\"object\":{\"call_id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa\",\"utterance_id\":\"u1\",\"speaker\":\"customer\",\"role\":\"user\",\"text\":\"Hi, where is my order?\",\"final\":true,\"interrupted\":false,\"start_ms\":4120,\"end_ms\":5310,\"language\":\"en-US\"}}}\n\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The transcript stream."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stream a call's live transcript",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.calls.transcriptStream(\"call_7Hk2Lm9Qp\")) {\n\tconsole.log(event.type, event.data.object);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "import os\n\nimport httpx\n\nurl = \"https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/transcript/stream\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['MOREVOICE_API_KEY']}\", \"Accept\": \"text/event-stream\"}\nwith httpx.stream(\"GET\", url, headers=headers, timeout=None) as response:\n    response.raise_for_status()\n    for line in response.iter_lines():\n        if line.startswith(\"data:\"):\n            print(line[5:].strip())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/transcript/stream \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Accept: text/event-stream\" -N\n"
					}
				]
			}
		},
		"/calls/{id}/transfer": {
			"post": {
				"description": "AI and IVR calls: to a queue or a phone number (warm: `note` is whispered to the person who answers). Calls handled by a human agent: to a queue, a number, an AI assistant or another agent, cold or warm (warm: the agent consults the target first; finish with POST …/consult/complete). Returns the call's control state.\n\n[Try it in the API playground](/api/playground/?op=calls_transfer) with a test-mode key.",
				"operationId": "calls_transfer",
				"parameters": [
					{
						"description": "A call ID (`call_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^call_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"examples": {
								"number": {
									"summary": "To a phone number, whispering context",
									"value": {
										"mode": "warm",
										"note": "VIP customer, order A-1042",
										"to": {
											"number": "+97235551234"
										}
									}
								},
								"queue": {
									"summary": "To a queue",
									"value": {
										"mode": "cold",
										"note": "Asked for a refund on order A-1042",
										"to": {
											"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									}
								}
							},
							"schema": {
								"additionalProperties": false,
								"description": "Where to transfer the call.",
								"properties": {
									"mode": {
										"default": "cold",
										"description": "cold: hand the call over. warm: talk to the target first (human calls), or whisper `note` to them (AI calls).",
										"enum": [
											"cold",
											"warm"
										],
										"type": "string"
									},
									"note": {
										"description": "Context for the target: shown with the queued call, whispered on a warm transfer.",
										"maxLength": 1000,
										"type": "string"
									},
									"to": {
										"additionalProperties": false,
										"description": "Where to: a queue, a phone number, an AI assistant or a human agent.",
										"properties": {
											"agent_id": {
												"description": "A user ID (`usr_…`).",
												"maxLength": 200,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											"assistant_id": {
												"description": "A assistant ID (`asst_…`).",
												"maxLength": 200,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											"number": {
												"pattern": "^\\+[1-9]\\d{6,14}$",
												"type": "string"
											},
											"queue_id": {
												"description": "A queue ID (`q_…`).",
												"maxLength": 200,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											}
										},
										"type": "object"
									}
								},
								"required": [
									"to"
								],
								"type": "object"
							}
						}
					},
					"description": "Where to transfer the call.",
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CallControl"
								},
								"example": {
									"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"consult": null,
									"held": false,
									"object": "call_control",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "client",
											"muted": false,
											"name": "+972501234567",
											"number": "+972501234567",
											"participant_id": "client",
											"role": "member",
											"state": "connected",
											"user_id": null
										},
										{
											"held": false,
											"joined_at": "2026-11-03T09:14:22.000Z",
											"kind": "agent",
											"muted": false,
											"name": "Noa",
											"number": null,
											"participant_id": "agent",
											"role": "moderator",
											"state": "connected",
											"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										}
									],
									"phase": "active",
									"recording": true,
									"status": "in_progress",
									"type": "human"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Transfer a call",
				"tags": [
					"Calls"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst callControl = await mv.calls.transfer(\"call_7Hk2Lm9Qp\", {\n\tmode: \"warm\",\n\tnote: \"VIP customer, order A-1042\",\n\tto: {\n\t\tnumber: \"+97235551234\",\n\t},\n});\nconsole.log(callControl);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall_control = client.calls.transfer(\"call_7Hk2Lm9Qp\", {\n    \"mode\": \"warm\",\n    \"note\": \"VIP customer, order A-1042\",\n    \"to\": {\n        \"number\": \"+97235551234\",\n    },\n})\nprint(call_control)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/calls/call_7Hk2Lm9Qp/transfer \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"mode\": \"warm\",\n  \"note\": \"VIP customer, order A-1042\",\n  \"to\": {\n    \"number\": \"+97235551234\"\n  }\n}'\n"
					}
				]
			}
		},
		"/campaigns": {
			"get": {
				"operationId": "campaigns_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only campaigns in this state.",
						"in": "query",
						"name": "state",
						"required": false,
						"schema": {
							"enum": [
								"draft",
								"scheduled",
								"running",
								"paused",
								"completed",
								"cancelled"
							],
							"type": "string"
						}
					},
					{
						"description": "Only campaigns with this purpose.",
						"in": "query",
						"name": "purpose",
						"required": false,
						"schema": {
							"enum": [
								"marketing",
								"service",
								"survey"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignList"
								},
								"example": {
									"data": [
										{
											"amd": {
												"message": "",
												"mode": "off"
											},
											"assistant_id": "asst_3kTzL9Qe2R",
											"caller_id": "+97235550100",
											"calls_per_second": 0,
											"completed_at": null,
											"connection_id": "conn_8DbH2nXy",
											"created_at": "2026-11-01T08:00:00.000Z",
											"disclosure": {
												"enabled": null,
												"text": ""
											},
											"dispositions": [
												"interested",
												"not-interested",
												"callback-requested"
											],
											"first_message": "",
											"id": "cmp_2Yb7mCq9aPLk",
											"livemode": true,
											"max_concurrent": 10,
											"name": "November renewals",
											"object": "campaign",
											"opt_out_dtmf_key": null,
											"pause_reason": null,
											"priority": 5,
											"purpose": "marketing",
											"retry": {
												"busy": {
													"delay_minutes": 15,
													"enabled": true
												},
												"declined": {
													"delay_minutes": 240,
													"enabled": false
												},
												"failed": {
													"delay_minutes": 10,
													"enabled": true
												},
												"max_attempts": 3,
												"no_answer": {
													"delay_minutes": 60,
													"enabled": true
												},
												"voicemail": {
													"delay_minutes": 120,
													"enabled": true
												}
											},
											"ring_timeout_seconds": 30,
											"schedule": {
												"end_at": null,
												"respect_holidays": true,
												"respect_shabbat": true,
												"start_at": null,
												"timezone": "Asia/Jerusalem",
												"windows": [
													{
														"days": [
															"sun",
															"mon",
															"tue",
															"wed",
															"thu"
														],
														"end": "20:00",
														"start": "09:00"
													},
													{
														"days": [
															"fri"
														],
														"end": "13:00",
														"start": "09:00"
													}
												]
											},
											"script": "Offer the {{plan}} renewal at the loyalty price.",
											"started_at": "2026-11-02T07:00:00.000Z",
											"state": "running",
											"stats": {
												"by_status": {
													"callback": 3,
													"cancelled": 0,
													"dialing": 5,
													"dnc": 9,
													"done": 120,
													"failed": 6,
													"invalid": 1,
													"pending": 812,
													"scheduled": 40,
													"skipped": 4
												},
												"finished": 140,
												"live": {
													"connected": 1,
													"dialing": 2,
													"ringing": 2
												},
												"total": 1000
											},
											"updated_at": "2026-11-02T07:00:00.000Z"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/campaigns"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List campaigns",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:read"
				],
				"description": "Lists the campaigns of this mode, newest first, with each campaign's contact counts. Filter by `state` or `purpose`.\n\n[Try it in the API playground](/api/playground/?op=campaigns_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const campaign of mv.campaigns.list()) {\n\tconsole.log(campaign);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor campaign in client.campaigns.list():\n    print(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Creates a draft campaign. Add contacts, then start it. The purpose decides the compliance checks: marketing needs consent with evidence (§30A) and, for Israeli numbers, the national do-not-call registry.\n\n[Try it in the API playground](/api/playground/?op=campaigns_create) with a test-mode key.",
				"operationId": "campaigns_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignCreateParamsInput"
							},
							"example": {
								"assistant_id": "asst_3kTzL9Qe2R",
								"name": "November renewals",
								"purpose": "marketing",
								"retry": {
									"busy": {
										"delay_minutes": 30
									},
									"max_attempts": 3,
									"no_answer": {
										"delay_minutes": 240
									}
								},
								"schedule": {
									"respect_shabbat": true,
									"timezone": "Asia/Jerusalem",
									"windows": [
										{
											"days": [
												"sun",
												"mon",
												"tue",
												"wed",
												"thu"
											],
											"end": "19:00",
											"start": "09:00"
										}
									]
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.create({\n\tassistant_id: \"asst_3kTzL9Qe2R\",\n\tname: \"November renewals\",\n\tpurpose: \"marketing\",\n\tretry: {\n\t\tbusy: {\n\t\t\tdelay_minutes: 30,\n\t\t},\n\t\tmax_attempts: 3,\n\t\tno_answer: {\n\t\t\tdelay_minutes: 240,\n\t\t},\n\t},\n\tschedule: {\n\t\trespect_shabbat: true,\n\t\ttimezone: \"Asia/Jerusalem\",\n\t\twindows: [\n\t\t\t{\n\t\t\t\tdays: [\n\t\t\t\t\t\"sun\",\n\t\t\t\t\t\"mon\",\n\t\t\t\t\t\"tue\",\n\t\t\t\t\t\"wed\",\n\t\t\t\t\t\"thu\",\n\t\t\t\t],\n\t\t\t\tend: \"19:00\",\n\t\t\t\tstart: \"09:00\",\n\t\t\t},\n\t\t],\n\t},\n});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.create({\n    \"assistant_id\": \"asst_3kTzL9Qe2R\",\n    \"name\": \"November renewals\",\n    \"purpose\": \"marketing\",\n    \"retry\": {\n        \"busy\": {\n            \"delay_minutes\": 30,\n        },\n        \"max_attempts\": 3,\n        \"no_answer\": {\n            \"delay_minutes\": 240,\n        },\n    },\n    \"schedule\": {\n        \"respect_shabbat\": True,\n        \"timezone\": \"Asia/Jerusalem\",\n        \"windows\": [\n            {\n                \"days\": [\n                    \"sun\",\n                    \"mon\",\n                    \"tue\",\n                    \"wed\",\n                    \"thu\",\n                ],\n                \"end\": \"19:00\",\n                \"start\": \"09:00\",\n            },\n        ],\n    },\n})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"assistant_id\": \"asst_3kTzL9Qe2R\",\n  \"name\": \"November renewals\",\n  \"purpose\": \"marketing\",\n  \"retry\": {\n    \"busy\": {\n      \"delay_minutes\": 30\n    },\n    \"max_attempts\": 3,\n    \"no_answer\": {\n      \"delay_minutes\": 240\n    }\n  },\n  \"schedule\": {\n    \"respect_shabbat\": true,\n    \"timezone\": \"Asia/Jerusalem\",\n    \"windows\": [\n      {\n        \"days\": [\n          \"sun\",\n          \"mon\",\n          \"tue\",\n          \"wed\",\n          \"thu\"\n        ],\n        \"end\": \"19:00\",\n        \"start\": \"09:00\"\n      }\n    ]\n  }\n}'\n"
					}
				]
			}
		},
		"/campaigns/{id}": {
			"delete": {
				"description": "Deletes a campaign that is not running or scheduled, with its contacts and attempts. Calls already made stay in the call log.\n\n[Try it in the API playground](/api/playground/?op=campaigns_delete) with a test-mode key.",
				"operationId": "campaigns_delete",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedCampaign"
								},
								"example": {
									"deleted": true,
									"id": "cmp_2Yb7mCq9aPLk",
									"object": "campaign"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedCampaign = await mv.campaigns.delete(\"cmp_7Hk2Lm9Qp\");\nconsole.log(deletedCampaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_campaign = client.campaigns.delete(\"cmp_7Hk2Lm9Qp\")\nprint(deleted_campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "campaigns_retrieve",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:read"
				],
				"description": "Returns a campaign: its settings, its state and its contact counts. `GET /v1/campaigns/{id}/stats` has the detailed results.\n\n[Try it in the API playground](/api/playground/?op=campaigns_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.retrieve(\"cmp_7Hk2Lm9Qp\");\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.retrieve(\"cmp_7Hk2Lm9Qp\")\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Changes the fields you send and keeps the rest. A completed or cancelled campaign can't change; pause a running one before changing its purpose.\n\n[Try it in the API playground](/api/playground/?op=campaigns_update) with a test-mode key.",
				"operationId": "campaigns_update",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignUpdateParamsInput"
							},
							"example": {
								"max_concurrent": 20,
								"schedule": {
									"end_at": "2026-11-30T18:00:00+02:00"
								}
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.update(\"cmp_7Hk2Lm9Qp\", {\n\tmax_concurrent: 20,\n\tschedule: {\n\t\tend_at: \"2026-11-30T18:00:00+02:00\",\n\t},\n});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.update(\"cmp_7Hk2Lm9Qp\", {\n    \"max_concurrent\": 20,\n    \"schedule\": {\n        \"end_at\": \"2026-11-30T18:00:00+02:00\",\n    },\n})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"max_concurrent\": 20,\n  \"schedule\": {\n    \"end_at\": \"2026-11-30T18:00:00+02:00\"\n  }\n}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/cancel": {
			"post": {
				"description": "Stops the campaign for good: unanswered calls are hung up and the contacts not yet dialled are cancelled.\n\n[Try it in the API playground](/api/playground/?op=campaigns_cancel) with a test-mode key.",
				"operationId": "campaigns_cancel",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignActionParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Cancel a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.cancel(\"cmp_7Hk2Lm9Qp\", {});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.cancel(\"cmp_7Hk2Lm9Qp\", {})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/cancel \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/contacts": {
			"get": {
				"operationId": "campaigns_contacts_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only these statuses, comma-separated (e.g. pending,scheduled).",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"maxLength": 200,
							"type": "string"
						}
					},
					{
						"description": "Only contacts with this recorded disposition.",
						"in": "query",
						"name": "outcome",
						"required": false,
						"schema": {
							"maxLength": 60,
							"type": "string"
						}
					},
					{
						"description": "Only this number.",
						"in": "query",
						"name": "phone",
						"required": false,
						"schema": {
							"maxLength": 40,
							"type": "string"
						}
					},
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignContactList"
								},
								"example": {
									"data": [],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/campaigns/cmp_2Yb7mCq9aPLk/contacts"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a campaign's contacts",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:read"
				],
				"description": "Lists the contacts of a campaign, newest first, with each contact's status, attempts and outcome. Filter by `status` (several, comma-separated), by `outcome` (the recorded disposition) or by `phone`.\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const contact of mv.campaigns.contacts.list(\"cmp_7Hk2Lm9Qp\")) {\n\tconsole.log(contact);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor contact in client.campaigns.contacts.list(\"cmp_7Hk2Lm9Qp\"):\n    print(contact)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Adds up to 1,000 contacts and answers what was added and what was left out, like a dashboard import of the same list: numbers are normalised and de-duplicated, do-not-call numbers are kept as dnc (never dialled), and in a marketing campaign a contact without consent evidence is added but skipped by the dialer (§30A).\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_create) with a test-mode key.",
				"operationId": "campaigns_contacts_create",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactBatchParamsInput"
							},
							"example": {
								"contacts": [
									{
										"consent": {
											"channel": "web",
											"granted_at": "2026-09-20T14:02:00+03:00",
											"source": "website_form_2026"
										},
										"name": "Dana Levi",
										"phone": "+972501234567",
										"variables": {
											"plan": "Gold"
										}
									},
									{
										"name": "Yossi Cohen",
										"phone": "052-765-4321",
										"variables": {
											"plan": "Silver"
										}
									}
								],
								"default_country": "IL"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ContactBatchResult"
								},
								"example": {
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"consent_recorded": 1,
									"errors": [
										{
											"index": 2,
											"message": "On the do-not-call list",
											"phone": "+972541112233",
											"reason": "dnc"
										}
									],
									"imported": 2,
									"livemode": true,
									"object": "contact_batch_result",
									"received": 3,
									"rejected": 1,
									"rejected_reasons": {
										"dnc": 1,
										"duplicate": 0,
										"invalid": 0
									},
									"warnings": [],
									"without_consent": 1
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Add contacts to a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst contactBatchResult = await mv.campaigns.contacts.create(\"cmp_7Hk2Lm9Qp\", {\n\tcontacts: [\n\t\t{\n\t\t\tconsent: {\n\t\t\t\tchannel: \"web\",\n\t\t\t\tgranted_at: \"2026-09-20T14:02:00+03:00\",\n\t\t\t\tsource: \"website_form_2026\",\n\t\t\t},\n\t\t\tname: \"Dana Levi\",\n\t\t\tphone: \"+972501234567\",\n\t\t\tvariables: {\n\t\t\t\tplan: \"Gold\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Yossi Cohen\",\n\t\t\tphone: \"052-765-4321\",\n\t\t\tvariables: {\n\t\t\t\tplan: \"Silver\",\n\t\t\t},\n\t\t},\n\t],\n\tdefault_country: \"IL\",\n});\nconsole.log(contactBatchResult);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncontact_batch_result = client.campaigns.contacts.create(\"cmp_7Hk2Lm9Qp\", {\n    \"contacts\": [\n        {\n            \"consent\": {\n                \"channel\": \"web\",\n                \"granted_at\": \"2026-09-20T14:02:00+03:00\",\n                \"source\": \"website_form_2026\",\n            },\n            \"name\": \"Dana Levi\",\n            \"phone\": \"+972501234567\",\n            \"variables\": {\n                \"plan\": \"Gold\",\n            },\n        },\n        {\n            \"name\": \"Yossi Cohen\",\n            \"phone\": \"052-765-4321\",\n            \"variables\": {\n                \"plan\": \"Silver\",\n            },\n        },\n    ],\n    \"default_country\": \"IL\",\n})\nprint(contact_batch_result)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"contacts\": [\n    {\n      \"consent\": {\n        \"channel\": \"web\",\n        \"granted_at\": \"2026-09-20T14:02:00+03:00\",\n        \"source\": \"website_form_2026\"\n      },\n      \"name\": \"Dana Levi\",\n      \"phone\": \"+972501234567\",\n      \"variables\": {\n        \"plan\": \"Gold\"\n      }\n    },\n    {\n      \"name\": \"Yossi Cohen\",\n      \"phone\": \"052-765-4321\",\n      \"variables\": {\n        \"plan\": \"Silver\"\n      }\n    }\n  ],\n  \"default_country\": \"IL\"\n}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/contacts/import": {
			"post": {
				"description": "Imports a CSV or XLSX list in the background through the dashboard's import path and answers 202 with the import; poll GET /v1/imports/{id} until it succeeds or fails. Send the file as multipart/form-data (a `file` part plus the options as text fields, `mapping` as a JSON string), or as JSON: CSV text, a base64 file, or an https URL to download. An Idempotency-Key is required, so a retried upload never imports twice.\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_import) with a test-mode key.",
				"operationId": "campaigns_contacts_import",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactImportParamsInput"
							},
							"example": {
								"csv": "Mobile,Name,Plan\n0501234567,Dana Levi,Gold\n0527654321,Yossi Cohen,Silver\n",
								"default_country": "IL",
								"mapping": {
									"name": "Name",
									"phone": "Mobile",
									"variables": {
										"plan": "Plan"
									}
								}
							}
						},
						"multipart/form-data": {
							"schema": {
								"description": "The import as multipart/form-data: the file part plus the same options as text fields.",
								"properties": {
									"consent_channel": {
										"description": "How every consenting row consented, when the file has no channel column.",
										"enum": [
											"web",
											"phone",
											"sms",
											"email",
											"whatsapp",
											"app",
											"written",
											"in_person",
											"other"
										],
										"type": "string"
									},
									"consent_source": {
										"description": "Where every consenting row consented, when the file has no source column.",
										"type": "string"
									},
									"default_country": {
										"description": "ISO 3166-1 alpha-2 country of numbers without a country code (default IL).",
										"type": "string"
									},
									"drop_dnc": {
										"description": "Leave do-not-call numbers out entirely.",
										"enum": [
											"true",
											"false"
										],
										"type": "string"
									},
									"file": {
										"description": "The CSV or XLSX file (up to 10 MB).",
										"format": "binary",
										"type": "string"
									},
									"filename": {
										"description": "The file's name, when the file part carries none; .xlsx is read as a spreadsheet.",
										"type": "string"
									},
									"has_header": {
										"description": "The first row holds column names (default: detected).",
										"enum": [
											"true",
											"false"
										],
										"type": "string"
									},
									"mapping": {
										"contentMediaType": "application/json",
										"description": "A JSON object: contact field → column header, e.g. {\"phone\":\"Mobile\",\"name\":\"Name\",\"plan\":\"Plan\"}.",
										"type": "string"
									}
								},
								"required": [
									"file"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"202": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ContactImport"
								},
								"example": {
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"completed_at": "2026-11-02T07:00:03.870Z",
									"consent_recorded": 0,
									"created_at": "2026-11-02T07:00:00.000Z",
									"error": null,
									"errors": [
										{
											"message": "too-short",
											"phone": "05012",
											"reason": "invalid",
											"row": 17
										}
									],
									"filename": "contacts.csv",
									"id": "imp_7RkXq2Lm9PvTz4nB1c8Ya",
									"imported": 4890,
									"livemode": true,
									"object": "import",
									"received": 5000,
									"rejected": 110,
									"rejected_reasons": {
										"dnc": 20,
										"duplicate": 40,
										"invalid": 50
									},
									"source": "csv",
									"started_at": "2026-11-02T07:00:00.120Z",
									"status": "succeeded",
									"warnings": [],
									"without_consent": 0
								}
							}
						},
						"description": "Accepted: the import runs in the background."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Import a contact list in the background",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst contactImport = await mv.campaigns.contacts.import(\"cmp_7Hk2Lm9Qp\", {\n\tcsv: \"Mobile,Name,Plan\\n0501234567,Dana Levi,Gold\\n0527654321,Yossi Cohen,Silver\\n\",\n\tdefault_country: \"IL\",\n\tmapping: {\n\t\tname: \"Name\",\n\t\tphone: \"Mobile\",\n\t\tvariables: {\n\t\t\tplan: \"Plan\",\n\t\t},\n\t},\n});\nconsole.log(contactImport);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncontact_import = client.campaigns.contacts.import_(\"cmp_7Hk2Lm9Qp\", {\n    \"csv\": \"Mobile,Name,Plan\\n0501234567,Dana Levi,Gold\\n0527654321,Yossi Cohen,Silver\\n\",\n    \"default_country\": \"IL\",\n    \"mapping\": {\n        \"name\": \"Name\",\n        \"phone\": \"Mobile\",\n        \"variables\": {\n            \"plan\": \"Plan\",\n        },\n    },\n})\nprint(contact_import)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts/import \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"csv\": \"Mobile,Name,Plan\\n0501234567,Dana Levi,Gold\\n0527654321,Yossi Cohen,Silver\\n\",\n  \"default_country\": \"IL\",\n  \"mapping\": {\n    \"name\": \"Name\",\n    \"phone\": \"Mobile\",\n    \"variables\": {\n      \"plan\": \"Plan\"\n    }\n  }\n}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/contacts/{contact_id}": {
			"get": {
				"operationId": "campaigns_contacts_retrieve",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A contact ID (`ctc_…`).",
						"in": "path",
						"name": "contact_id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^ctc_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignContact"
								},
								"example": {
									"attempts": 1,
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"completed_at": "2026-11-02T09:17:30.000Z",
									"consent": true,
									"created_at": "2026-11-01T08:00:00.000Z",
									"id": "ctc_1aB2cD3eF4g",
									"last_attempt_at": "2026-11-02T09:14:00.000Z",
									"last_call_id": "call_3Hk9PqR2sT",
									"last_result": "answered",
									"livemode": true,
									"name": "Dana Levi",
									"next_attempt_at": null,
									"object": "campaign_contact",
									"outcome": "interested",
									"outcome_data": {
										"notes": "Wants the annual plan"
									},
									"phone": "+972501234567",
									"row": 2,
									"skip_reason": null,
									"status": "done",
									"timezone": null,
									"updated_at": "2026-11-02T09:17:30.000Z",
									"variables": {
										"plan": "Gold"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a campaign contact",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:read"
				],
				"description": "Returns one contact of a campaign: the number, its variables, its status, how many times it was dialled and the outcome.\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaignContact = await mv.campaigns.contacts.retrieve(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\");\nconsole.log(campaignContact);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign_contact = client.campaigns.contacts.retrieve(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\")\nprint(campaign_contact)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts/ctc_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "status scheduled dials the contact again now (refused for a number on the do-not-call list); skipped takes it out of the campaign. A contact being dialled can't change.\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_update) with a test-mode key.",
				"operationId": "campaigns_contacts_update",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A contact ID (`ctc_…`).",
						"in": "path",
						"name": "contact_id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^ctc_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactUpdateParamsInput"
							},
							"example": {
								"status": "skipped"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignContact"
								},
								"example": {
									"attempts": 1,
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"completed_at": "2026-11-02T09:17:30.000Z",
									"consent": true,
									"created_at": "2026-11-01T08:00:00.000Z",
									"id": "ctc_1aB2cD3eF4g",
									"last_attempt_at": "2026-11-02T09:14:00.000Z",
									"last_call_id": "call_3Hk9PqR2sT",
									"last_result": "answered",
									"livemode": true,
									"name": "Dana Levi",
									"next_attempt_at": null,
									"object": "campaign_contact",
									"outcome": "interested",
									"outcome_data": {
										"notes": "Wants the annual plan"
									},
									"phone": "+972501234567",
									"row": 2,
									"skip_reason": null,
									"status": "done",
									"timezone": null,
									"updated_at": "2026-11-02T09:17:30.000Z",
									"variables": {
										"plan": "Gold"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Requeue or skip a campaign contact",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaignContact = await mv.campaigns.contacts.update(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\", {\n\tstatus: \"skipped\",\n});\nconsole.log(campaignContact);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign_contact = client.campaigns.contacts.update(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\", {\n    \"status\": \"skipped\",\n})\nprint(campaign_contact)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts/ctc_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"status\": \"skipped\"\n}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/contacts/{contact_id}/attempts": {
			"get": {
				"operationId": "campaigns_contacts_list_attempts",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A contact ID (`ctc_…`).",
						"in": "path",
						"name": "contact_id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^ctc_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignAttemptList"
								},
								"example": {
									"data": [
										{
											"answered_at": "2026-11-02T09:14:09.900Z",
											"attempt_number": 1,
											"call_id": "call_3Hk9PqR2sT",
											"campaign_id": "cmp_2Yb7mCq9aPLk",
											"contact_id": "ctc_1aB2cD3eF4g",
											"disposition": "interested",
											"duration_ms": 210000,
											"end_reason": "assistant-ended",
											"ended_at": "2026-11-02T09:17:30.000Z",
											"id": "att_4dE5fG6hJ7",
											"livemode": true,
											"object": "campaign_attempt",
											"phone": "+972501234567",
											"result": "answered",
											"ring_ms": 8700,
											"ringing_at": "2026-11-02T09:14:01.200Z",
											"sip_status": 200,
											"started_at": "2026-11-02T09:14:00.000Z",
											"status": "done",
											"talk_ms": 200100
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/campaigns/cmp_2Yb7mCq9aPLk/contacts/ctc_1aB2cD3eF4g/attempts"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a contact's dial attempts",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"contacts:read"
				],
				"description": "Lists the dial attempts made to one contact of the campaign, newest first: when each one started, how it ended, and the call it placed.\n\n[Try it in the API playground](/api/playground/?op=campaigns_contacts_list_attempts) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const contact of mv.campaigns.contacts.listAttempts(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\")) {\n\tconsole.log(contact);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor contact in client.campaigns.contacts.list_attempts(\"cmp_7Hk2Lm9Qp\", \"ctc_7Hk2Lm9Qp\"):\n    print(contact)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/contacts/ctc_7Hk2Lm9Qp/attempts \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/campaigns/{id}/export": {
			"get": {
				"description": "The dashboard's export, streamed: UTF-8 with a byte-order mark (opens in Excel with Hebrew intact). kind=contacts (default) has one row per contact with its result and variables; kind=attempts one row per dial attempt.\n\n[Try it in the API playground](/api/playground/?op=campaigns_export) with a test-mode key.",
				"operationId": "campaigns_export",
				"parameters": [
					{
						"description": "contacts (default) or attempts.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"default": "contacts",
							"enum": [
								"contacts",
								"attempts"
							],
							"type": "string"
						}
					},
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/csv": {
								"schema": {
									"description": "CSV, UTF-8 with a byte-order mark.",
									"examples": [
										"row,phone,name,status,attempts,last_result,outcome\r\n2,+972501234567,Dana Levi,done,1,answered,interested\r\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The CSV file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Export a campaign's contacts or attempts as CSV",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.campaigns.export(\"cmp_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.campaigns.export(\"cmp_7Hk2Lm9Qp\")\nprint(data)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/export \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/campaigns/{id}/pause": {
			"post": {
				"description": "Stops dialling new calls; calls in progress finish. Resume it to continue.\n\n[Try it in the API playground](/api/playground/?op=campaigns_pause) with a test-mode key.",
				"operationId": "campaigns_pause",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignActionParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Pause a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.pause(\"cmp_7Hk2Lm9Qp\", {});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.pause(\"cmp_7Hk2Lm9Qp\", {})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/pause \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/preflight": {
			"get": {
				"operationId": "campaigns_preflight",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignPreflight"
								},
								"example": {
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"dialable": 852,
									"errors": [],
									"next_window_at": "2026-11-02T09:00:00.000Z",
									"object": "campaign_preflight",
									"ok": true,
									"warnings": [
										"12 contact(s) have no recorded marketing consent and will be skipped"
									],
									"window_open": true
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Check whether a campaign can start",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:read"
				],
				"description": "Runs the checks that starting the campaign runs, without starting it: the same checks as the dashboard's Start button. `ok` says whether it can start; `errors` block the start, `warnings` don't. `window_open` and `next_window_at` say whether the campaign's calling window (and Shabbat and holidays) lets it dial now, and when it next can.\n\n[Try it in the API playground](/api/playground/?op=campaigns_preflight) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaignPreflight = await mv.campaigns.preflight(\"cmp_7Hk2Lm9Qp\");\nconsole.log(campaignPreflight);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign_preflight = client.campaigns.preflight(\"cmp_7Hk2Lm9Qp\")\nprint(campaign_preflight)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/preflight \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/campaigns/{id}/resume": {
			"post": {
				"description": "Runs the pre-flight checks again and resumes dialling.\n\n[Try it in the API playground](/api/playground/?op=campaigns_resume) with a test-mode key.",
				"operationId": "campaigns_resume",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignActionParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Resume a paused campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.resume(\"cmp_7Hk2Lm9Qp\", {});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.resume(\"cmp_7Hk2Lm9Qp\", {})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/resume \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/start": {
			"post": {
				"description": "Runs the dashboard's pre-flight checks and starts dialling (or schedules the start). A failed check answers 409 preflight_failed with the list. Once running, every call is still checked against the do-not-call list, consent, the national registry, the calling hours and Shabbat; a marketing campaign the registry can't check pauses itself (pause_reason).\n\n[Try it in the API playground](/api/playground/?op=campaigns_start) with a test-mode key.",
				"operationId": "campaigns_start",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignStartParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Campaign"
								},
								"example": {
									"amd": {
										"message": "",
										"mode": "off"
									},
									"assistant_id": "asst_3kTzL9Qe2R",
									"caller_id": "+97235550100",
									"calls_per_second": 0,
									"completed_at": null,
									"connection_id": "conn_8DbH2nXy",
									"created_at": "2026-11-01T08:00:00.000Z",
									"disclosure": {
										"enabled": null,
										"text": ""
									},
									"dispositions": [
										"interested",
										"not-interested",
										"callback-requested"
									],
									"first_message": "",
									"id": "cmp_2Yb7mCq9aPLk",
									"livemode": true,
									"max_concurrent": 10,
									"name": "November renewals",
									"object": "campaign",
									"opt_out_dtmf_key": null,
									"pause_reason": null,
									"priority": 5,
									"purpose": "marketing",
									"retry": {
										"busy": {
											"delay_minutes": 15,
											"enabled": true
										},
										"declined": {
											"delay_minutes": 240,
											"enabled": false
										},
										"failed": {
											"delay_minutes": 10,
											"enabled": true
										},
										"max_attempts": 3,
										"no_answer": {
											"delay_minutes": 60,
											"enabled": true
										},
										"voicemail": {
											"delay_minutes": 120,
											"enabled": true
										}
									},
									"ring_timeout_seconds": 30,
									"schedule": {
										"end_at": null,
										"respect_holidays": true,
										"respect_shabbat": true,
										"start_at": null,
										"timezone": "Asia/Jerusalem",
										"windows": [
											{
												"days": [
													"sun",
													"mon",
													"tue",
													"wed",
													"thu"
												],
												"end": "20:00",
												"start": "09:00"
											},
											{
												"days": [
													"fri"
												],
												"end": "13:00",
												"start": "09:00"
											}
										]
									},
									"script": "Offer the {{plan}} renewal at the loyalty price.",
									"started_at": "2026-11-02T07:00:00.000Z",
									"state": "running",
									"stats": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"updated_at": "2026-11-02T07:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Start a campaign",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaign = await mv.campaigns.start(\"cmp_7Hk2Lm9Qp\", {});\nconsole.log(campaign);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign = client.campaigns.start(\"cmp_7Hk2Lm9Qp\", {})\nprint(campaign)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/start \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/campaigns/{id}/stats": {
			"get": {
				"operationId": "campaigns_stats",
				"parameters": [
					{
						"description": "A campaign ID (`cmp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cmp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CampaignResults"
								},
								"example": {
									"attempts": {
										"average_ring_seconds": 11.4,
										"by_result": {
											"answered": 128,
											"busy": 22,
											"no_answer": 140,
											"voicemail": 20
										},
										"talk_seconds": 9120,
										"total": 310
									},
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"contacts": {
										"by_status": {
											"callback": 3,
											"cancelled": 0,
											"dialing": 5,
											"dnc": 9,
											"done": 120,
											"failed": 6,
											"invalid": 1,
											"pending": 812,
											"scheduled": 40,
											"skipped": 4
										},
										"finished": 140,
										"live": {
											"connected": 1,
											"dialing": 2,
											"ringing": 2
										},
										"total": 1000
									},
									"livemode": true,
									"object": "campaign_stats",
									"outcomes": {
										"interested": 41,
										"not-interested": 60
									},
									"skip_reasons": {
										"dnc_import": 7,
										"no_consent": 4,
										"registry": 2
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a campaign's results",
				"tags": [
					"Campaigns"
				],
				"x-morevoice-scopes": [
					"campaigns:read"
				],
				"description": "Returns the campaign's results so far: contacts per status, dial attempts per result with talk and ring time, the dispositions recorded, and the contacts compliance checks skipped, by reason.\n\n[Try it in the API playground](/api/playground/?op=campaigns_stats) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst campaignResults = await mv.campaigns.stats(\"cmp_7Hk2Lm9Qp\");\nconsole.log(campaignResults);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncampaign_results = client.campaigns.stats(\"cmp_7Hk2Lm9Qp\")\nprint(campaign_results)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/campaigns/cmp_7Hk2Lm9Qp/stats \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/cli/listen": {
			"get": {
				"description": "The stream behind the CLI's `listen` command: your organisation's events for this key's mode (each with the exact body and Standard Webhooks headers to POST to your local endpoint, signed with the session's secret) and, with `forward_tools=true`, tool calls to answer from your machine — tools whose URL is `cli://<name>` and, in test mode, every webhook tool of your test calls. The session ends when the stream closes. Use a test key; a live key needs `live=true` and the `webhooks:write` scope. Counts against the key's stream limit.\n\n[Try it in the API playground](/api/playground/?op=cli_listen_stream) with a test-mode key.",
				"operationId": "cli_listen_stream",
				"parameters": [
					{
						"description": "Event types to forward: a type (`call.ended`), a group (`call.*`) or `*`; comma-separated or repeated. Default: every event (opt-in live types only when named).",
						"in": "query",
						"name": "events",
						"required": false,
						"schema": {
							"anyOf": [
								{
									"type": "string"
								},
								{
									"items": {
										"type": "string"
									},
									"type": "array"
								}
							]
						}
					},
					{
						"description": "`true`: this session answers tool calls — tools whose URL is `cli://<name>` and, in test mode, every webhook tool of the organisation's test calls. Needs the `tools:write` scope.",
						"in": "query",
						"name": "forward_tools",
						"required": false,
						"schema": {
							"enum": [
								"true",
								"false"
							],
							"type": "string"
						}
					},
					{
						"description": "Required (`true`) with a live key: live events and tool calls of live calls reach your machine. Needs the `webhooks:write` scope.",
						"in": "query",
						"name": "live",
						"required": false,
						"schema": {
							"enum": [
								"true",
								"false"
							],
							"type": "string"
						}
					},
					{
						"description": "Resume after this event (`evt_…`), for clients that cannot send `Last-Event-ID`.",
						"in": "query",
						"name": "last_event_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/event-stream": {
								"schema": {
									"description": "A text/event-stream. First `cli.session` (`id`, `livemode`, `events`, `forward_tools`, `forward_all_tools`, and `secret`: the `whsec_…` the forwarded events are signed with, stable for the API key). Then `webhook` frames (`id` = the event's ID, resumable with Last-Event-ID): `type`, `headers` and `body` — POST exactly that body with those headers to your local endpoint, which verifies them as Standard Webhooks with the session secret. And `tool_call` frames: `id`, `tool`, `call_id`, `timeout_ms`, `url`, `headers` (signed with your organisation's signing secret, as the tool's URL would get them) and `body`; answer each with POST /v1/cli/listen/{session_id}/tool_results within `timeout_ms`. Comment lines (`: ping`) keep the connection alive every 15 s.",
									"examples": [
										"retry: 3000\n\nevent: cli.session\ndata: {\"object\":\"cli_session\",\"id\":\"clis_5bH8jK3mN6pQ9rT2vW4xYz\",\"livemode\":false,\"events\":[\"call.*\"],\"forward_tools\":true,\"forward_all_tools\":true,\"secret\":\"whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw\",\"created\":\"2026-11-03T09:14:20.000Z\"}\n\nid: evt_3fT9kq2ZpLr8YwVbN1cX0a\nevent: webhook\ndata: {\"object\":\"cli_webhook\",\"id\":\"evt_3fT9kq2ZpLr8YwVbN1cX0a\",\"type\":\"call.ended\",\"headers\":{\"content-type\":\"application/json\",\"user-agent\":\"MoreVoice-Webhooks/1.0 (cli)\",\"webhook-id\":\"evt_3fT9kq2ZpLr8YwVbN1cX0a\",\"webhook-timestamp\":\"1762161262\",\"webhook-signature\":\"v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=\"},\"body\":\"{\\\"id\\\":\\\"evt_3fT9kq2ZpLr8YwVbN1cX0a\\\",\\\"object\\\":\\\"event\\\",\\\"type\\\":\\\"call.ended\\\"}\"}\n\nevent: tool_call\ndata: {\"object\":\"cli_tool_call\",\"id\":\"clitc_7cJ9kL4mP2qR5sT8uV1wXy\",\"tool\":\"order_status\",\"call_id\":\"call_8tRPaZp5hLMbrGqdJ9AmNa\",\"timeout_ms\":15000,\"url\":\"cli://orders\",\"headers\":{\"content-type\":\"application/json\",\"webhook-id\":\"tc_2bN…\",\"webhook-timestamp\":\"1762161263\",\"webhook-signature\":\"v1,…\"},\"body\":\"{\\\"tool\\\":\\\"order_status\\\",\\\"arguments\\\":{\\\"order\\\":\\\"A-1\\\"}}\"}\n\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The session's stream."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Open a CLI listen session",
				"tags": [
					"CLI"
				],
				"x-morevoice-scopes": [
					"events:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.cliListen.stream()) {\n\tconsole.log(event);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "import os\n\nimport httpx\n\nurl = \"https://api.morevoice.ai/v1/cli/listen\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['MOREVOICE_API_KEY']}\", \"Accept\": \"text/event-stream\"}\nwith httpx.stream(\"GET\", url, headers=headers, timeout=None) as response:\n    response.raise_for_status()\n    for line in response.iter_lines():\n        if line.startswith(\"data:\"):\n            print(line[5:].strip())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/cli/listen \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Accept: text/event-stream\" -N\n"
					}
				]
			}
		},
		"/cli/listen/{session_id}/tool_results": {
			"post": {
				"description": "Sends your local tool server's answer (status and body, as it responded) for a `tool_call` frame of your listen session. Only the key that opened the session can answer, within the call's `timeout_ms`.\n\n[Try it in the API playground](/api/playground/?op=cli_submit_tool_result) with a test-mode key.",
				"operationId": "cli_submit_tool_result",
				"parameters": [
					{
						"description": "The session's ID (`clis_…`, from the `cli.session` frame).",
						"example": "clis_5bH8jK3mN6pQ9rT2vW4xYz",
						"in": "path",
						"name": "session_id",
						"required": true,
						"schema": {
							"pattern": "^clis_[0-9A-Za-z]{22}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CliToolResultParamsInput"
							},
							"example": {
								"body": "{\"status\":\"shipped\"}",
								"id": "clitc_7cJ9kL4mP2qR5sT8uV1wXy",
								"status": 200
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CliToolResult"
								},
								"example": {
									"accepted": true,
									"id": "clitc_7cJ9kL4mP2qR5sT8uV1wXy",
									"object": "cli_tool_result",
									"session_id": "clis_5bH8jK3mN6pQ9rT2vW4xYz"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Answer a relayed tool call",
				"tags": [
					"CLI"
				],
				"x-morevoice-scopes": [
					"events:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst cliToolResult = await mv.cli.submitToolResult(\"clis_5bH8jK3mN6pQ9rT2vW4xYz\", {\n\tbody: \"{\\\"status\\\":\\\"shipped\\\"}\",\n\tid: \"clitc_7cJ9kL4mP2qR5sT8uV1wXy\",\n\tstatus: 200,\n});\nconsole.log(cliToolResult);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncli_tool_result = client.cli.submit_tool_result(\"clis_5bH8jK3mN6pQ9rT2vW4xYz\", {\n    \"body\": \"{\\\"status\\\":\\\"shipped\\\"}\",\n    \"id\": \"clitc_7cJ9kL4mP2qR5sT8uV1wXy\",\n    \"status\": 200,\n})\nprint(cli_tool_result)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/cli/listen/clis_5bH8jK3mN6pQ9rT2vW4xYz/tool_results \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"body\": \"{\\\"status\\\":\\\"shipped\\\"}\",\n  \"id\": \"clitc_7cJ9kL4mP2qR5sT8uV1wXy\",\n  \"status\": 200\n}'\n"
					}
				]
			}
		},
		"/client_tokens": {
			"post": {
				"description": "Mint, on your server, a short-lived token a browser uses to start one call to one assistant with @morevoice/web (`MoreVoiceWeb.start({ token })`). The token works once, until `expires_at`; bind it to your site with `origin`. It carries the call's ID, so you can follow the call (webhooks, GET /v1/calls/{id}/events) before it starts.\n\n[Try it in the API playground](/api/playground/?op=client_tokens_create) with a test-mode key.",
				"operationId": "client_tokens_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ClientTokenCreateParamsInput"
							},
							"example": {
								"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
								"metadata": {
									"crm_contact_id": "0031x00000AbCdE"
								},
								"origin": "https://shop.example",
								"ttl_s": 300
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ClientToken"
								},
								"example": {
									"agent_user_id": null,
									"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
									"call_id": "call_3slqGaD2htUzxdRsI",
									"expires_at": "2026-11-03T09:19:22.000Z",
									"livemode": true,
									"object": "client_token",
									"origin": "https://shop.example",
									"token": "<client_token: short-lived JWT, pass it through unchanged>",
									"ws_url": "wss://api.morevoice.ai/ws/call"
								}
							}
						},
						"description": "The token."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a client token",
				"tags": [
					"Client tokens"
				],
				"x-morevoice-scopes": [
					"web_calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst clientToken = await mv.clientTokens.create({\n\tassistant_id: \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n\tmetadata: {\n\t\tcrm_contact_id: \"0031x00000AbCdE\",\n\t},\n\torigin: \"https://shop.example\",\n\tttl_s: 300,\n});\nconsole.log(clientToken);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nclient_token = client.client_tokens.create({\n    \"assistant_id\": \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n    \"metadata\": {\n        \"crm_contact_id\": \"0031x00000AbCdE\",\n    },\n    \"origin\": \"https://shop.example\",\n    \"ttl_s\": 300,\n})\nprint(client_token)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/client_tokens \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"assistant_id\": \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n  \"metadata\": {\n    \"crm_contact_id\": \"0031x00000AbCdE\"\n  },\n  \"origin\": \"https://shop.example\",\n  \"ttl_s\": 300\n}'\n"
					}
				]
			}
		},
		"/conference_rooms": {
			"get": {
				"description": "The organisation's active rooms, newest first. Guest links are not included: they are shown only when created.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_list) with a test-mode key.",
				"operationId": "conference_rooms_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceRoomList"
								},
								"example": {
									"data": [
										{
											"active": true,
											"created": "2026-11-01T09:14:22.000Z",
											"dial_in": [
												"+97233761234"
											],
											"has_moderator_pin": false,
											"has_pin": true,
											"id": "room_2dXk9QmZ4rTv",
											"live": null,
											"livemode": true,
											"name": "Weekly sales sync",
											"object": "conference_room",
											"owner_id": null,
											"pin_length": 4,
											"schedule": {
												"end_at": "2026-11-03T08:30:00.000Z",
												"recurrence": "weekly",
												"start_at": "2026-11-03T08:00:00.000Z",
												"timezone": "Asia/Jerusalem"
											},
											"settings": {
												"ai_note_taker": true,
												"announce": true,
												"description": "",
												"language": "he",
												"lock_on_start": false,
												"max_participants": 20,
												"mute_on_entry": false,
												"record": true,
												"transcribe": true,
												"wait_for_moderator": false
											},
											"updated": "2026-11-01T09:14:22.000Z"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/conference_rooms"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List conference rooms",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const conferenceRoom of mv.conferenceRooms.list()) {\n\tconsole.log(conferenceRoom);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor conference_room in client.conference_rooms.list():\n    print(conference_room)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/conference_rooms \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Returns the room with its guest link (`join_url`), shown only now. Phone dial-in comes from an inbound route to the room.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_create) with a test-mode key.",
				"operationId": "conference_rooms_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"name": "Weekly sales sync",
								"pin": "4821",
								"schedule": {
									"end_at": "2026-11-03T10:30:00+02:00",
									"recurrence": "weekly",
									"start_at": "2026-11-03T10:00:00+02:00"
								},
								"settings": {
									"ai_note_taker": true,
									"language": "he"
								}
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"moderator_pin": {
										"description": "Moderator PIN (different from the participant PIN).",
										"pattern": "^\\d{4,8}$",
										"type": "string"
									},
									"name": {
										"maxLength": 80,
										"minLength": 1,
										"type": "string"
									},
									"pin": {
										"description": "Participant PIN for phone dial-in (4–8 digits).",
										"pattern": "^\\d{4,8}$",
										"type": "string"
									},
									"schedule": {
										"additionalProperties": false,
										"description": "Replaces the schedule.",
										"properties": {
											"end_at": {
												"anyOf": [
													{
														"examples": [
															"2026-11-03T09:00:00+02:00"
														],
														"format": "date-time",
														"type": "string"
													},
													{
														"type": "null"
													}
												]
											},
											"recurrence": {
												"enum": [
													"none",
													"daily",
													"weekly",
													"weekdays"
												],
												"type": "string"
											},
											"start_at": {
												"anyOf": [
													{
														"examples": [
															"2026-11-03T09:00:00+02:00"
														],
														"format": "date-time",
														"type": "string"
													},
													{
														"type": "null"
													}
												]
											},
											"timezone": {
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											}
										},
										"type": "object"
									},
									"settings": {
										"additionalProperties": false,
										"description": "Only the settings you send change (defaults on create).",
										"properties": {
											"ai_note_taker": {
												"type": "boolean"
											},
											"announce": {
												"type": "boolean"
											},
											"description": {
												"maxLength": 1000,
												"type": "string"
											},
											"language": {
												"enum": [
													"he",
													"en"
												],
												"type": "string"
											},
											"lock_on_start": {
												"type": "boolean"
											},
											"max_participants": {
												"maximum": 50,
												"minimum": 2,
												"type": "integer"
											},
											"mute_on_entry": {
												"type": "boolean"
											},
											"record": {
												"type": "boolean"
											},
											"transcribe": {
												"type": "boolean"
											},
											"wait_for_moderator": {
												"type": "boolean"
											}
										},
										"type": "object"
									}
								},
								"required": [
									"name"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceRoomWithLink"
								},
								"example": {
									"active": true,
									"created": "2026-11-01T09:14:22.000Z",
									"dial_in": [
										"+97233761234"
									],
									"has_moderator_pin": false,
									"has_pin": true,
									"id": "room_2dXk9QmZ4rTv",
									"join_url": "https://app.example.com/join/k3J9xQ2mV8pL5sT1wR7yZ4bN",
									"live": null,
									"livemode": true,
									"name": "Weekly sales sync",
									"object": "conference_room",
									"owner_id": null,
									"pin_length": 4,
									"schedule": {
										"end_at": "2026-11-03T08:30:00.000Z",
										"recurrence": "weekly",
										"start_at": "2026-11-03T08:00:00.000Z",
										"timezone": "Asia/Jerusalem"
									},
									"settings": {
										"ai_note_taker": true,
										"announce": true,
										"description": "",
										"language": "he",
										"lock_on_start": false,
										"max_participants": 20,
										"mute_on_entry": false,
										"record": true,
										"transcribe": true,
										"wait_for_moderator": false
									},
									"updated": "2026-11-01T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a conference room",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceRoomWithLink = await mv.conferenceRooms.create({\n\tname: \"Weekly sales sync\",\n\tpin: \"4821\",\n\tschedule: {\n\t\tend_at: \"2026-11-03T10:30:00+02:00\",\n\t\trecurrence: \"weekly\",\n\t\tstart_at: \"2026-11-03T10:00:00+02:00\",\n\t},\n\tsettings: {\n\t\tai_note_taker: true,\n\t\tlanguage: \"he\",\n\t},\n});\nconsole.log(conferenceRoomWithLink);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_room_with_link = client.conference_rooms.create({\n    \"name\": \"Weekly sales sync\",\n    \"pin\": \"4821\",\n    \"schedule\": {\n        \"end_at\": \"2026-11-03T10:30:00+02:00\",\n        \"recurrence\": \"weekly\",\n        \"start_at\": \"2026-11-03T10:00:00+02:00\",\n    },\n    \"settings\": {\n        \"ai_note_taker\": True,\n        \"language\": \"he\",\n    },\n})\nprint(conference_room_with_link)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/conference_rooms \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"name\": \"Weekly sales sync\",\n  \"pin\": \"4821\",\n  \"schedule\": {\n    \"end_at\": \"2026-11-03T10:30:00+02:00\",\n    \"recurrence\": \"weekly\",\n    \"start_at\": \"2026-11-03T10:00:00+02:00\"\n  },\n  \"settings\": {\n    \"ai_note_taker\": true,\n    \"language\": \"he\"\n  }\n}'\n"
					}
				]
			}
		},
		"/conference_rooms/{id}": {
			"delete": {
				"description": "Ends a session in progress, unlinks the room's inbound routes and deletes it. Its past sessions (call records) stay.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_delete) with a test-mode key.",
				"operationId": "conference_rooms_delete",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedConferenceRoom"
								},
								"example": {
									"deleted": true,
									"id": "room_2dXk9QmZ4rTv",
									"object": "conference_room"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a conference room",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedConferenceRoom = await mv.conferenceRooms.delete(\"room_7Hk2Lm9Qp\");\nconsole.log(deletedConferenceRoom);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_conference_room = client.conference_rooms.delete(\"room_7Hk2Lm9Qp\")\nprint(deleted_conference_room)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "conference_rooms_retrieve",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceRoom"
								},
								"example": {
									"active": true,
									"created": "2026-11-01T09:14:22.000Z",
									"dial_in": [
										"+97233761234"
									],
									"has_moderator_pin": false,
									"has_pin": true,
									"id": "room_2dXk9QmZ4rTv",
									"live": null,
									"livemode": true,
									"name": "Weekly sales sync",
									"object": "conference_room",
									"owner_id": null,
									"pin_length": 4,
									"schedule": {
										"end_at": "2026-11-03T08:30:00.000Z",
										"recurrence": "weekly",
										"start_at": "2026-11-03T08:00:00.000Z",
										"timezone": "Asia/Jerusalem"
									},
									"settings": {
										"ai_note_taker": true,
										"announce": true,
										"description": "",
										"language": "he",
										"lock_on_start": false,
										"max_participants": 20,
										"mute_on_entry": false,
										"record": true,
										"transcribe": true,
										"wait_for_moderator": false
									},
									"updated": "2026-11-01T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a conference room",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:read"
				],
				"description": "Returns the `ConferenceRoom` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceRoom = await mv.conferenceRooms.retrieve(\"room_7Hk2Lm9Qp\");\nconsole.log(conferenceRoom);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_room = client.conference_rooms.retrieve(\"room_7Hk2Lm9Qp\")\nprint(conference_room)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Only the fields (and settings) you send change; `schedule` is replaced as a whole. A `null` PIN removes it.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_update) with a test-mode key.",
				"operationId": "conference_rooms_update",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"name": "Sales sync (Tuesdays)",
								"settings": {
									"mute_on_entry": true
								}
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"active": {
										"description": "false: switch the room off (it can't be joined).",
										"type": "boolean"
									},
									"moderator_pin": {
										"anyOf": [
											{
												"pattern": "^\\d{4,8}$",
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "A new moderator PIN; null removes it."
									},
									"name": {
										"maxLength": 80,
										"minLength": 1,
										"type": "string"
									},
									"pin": {
										"anyOf": [
											{
												"pattern": "^\\d{4,8}$",
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "A new participant PIN; null removes it."
									},
									"schedule": {
										"additionalProperties": false,
										"description": "Replaces the schedule.",
										"properties": {
											"end_at": {
												"anyOf": [
													{
														"examples": [
															"2026-11-03T09:00:00+02:00"
														],
														"format": "date-time",
														"type": "string"
													},
													{
														"type": "null"
													}
												]
											},
											"recurrence": {
												"enum": [
													"none",
													"daily",
													"weekly",
													"weekdays"
												],
												"type": "string"
											},
											"start_at": {
												"anyOf": [
													{
														"examples": [
															"2026-11-03T09:00:00+02:00"
														],
														"format": "date-time",
														"type": "string"
													},
													{
														"type": "null"
													}
												]
											},
											"timezone": {
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											}
										},
										"type": "object"
									},
									"settings": {
										"additionalProperties": false,
										"description": "Only the settings you send change (defaults on create).",
										"properties": {
											"ai_note_taker": {
												"type": "boolean"
											},
											"announce": {
												"type": "boolean"
											},
											"description": {
												"maxLength": 1000,
												"type": "string"
											},
											"language": {
												"enum": [
													"he",
													"en"
												],
												"type": "string"
											},
											"lock_on_start": {
												"type": "boolean"
											},
											"max_participants": {
												"maximum": 50,
												"minimum": 2,
												"type": "integer"
											},
											"mute_on_entry": {
												"type": "boolean"
											},
											"record": {
												"type": "boolean"
											},
											"transcribe": {
												"type": "boolean"
											},
											"wait_for_moderator": {
												"type": "boolean"
											}
										},
										"type": "object"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceRoom"
								},
								"example": {
									"active": true,
									"created": "2026-11-01T09:14:22.000Z",
									"dial_in": [
										"+97233761234"
									],
									"has_moderator_pin": false,
									"has_pin": true,
									"id": "room_2dXk9QmZ4rTv",
									"live": null,
									"livemode": true,
									"name": "Weekly sales sync",
									"object": "conference_room",
									"owner_id": null,
									"pin_length": 4,
									"schedule": {
										"end_at": "2026-11-03T08:30:00.000Z",
										"recurrence": "weekly",
										"start_at": "2026-11-03T08:00:00.000Z",
										"timezone": "Asia/Jerusalem"
									},
									"settings": {
										"ai_note_taker": true,
										"announce": true,
										"description": "",
										"language": "he",
										"lock_on_start": false,
										"max_participants": 20,
										"mute_on_entry": false,
										"record": true,
										"transcribe": true,
										"wait_for_moderator": false
									},
									"updated": "2026-11-01T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a conference room",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceRoom = await mv.conferenceRooms.update(\"room_7Hk2Lm9Qp\", {\n\tname: \"Sales sync (Tuesdays)\",\n\tsettings: {\n\t\tmute_on_entry: true,\n\t},\n});\nconsole.log(conferenceRoom);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_room = client.conference_rooms.update(\"room_7Hk2Lm9Qp\", {\n    \"name\": \"Sales sync (Tuesdays)\",\n    \"settings\": {\n        \"mute_on_entry\": True,\n    },\n})\nprint(conference_room)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Sales sync (Tuesdays)\",\n  \"settings\": {\n    \"mute_on_entry\": true\n  }\n}'\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/history": {
			"get": {
				"description": "The room's recent sessions (up to 100), newest first, with their AI meeting notes. Each one is a call: fetch its recording and transcript through /v1/calls/{id}.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_list_sessions) with a test-mode key.",
				"operationId": "conference_rooms_list_sessions",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceSessionList"
								},
								"example": {
									"data": [
										{
											"duration_ms": 1800000,
											"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
											"notes": {
												"action_items": [
													"Dana: send the deck"
												],
												"decisions": [
													"Ship the pilot"
												],
												"summary": "Agreed the Q4 targets."
											},
											"object": "conference_session",
											"participants": 4,
											"started_at": "2026-11-03T08:00:40.000Z",
											"status": "ended"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/conference_rooms/room_2dXk9QmZ4rTv/history"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a room's past sessions",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const conferenceRoom of mv.conferenceRooms.listSessions(\"room_7Hk2Lm9Qp\")) {\n\tconsole.log(conferenceRoom);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor conference_room in client.conference_rooms.list_sessions(\"room_7Hk2Lm9Qp\"):\n    print(conference_room)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/history \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/ics": {
			"get": {
				"description": "An .ics file (RFC 5545) for the room's schedule, with its guest link and phone dial-in. It carries the guest link, so it needs `conference:write`.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_retrieve_ics) with a test-mode key.",
				"operationId": "conference_rooms_retrieve_ics",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/calendar": {
								"schema": {
									"description": "An RFC 5545 calendar invitation (text/calendar) with the guest link and the phone dial-in.",
									"examples": [
										"BEGIN:VCALENDAR\r\nVERSION:2.0\r\n…\r\nEND:VCALENDAR\r\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The calendar file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Download the calendar invitation",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.conferenceRooms.retrieveIcs(\"room_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.conference_rooms.retrieve_ics(\"room_7Hk2Lm9Qp\")\nprint(data)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/ics \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/invite": {
			"post": {
				"description": "Emails each address the room's guest link, phone dial-in and a calendar file, in the room's language. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_invite) with a test-mode key.",
				"operationId": "conference_rooms_invite",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"emails": [
									"dana@example.com"
								],
								"message": "Agenda: Q4 pipeline."
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"emails": {
										"description": "Up to 50 addresses.",
										"items": {
											"maxLength": 254,
											"type": "string"
										},
										"maxItems": 50,
										"minItems": 1,
										"type": "array"
									},
									"message": {
										"description": "A personal note in the invitation.",
										"maxLength": 1000,
										"type": "string"
									},
									"pin": {
										"description": "Print this participant PIN in the invitation (otherwise it says a PIN is required).",
										"pattern": "^\\d{4,8}$",
										"type": "string"
									}
								},
								"required": [
									"emails"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceInviteBatch"
								},
								"example": {
									"livemode": true,
									"object": "conference_invite_batch",
									"results": [
										{
											"email": "dana@example.com",
											"error": null,
											"status": "sent"
										}
									],
									"room_id": "room_2dXk9QmZ4rTv",
									"sent": 1
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Email invitations",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceInviteBatch = await mv.conferenceRooms.invite(\"room_7Hk2Lm9Qp\", {\n\temails: [\n\t\t\"dana@example.com\",\n\t],\n\tmessage: \"Agenda: Q4 pipeline.\",\n});\nconsole.log(conferenceInviteBatch);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_invite_batch = client.conference_rooms.invite(\"room_7Hk2Lm9Qp\", {\n    \"emails\": [\n        \"dana@example.com\",\n    ],\n    \"message\": \"Agenda: Q4 pipeline.\",\n})\nprint(conference_invite_batch)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/invite \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"emails\": [\n    \"dana@example.com\"\n  ],\n  \"message\": \"Agenda: Q4 pipeline.\"\n}'\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/links": {
			"post": {
				"description": "Replaces the room's guest link: the previous one stops working at once. The new `join_url` is shown only now.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_create_link) with a test-mode key.",
				"operationId": "conference_rooms_create_link",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ConferenceRoomLinkParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceRoomWithLink"
								},
								"example": {
									"active": true,
									"created": "2026-11-01T09:14:22.000Z",
									"dial_in": [
										"+97233761234"
									],
									"has_moderator_pin": false,
									"has_pin": true,
									"id": "room_2dXk9QmZ4rTv",
									"join_url": "https://app.example.com/join/k3J9xQ2mV8pL5sT1wR7yZ4bN",
									"live": null,
									"livemode": true,
									"name": "Weekly sales sync",
									"object": "conference_room",
									"owner_id": null,
									"pin_length": 4,
									"schedule": {
										"end_at": "2026-11-03T08:30:00.000Z",
										"recurrence": "weekly",
										"start_at": "2026-11-03T08:00:00.000Z",
										"timezone": "Asia/Jerusalem"
									},
									"settings": {
										"ai_note_taker": true,
										"announce": true,
										"description": "",
										"language": "he",
										"lock_on_start": false,
										"max_participants": 20,
										"mute_on_entry": false,
										"record": true,
										"transcribe": true,
										"wait_for_moderator": false
									},
									"updated": "2026-11-01T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a new guest link",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceRoomWithLink = await mv.conferenceRooms.createLink(\"room_7Hk2Lm9Qp\", {});\nconsole.log(conferenceRoomWithLink);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_room_with_link = client.conference_rooms.create_link(\"room_7Hk2Lm9Qp\", {})\nprint(conference_room_with_link)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/links \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/live": {
			"get": {
				"operationId": "conference_rooms_retrieve_live",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceLive"
								},
								"example": {
									"active": true,
									"livemode": true,
									"locked": false,
									"object": "conference_live",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T08:01:10.000Z",
											"kind": "guest",
											"muted": false,
											"name": "Dana",
											"participant_id": "g7Hk2pQx",
											"phone": null,
											"role": "member",
											"state": "connected",
											"talking": false,
											"user_id": null
										}
									],
									"recording": true,
									"room_id": "room_2dXk9QmZ4rTv",
									"session_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"started_at": "2026-11-03T08:00:40.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Who is in the room now",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:read"
				],
				"description": "Returns the `ConferenceLive` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_retrieve_live) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceLive = await mv.conferenceRooms.retrieveLive(\"room_7Hk2Lm9Qp\");\nconsole.log(conferenceLive);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_live = client.conference_rooms.retrieve_live(\"room_7Hk2Lm9Qp\")\nprint(conference_live)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/live \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/conference_rooms/{id}/moderate": {
			"post": {
				"description": "Acts on the session in progress (409 when nobody is in the room): mute, hold, promote or remove a participant (`participant_id` from GET …/live), lock or unlock the room, mute everyone but the moderators, or end the session. Returns the live view after the change. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=conference_rooms_moderate) with a test-mode key.",
				"operationId": "conference_rooms_moderate",
				"parameters": [
					{
						"description": "A conference room ID (`room_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^room_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"mute": true,
								"participant_id": "g7Hk2pQx"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"end": {
										"description": "End the session for everyone.",
										"enum": [
											true
										],
										"type": "boolean"
									},
									"hold": {
										"type": "boolean"
									},
									"lock": {
										"description": "Lock (true) or unlock the room: when locked nobody else can join.",
										"type": "boolean"
									},
									"mute": {
										"type": "boolean"
									},
									"mute_all": {
										"description": "Mute everyone except the moderators.",
										"enum": [
											true
										],
										"type": "boolean"
									},
									"participant_id": {
										"description": "The participant to act on (from GET …/live).",
										"maxLength": 40,
										"minLength": 1,
										"type": "string"
									},
									"remove": {
										"description": "Remove the participant from the room.",
										"enum": [
											true
										],
										"type": "boolean"
									},
									"role": {
										"enum": [
											"moderator",
											"member"
										],
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConferenceLive"
								},
								"example": {
									"active": true,
									"livemode": true,
									"locked": false,
									"object": "conference_live",
									"participants": [
										{
											"held": false,
											"joined_at": "2026-11-03T08:01:10.000Z",
											"kind": "guest",
											"muted": false,
											"name": "Dana",
											"participant_id": "g7Hk2pQx",
											"phone": null,
											"role": "member",
											"state": "connected",
											"talking": false,
											"user_id": null
										}
									],
									"recording": true,
									"room_id": "room_2dXk9QmZ4rTv",
									"session_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"started_at": "2026-11-03T08:00:40.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Moderate a live session",
				"tags": [
					"Conference rooms"
				],
				"x-morevoice-scopes": [
					"conference:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst conferenceLive = await mv.conferenceRooms.moderate(\"room_7Hk2Lm9Qp\", {\n\tmute: true,\n\tparticipant_id: \"g7Hk2pQx\",\n});\nconsole.log(conferenceLive);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconference_live = client.conference_rooms.moderate(\"room_7Hk2Lm9Qp\", {\n    \"mute\": True,\n    \"participant_id\": \"g7Hk2pQx\",\n})\nprint(conference_live)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/conference_rooms/room_7Hk2Lm9Qp/moderate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"mute\": true,\n  \"participant_id\": \"g7Hk2pQx\"\n}'\n"
					}
				]
			}
		},
		"/connections": {
			"get": {
				"operationId": "connections_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConnectionList"
								},
								"example": {
									"data": [
										{
											"active_calls": 2,
											"answer_inbound": true,
											"auth_username": "",
											"backend": "native",
											"caller_ids": [
												"+97231234567"
											],
											"codecs": [
												"pcma",
												"pcmu"
											],
											"created": "2026-11-03T09:14:22.000Z",
											"default_caller_id": "+97231234567",
											"display_name": "",
											"enabled": true,
											"host": "sip.carrier.example.com",
											"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
											"inbound_acl": [
												"198.51.100.0/24"
											],
											"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
											"inbound_reserve_pct": 15,
											"livemode": true,
											"max_channels": 30,
											"max_cps": 5,
											"name": "Main trunk",
											"object": "connection",
											"overflow_policy": "busy",
											"password_set": false,
											"port": 5060,
											"register": false,
											"register_expires_seconds": 300,
											"status": {
												"error": null,
												"expires_seconds": null,
												"registered_at": null,
												"state": "listening"
											},
											"transport": "udp",
											"type": "trunk",
											"updated": "2026-11-03T09:14:22.000Z",
											"username": ""
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/connections"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List connections",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:read"
				],
				"description": "Lists your SIP connections, oldest first, with their registration status and the calls on them now. Passwords are never returned. Live mode only: a test key answers `403` with the code `live_only`.\n\n[Try it in the API playground](/api/playground/?op=connections_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const connection of mv.connections.list()) {\n\tconsole.log(connection);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor connection in client.connections.list():\n    print(connection)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/connections \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"operationId": "connections_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ConnectionCreateParamsInput"
							},
							"example": {
								"caller_ids": [
									"+97231234567"
								],
								"default_caller_id": "+97231234567",
								"host": "sip.carrier.example.com",
								"inbound_acl": [
									"198.51.100.0/24"
								],
								"max_channels": 30,
								"max_cps": 5,
								"name": "Main trunk",
								"register": false,
								"type": "trunk"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Connection"
								},
								"example": {
									"active_calls": 2,
									"answer_inbound": true,
									"auth_username": "",
									"backend": "native",
									"caller_ids": [
										"+97231234567"
									],
									"codecs": [
										"pcma",
										"pcmu"
									],
									"created": "2026-11-03T09:14:22.000Z",
									"default_caller_id": "+97231234567",
									"display_name": "",
									"enabled": true,
									"host": "sip.carrier.example.com",
									"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"inbound_acl": [
										"198.51.100.0/24"
									],
									"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"inbound_reserve_pct": 15,
									"livemode": true,
									"max_channels": 30,
									"max_cps": 5,
									"name": "Main trunk",
									"object": "connection",
									"overflow_policy": "busy",
									"password_set": false,
									"port": 5060,
									"register": false,
									"register_expires_seconds": 300,
									"status": {
										"error": null,
										"expires_seconds": null,
										"registered_at": null,
										"state": "listening"
									},
									"transport": "udp",
									"type": "trunk",
									"updated": "2026-11-03T09:14:22.000Z",
									"username": ""
								}
							}
						},
						"description": "The new connection."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a connection",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:write"
				],
				"description": "Adds a SIP connection to your carrier: a trunk the carrier sends calls to, or a registration account MoreVoice registers like a desk phone. `password` is write-only. New inbound calls are accepted only from the connection's host and its `inbound_acl`. Live mode only: a test key answers `403` with the code `live_only`.\n\n[Try it in the API playground](/api/playground/?op=connections_create) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst connection = await mv.connections.create({\n\tcaller_ids: [\n\t\t\"+97231234567\",\n\t],\n\tdefault_caller_id: \"+97231234567\",\n\thost: \"sip.carrier.example.com\",\n\tinbound_acl: [\n\t\t\"198.51.100.0/24\",\n\t],\n\tmax_channels: 30,\n\tmax_cps: 5,\n\tname: \"Main trunk\",\n\tregister: false,\n\ttype: \"trunk\",\n});\nconsole.log(connection);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconnection = client.connections.create({\n    \"caller_ids\": [\n        \"+97231234567\",\n    ],\n    \"default_caller_id\": \"+97231234567\",\n    \"host\": \"sip.carrier.example.com\",\n    \"inbound_acl\": [\n        \"198.51.100.0/24\",\n    ],\n    \"max_channels\": 30,\n    \"max_cps\": 5,\n    \"name\": \"Main trunk\",\n    \"register\": False,\n    \"type\": \"trunk\",\n})\nprint(connection)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/connections \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"caller_ids\": [\n    \"+97231234567\"\n  ],\n  \"default_caller_id\": \"+97231234567\",\n  \"host\": \"sip.carrier.example.com\",\n  \"inbound_acl\": [\n    \"198.51.100.0/24\"\n  ],\n  \"max_channels\": 30,\n  \"max_cps\": 5,\n  \"name\": \"Main trunk\",\n  \"register\": false,\n  \"type\": \"trunk\"\n}'\n"
					}
				]
			}
		},
		"/connections/{id}": {
			"delete": {
				"description": "Deletes the connection. Refused (409) while it carries calls.\n\n[Try it in the API playground](/api/playground/?op=connections_delete) with a test-mode key.",
				"operationId": "connections_delete",
				"parameters": [
					{
						"description": "A connection ID (`conn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^conn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedConnection"
								},
								"example": {
									"deleted": true,
									"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"object": "connection"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a connection",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedConnection = await mv.connections.delete(\"conn_7Hk2Lm9Qp\");\nconsole.log(deletedConnection);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_connection = client.connections.delete(\"conn_7Hk2Lm9Qp\")\nprint(deleted_connection)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/connections/conn_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "connections_retrieve",
				"parameters": [
					{
						"description": "A connection ID (`conn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^conn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Connection"
								},
								"example": {
									"active_calls": 2,
									"answer_inbound": true,
									"auth_username": "",
									"backend": "native",
									"caller_ids": [
										"+97231234567"
									],
									"codecs": [
										"pcma",
										"pcmu"
									],
									"created": "2026-11-03T09:14:22.000Z",
									"default_caller_id": "+97231234567",
									"display_name": "",
									"enabled": true,
									"host": "sip.carrier.example.com",
									"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"inbound_acl": [
										"198.51.100.0/24"
									],
									"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"inbound_reserve_pct": 15,
									"livemode": true,
									"max_channels": 30,
									"max_cps": 5,
									"name": "Main trunk",
									"object": "connection",
									"overflow_policy": "busy",
									"password_set": false,
									"port": 5060,
									"register": false,
									"register_expires_seconds": 300,
									"status": {
										"error": null,
										"expires_seconds": null,
										"registered_at": null,
										"state": "listening"
									},
									"transport": "udp",
									"type": "trunk",
									"updated": "2026-11-03T09:14:22.000Z",
									"username": ""
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a connection",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:read"
				],
				"description": "Returns a SIP connection with its limits, its registration status and the calls on it now. The password is never returned (`password_set` says whether one is stored). Live mode only.\n\n[Try it in the API playground](/api/playground/?op=connections_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst connection = await mv.connections.retrieve(\"conn_7Hk2Lm9Qp\");\nconsole.log(connection);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconnection = client.connections.retrieve(\"conn_7Hk2Lm9Qp\")\nprint(connection)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/connections/conn_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Changes the fields you send; the rest is kept. `password` is write-only: a string replaces it, null removes it.\n\n[Try it in the API playground](/api/playground/?op=connections_update) with a test-mode key.",
				"operationId": "connections_update",
				"parameters": [
					{
						"description": "A connection ID (`conn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^conn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ConnectionUpdateParamsInput"
							},
							"example": {
								"max_cps": 10,
								"password": "n3w-pa55"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Connection"
								},
								"example": {
									"active_calls": 2,
									"answer_inbound": true,
									"auth_username": "",
									"backend": "native",
									"caller_ids": [
										"+97231234567"
									],
									"codecs": [
										"pcma",
										"pcmu"
									],
									"created": "2026-11-03T09:14:22.000Z",
									"default_caller_id": "+97231234567",
									"display_name": "",
									"enabled": true,
									"host": "sip.carrier.example.com",
									"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"inbound_acl": [
										"198.51.100.0/24"
									],
									"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"inbound_reserve_pct": 15,
									"livemode": true,
									"max_channels": 30,
									"max_cps": 5,
									"name": "Main trunk",
									"object": "connection",
									"overflow_policy": "busy",
									"password_set": false,
									"port": 5060,
									"register": false,
									"register_expires_seconds": 300,
									"status": {
										"error": null,
										"expires_seconds": null,
										"registered_at": null,
										"state": "listening"
									},
									"transport": "udp",
									"type": "trunk",
									"updated": "2026-11-03T09:14:22.000Z",
									"username": ""
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a connection",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst connection = await mv.connections.update(\"conn_7Hk2Lm9Qp\", {\n\tmax_cps: 10,\n\tpassword: \"n3w-pa55\",\n});\nconsole.log(connection);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconnection = client.connections.update(\"conn_7Hk2Lm9Qp\", {\n    \"max_cps\": 10,\n    \"password\": \"n3w-pa55\",\n})\nprint(connection)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/connections/conn_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"max_cps\": 10,\n  \"password\": \"n3w-pa55\"\n}'\n"
					}
				]
			}
		},
		"/connections/{id}/register": {
			"post": {
				"description": "Sends a fresh REGISTER now (FreeSWITCH connections re-register their gateway). The answer is the state right after the request.\n\n[Try it in the API playground](/api/playground/?op=connections_register) with a test-mode key.",
				"operationId": "connections_register",
				"parameters": [
					{
						"description": "A connection ID (`conn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^conn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConnectionRegistration"
								},
								"example": {
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"livemode": true,
									"object": "connection_registration",
									"status": {
										"error": null,
										"expires_seconds": null,
										"registered_at": null,
										"state": "registering"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Re-register a connection",
				"tags": [
					"Connections"
				],
				"x-morevoice-scopes": [
					"connections:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst connectionRegistration = await mv.connections.register(\"conn_7Hk2Lm9Qp\");\nconsole.log(connectionRegistration);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconnection_registration = client.connections.register(\"conn_7Hk2Lm9Qp\")\nprint(connection_registration)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/connections/conn_7Hk2Lm9Qp/register \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/consents": {
			"get": {
				"operationId": "consents_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only this number (any common form).",
						"in": "query",
						"name": "phone",
						"required": false,
						"schema": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only active (`true`) or only revoked (`false`) records.",
						"in": "query",
						"name": "active",
						"required": false,
						"schema": {
							"enum": [
								"true",
								"false"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConsentList"
								},
								"example": {
									"data": [
										{
											"active": true,
											"created": "2026-10-30T12:00:01.000Z",
											"evidence": "https://example.com/forms/123 (checkbox, IP 198.51.100.7)",
											"granted_at": "2026-10-30T12:00:00.000Z",
											"livemode": true,
											"object": "consent",
											"phone": "+972501234567",
											"revoked_at": null,
											"scope": "marketing",
											"source": "web_form"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/consents"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List consent records",
				"tags": [
					"Consents"
				],
				"x-morevoice-scopes": [
					"consents:read"
				],
				"description": "Lists the recorded consents to be called (§30A), newest first. Filter by `phone` (any common format) or by `active` (`false` lists revoked records). Test keys can read the list; recording or revoking consent needs a live key.\n\n[Try it in the API playground](/api/playground/?op=consents_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const consent of mv.consents.list()) {\n\tconsole.log(consent);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor consent in client.consents.list():\n    print(consent)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/consents \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Records marketing consent (§30A) for up to 1,000 numbers, with where it was given and what proves it. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=consents_create) with a test-mode key.",
				"operationId": "consents_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"evidence": "https://example.com/forms/123",
								"granted_at": "2026-10-30T12:00:00.000Z",
								"phones": [
									"+972501234567"
								],
								"source": "web_form"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"evidence": {
										"description": "What proves it: a form URL, a recording reference, a document ID.",
										"maxLength": 2000,
										"type": "string"
									},
									"granted_at": {
										"description": "When the consent was given (default: now). Not in the future.",
										"examples": [
											"2026-11-03T09:14:22.000Z"
										],
										"format": "date-time",
										"type": "string"
									},
									"phones": {
										"description": "Up to 1000 numbers that gave consent.",
										"items": {
											"description": "A phone number: E.164 (`+972501234567`) or a local Israeli form (`050-123-4567`).",
											"maxLength": 40,
											"minLength": 1,
											"type": "string"
										},
										"maxItems": 1000,
										"minItems": 1,
										"type": "array"
									},
									"source": {
										"description": "Where the consent was given (default `api`).",
										"maxLength": 100,
										"minLength": 1,
										"type": "string"
									}
								},
								"required": [
									"phones"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConsentBatch"
								},
								"example": {
									"invalid": [],
									"livemode": true,
									"object": "consent_batch",
									"recorded": [
										"+972501234567"
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Record consents",
				"tags": [
					"Consents"
				],
				"x-morevoice-scopes": [
					"consents:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst consentBatch = await mv.consents.create({\n\tevidence: \"https://example.com/forms/123\",\n\tgranted_at: \"2026-10-30T12:00:00.000Z\",\n\tphones: [\n\t\t\"+972501234567\",\n\t],\n\tsource: \"web_form\",\n});\nconsole.log(consentBatch);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconsent_batch = client.consents.create({\n    \"evidence\": \"https://example.com/forms/123\",\n    \"granted_at\": \"2026-10-30T12:00:00.000Z\",\n    \"phones\": [\n        \"+972501234567\",\n    ],\n    \"source\": \"web_form\",\n})\nprint(consent_batch)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/consents \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"evidence\": \"https://example.com/forms/123\",\n  \"granted_at\": \"2026-10-30T12:00:00.000Z\",\n  \"phones\": [\n    \"+972501234567\"\n  ],\n  \"source\": \"web_form\"\n}'\n"
					}
				]
			}
		},
		"/consents/{phone}": {
			"delete": {
				"description": "Revokes every active consent of the number. The records stay (with `revoked_at`) as evidence. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=consents_delete) with a test-mode key.",
				"operationId": "consents_delete",
				"parameters": [
					{
						"description": "The number (URL-encode the `+` as `%2B`).",
						"in": "path",
						"name": "phone",
						"required": true,
						"schema": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConsentRevocation"
								},
								"example": {
									"livemode": true,
									"object": "consent_revocation",
									"phone": "+972501234567",
									"revoked_at": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Revoke a number's consent",
				"tags": [
					"Consents"
				],
				"x-morevoice-scopes": [
					"consents:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst consentRevocation = await mv.consents.delete(\"+972501234567\");\nconsole.log(consentRevocation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nconsent_revocation = client.consents.delete(\"+972501234567\")\nprint(consent_revocation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/consents/%2B972501234567 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/copilot_profiles": {
			"get": {
				"operationId": "copilot_profiles_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfileList"
								},
								"example": {
									"data": [
										{
											"alerts": [
												{
													"key": "escalation",
													"kind": "escalation",
													"label": "Asks for a manager",
													"message": "Acknowledge and offer a solution.",
													"notify_supervisor": true,
													"phrases": [
														"manager"
													],
													"severity": "critical",
													"threshold": 0
												}
											],
											"coaching": {
												"monologue_seconds_max": 40,
												"silence_seconds_max": 7,
												"talk_ratio_max": 0.65,
												"wpm_max": 175,
												"wpm_min": 0
											},
											"company": "Acme",
											"compliance": {
												"forbidden_phrases": [
													{
														"instead": "In most cases",
														"phrase": "guaranteed",
														"reason": "No guarantees",
														"severity": "warn"
													}
												],
												"required_disclosures": []
											},
											"created": "2026-11-03T09:14:22.000Z",
											"fields": [
												{
													"hint": "",
													"key": "budget",
													"label": "Monthly budget",
													"options": [],
													"pattern": "",
													"required": false,
													"type": "money"
												}
											],
											"goal": "Book a demo or a clear next step.",
											"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
											"kb": {
												"document_ids": [
													"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
												],
												"links": [],
												"min_score": 0.35
											},
											"language": "en",
											"livemode": true,
											"model": {
												"api": "chat",
												"deep_path": true,
												"fallback_model": "gpt-4.1-nano",
												"max_calls_per_minute": 12,
												"model": "gpt-4.1-mini",
												"objection_similarity": 0.72,
												"priority": true,
												"speculative": true,
												"temperature": 0.3
											},
											"name": "Outbound sales",
											"object": "copilot_profile",
											"objections": [
												{
													"examples": [
														"it costs too much"
													],
													"follow_up": "What do you pay now?",
													"kb_query": "price list",
													"key": "price",
													"label": "Too expensive",
													"response": "Compare it with what downtime costs you today.",
													"triggers": [
														"too expensive"
													]
												}
											],
											"product": "Acme Cloud PBX",
											"qa_rubric": [
												{
													"description": "Asked open questions first.",
													"key": "discovery",
													"label": "Discovery",
													"weight": 60
												},
												{
													"description": "Agreed a dated next step.",
													"key": "close",
													"label": "Next step",
													"weight": 40
												}
											],
											"script": {
												"flow_id": null,
												"version": "published"
											},
											"stages": [
												{
													"checklist": [
														{
															"ask": "",
															"key": "recorded",
															"label": "Say the call is recorded",
															"phrases": [
																"this call is recorded"
															],
															"required": true
														}
													],
													"goal": "Introduce yourself and ask for two minutes",
													"key": "opening",
													"label": "Opening"
												}
											],
											"template_id": "sales-outbound",
											"tone": "Warm, confident, never pushy.",
											"updated": "2026-11-03T09:14:22.000Z",
											"version": 4
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/copilot_profiles"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List copilot profiles",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:read"
				],
				"description": "Returns a page of `CopilotProfile` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const copilotProfile of mv.copilotProfiles.list()) {\n\tconsole.log(copilotProfile);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor copilot_profile in client.copilot_profiles.list():\n    print(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/copilot_profiles \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"operationId": "copilot_profiles_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CopilotProfileCreateParamsInput"
							},
							"example": {
								"company": "Acme",
								"name": "Outbound sales",
								"product": "Acme Cloud PBX",
								"template_id": "sales-outbound"
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfile"
								},
								"example": {
									"alerts": [
										{
											"key": "escalation",
											"kind": "escalation",
											"label": "Asks for a manager",
											"message": "Acknowledge and offer a solution.",
											"notify_supervisor": true,
											"phrases": [
												"manager"
											],
											"severity": "critical",
											"threshold": 0
										}
									],
									"coaching": {
										"monologue_seconds_max": 40,
										"silence_seconds_max": 7,
										"talk_ratio_max": 0.65,
										"wpm_max": 175,
										"wpm_min": 0
									},
									"company": "Acme",
									"compliance": {
										"forbidden_phrases": [
											{
												"instead": "In most cases",
												"phrase": "guaranteed",
												"reason": "No guarantees",
												"severity": "warn"
											}
										],
										"required_disclosures": []
									},
									"created": "2026-11-03T09:14:22.000Z",
									"fields": [
										{
											"hint": "",
											"key": "budget",
											"label": "Monthly budget",
											"options": [],
											"pattern": "",
											"required": false,
											"type": "money"
										}
									],
									"goal": "Book a demo or a clear next step.",
									"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
									"kb": {
										"document_ids": [
											"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
										],
										"links": [],
										"min_score": 0.35
									},
									"language": "en",
									"livemode": true,
									"model": {
										"api": "chat",
										"deep_path": true,
										"fallback_model": "gpt-4.1-nano",
										"max_calls_per_minute": 12,
										"model": "gpt-4.1-mini",
										"objection_similarity": 0.72,
										"priority": true,
										"speculative": true,
										"temperature": 0.3
									},
									"name": "Outbound sales",
									"object": "copilot_profile",
									"objections": [
										{
											"examples": [
												"it costs too much"
											],
											"follow_up": "What do you pay now?",
											"kb_query": "price list",
											"key": "price",
											"label": "Too expensive",
											"response": "Compare it with what downtime costs you today.",
											"triggers": [
												"too expensive"
											]
										}
									],
									"product": "Acme Cloud PBX",
									"qa_rubric": [
										{
											"description": "Asked open questions first.",
											"key": "discovery",
											"label": "Discovery",
											"weight": 60
										},
										{
											"description": "Agreed a dated next step.",
											"key": "close",
											"label": "Next step",
											"weight": 40
										}
									],
									"script": {
										"flow_id": null,
										"version": "published"
									},
									"stages": [
										{
											"checklist": [
												{
													"ask": "",
													"key": "recorded",
													"label": "Say the call is recorded",
													"phrases": [
														"this call is recorded"
													],
													"required": true
												}
											],
											"goal": "Introduce yourself and ask for two minutes",
											"key": "opening",
											"label": "Opening"
										}
									],
									"template_id": "sales-outbound",
									"tone": "Warm, confident, never pushy.",
									"updated": "2026-11-03T09:14:22.000Z",
									"version": 4
								}
							}
						},
						"description": "The new profile."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a copilot profile",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:write"
				],
				"description": "Returns the new `CopilotProfile`.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_create) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst copilotProfile = await mv.copilotProfiles.create({\n\tcompany: \"Acme\",\n\tname: \"Outbound sales\",\n\tproduct: \"Acme Cloud PBX\",\n\ttemplate_id: \"sales-outbound\",\n});\nconsole.log(copilotProfile);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncopilot_profile = client.copilot_profiles.create({\n    \"company\": \"Acme\",\n    \"name\": \"Outbound sales\",\n    \"product\": \"Acme Cloud PBX\",\n    \"template_id\": \"sales-outbound\",\n})\nprint(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/copilot_profiles \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"company\": \"Acme\",\n  \"name\": \"Outbound sales\",\n  \"product\": \"Acme Cloud PBX\",\n  \"template_id\": \"sales-outbound\"\n}'\n"
					}
				]
			}
		},
		"/copilot_profiles/templates": {
			"get": {
				"description": "The built-in profiles you can start from (`template_id` on create).\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_list_templates) with a test-mode key.",
				"operationId": "copilot_profiles_list_templates",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfileTemplateList"
								},
								"example": {
									"data": [
										{
											"alerts": [
												{
													"key": "escalation",
													"kind": "escalation",
													"label": "Asks for a manager",
													"message": "Acknowledge and offer a solution.",
													"notify_supervisor": true,
													"phrases": [
														"manager"
													],
													"severity": "critical",
													"threshold": 0
												}
											],
											"coaching": {
												"monologue_seconds_max": 40,
												"silence_seconds_max": 7,
												"talk_ratio_max": 0.65,
												"wpm_max": 175,
												"wpm_min": 0
											},
											"company": "Acme",
											"compliance": {
												"forbidden_phrases": [
													{
														"instead": "In most cases",
														"phrase": "guaranteed",
														"reason": "No guarantees",
														"severity": "warn"
													}
												],
												"required_disclosures": []
											},
											"description": "Opening, discovery, offer, objections and close.",
											"fields": [
												{
													"hint": "",
													"key": "budget",
													"label": "Monthly budget",
													"options": [],
													"pattern": "",
													"required": false,
													"type": "money"
												}
											],
											"goal": "Book a demo or a clear next step.",
											"kb": {
												"document_ids": [],
												"links": [],
												"min_score": 0.35
											},
											"language": "en",
											"model": {
												"api": "chat",
												"deep_path": true,
												"fallback_model": "gpt-4.1-nano",
												"max_calls_per_minute": 12,
												"model": "gpt-4.1-mini",
												"objection_similarity": 0.72,
												"priority": true,
												"speculative": true,
												"temperature": 0.3
											},
											"name": "Outbound sales",
											"object": "copilot_profile_template",
											"objections": [
												{
													"examples": [
														"it costs too much"
													],
													"follow_up": "What do you pay now?",
													"kb_query": "price list",
													"key": "price",
													"label": "Too expensive",
													"response": "Compare it with what downtime costs you today.",
													"triggers": [
														"too expensive"
													]
												}
											],
											"product": "Acme Cloud PBX",
											"qa_rubric": [
												{
													"description": "Asked open questions first.",
													"key": "discovery",
													"label": "Discovery",
													"weight": 60
												},
												{
													"description": "Agreed a dated next step.",
													"key": "close",
													"label": "Next step",
													"weight": 40
												}
											],
											"script": {
												"flow_id": null,
												"version": "published"
											},
											"stages": [
												{
													"checklist": [
														{
															"ask": "",
															"key": "recorded",
															"label": "Say the call is recorded",
															"phrases": [
																"this call is recorded"
															],
															"required": true
														}
													],
													"goal": "Introduce yourself and ask for two minutes",
													"key": "opening",
													"label": "Opening"
												}
											],
											"template_id": "sales-outbound",
											"tone": "Warm, confident, never pushy."
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/copilot_profiles/templates"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List copilot profile templates",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const copilotProfile of mv.copilotProfiles.listTemplates()) {\n\tconsole.log(copilotProfile);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor copilot_profile in client.copilot_profiles.list_templates():\n    print(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/copilot_profiles/templates \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/copilot_profiles/{id}": {
			"delete": {
				"description": "Deletes the profile. Queues and calls that used it run without a copilot profile.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_delete) with a test-mode key.",
				"operationId": "copilot_profiles_delete",
				"parameters": [
					{
						"description": "A copilot profile ID (`cop_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cop_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedCopilotProfile"
								},
								"example": {
									"deleted": true,
									"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
									"object": "copilot_profile"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a copilot profile",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedCopilotProfile = await mv.copilotProfiles.delete(\"cop_7Hk2Lm9Qp\");\nconsole.log(deletedCopilotProfile);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_copilot_profile = client.copilot_profiles.delete(\"cop_7Hk2Lm9Qp\")\nprint(deleted_copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/copilot_profiles/cop_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "copilot_profiles_retrieve",
				"parameters": [
					{
						"description": "A copilot profile ID (`cop_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cop_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfile"
								},
								"example": {
									"alerts": [
										{
											"key": "escalation",
											"kind": "escalation",
											"label": "Asks for a manager",
											"message": "Acknowledge and offer a solution.",
											"notify_supervisor": true,
											"phrases": [
												"manager"
											],
											"severity": "critical",
											"threshold": 0
										}
									],
									"coaching": {
										"monologue_seconds_max": 40,
										"silence_seconds_max": 7,
										"talk_ratio_max": 0.65,
										"wpm_max": 175,
										"wpm_min": 0
									},
									"company": "Acme",
									"compliance": {
										"forbidden_phrases": [
											{
												"instead": "In most cases",
												"phrase": "guaranteed",
												"reason": "No guarantees",
												"severity": "warn"
											}
										],
										"required_disclosures": []
									},
									"created": "2026-11-03T09:14:22.000Z",
									"fields": [
										{
											"hint": "",
											"key": "budget",
											"label": "Monthly budget",
											"options": [],
											"pattern": "",
											"required": false,
											"type": "money"
										}
									],
									"goal": "Book a demo or a clear next step.",
									"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
									"kb": {
										"document_ids": [
											"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
										],
										"links": [],
										"min_score": 0.35
									},
									"language": "en",
									"livemode": true,
									"model": {
										"api": "chat",
										"deep_path": true,
										"fallback_model": "gpt-4.1-nano",
										"max_calls_per_minute": 12,
										"model": "gpt-4.1-mini",
										"objection_similarity": 0.72,
										"priority": true,
										"speculative": true,
										"temperature": 0.3
									},
									"name": "Outbound sales",
									"object": "copilot_profile",
									"objections": [
										{
											"examples": [
												"it costs too much"
											],
											"follow_up": "What do you pay now?",
											"kb_query": "price list",
											"key": "price",
											"label": "Too expensive",
											"response": "Compare it with what downtime costs you today.",
											"triggers": [
												"too expensive"
											]
										}
									],
									"product": "Acme Cloud PBX",
									"qa_rubric": [
										{
											"description": "Asked open questions first.",
											"key": "discovery",
											"label": "Discovery",
											"weight": 60
										},
										{
											"description": "Agreed a dated next step.",
											"key": "close",
											"label": "Next step",
											"weight": 40
										}
									],
									"script": {
										"flow_id": null,
										"version": "published"
									},
									"stages": [
										{
											"checklist": [
												{
													"ask": "",
													"key": "recorded",
													"label": "Say the call is recorded",
													"phrases": [
														"this call is recorded"
													],
													"required": true
												}
											],
											"goal": "Introduce yourself and ask for two minutes",
											"key": "opening",
											"label": "Opening"
										}
									],
									"template_id": "sales-outbound",
									"tone": "Warm, confident, never pushy.",
									"updated": "2026-11-03T09:14:22.000Z",
									"version": 4
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a copilot profile",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:read"
				],
				"description": "Returns the `CopilotProfile` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst copilotProfile = await mv.copilotProfiles.retrieve(\"cop_7Hk2Lm9Qp\");\nconsole.log(copilotProfile);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncopilot_profile = client.copilot_profiles.retrieve(\"cop_7Hk2Lm9Qp\")\nprint(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/copilot_profiles/cop_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Updates the fields you send. Nested objects merge with the stored values; lists (stages, objections, alerts…) replace them. Calls that start afterwards use the new version.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_update) with a test-mode key.",
				"operationId": "copilot_profiles_update",
				"parameters": [
					{
						"description": "A copilot profile ID (`cop_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cop_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CopilotProfileUpdateParamsInput"
							},
							"example": {
								"coaching": {
									"talk_ratio_max": 0.6
								}
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfile"
								},
								"example": {
									"alerts": [
										{
											"key": "escalation",
											"kind": "escalation",
											"label": "Asks for a manager",
											"message": "Acknowledge and offer a solution.",
											"notify_supervisor": true,
											"phrases": [
												"manager"
											],
											"severity": "critical",
											"threshold": 0
										}
									],
									"coaching": {
										"monologue_seconds_max": 40,
										"silence_seconds_max": 7,
										"talk_ratio_max": 0.65,
										"wpm_max": 175,
										"wpm_min": 0
									},
									"company": "Acme",
									"compliance": {
										"forbidden_phrases": [
											{
												"instead": "In most cases",
												"phrase": "guaranteed",
												"reason": "No guarantees",
												"severity": "warn"
											}
										],
										"required_disclosures": []
									},
									"created": "2026-11-03T09:14:22.000Z",
									"fields": [
										{
											"hint": "",
											"key": "budget",
											"label": "Monthly budget",
											"options": [],
											"pattern": "",
											"required": false,
											"type": "money"
										}
									],
									"goal": "Book a demo or a clear next step.",
									"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
									"kb": {
										"document_ids": [
											"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
										],
										"links": [],
										"min_score": 0.35
									},
									"language": "en",
									"livemode": true,
									"model": {
										"api": "chat",
										"deep_path": true,
										"fallback_model": "gpt-4.1-nano",
										"max_calls_per_minute": 12,
										"model": "gpt-4.1-mini",
										"objection_similarity": 0.72,
										"priority": true,
										"speculative": true,
										"temperature": 0.3
									},
									"name": "Outbound sales",
									"object": "copilot_profile",
									"objections": [
										{
											"examples": [
												"it costs too much"
											],
											"follow_up": "What do you pay now?",
											"kb_query": "price list",
											"key": "price",
											"label": "Too expensive",
											"response": "Compare it with what downtime costs you today.",
											"triggers": [
												"too expensive"
											]
										}
									],
									"product": "Acme Cloud PBX",
									"qa_rubric": [
										{
											"description": "Asked open questions first.",
											"key": "discovery",
											"label": "Discovery",
											"weight": 60
										},
										{
											"description": "Agreed a dated next step.",
											"key": "close",
											"label": "Next step",
											"weight": 40
										}
									],
									"script": {
										"flow_id": null,
										"version": "published"
									},
									"stages": [
										{
											"checklist": [
												{
													"ask": "",
													"key": "recorded",
													"label": "Say the call is recorded",
													"phrases": [
														"this call is recorded"
													],
													"required": true
												}
											],
											"goal": "Introduce yourself and ask for two minutes",
											"key": "opening",
											"label": "Opening"
										}
									],
									"template_id": "sales-outbound",
									"tone": "Warm, confident, never pushy.",
									"updated": "2026-11-03T09:14:22.000Z",
									"version": 4
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a copilot profile",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst copilotProfile = await mv.copilotProfiles.update(\"cop_7Hk2Lm9Qp\", {\n\tcoaching: {\n\t\ttalk_ratio_max: 0.6,\n\t},\n});\nconsole.log(copilotProfile);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncopilot_profile = client.copilot_profiles.update(\"cop_7Hk2Lm9Qp\", {\n    \"coaching\": {\n        \"talk_ratio_max\": 0.6,\n    },\n})\nprint(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/copilot_profiles/cop_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"coaching\": {\n    \"talk_ratio_max\": 0.6\n  }\n}'\n"
					}
				]
			}
		},
		"/copilot_profiles/{id}/duplicate": {
			"post": {
				"operationId": "copilot_profiles_duplicate",
				"parameters": [
					{
						"description": "A copilot profile ID (`cop_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^cop_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DuplicateCopilotProfileParamsInput"
							},
							"example": {
								"name": "Outbound sales B"
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CopilotProfile"
								},
								"example": {
									"alerts": [
										{
											"key": "escalation",
											"kind": "escalation",
											"label": "Asks for a manager",
											"message": "Acknowledge and offer a solution.",
											"notify_supervisor": true,
											"phrases": [
												"manager"
											],
											"severity": "critical",
											"threshold": 0
										}
									],
									"coaching": {
										"monologue_seconds_max": 40,
										"silence_seconds_max": 7,
										"talk_ratio_max": 0.65,
										"wpm_max": 175,
										"wpm_min": 0
									},
									"company": "Acme",
									"compliance": {
										"forbidden_phrases": [
											{
												"instead": "In most cases",
												"phrase": "guaranteed",
												"reason": "No guarantees",
												"severity": "warn"
											}
										],
										"required_disclosures": []
									},
									"created": "2026-11-03T09:14:22.000Z",
									"fields": [
										{
											"hint": "",
											"key": "budget",
											"label": "Monthly budget",
											"options": [],
											"pattern": "",
											"required": false,
											"type": "money"
										}
									],
									"goal": "Book a demo or a clear next step.",
									"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
									"kb": {
										"document_ids": [
											"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
										],
										"links": [],
										"min_score": 0.35
									},
									"language": "en",
									"livemode": true,
									"model": {
										"api": "chat",
										"deep_path": true,
										"fallback_model": "gpt-4.1-nano",
										"max_calls_per_minute": 12,
										"model": "gpt-4.1-mini",
										"objection_similarity": 0.72,
										"priority": true,
										"speculative": true,
										"temperature": 0.3
									},
									"name": "Outbound sales",
									"object": "copilot_profile",
									"objections": [
										{
											"examples": [
												"it costs too much"
											],
											"follow_up": "What do you pay now?",
											"kb_query": "price list",
											"key": "price",
											"label": "Too expensive",
											"response": "Compare it with what downtime costs you today.",
											"triggers": [
												"too expensive"
											]
										}
									],
									"product": "Acme Cloud PBX",
									"qa_rubric": [
										{
											"description": "Asked open questions first.",
											"key": "discovery",
											"label": "Discovery",
											"weight": 60
										},
										{
											"description": "Agreed a dated next step.",
											"key": "close",
											"label": "Next step",
											"weight": 40
										}
									],
									"script": {
										"flow_id": null,
										"version": "published"
									},
									"stages": [
										{
											"checklist": [
												{
													"ask": "",
													"key": "recorded",
													"label": "Say the call is recorded",
													"phrases": [
														"this call is recorded"
													],
													"required": true
												}
											],
											"goal": "Introduce yourself and ask for two minutes",
											"key": "opening",
											"label": "Opening"
										}
									],
									"template_id": "sales-outbound",
									"tone": "Warm, confident, never pushy.",
									"updated": "2026-11-03T09:14:22.000Z",
									"version": 4
								}
							}
						},
						"description": "The copy."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Duplicate a copilot profile",
				"tags": [
					"Copilot profiles"
				],
				"x-morevoice-scopes": [
					"copilot:write"
				],
				"description": "Returns the new `CopilotProfile`. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=copilot_profiles_duplicate) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst copilotProfile = await mv.copilotProfiles.duplicate(\"cop_7Hk2Lm9Qp\", {\n\tname: \"Outbound sales B\",\n});\nconsole.log(copilotProfile);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncopilot_profile = client.copilot_profiles.duplicate(\"cop_7Hk2Lm9Qp\", {\n    \"name\": \"Outbound sales B\",\n})\nprint(copilot_profile)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/copilot_profiles/cop_7Hk2Lm9Qp/duplicate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"name\": \"Outbound sales B\"\n}'\n"
					}
				]
			}
		},
		"/dnc": {
			"get": {
				"operationId": "dnc_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only this number (any common form).",
						"in": "query",
						"name": "phone",
						"required": false,
						"schema": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DncEntryList"
								},
								"example": {
									"data": [
										{
											"call_id": null,
											"campaign_id": null,
											"created": "2026-11-03T09:14:22.000Z",
											"livemode": true,
											"object": "dnc_entry",
											"phone": "+972501234567",
											"reason": "Asked not to be called",
											"source": "api"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/dnc"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List the do-not-call list",
				"tags": [
					"Do not call"
				],
				"x-morevoice-scopes": [
					"dnc:read"
				],
				"description": "Lists the numbers on your do-not-call list, newest first: how each one got there and when. Filter by `phone` (any common format). Test keys can read the list; changing it needs a live key.\n\n[Try it in the API playground](/api/playground/?op=dnc_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const dnc of mv.dnc.list()) {\n\tconsole.log(dnc);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor dnc in client.dnc.list():\n    print(dnc)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/dnc \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Adds up to 1,000 numbers. Each new number emits one `contact.opted_out` event, and queued campaign contacts with it are taken out at once. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=dnc_create) with a test-mode key.",
				"operationId": "dnc_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"phones": [
									"+972501234567",
									"052-765-4321"
								],
								"reason": "Opted out in the CRM"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"phones": {
										"description": "Up to 1000 numbers.",
										"items": {
											"description": "A phone number: E.164 (`+972501234567`) or a local Israeli form (`050-123-4567`).",
											"maxLength": 40,
											"minLength": 1,
											"type": "string"
										},
										"maxItems": 1000,
										"minItems": 1,
										"type": "array"
									},
									"reason": {
										"description": "A note kept with each entry.",
										"maxLength": 500,
										"type": "string"
									}
								},
								"required": [
									"phones"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DncBatch"
								},
								"example": {
									"added": [
										"+972501234567"
									],
									"already_listed": [
										"+972527654321"
									],
									"invalid": [],
									"livemode": true,
									"object": "dnc_batch"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Add numbers to the do-not-call list",
				"tags": [
					"Do not call"
				],
				"x-morevoice-scopes": [
					"dnc:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst dncBatch = await mv.dnc.create({\n\tphones: [\n\t\t\"+972501234567\",\n\t\t\"052-765-4321\",\n\t],\n\treason: \"Opted out in the CRM\",\n});\nconsole.log(dncBatch);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndnc_batch = client.dnc.create({\n    \"phones\": [\n        \"+972501234567\",\n        \"052-765-4321\",\n    ],\n    \"reason\": \"Opted out in the CRM\",\n})\nprint(dnc_batch)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/dnc \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"phones\": [\n    \"+972501234567\",\n    \"052-765-4321\"\n  ],\n  \"reason\": \"Opted out in the CRM\"\n}'\n"
					}
				]
			}
		},
		"/dnc/check": {
			"post": {
				"description": "For each number: your do-not-call list, recorded consent and the national registry, combined into `callable` for the purpose. Read-only.\n\n[Try it in the API playground](/api/playground/?op=dnc_check) with a test-mode key.",
				"operationId": "dnc_check",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"phones": [
									"+972501234567",
									"0527654321"
								],
								"purpose": "marketing"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"phones": {
										"description": "Up to 100 numbers.",
										"items": {
											"description": "A phone number: E.164 (`+972501234567`) or a local Israeli form (`050-123-4567`).",
											"maxLength": 40,
											"minLength": 1,
											"type": "string"
										},
										"maxItems": 100,
										"minItems": 1,
										"type": "array"
									},
									"purpose": {
										"description": "The call's purpose. `marketing` requires recorded consent and a national-registry clearance (Israeli numbers); every purpose respects your do-not-call list.",
										"enum": [
											"service",
											"marketing",
											"survey"
										],
										"type": "string"
									}
								},
								"required": [
									"phones",
									"purpose"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DncCheck"
								},
								"example": {
									"livemode": true,
									"object": "dnc_check",
									"purpose": "marketing",
									"results": [
										{
											"callable": true,
											"consent": true,
											"input": "+972501234567",
											"org_dnc": false,
											"phone": "+972501234567",
											"reasons": [],
											"registry": {
												"cached": true,
												"checked_at": "2026-11-01T08:00:00.000Z",
												"status": "clear"
											},
											"valid": true
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Check numbers before calling",
				"tags": [
					"Do not call"
				],
				"x-morevoice-scopes": [
					"dnc:read",
					"consents:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst dncCheck = await mv.dnc.check({\n\tphones: [\n\t\t\"+972501234567\",\n\t\t\"0527654321\",\n\t],\n\tpurpose: \"marketing\",\n});\nconsole.log(dncCheck);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndnc_check = client.dnc.check({\n    \"phones\": [\n        \"+972501234567\",\n        \"0527654321\",\n    ],\n    \"purpose\": \"marketing\",\n})\nprint(dnc_check)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/dnc/check \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"phones\": [\n    \"+972501234567\",\n    \"0527654321\"\n  ],\n  \"purpose\": \"marketing\"\n}'\n"
					}
				]
			}
		},
		"/dnc/{phone}": {
			"delete": {
				"description": "Calls to the number are allowed again (marketing calls still need consent and the registry). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=dnc_delete) with a test-mode key.",
				"operationId": "dnc_delete",
				"parameters": [
					{
						"description": "The number (URL-encode the `+` as `%2B`).",
						"in": "path",
						"name": "phone",
						"required": true,
						"schema": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedDncEntry"
								},
								"example": {
									"deleted": true,
									"object": "dnc_entry",
									"phone": "+972501234567"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Remove a number from the do-not-call list",
				"tags": [
					"Do not call"
				],
				"x-morevoice-scopes": [
					"dnc:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedDncEntry = await mv.dnc.delete(\"+972501234567\");\nconsole.log(deletedDncEntry);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_dnc_entry = client.dnc.delete(\"+972501234567\")\nprint(deleted_dnc_entry)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/dnc/%2B972501234567 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "dnc_retrieve",
				"parameters": [
					{
						"description": "The number (URL-encode the `+` as `%2B`).",
						"in": "path",
						"name": "phone",
						"required": true,
						"schema": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DncEntry"
								},
								"example": {
									"call_id": null,
									"campaign_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"livemode": true,
									"object": "dnc_entry",
									"phone": "+972501234567",
									"reason": "Asked not to be called",
									"source": "api"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a do-not-call entry",
				"tags": [
					"Do not call"
				],
				"x-morevoice-scopes": [
					"dnc:read"
				],
				"description": "Returns the entry of one number on your do-not-call list: when it was added, how (`source`: the dashboard, an import, the API, or an opt-out during a call) and your note. `404` means the number is not on the list. To check a number against the national registry too, use `POST /v1/dnc/check`.\n\n[Try it in the API playground](/api/playground/?op=dnc_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst dncEntry = await mv.dnc.retrieve(\"+972501234567\");\nconsole.log(dncEntry);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndnc_entry = client.dnc.retrieve(\"+972501234567\")\nprint(dnc_entry)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/dnc/%2B972501234567 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/events": {
			"get": {
				"description": "Events in this mode, newest first, for the last 30 days. Filter by type (`type=call.*`, or several with `types[]`) and creation time (`created[gte]`…).\n\n[Try it in the API playground](/api/playground/?op=events_list) with a test-mode key.",
				"operationId": "events_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only events of this type. An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event.",
						"in": "query",
						"name": "type",
						"required": false,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only events of these types (`types[]=call.ended&types[]=qa.*`).",
						"in": "query",
						"name": "types",
						"required": false,
						"schema": {
							"items": {
								"description": "An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event.",
								"maxLength": 64,
								"minLength": 1,
								"type": "string"
							},
							"maxItems": 20,
							"type": "array"
						}
					},
					{
						"description": "Filter on the creation time: created[gte], created[gt], created[lte], created[lt] (ISO-8601).",
						"explode": true,
						"in": "query",
						"name": "created",
						"required": false,
						"schema": {
							"additionalProperties": false,
							"properties": {
								"gt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"gte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								}
							},
							"type": "object"
						},
						"style": "deepObject"
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventList"
								},
								"example": {
									"data": [
										{
											"api_version": "2026-11-01",
											"created": "2026-11-03T09:14:22Z",
											"data": {
												"object": {
													"duration_ms": 93120,
													"end_reason": "hangup",
													"id": "call_7Hk2LmN9pQ4rS6tV8wX0yZ",
													"metadata": {},
													"object": "call",
													"status": "ended"
												}
											},
											"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
											"livemode": true,
											"object": "event",
											"org_id": "org_0000000000000000000001",
											"request": {
												"id": null,
												"idempotency_key": null
											},
											"type": "call.ended"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/events"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List events",
				"tags": [
					"Events"
				],
				"x-morevoice-scopes": [
					"events:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.events.list()) {\n\tconsole.log(event);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor event in client.events.list():\n    print(event)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/events \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/events/stream": {
			"get": {
				"description": "Server-Sent Events: the same event envelopes as GET /v1/events and webhooks, live, for this key's mode. Filter with `types` (`call.*`, `campaign.completed`, …). Reconnect with `Last-Event-ID` (EventSource does it for you) to replay what you missed, up to 24 hours back; delivery is at-least-once, so dedupe on `id`. Counts against the key's stream limit (`concurrency_limit`, `limit_type: api_streams`).\n\n[Try it in the API playground](/api/playground/?op=events_stream) with a test-mode key.",
				"operationId": "events_stream",
				"parameters": [
					{
						"description": "Only these event types: a type (`call.ended`), a group (`call.*`) or `\"*\"`; comma-separated or repeated. Default: every event.",
						"in": "query",
						"name": "types",
						"required": false,
						"schema": {
							"anyOf": [
								{
									"type": "string"
								},
								{
									"items": {
										"type": "string"
									},
									"type": "array"
								}
							]
						}
					},
					{
						"description": "Resume after this event, for clients that cannot send the `Last-Event-ID` header (the header wins when both are sent).",
						"in": "query",
						"name": "last_event_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/event-stream": {
								"schema": {
									"description": "A text/event-stream of event envelopes (the `Event` object, as GET /v1/events returns and webhooks deliver). Each frame is `id: <evt_…>`, `event: <type>` and one `data:` line. Comment lines (`: ping`) keep the connection alive every 15 s.",
									"examples": [
										"retry: 3000\n\nid: evt_3fT9kq2ZpLr8YwVbN1cX0a\nevent: call.ended\ndata: {\"id\":\"evt_3fT9kq2ZpLr8YwVbN1cX0a\",\"object\":\"event\",\"type\":\"call.ended\",\"created\":\"2026-11-03T09:14:22Z\",\"api_version\":\"2026-11-01\",\"livemode\":true,\"org_id\":\"org_0000000000000000000001\",\"data\":{\"object\":{\"id\":\"call_7Hk2\",\"object\":\"call\",\"status\":\"ended\"}},\"request\":{\"id\":null,\"idempotency_key\":null}}\n\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The event stream."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stream events as they happen",
				"tags": [
					"Events"
				],
				"x-morevoice-scopes": [
					"events:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.events.stream()) {\n\tconsole.log(event.type, event.data.object);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "import os\n\nimport httpx\n\nurl = \"https://api.morevoice.ai/v1/events/stream\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['MOREVOICE_API_KEY']}\", \"Accept\": \"text/event-stream\"}\nwith httpx.stream(\"GET\", url, headers=headers, timeout=None) as response:\n    response.raise_for_status()\n    for line in response.iter_lines():\n        if line.startswith(\"data:\"):\n            print(line[5:].strip())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/events/stream \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Accept: text/event-stream\" -N\n"
					}
				]
			}
		},
		"/events/{id}": {
			"get": {
				"operationId": "events_retrieve",
				"parameters": [
					{
						"description": "A event ID (`evt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^evt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Event"
								},
								"example": {
									"api_version": "2026-11-01",
									"created": "2026-11-03T09:14:22Z",
									"data": {
										"object": {
											"duration_ms": 93120,
											"end_reason": "hangup",
											"id": "call_7Hk2LmN9pQ4rS6tV8wX0yZ",
											"metadata": {},
											"object": "call",
											"status": "ended"
										}
									},
									"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
									"livemode": true,
									"object": "event",
									"org_id": "org_0000000000000000000001",
									"request": {
										"id": null,
										"idempotency_key": null
									},
									"type": "call.ended"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an event",
				"tags": [
					"Events"
				],
				"x-morevoice-scopes": [
					"events:read"
				],
				"description": "Returns one event: its type, the API version it was rendered in, and its payload (`data.object`), exactly as webhooks deliver it. Events are kept for 30 days.\n\n[Try it in the API playground](/api/playground/?op=events_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst event = await mv.events.retrieve(\"evt_7Hk2Lm9Qp\");\nconsole.log(event);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nevent = client.events.retrieve(\"evt_7Hk2Lm9Qp\")\nprint(event)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/events/evt_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flow_templates": {
			"get": {
				"description": "The starter flows you can create a flow from (`template_id` on POST /v1/flows), with names and descriptions in `language`.\n\n[Try it in the API playground](/api/playground/?op=flow_templates_list) with a test-mode key.",
				"operationId": "flow_templates_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only templates of this kind.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"enum": [
								"voice",
								"agent_script",
								"ivr"
							],
							"type": "string"
						}
					},
					{
						"description": "The language of names and descriptions (default en).",
						"in": "query",
						"name": "language",
						"required": false,
						"schema": {
							"enum": [
								"en",
								"he"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowTemplateList"
								},
								"example": {
									"data": [
										{
											"description": "Understands what the caller needs, books a slot in your calendar, texts a confirmation and offers another time when it's taken.",
											"kind": "voice",
											"language": "en",
											"name": "Appointment booking",
											"node_count": 14,
											"object": "flow_template",
											"tags": [
												"inbound",
												"booking",
												"sms",
												"api"
											],
											"template_id": "appointment-booking"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/flow_templates"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List flow templates",
				"tags": [
					"Flow templates"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const flowTemplate of mv.flowTemplates.list()) {\n\tconsole.log(flowTemplate);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor flow_template in client.flow_templates.list():\n    print(flow_template)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flow_templates \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flow_templates/{template_id}": {
			"get": {
				"description": "A starter flow with its graph in the v1 node schema, in `language` (default en).\n\n[Try it in the API playground](/api/playground/?op=flow_templates_retrieve) with a test-mode key.",
				"operationId": "flow_templates_retrieve",
				"parameters": [
					{
						"description": "The template's language (default en): its lines, names and description.",
						"in": "query",
						"name": "language",
						"required": false,
						"schema": {
							"enum": [
								"en",
								"he"
							],
							"type": "string"
						}
					},
					{
						"description": "The template's ID.",
						"example": "appointment-booking",
						"in": "path",
						"name": "template_id",
						"required": true,
						"schema": {
							"pattern": "^[a-z0-9-]{1,80}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowTemplate"
								},
								"example": {
									"description": "Understands what the caller needs, books a slot in your calendar, texts a confirmation and offers another time when it's taken.",
									"kind": "voice",
									"language": "en",
									"name": "Appointment booking",
									"node_count": 14,
									"object": "flow_template",
									"tags": [
										"inbound",
										"booking",
										"sms",
										"api"
									],
									"template_id": "appointment-booking"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a flow template",
				"tags": [
					"Flow templates"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowTemplate = await mv.flowTemplates.retrieve(\"appointment-booking\");\nconsole.log(flowTemplate);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_template = client.flow_templates.retrieve(\"appointment-booking\")\nprint(flow_template)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flow_templates/appointment-booking \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flows": {
			"get": {
				"description": "Your flows, most recently changed first (archived ones only with include_archived=true).\n\n[Try it in the API playground](/api/playground/?op=flows_list) with a test-mode key.",
				"operationId": "flows_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only flows of this kind.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"enum": [
								"voice",
								"agent_script",
								"ivr"
							],
							"type": "string"
						}
					},
					{
						"description": "Only flows linked to this assistant.",
						"in": "query",
						"name": "assistant_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^asst_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "Include archived flows (default false).",
						"in": "query",
						"name": "include_archived",
						"required": false,
						"schema": {
							"enum": [
								"true",
								"false"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowList"
								},
								"example": {
									"data": [
										{
											"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
											"description": "Identify the caller and route them.",
											"draft_rev": 17,
											"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
											"kind": "voice",
											"latest_version": 3,
											"livemode": true,
											"name": "Reception",
											"node_count": 12,
											"object": "flow",
											"published_version": 3,
											"status": "published",
											"template_id": null,
											"updated": "2026-11-03T09:14:22.000Z"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/flows"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List flows",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const flow of mv.flows.list()) {\n\tconsole.log(flow);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor flow in client.flows.list():\n    print(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Creates a flow with an empty draft, a template's, or the `graph` you send. It runs on calls once published (POST /v1/flows/{id}/publish).\n\n[Try it in the API playground](/api/playground/?op=flows_create) with a test-mode key.",
				"operationId": "flows_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowCreateParamsInput"
							},
							"example": {
								"kind": "voice",
								"language": "en",
								"name": "Reception"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Flow"
								},
								"example": {
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"description": "Identify the caller and route them.",
									"draft_rev": 17,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"kind": "voice",
									"latest_version": 3,
									"livemode": true,
									"name": "Reception",
									"node_count": 12,
									"object": "flow",
									"published_version": 3,
									"status": "published",
									"template_id": null,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "The new flow."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flow = await mv.flows.create({\n\tkind: \"voice\",\n\tlanguage: \"en\",\n\tname: \"Reception\",\n});\nconsole.log(flow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow = client.flows.create({\n    \"kind\": \"voice\",\n    \"language\": \"en\",\n    \"name\": \"Reception\",\n})\nprint(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"kind\": \"voice\",\n  \"language\": \"en\",\n  \"name\": \"Reception\"\n}'\n"
					}
				]
			}
		},
		"/flows/validate": {
			"post": {
				"description": "Checks a graph without saving it: the errors that would block publishing, plus warnings and tasks. A malformed graph answers 400.\n\n[Try it in the API playground](/api/playground/?op=flows_validate) with a test-mode key.",
				"operationId": "flows_validate",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowValidateParamsInput"
							},
							"example": {
								"graph": {
									"kind": "voice",
									"nodes": [
										{
											"key": "start",
											"transitions": [
												{
													"condition": {
														"kind": "always"
													},
													"next": null
												}
											],
											"type": "start"
										}
									]
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowValidation"
								},
								"example": {
									"issues": [
										{
											"code": "dead_end",
											"field": null,
											"message": "This node has an output that leads nowhere.",
											"node_key": "ask_id",
											"severity": "error",
											"transition_key": "t_fail"
										}
									],
									"object": "flow_validation",
									"valid": false
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Validate a flow graph",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowValidation = await mv.flows.validate({\n\tgraph: {\n\t\tkind: \"voice\",\n\t\tnodes: [\n\t\t\t{\n\t\t\t\tkey: \"start\",\n\t\t\t\ttransitions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcondition: {\n\t\t\t\t\t\t\tkind: \"always\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext: null,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\ttype: \"start\",\n\t\t\t},\n\t\t],\n\t},\n});\nconsole.log(flowValidation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_validation = client.flows.validate({\n    \"graph\": {\n        \"kind\": \"voice\",\n        \"nodes\": [\n            {\n                \"key\": \"start\",\n                \"transitions\": [\n                    {\n                        \"condition\": {\n                            \"kind\": \"always\",\n                        },\n                        \"next\": None,\n                    },\n                ],\n                \"type\": \"start\",\n            },\n        ],\n    },\n})\nprint(flow_validation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows/validate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"graph\": {\n    \"kind\": \"voice\",\n    \"nodes\": [\n      {\n        \"key\": \"start\",\n        \"transitions\": [\n          {\n            \"condition\": {\n              \"kind\": \"always\"\n            },\n            \"next\": null\n          }\n        ],\n        \"type\": \"start\"\n      }\n    ]\n  }\n}'\n"
					}
				]
			}
		},
		"/flows/{id}": {
			"delete": {
				"description": "Deletes the flow and its versions. 409 while an assistant or a copilot profile uses it (details list them): detach it first.\n\n[Try it in the API playground](/api/playground/?op=flows_delete) with a test-mode key.",
				"operationId": "flows_delete",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedFlow"
								},
								"example": {
									"deleted": true,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"object": "flow"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedFlow = await mv.flows.delete(\"flow_7Hk2Lm9Qp\");\nconsole.log(deletedFlow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_flow = client.flows.delete(\"flow_7Hk2Lm9Qp\")\nprint(deleted_flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"description": "The flow's details. Its graph: GET /v1/flows/{id}/draft (editable) or /versions/{version} (published).\n\n[Try it in the API playground](/api/playground/?op=flows_retrieve) with a test-mode key.",
				"operationId": "flows_retrieve",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Flow"
								},
								"example": {
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"description": "Identify the caller and route them.",
									"draft_rev": 17,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"kind": "voice",
									"latest_version": 3,
									"livemode": true,
									"name": "Reception",
									"node_count": 12,
									"object": "flow",
									"published_version": 3,
									"status": "published",
									"template_id": null,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flow = await mv.flows.retrieve(\"flow_7Hk2Lm9Qp\");\nconsole.log(flow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow = client.flows.retrieve(\"flow_7Hk2Lm9Qp\")\nprint(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"operationId": "flows_update",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowUpdateParamsInput"
							},
							"example": {
								"name": "Reception (2026)"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Flow"
								},
								"example": {
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"description": "Identify the caller and route them.",
									"draft_rev": 17,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"kind": "voice",
									"latest_version": 3,
									"livemode": true,
									"name": "Reception",
									"node_count": 12,
									"object": "flow",
									"published_version": 3,
									"status": "published",
									"template_id": null,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"description": "Changes only the fields you send. Returns the updated `Flow`. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=flows_update) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flow = await mv.flows.update(\"flow_7Hk2Lm9Qp\", {\n\tname: \"Reception (2026)\",\n});\nconsole.log(flow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow = client.flows.update(\"flow_7Hk2Lm9Qp\", {\n    \"name\": \"Reception (2026)\",\n})\nprint(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Reception (2026)\"\n}'\n"
					}
				]
			}
		},
		"/flows/{id}/analytics": {
			"get": {
				"description": "How this key's mode's calls went through the flow (the latest 5000 in the range): visits, calls, drop-off, caller turns and errors per node, how often each transition was taken, how calls ended, and IVR KPIs for IVR flows. Filter by `from` / `to` (start time) and a published `version`.\n\n[Try it in the API playground](/api/playground/?op=flows_retrieve_analytics) with a test-mode key.",
				"operationId": "flows_retrieve_analytics",
				"parameters": [
					{
						"description": "Calls that started at or after this time (ISO 8601).",
						"example": "2026-11-03T09:14:22.000Z",
						"in": "query",
						"name": "from",
						"required": false,
						"schema": {
							"format": "date-time",
							"type": "string"
						}
					},
					{
						"description": "Calls that started at or before this time (ISO 8601).",
						"example": "2026-11-03T09:14:22.000Z",
						"in": "query",
						"name": "to",
						"required": false,
						"schema": {
							"format": "date-time",
							"type": "string"
						}
					},
					{
						"description": "Only calls that ran this published version.",
						"in": "query",
						"name": "version",
						"required": false,
						"schema": {
							"pattern": "^[1-9][0-9]{0,6}$",
							"type": "string"
						}
					},
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowAnalytics"
								},
								"example": {
									"calls": 120,
									"ends": [
										{
											"calls": 98,
											"reason": "flow-ended"
										},
										{
											"calls": 22,
											"reason": "customer-hangup"
										}
									],
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"from": "2026-11-01T00:00:00.000Z",
									"ivr": null,
									"livemode": true,
									"nodes": [
										{
											"avg_turns": 0.2,
											"calls": 120,
											"drop_off": 4,
											"errors": 0,
											"node_key": "start",
											"node_type": "start",
											"visits": 120
										},
										{
											"avg_turns": 1.4,
											"calls": 116,
											"drop_off": 9,
											"errors": 0,
											"node_key": "ask_id",
											"node_type": "question",
											"visits": 131
										}
									],
									"object": "flow_analytics",
									"to": null,
									"transitions": [
										{
											"node_key": "start",
											"rate": 0.967,
											"taken": 116,
											"transition_key": "t_next"
										}
									],
									"version": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a flow's analytics",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowAnalytics = await mv.flows.retrieveAnalytics(\"flow_7Hk2Lm9Qp\");\nconsole.log(flowAnalytics);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_analytics = client.flows.retrieve_analytics(\"flow_7Hk2Lm9Qp\")\nprint(flow_analytics)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/analytics \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flows/{id}/draft": {
			"get": {
				"description": "The editable graph and its revision (`rev`: send it back as `base_rev`).\n\n[Try it in the API playground](/api/playground/?op=flows_retrieve_draft) with a test-mode key.",
				"operationId": "flows_retrieve_draft",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowDraft"
								},
								"example": {
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"graph": {
										"kind": "voice",
										"nodes": [
											{
												"disabled": false,
												"global": null,
												"key": "start",
												"position": {
													"x": 0,
													"y": 0
												},
												"start": {
													"first_message_mode": "speak",
													"greeting": "Hello, you've reached Acme.",
													"interruptible": true
												},
												"title": "Start",
												"transitions": [
													{
														"condition": {
															"kind": "always"
														},
														"key": "t_next",
														"label": "Next",
														"next": "ask_id"
													}
												],
												"type": "start"
											},
											{
												"disabled": false,
												"global": null,
												"key": "ask_id",
												"position": {
													"x": 320,
													"y": 0
												},
												"question": {
													"confirm": true,
													"max_retries": 2,
													"prompt": "What is your ID number?",
													"reask_prompts": [],
													"var": "customer_id"
												},
												"title": "Ask for the ID",
												"transitions": [
													{
														"condition": {
															"kind": "outcome",
															"outcome": "collected"
														},
														"key": "t_ok",
														"label": "Collected",
														"next": "bye"
													},
													{
														"condition": {
															"kind": "outcome",
															"outcome": "max_retries"
														},
														"key": "t_fail",
														"label": "Couldn't collect",
														"next": "bye"
													}
												],
												"type": "question"
											},
											{
												"disabled": false,
												"end": {
													"message": "Thank you, goodbye."
												},
												"global": null,
												"key": "bye",
												"position": {
													"x": 640,
													"y": 0
												},
												"title": "Goodbye",
												"transitions": [],
												"type": "end"
											}
										],
										"schema_version": 1,
										"settings": {
											"classifier_model": null,
											"fallback_node_key": null,
											"global_prompt": "You are Acme's friendly receptionist.",
											"ivr": null,
											"language": "en",
											"max_chain_steps": 25,
											"max_transitions": 200,
											"max_turns_per_node": 8,
											"max_visits_per_node": 5,
											"on_pre_call_fail": "continue",
											"pre_call_timeout_ms": 2500,
											"style_field": "auto",
											"transition_model": "inline"
										},
										"variables": [
											{
												"key": "customer_id",
												"label": "Customer ID",
												"source": "collected",
												"type": "text"
											}
										]
									},
									"livemode": true,
									"object": "flow_draft",
									"rev": 17,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a flow's draft",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowDraft = await mv.flows.retrieveDraft(\"flow_7Hk2Lm9Qp\");\nconsole.log(flowDraft);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_draft = client.flows.retrieve_draft(\"flow_7Hk2Lm9Qp\")\nprint(flow_draft)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/draft \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"put": {
				"description": "Replaces the draft graph. Nodes are matched to the stored ones by `id`: what the v1 schema does not carry (groups, notes, editor state) is kept, and `internal` nodes stay exactly as stored. `base_rev` must be the draft's current revision, else 409 (details.draft_rev) and nothing is written — read the draft again and retry. Calls keep running the published version until you publish.\n\n[Try it in the API playground](/api/playground/?op=flows_update_draft) with a test-mode key.",
				"operationId": "flows_update_draft",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowDraftParamsInput"
							},
							"example": {
								"base_rev": 17,
								"graph": {
									"nodes": [
										{
											"key": "start",
											"start": {
												"greeting": "Hello!"
											},
											"transitions": [
												{
													"condition": {
														"kind": "always"
													},
													"next": "bye"
												}
											],
											"type": "start"
										},
										{
											"end": {
												"message": "Goodbye."
											},
											"key": "bye",
											"type": "end"
										}
									]
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowDraft"
								},
								"example": {
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"graph": {
										"kind": "voice",
										"nodes": [
											{
												"disabled": false,
												"global": null,
												"key": "start",
												"position": {
													"x": 0,
													"y": 0
												},
												"start": {
													"first_message_mode": "speak",
													"greeting": "Hello, you've reached Acme.",
													"interruptible": true
												},
												"title": "Start",
												"transitions": [
													{
														"condition": {
															"kind": "always"
														},
														"key": "t_next",
														"label": "Next",
														"next": "ask_id"
													}
												],
												"type": "start"
											},
											{
												"disabled": false,
												"global": null,
												"key": "ask_id",
												"position": {
													"x": 320,
													"y": 0
												},
												"question": {
													"confirm": true,
													"max_retries": 2,
													"prompt": "What is your ID number?",
													"reask_prompts": [],
													"var": "customer_id"
												},
												"title": "Ask for the ID",
												"transitions": [
													{
														"condition": {
															"kind": "outcome",
															"outcome": "collected"
														},
														"key": "t_ok",
														"label": "Collected",
														"next": "bye"
													},
													{
														"condition": {
															"kind": "outcome",
															"outcome": "max_retries"
														},
														"key": "t_fail",
														"label": "Couldn't collect",
														"next": "bye"
													}
												],
												"type": "question"
											},
											{
												"disabled": false,
												"end": {
													"message": "Thank you, goodbye."
												},
												"global": null,
												"key": "bye",
												"position": {
													"x": 640,
													"y": 0
												},
												"title": "Goodbye",
												"transitions": [],
												"type": "end"
											}
										],
										"schema_version": 1,
										"settings": {
											"classifier_model": null,
											"fallback_node_key": null,
											"global_prompt": "You are Acme's friendly receptionist.",
											"ivr": null,
											"language": "en",
											"max_chain_steps": 25,
											"max_transitions": 200,
											"max_turns_per_node": 8,
											"max_visits_per_node": 5,
											"on_pre_call_fail": "continue",
											"pre_call_timeout_ms": 2500,
											"style_field": "auto",
											"transition_model": "inline"
										},
										"variables": [
											{
												"key": "customer_id",
												"label": "Customer ID",
												"source": "collected",
												"type": "text"
											}
										]
									},
									"livemode": true,
									"object": "flow_draft",
									"rev": 17,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Replace a flow's draft",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowDraft = await mv.flows.updateDraft(\"flow_7Hk2Lm9Qp\", {\n\tbase_rev: 17,\n\tgraph: {\n\t\tnodes: [\n\t\t\t{\n\t\t\t\tkey: \"start\",\n\t\t\t\tstart: {\n\t\t\t\t\tgreeting: \"Hello!\",\n\t\t\t\t},\n\t\t\t\ttransitions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcondition: {\n\t\t\t\t\t\t\tkind: \"always\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext: \"bye\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\ttype: \"start\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tend: {\n\t\t\t\t\tmessage: \"Goodbye.\",\n\t\t\t\t},\n\t\t\t\tkey: \"bye\",\n\t\t\t\ttype: \"end\",\n\t\t\t},\n\t\t],\n\t},\n});\nconsole.log(flowDraft);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_draft = client.flows.update_draft(\"flow_7Hk2Lm9Qp\", {\n    \"base_rev\": 17,\n    \"graph\": {\n        \"nodes\": [\n            {\n                \"key\": \"start\",\n                \"start\": {\n                    \"greeting\": \"Hello!\",\n                },\n                \"transitions\": [\n                    {\n                        \"condition\": {\n                            \"kind\": \"always\",\n                        },\n                        \"next\": \"bye\",\n                    },\n                ],\n                \"type\": \"start\",\n            },\n            {\n                \"end\": {\n                    \"message\": \"Goodbye.\",\n                },\n                \"key\": \"bye\",\n                \"type\": \"end\",\n            },\n        ],\n    },\n})\nprint(flow_draft)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PUT https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/draft \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"base_rev\": 17,\n  \"graph\": {\n    \"nodes\": [\n      {\n        \"key\": \"start\",\n        \"start\": {\n          \"greeting\": \"Hello!\"\n        },\n        \"transitions\": [\n          {\n            \"condition\": {\n              \"kind\": \"always\"\n            },\n            \"next\": \"bye\"\n          }\n        ],\n        \"type\": \"start\"\n      },\n      {\n        \"end\": {\n          \"message\": \"Goodbye.\"\n        },\n        \"key\": \"bye\",\n        \"type\": \"end\"\n      }\n    ]\n  }\n}'\n"
					}
				]
			}
		},
		"/flows/{id}/duplicate": {
			"post": {
				"description": "Creates a new flow from this one's draft (unpublished, linked to no assistant).\n\n[Try it in the API playground](/api/playground/?op=flows_duplicate) with a test-mode key.",
				"operationId": "flows_duplicate",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DuplicateFlowParamsInput"
							},
							"example": {
								"name": "Reception B"
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Flow"
								},
								"example": {
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"description": "Identify the caller and route them.",
									"draft_rev": 17,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"kind": "voice",
									"latest_version": 3,
									"livemode": true,
									"name": "Reception",
									"node_count": 12,
									"object": "flow",
									"published_version": 3,
									"status": "published",
									"template_id": null,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "The copy."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Duplicate a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flow = await mv.flows.duplicate(\"flow_7Hk2Lm9Qp\", {\n\tname: \"Reception B\",\n});\nconsole.log(flow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow = client.flows.duplicate(\"flow_7Hk2Lm9Qp\", {\n    \"name\": \"Reception B\",\n})\nprint(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/duplicate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"name\": \"Reception B\"\n}'\n"
					}
				]
			}
		},
		"/flows/{id}/publish": {
			"post": {
				"description": "Publishes the draft as a new immutable version; calls start using it at once. A draft with errors is refused with 409 flow_invalid (details.issues: what to fix).\n\n[Try it in the API playground](/api/playground/?op=flows_publish) with a test-mode key.",
				"operationId": "flows_publish",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowPublishParamsInput"
							},
							"example": {
								"note": "New opening hours"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Flow"
								},
								"example": {
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"description": "Identify the caller and route them.",
									"draft_rev": 17,
									"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"kind": "voice",
									"latest_version": 3,
									"livemode": true,
									"name": "Reception",
									"node_count": 12,
									"object": "flow",
									"published_version": 3,
									"status": "published",
									"template_id": null,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Publish a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flow = await mv.flows.publish(\"flow_7Hk2Lm9Qp\", {\n\tnote: \"New opening hours\",\n});\nconsole.log(flow);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow = client.flows.publish(\"flow_7Hk2Lm9Qp\", {\n    \"note\": \"New opening hours\",\n})\nprint(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/publish \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"note\": \"New opening hours\"\n}'\n"
					}
				]
			}
		},
		"/flows/{id}/simulate": {
			"post": {
				"description": "Runs a text-only call through the flow's draft (or a published `version`) with the real flow engine and the assistant's model, and answers what happened: the turns, the nodes entered, the actions (dry runs: no API or tool request is sent) and where the call stands. Send the caller's lines as `messages` / `message`, keys as `dtmf`, silence as `no_response`. Continue the same simulation with `sim_id` (it lives 15 minutes). With a test key the models are mocks.\n\nSend `Accept: text/event-stream` to receive the same simulation as Server-Sent Events while it runs: `sim.started` (`sim_id`, `resumed`, `kind`), then `sim.node`, `sim.turn` and `sim.action` (each with the fields of the matching FlowSimulation entry) in order, and last `sim.done`, whose data is this endpoint's JSON answer; `error` ends a failed run. Closing the connection stops the simulation. A streamed answer counts against the key's stream limit and is not stored for Idempotency-Key replays.\n\n[Try it in the API playground](/api/playground/?op=flows_simulate) with a test-mode key.",
				"operationId": "flows_simulate",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowSimulateParamsInput"
							},
							"example": {
								"messages": [
									"Hi, I'd like to book an appointment",
									"Tomorrow at 10"
								]
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowSimulation"
								},
								"example": {
									"actions": [],
									"coverage": {
										"node_count": 5,
										"node_pct": 60,
										"transition_count": 5,
										"transition_pct": 40,
										"unvisited_node_keys": [
											"bye"
										],
										"visited_node_keys": [
											"start",
											"ask_id"
										]
									},
									"current_node_key": "ask_id",
									"end_reason": null,
									"ended": false,
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"id": "sim_7Hk2pQ9xZb4Lm8Nc3Rt6Vw",
									"livemode": false,
									"object": "flow_simulation",
									"path": [
										{
											"from_node_key": null,
											"node_key": "start",
											"node_type": "start",
											"transition_key": null,
											"via": "start"
										},
										{
											"from_node_key": "start",
											"node_key": "ask_id",
											"node_type": "question",
											"transition_key": "t_next",
											"via": "always"
										}
									],
									"resumed": false,
									"turns": [
										{
											"node_key": "start",
											"role": "assistant",
											"source": "script",
											"text": "Hello, you've reached Acme."
										},
										{
											"node_key": "ask_id",
											"role": "customer",
											"source": "speech",
											"text": "Hi, I'd like to book an appointment"
										},
										{
											"node_key": "ask_id",
											"role": "assistant",
											"source": "ai",
											"text": "Sure! What is your ID number?"
										}
									],
									"variables": {
										"customer_id": null
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Simulate a call through a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowSimulation = await mv.flows.simulate(\"flow_7Hk2Lm9Qp\", {\n\tmessages: [\n\t\t\"Hi, I'd like to book an appointment\",\n\t\t\"Tomorrow at 10\",\n\t],\n});\nconsole.log(flowSimulation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_simulation = client.flows.simulate(\"flow_7Hk2Lm9Qp\", {\n    \"messages\": [\n        \"Hi, I'd like to book an appointment\",\n        \"Tomorrow at 10\",\n    ],\n})\nprint(flow_simulation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/simulate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"messages\": [\n    \"Hi, I'\\''d like to book an appointment\",\n    \"Tomorrow at 10\"\n  ]\n}'\n"
					}
				]
			}
		},
		"/flows/{id}/usage": {
			"get": {
				"operationId": "flows_retrieve_usage",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowUsage"
								},
								"example": {
									"assistants": [
										{
											"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
											"name": "Receptionist"
										}
									],
									"copilot_profiles": [],
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"object": "flow_usage"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve what uses a flow",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"description": "Returns the `FlowUsage` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=flows_retrieve_usage) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowUsage = await mv.flows.retrieveUsage(\"flow_7Hk2Lm9Qp\");\nconsole.log(flowUsage);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_usage = client.flows.retrieve_usage(\"flow_7Hk2Lm9Qp\")\nprint(flow_usage)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/usage \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flows/{id}/versions": {
			"get": {
				"operationId": "flows_list_versions",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowVersionList"
								},
								"example": {
									"data": [
										{
											"checksum": "3f786850e387550fdab836ed7e6dc881de23001b",
											"created": "2026-11-03T09:14:22.000Z",
											"edge_count": 15,
											"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
											"livemode": true,
											"node_count": 12,
											"note": "New opening hours",
											"object": "flow_version",
											"version": 3
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/flows/flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8/versions"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a flow's versions",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"description": "Returns a page of `FlowVersion` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=flows_list_versions) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const flow of mv.flows.listVersions(\"flow_7Hk2Lm9Qp\")) {\n\tconsole.log(flow);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor flow in client.flows.list_versions(\"flow_7Hk2Lm9Qp\"):\n    print(flow)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/versions \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flows/{id}/versions/{version}": {
			"get": {
				"description": "A published version, with its graph.\n\n[Try it in the API playground](/api/playground/?op=flows_retrieve_version) with a test-mode key.",
				"operationId": "flows_retrieve_version",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "The version number.",
						"example": "3",
						"in": "path",
						"name": "version",
						"required": true,
						"schema": {
							"pattern": "^[1-9][0-9]{0,6}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowVersion"
								},
								"example": {
									"checksum": "3f786850e387550fdab836ed7e6dc881de23001b",
									"created": "2026-11-03T09:14:22.000Z",
									"edge_count": 15,
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"graph": {
										"kind": "voice",
										"nodes": [
											{
												"disabled": false,
												"global": null,
												"key": "start",
												"position": {
													"x": 0,
													"y": 0
												},
												"start": {
													"first_message_mode": "speak",
													"greeting": "Hello, you've reached Acme.",
													"interruptible": true
												},
												"title": "Start",
												"transitions": [
													{
														"condition": {
															"kind": "always"
														},
														"key": "t_next",
														"label": "Next",
														"next": "ask_id"
													}
												],
												"type": "start"
											},
											{
												"disabled": false,
												"global": null,
												"key": "ask_id",
												"position": {
													"x": 320,
													"y": 0
												},
												"question": {
													"confirm": true,
													"max_retries": 2,
													"prompt": "What is your ID number?",
													"reask_prompts": [],
													"var": "customer_id"
												},
												"title": "Ask for the ID",
												"transitions": [
													{
														"condition": {
															"kind": "outcome",
															"outcome": "collected"
														},
														"key": "t_ok",
														"label": "Collected",
														"next": "bye"
													},
													{
														"condition": {
															"kind": "outcome",
															"outcome": "max_retries"
														},
														"key": "t_fail",
														"label": "Couldn't collect",
														"next": "bye"
													}
												],
												"type": "question"
											},
											{
												"disabled": false,
												"end": {
													"message": "Thank you, goodbye."
												},
												"global": null,
												"key": "bye",
												"position": {
													"x": 640,
													"y": 0
												},
												"title": "Goodbye",
												"transitions": [],
												"type": "end"
											}
										],
										"schema_version": 1,
										"settings": {
											"classifier_model": null,
											"fallback_node_key": null,
											"global_prompt": "You are Acme's friendly receptionist.",
											"ivr": null,
											"language": "en",
											"max_chain_steps": 25,
											"max_transitions": 200,
											"max_turns_per_node": 8,
											"max_visits_per_node": 5,
											"on_pre_call_fail": "continue",
											"pre_call_timeout_ms": 2500,
											"style_field": "auto",
											"transition_model": "inline"
										},
										"variables": [
											{
												"key": "customer_id",
												"label": "Customer ID",
												"source": "collected",
												"type": "text"
											}
										]
									},
									"livemode": true,
									"node_count": 12,
									"note": "New opening hours",
									"object": "flow_version",
									"version": 3
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a flow version",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowVersion = await mv.flows.retrieveVersion(\"flow_7Hk2Lm9Qp\", \"3\");\nconsole.log(flowVersion);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_version = client.flows.retrieve_version(\"flow_7Hk2Lm9Qp\", \"3\")\nprint(flow_version)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/versions/3 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/flows/{id}/versions/{version}/restore": {
			"post": {
				"description": "Copies the version's graph into the draft (a new draft revision). It is not published: publish to run it.\n\n[Try it in the API playground](/api/playground/?op=flows_restore_version) with a test-mode key.",
				"operationId": "flows_restore_version",
				"parameters": [
					{
						"description": "A flow ID (`flow_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^flow_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "The version number.",
						"example": "3",
						"in": "path",
						"name": "version",
						"required": true,
						"schema": {
							"pattern": "^[1-9][0-9]{0,6}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FlowDraft"
								},
								"example": {
									"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
									"graph": {
										"kind": "voice",
										"nodes": [
											{
												"disabled": false,
												"global": null,
												"key": "start",
												"position": {
													"x": 0,
													"y": 0
												},
												"start": {
													"first_message_mode": "speak",
													"greeting": "Hello, you've reached Acme.",
													"interruptible": true
												},
												"title": "Start",
												"transitions": [
													{
														"condition": {
															"kind": "always"
														},
														"key": "t_next",
														"label": "Next",
														"next": "ask_id"
													}
												],
												"type": "start"
											},
											{
												"disabled": false,
												"global": null,
												"key": "ask_id",
												"position": {
													"x": 320,
													"y": 0
												},
												"question": {
													"confirm": true,
													"max_retries": 2,
													"prompt": "What is your ID number?",
													"reask_prompts": [],
													"var": "customer_id"
												},
												"title": "Ask for the ID",
												"transitions": [
													{
														"condition": {
															"kind": "outcome",
															"outcome": "collected"
														},
														"key": "t_ok",
														"label": "Collected",
														"next": "bye"
													},
													{
														"condition": {
															"kind": "outcome",
															"outcome": "max_retries"
														},
														"key": "t_fail",
														"label": "Couldn't collect",
														"next": "bye"
													}
												],
												"type": "question"
											},
											{
												"disabled": false,
												"end": {
													"message": "Thank you, goodbye."
												},
												"global": null,
												"key": "bye",
												"position": {
													"x": 640,
													"y": 0
												},
												"title": "Goodbye",
												"transitions": [],
												"type": "end"
											}
										],
										"schema_version": 1,
										"settings": {
											"classifier_model": null,
											"fallback_node_key": null,
											"global_prompt": "You are Acme's friendly receptionist.",
											"ivr": null,
											"language": "en",
											"max_chain_steps": 25,
											"max_transitions": 200,
											"max_turns_per_node": 8,
											"max_visits_per_node": 5,
											"on_pre_call_fail": "continue",
											"pre_call_timeout_ms": 2500,
											"style_field": "auto",
											"transition_model": "inline"
										},
										"variables": [
											{
												"key": "customer_id",
												"label": "Customer ID",
												"source": "collected",
												"type": "text"
											}
										]
									},
									"livemode": true,
									"object": "flow_draft",
									"rev": 17,
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Restore a flow version into the draft",
				"tags": [
					"Flows"
				],
				"x-morevoice-scopes": [
					"flows:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst flowDraft = await mv.flows.restore.version(\"flow_7Hk2Lm9Qp\", \"3\");\nconsole.log(flowDraft);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nflow_draft = client.flows.restore.version(\"flow_7Hk2Lm9Qp\", \"3\")\nprint(flow_draft)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/flows/flow_7Hk2Lm9Qp/versions/3/restore \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/imports/{id}": {
			"get": {
				"operationId": "imports_retrieve",
				"parameters": [
					{
						"description": "A import ID (`imp_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^imp_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ContactImport"
								},
								"example": {
									"campaign_id": "cmp_2Yb7mCq9aPLk",
									"completed_at": "2026-11-02T07:00:03.870Z",
									"consent_recorded": 0,
									"created_at": "2026-11-02T07:00:00.000Z",
									"error": null,
									"errors": [
										{
											"message": "too-short",
											"phone": "05012",
											"reason": "invalid",
											"row": 17
										}
									],
									"filename": "contacts.csv",
									"id": "imp_7RkXq2Lm9PvTz4nB1c8Ya",
									"imported": 4890,
									"livemode": true,
									"object": "import",
									"received": 5000,
									"rejected": 110,
									"rejected_reasons": {
										"dnc": 20,
										"duplicate": 40,
										"invalid": 50
									},
									"source": "csv",
									"started_at": "2026-11-02T07:00:00.120Z",
									"status": "succeeded",
									"warnings": [],
									"without_consent": 0
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a contact import",
				"tags": [
					"Imports"
				],
				"x-morevoice-scopes": [
					"contacts:read"
				],
				"description": "Returns a background contact import: its `status` (`pending`, `processing`, then `succeeded` or `failed`), how many rows were received, imported and rejected, and why rows were rejected. Poll it until it succeeds or fails; `importCsv` in the SDK does that for you.\n\n[Try it in the API playground](/api/playground/?op=imports_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst contactImport = await mv.imports.retrieve(\"imp_7Hk2Lm9Qp\");\nconsole.log(contactImport);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncontact_import = client.imports.retrieve(\"imp_7Hk2Lm9Qp\")\nprint(contact_import)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/imports/imp_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/inbound_routes": {
			"get": {
				"description": "Your routes in evaluation order: priority, then age. The first enabled route that matches a call wins.\n\n[Try it in the API playground](/api/playground/?op=inbound_routes_list) with a test-mode key.",
				"operationId": "inbound_routes_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboundRouteList"
								},
								"example": {
									"data": [
										{
											"assistant_request_timeout_ms": 1500,
											"assistant_request_url": null,
											"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
											"created": "2026-11-03T09:14:22.000Z",
											"enabled": true,
											"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
											"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
											"livemode": true,
											"match_caller": "",
											"match_did": "+97231234567",
											"name": "Sales line",
											"object": "inbound_route",
											"priority": 100,
											"target": {
												"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
												"type": "queue"
											}
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/inbound_routes"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List inbound routes",
				"tags": [
					"Inbound routes"
				],
				"x-morevoice-scopes": [
					"inbound_routes:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const inboundRoute of mv.inboundRoutes.list()) {\n\tconsole.log(inboundRoute);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor inbound_route in client.inbound_routes.list():\n    print(inbound_route)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/inbound_routes \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"operationId": "inbound_routes_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InboundRouteCreateParamsInput"
							},
							"example": {
								"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"match_did": "+97231234567",
								"name": "Sales line",
								"target": {
									"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"type": "queue"
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboundRoute"
								},
								"example": {
									"assistant_request_timeout_ms": 1500,
									"assistant_request_url": null,
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"livemode": true,
									"match_caller": "",
									"match_did": "+97231234567",
									"name": "Sales line",
									"object": "inbound_route",
									"priority": 100,
									"target": {
										"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"type": "queue"
									}
								}
							}
						},
						"description": "The new route."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create an inbound route",
				"tags": [
					"Inbound routes"
				],
				"x-morevoice-scopes": [
					"inbound_routes:write"
				],
				"description": "Adds a rule that answers inbound calls. `target` is required: an assistant, a published flow, a queue, a person or a conference room. The other fields default: enabled, priority 100, any connection, any dialled number and any caller. `match_did` and `match_caller` take an exact number, a prefix ending in `*`, or nothing for any. The next call uses the new rule.\n\n[Try it in the API playground](/api/playground/?op=inbound_routes_create) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst inboundRoute = await mv.inboundRoutes.create({\n\tfallback_assistant_id: \"asst_3cYbE6uYvGkH8w4ZK1rTqd\",\n\tmatch_did: \"+97231234567\",\n\tname: \"Sales line\",\n\ttarget: {\n\t\tqueue_id: \"q_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n\t\ttype: \"queue\",\n\t},\n});\nconsole.log(inboundRoute);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninbound_route = client.inbound_routes.create({\n    \"fallback_assistant_id\": \"asst_3cYbE6uYvGkH8w4ZK1rTqd\",\n    \"match_did\": \"+97231234567\",\n    \"name\": \"Sales line\",\n    \"target\": {\n        \"queue_id\": \"q_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n        \"type\": \"queue\",\n    },\n})\nprint(inbound_route)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/inbound_routes \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"fallback_assistant_id\": \"asst_3cYbE6uYvGkH8w4ZK1rTqd\",\n  \"match_did\": \"+97231234567\",\n  \"name\": \"Sales line\",\n  \"target\": {\n    \"queue_id\": \"q_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n    \"type\": \"queue\"\n  }\n}'\n"
					}
				]
			}
		},
		"/inbound_routes/{id}": {
			"delete": {
				"operationId": "inbound_routes_delete",
				"parameters": [
					{
						"description": "A inbound route ID (`rte_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rte_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedInboundRoute"
								},
								"example": {
									"deleted": true,
									"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"object": "inbound_route"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete an inbound route",
				"tags": [
					"Inbound routes"
				],
				"x-morevoice-scopes": [
					"inbound_routes:write"
				],
				"description": "Deletes an inbound route. Calls already in progress are not affected; the next call is routed by the remaining rules.\n\n[Try it in the API playground](/api/playground/?op=inbound_routes_delete) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedInboundRoute = await mv.inboundRoutes.delete(\"rte_7Hk2Lm9Qp\");\nconsole.log(deletedInboundRoute);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_inbound_route = client.inbound_routes.delete(\"rte_7Hk2Lm9Qp\")\nprint(deleted_inbound_route)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/inbound_routes/rte_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "inbound_routes_retrieve",
				"parameters": [
					{
						"description": "A inbound route ID (`rte_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rte_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboundRoute"
								},
								"example": {
									"assistant_request_timeout_ms": 1500,
									"assistant_request_url": null,
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"livemode": true,
									"match_caller": "",
									"match_did": "+97231234567",
									"name": "Sales line",
									"object": "inbound_route",
									"priority": 100,
									"target": {
										"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"type": "queue"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an inbound route",
				"tags": [
					"Inbound routes"
				],
				"x-morevoice-scopes": [
					"inbound_routes:read"
				],
				"description": "Returns an inbound route: what it matches (`connection_id`, `match_did`, `match_caller`), its `priority`, whether it is `enabled`, and its `target`.\n\n[Try it in the API playground](/api/playground/?op=inbound_routes_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst inboundRoute = await mv.inboundRoutes.retrieve(\"rte_7Hk2Lm9Qp\");\nconsole.log(inboundRoute);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninbound_route = client.inbound_routes.retrieve(\"rte_7Hk2Lm9Qp\")\nprint(inbound_route)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/inbound_routes/rte_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Changes the fields you send. A new `target` replaces the old one (and drops `fallback_assistant_id` when the new target is an assistant).\n\n[Try it in the API playground](/api/playground/?op=inbound_routes_update) with a test-mode key.",
				"operationId": "inbound_routes_update",
				"parameters": [
					{
						"description": "A inbound route ID (`rte_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rte_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InboundRouteUpdateParamsInput"
							},
							"example": {
								"enabled": false
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboundRoute"
								},
								"example": {
									"assistant_request_timeout_ms": 1500,
									"assistant_request_url": null,
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"livemode": true,
									"match_caller": "",
									"match_did": "+97231234567",
									"name": "Sales line",
									"object": "inbound_route",
									"priority": 100,
									"target": {
										"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
										"type": "queue"
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update an inbound route",
				"tags": [
					"Inbound routes"
				],
				"x-morevoice-scopes": [
					"inbound_routes:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst inboundRoute = await mv.inboundRoutes.update(\"rte_7Hk2Lm9Qp\", {\n\tenabled: false,\n});\nconsole.log(inboundRoute);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninbound_route = client.inbound_routes.update(\"rte_7Hk2Lm9Qp\", {\n    \"enabled\": False,\n})\nprint(inbound_route)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/inbound_routes/rte_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"enabled\": false\n}'\n"
					}
				]
			}
		},
		"/insights": {
			"get": {
				"description": "Analytics over the period's scored calls: KPIs, dispositions, the top objections and the answers that win, behaviour buckets and per-agent trends.\n\n[Try it in the API playground](/api/playground/?op=insights_retrieve) with a test-mode key.",
				"operationId": "insights_retrieve",
				"parameters": [
					{
						"description": "The period: the last N days (1–365, default 30).",
						"in": "query",
						"name": "days",
						"required": false,
						"schema": {
							"default": 30,
							"maximum": 365,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "Only this agent's calls.",
						"in": "query",
						"name": "agent_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Insights"
								},
								"example": {
									"agents": [
										{
											"average_score": 83.2,
											"calls": 87,
											"compliance_fails": 0,
											"name": "Dana Levi",
											"pass_rate": 0.9,
											"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
											"weekly": [
												{
													"average_score": 84.5,
													"calls": 21,
													"week": "2026-10-25"
												}
											],
											"win_rate": 0.31
										}
									],
									"behaviour": {
										"checklist": null,
										"questions": [
											{
												"average_score": 84,
												"calls": 98,
												"label": "5–8",
												"win_rate": 0.38
											}
										],
										"talk_ratio": [
											{
												"average_score": 82.1,
												"calls": 120,
												"label": "35–55%",
												"win_rate": 0.34
											}
										]
									},
									"copilot": {
										"adoption_rate": 0.42,
										"thumbs_down": 4,
										"thumbs_up": 31
									},
									"days": 30,
									"dispositions": [
										{
											"calls": 64,
											"disposition": "appointment"
										}
									],
									"from": "2026-10-04T09:14:22.000Z",
									"kpis": {
										"analyzed": 412,
										"average_duration_seconds": 245,
										"average_score": 78.4,
										"compliance_fail_rate": 0.03,
										"pass_rate": 0.81,
										"win_rate": 0.27
									},
									"livemode": true,
									"object": "insights",
									"semantic_clustering": true,
									"to": "2026-11-03T09:14:22.000Z",
									"top_objections": [
										{
											"best_response": "Compared it with today's costs.",
											"calls": 51,
											"count": 58,
											"examples": [
												"It's too expensive"
											],
											"handled_rate": 0.72,
											"label": "Too expensive",
											"win_rate": 0.22,
											"win_rate_handled": 0.29,
											"win_rate_unhandled": 0.06
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve conversation insights",
				"tags": [
					"Insights"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst insights = await mv.insights.retrieve();\nconsole.log(insights);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninsights = client.insights.retrieve()\nprint(insights)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/insights \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/invitations": {
			"get": {
				"description": "Open invitations, and those that expired in the last 30 days (resend them).\n\n[Try it in the API playground](/api/playground/?op=invitations_list) with a test-mode key.",
				"operationId": "invitations_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InvitationList"
								},
								"example": {
									"data": [
										{
											"billing": false,
											"created": "2026-11-03T09:14:22.000Z",
											"email": "yossi@example.com",
											"existing_user": false,
											"expires": "2026-11-10T09:14:22.000Z",
											"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
											"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
											"livemode": true,
											"object": "invitation",
											"role": "agent",
											"status": "pending",
											"team_id": null
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/invitations"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List invitations",
				"tags": [
					"Invitations"
				],
				"x-morevoice-scopes": [
					"users:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const invitation of mv.invitations.list()) {\n\tconsole.log(invitation);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor invitation in client.invitations.list():\n    print(invitation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/invitations \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Invites one person by email. They join with the role you chose when they accept (7 days). A seat is reserved for them: 402 plan_limit when none is free. Inviting an address that already has an open invitation replaces it (the old link stops working). The link is only emailed — the API never returns it.\n\n[Try it in the API playground](/api/playground/?op=invitations_create) with a test-mode key.",
				"operationId": "invitations_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InvitationCreateParamsInput"
							},
							"example": {
								"email": "yossi@example.com",
								"role": "agent"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Invitation"
								},
								"example": {
									"billing": false,
									"created": "2026-11-03T09:14:22.000Z",
									"email": "yossi@example.com",
									"emailed": true,
									"existing_user": false,
									"expires": "2026-11-10T09:14:22.000Z",
									"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
									"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"livemode": true,
									"object": "invitation",
									"role": "agent",
									"status": "pending",
									"team_id": null
								}
							}
						},
						"description": "The invitation."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Invite a user",
				"tags": [
					"Invitations"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst invitation = await mv.invitations.create({\n\temail: \"yossi@example.com\",\n\trole: \"agent\",\n});\nconsole.log(invitation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninvitation = client.invitations.create({\n    \"email\": \"yossi@example.com\",\n    \"role\": \"agent\",\n})\nprint(invitation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/invitations \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"email\": \"yossi@example.com\",\n  \"role\": \"agent\"\n}'\n"
					}
				]
			}
		},
		"/invitations/{id}": {
			"delete": {
				"operationId": "invitations_delete",
				"parameters": [
					{
						"description": "A invitation ID (`inv_t_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^inv_t_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedInvitation"
								},
								"example": {
									"deleted": true,
									"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
									"object": "invitation"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Withdraw an invitation",
				"tags": [
					"Invitations"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"description": "Returns the deleted object's `id` with `deleted: true`. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=invitations_delete) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedInvitation = await mv.invitations.delete(\"inv_t_7Hk2Lm9Qp\");\nconsole.log(deletedInvitation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_invitation = client.invitations.delete(\"inv_t_7Hk2Lm9Qp\")\nprint(deleted_invitation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/invitations/inv_t_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "invitations_retrieve",
				"parameters": [
					{
						"description": "A invitation ID (`inv_t_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^inv_t_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Invitation"
								},
								"example": {
									"billing": false,
									"created": "2026-11-03T09:14:22.000Z",
									"email": "yossi@example.com",
									"emailed": true,
									"existing_user": false,
									"expires": "2026-11-10T09:14:22.000Z",
									"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
									"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"livemode": true,
									"object": "invitation",
									"role": "agent",
									"status": "pending",
									"team_id": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve an invitation",
				"tags": [
					"Invitations"
				],
				"x-morevoice-scopes": [
					"users:read"
				],
				"description": "Returns the `Invitation` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=invitations_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst invitation = await mv.invitations.retrieve(\"inv_t_7Hk2Lm9Qp\");\nconsole.log(invitation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninvitation = client.invitations.retrieve(\"inv_t_7Hk2Lm9Qp\")\nprint(invitation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/invitations/inv_t_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/invitations/{id}/resend": {
			"post": {
				"description": "Emails a new link, valid 7 more days (the previous link stops working). An expired invitation takes its seat back, so it is seat-checked again.\n\n[Try it in the API playground](/api/playground/?op=invitations_resend) with a test-mode key.",
				"operationId": "invitations_resend",
				"parameters": [
					{
						"description": "A invitation ID (`inv_t_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^inv_t_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Invitation"
								},
								"example": {
									"billing": false,
									"created": "2026-11-03T09:14:22.000Z",
									"email": "yossi@example.com",
									"emailed": true,
									"existing_user": false,
									"expires": "2026-11-10T09:14:22.000Z",
									"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
									"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"livemode": true,
									"object": "invitation",
									"role": "agent",
									"status": "pending",
									"team_id": null
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Resend an invitation",
				"tags": [
					"Invitations"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst invitation = await mv.invitations.resend(\"inv_t_7Hk2Lm9Qp\");\nconsole.log(invitation);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ninvitation = client.invitations.resend(\"inv_t_7Hk2Lm9Qp\")\nprint(invitation)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/invitations/inv_t_7Hk2Lm9Qp/resend \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/kb/documents": {
			"get": {
				"operationId": "kb_documents_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only documents in this status.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"pending",
								"processing",
								"ready",
								"error"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/KbDocumentList"
								},
								"example": {
									"data": [
										{
											"bytes": 184320,
											"chunk_count": 42,
											"created": "2026-11-03T09:14:22.000Z",
											"error": null,
											"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
											"kind": "pdf",
											"livemode": true,
											"object": "kb_document",
											"original_stored": true,
											"source": "price-list-2026.pdf",
											"status": "ready",
											"title": "Price list 2026",
											"updated": "2026-11-03T09:14:31.000Z"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/kb/documents"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List knowledge-base documents",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:read"
				],
				"description": "Returns a page of `KbDocument` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const kbDocument of mv.kbDocuments.list()) {\n\tconsole.log(kbDocument);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor kb_document in client.kb_documents.list():\n    print(kb_document)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/kb/documents \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Adds a document from a file (JSON with base64, or multipart/form-data with a `file` part, ≤ 25 MB), a public URL, or text, and indexes it in the background: answers 202 with the document `pending`. Poll it until `status` is `ready` (searchable) or `error`. Beyond the plan's knowledge-base storage: 402 plan_limit.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_create) with a test-mode key.",
				"operationId": "kb_documents_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KbDocumentCreateParamsInput"
							},
							"example": {
								"text": "# Opening hours\nSunday–Thursday 08:00–18:00, Friday 08:00–13:00.",
								"title": "Opening hours"
							}
						},
						"multipart/form-data": {
							"schema": {
								"description": "A file upload as multipart/form-data.",
								"properties": {
									"file": {
										"description": "The file (up to 25 MB): PDF, DOCX, XLSX, CSV, Markdown, text or HTML.",
										"format": "binary",
										"type": "string"
									},
									"title": {
										"description": "Default: the file's name.",
										"type": "string"
									}
								},
								"required": [
									"file"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"202": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/KbDocument"
								},
								"example": {
									"bytes": 184320,
									"chunk_count": 42,
									"created": "2026-11-03T09:14:22.000Z",
									"error": null,
									"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
									"kind": "pdf",
									"livemode": true,
									"object": "kb_document",
									"original_stored": true,
									"source": "price-list-2026.pdf",
									"status": "ready",
									"title": "Price list 2026",
									"updated": "2026-11-03T09:14:31.000Z"
								}
							}
						},
						"description": "Accepted: the document is indexed in the background."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Add a knowledge-base document",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst kbDocument = await mv.kbDocuments.create({\n\ttext: \"# Opening hours\\nSunday–Thursday 08:00–18:00, Friday 08:00–13:00.\",\n\ttitle: \"Opening hours\",\n});\nconsole.log(kbDocument);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nkb_document = client.kb_documents.create({\n    \"text\": \"# Opening hours\\nSunday–Thursday 08:00–18:00, Friday 08:00–13:00.\",\n    \"title\": \"Opening hours\",\n})\nprint(kb_document)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/kb/documents \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"text\": \"# Opening hours\\nSunday–Thursday 08:00–18:00, Friday 08:00–13:00.\",\n  \"title\": \"Opening hours\"\n}'\n"
					}
				]
			}
		},
		"/kb/documents/{id}": {
			"delete": {
				"description": "Deletes the document, its passages and its stored original. Assistants and the copilot stop answering from it at once.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_delete) with a test-mode key.",
				"operationId": "kb_documents_delete",
				"parameters": [
					{
						"description": "A kb document ID (`kbd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedKbDocument"
								},
								"example": {
									"deleted": true,
									"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
									"object": "kb_document"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a knowledge-base document",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedKbDocument = await mv.kbDocuments.delete(\"kbd_7Hk2Lm9Qp\");\nconsole.log(deletedKbDocument);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_kb_document = client.kb_documents.delete(\"kbd_7Hk2Lm9Qp\")\nprint(deleted_kb_document)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/kb/documents/kbd_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "kb_documents_retrieve",
				"parameters": [
					{
						"description": "A kb document ID (`kbd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/KbDocument"
								},
								"example": {
									"bytes": 184320,
									"chunk_count": 42,
									"created": "2026-11-03T09:14:22.000Z",
									"error": null,
									"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
									"kind": "pdf",
									"livemode": true,
									"object": "kb_document",
									"original_stored": true,
									"source": "price-list-2026.pdf",
									"status": "ready",
									"title": "Price list 2026",
									"updated": "2026-11-03T09:14:31.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a knowledge-base document",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:read"
				],
				"description": "Returns the `KbDocument` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst kbDocument = await mv.kbDocuments.retrieve(\"kbd_7Hk2Lm9Qp\");\nconsole.log(kbDocument);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nkb_document = client.kb_documents.retrieve(\"kbd_7Hk2Lm9Qp\")\nprint(kb_document)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/kb/documents/kbd_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/kb/documents/{id}/content": {
			"get": {
				"description": "The uploaded original, as it was uploaded (its own content type). 404 for URL documents and when the original is not stored (`original_stored: false`). Every download is audited.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_retrieve_content) with a test-mode key.",
				"operationId": "kb_documents_retrieve_content",
				"parameters": [
					{
						"description": "A kb document ID (`kbd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/octet-stream": {
								"schema": {
									"format": "binary",
									"type": "string"
								}
							}
						},
						"description": "The file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Download a document's original file",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.kbDocuments.retrieveContent(\"kbd_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.kb_documents.retrieve_content(\"kbd_7Hk2Lm9Qp\")\nprint(data)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/kb/documents/kbd_7Hk2Lm9Qp/content \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/kb/documents/{id}/reingest": {
			"post": {
				"description": "Reads the document again — a URL is fetched again, a file is re-read from its stored original — and re-indexes it in the background (202). 409 when the original of an uploaded file is not stored: upload it again.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_reingest) with a test-mode key.",
				"operationId": "kb_documents_reingest",
				"parameters": [
					{
						"description": "A kb document ID (`kbd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"202": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/KbDocument"
								},
								"example": {
									"bytes": 184320,
									"chunk_count": 42,
									"created": "2026-11-03T09:14:22.000Z",
									"error": null,
									"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
									"kind": "pdf",
									"livemode": true,
									"object": "kb_document",
									"original_stored": true,
									"source": "price-list-2026.pdf",
									"status": "ready",
									"title": "Price list 2026",
									"updated": "2026-11-03T09:14:31.000Z"
								}
							}
						},
						"description": "Accepted: the document is re-indexed in the background."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Re-index a knowledge-base document",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst kbDocument = await mv.kbDocuments.reingest(\"kbd_7Hk2Lm9Qp\");\nconsole.log(kbDocument);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nkb_document = client.kb_documents.reingest(\"kbd_7Hk2Lm9Qp\")\nprint(kb_document)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/kb/documents/kbd_7Hk2Lm9Qp/reingest \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/kb/search": {
			"post": {
				"description": "The passages that best answer `query`, ranked like assistants and the copilot rank them (hybrid: words and meaning). Test keys search by words only, without an embedding call.\n\n[Try it in the API playground](/api/playground/?op=kb_documents_search) with a test-mode key.",
				"operationId": "kb_documents_search",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KbSearchParamsInput"
							},
							"example": {
								"limit": 3,
								"query": "When are you open on Friday?"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/KbSearchResult"
								},
								"example": {
									"data": [
										{
											"document_id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
											"document_title": "Opening hours",
											"heading": "Opening hours",
											"match": "hybrid",
											"object": "kb_search_hit",
											"score": 0.82,
											"snippet": "… Friday 08:00–13:00.",
											"text": "Sunday–Thursday 08:00–18:00, Friday 08:00–13:00."
										}
									],
									"livemode": true,
									"object": "kb_search_result",
									"query": "When are you open on Friday?",
									"semantic": true
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Search the knowledge base",
				"tags": [
					"Knowledge base"
				],
				"x-morevoice-scopes": [
					"kb:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst kbSearchResult = await mv.kb.documentsSearch({\n\tlimit: 3,\n\tquery: \"When are you open on Friday?\",\n});\nconsole.log(kbSearchResult);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nkb_search_result = client.kb.documents_search({\n    \"limit\": 3,\n    \"query\": \"When are you open on Friday?\",\n})\nprint(kb_search_result)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/kb/search \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"limit\": 3,\n  \"query\": \"When are you open on Friday?\"\n}'\n"
					}
				]
			}
		},
		"/openapi.json": {
			"get": {
				"description": "This API described as OpenAPI 3.1, the source of the SDKs and the API reference. No API key needed.\n\n[Try it in the API playground](/api/playground/?op=openapi_get) with a test-mode key.",
				"operationId": "openapi_get",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"additionalProperties": {},
									"description": "An OpenAPI 3.1 document.",
									"examples": [
										{
											"info": {
												"title": "MoreVoice API",
												"version": "2026-11-01"
											},
											"openapi": "3.1.0",
											"paths": {}
										}
									],
									"properties": {
										"info": {
											"additionalProperties": {},
											"properties": {
												"title": {
													"type": "string"
												},
												"version": {
													"type": "string"
												}
											},
											"required": [
												"title",
												"version"
											],
											"type": "object"
										},
										"openapi": {
											"description": "The OpenAPI version (3.1.x).",
											"type": "string"
										},
										"paths": {
											"additionalProperties": {},
											"propertyNames": {
												"type": "string"
											},
											"type": "object"
										}
									},
									"required": [
										"openapi",
										"info",
										"paths"
									],
									"type": "object"
								},
								"example": {
									"info": {
										"title": "MoreVoice API",
										"version": "2026-11-01"
									},
									"openapi": "3.1.0",
									"paths": {}
								}
							}
						},
						"description": "The OpenAPI 3.1 document."
					},
					"304": {
						"description": "Not modified"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [],
				"summary": "Get the OpenAPI document",
				"tags": [
					"OpenAPI"
				],
				"x-codeSamples": [
					{
						"lang": "python",
						"label": "Python",
						"source": "import requests\n\nresponse = requests.get(\"https://api.morevoice.ai/v1/openapi.json\")\nresponse.raise_for_status()\nprint(response.json())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/openapi.json\n"
					}
				]
			}
		},
		"/organizations": {
			"get": {
				"description": "Your partner account's client organisations, newest first. Act inside one by sending its ID as the `Mv-Account` header.\n\n[Try it in the API playground](/api/playground/?op=organizations_list) with a test-mode key.",
				"operationId": "organizations_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only organisations in this status.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"trial",
								"active",
								"past_due",
								"suspended",
								"closed"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/OrganizationList"
								},
								"example": {
									"data": [
										{
											"billing_mode": "wholesale",
											"country": "IL",
											"created": "2026-11-03T09:14:22.000Z",
											"id": "org_6Hn3QpX8vB2mK9tL4wR7yZ",
											"livemode": true,
											"locale": "he",
											"members": 4,
											"name": "Haifa Dental Clinic",
											"object": "organization",
											"parent": "org_2Bc4De6Fg8Hi0Jk2Lm4No6",
											"plan": "growth",
											"region": "il",
											"slug": "haifa-dental-clinic",
											"status": "active"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/organizations"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List client organizations",
				"tags": [
					"Organizations"
				],
				"x-morevoice-scopes": [
					"children:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const organization of mv.organizations.list()) {\n\tconsole.log(organization);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor organization in client.organizations.list():\n    print(organization)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/organizations \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Creates a client organisation under your partner account (live keys only). With `admin_email`, that person is invited as its owner (the invitation link is emailed, never returned).\n\n[Try it in the API playground](/api/playground/?op=organizations_create) with a test-mode key.",
				"operationId": "organizations_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/OrganizationCreateParamsInput"
							},
							"example": {
								"admin_email": "owner@haifa-dental.example",
								"name": "Haifa Dental Clinic",
								"plan": "growth"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Organization"
								},
								"example": {
									"billing_mode": "wholesale",
									"country": "IL",
									"created": "2026-11-03T09:14:22.000Z",
									"id": "org_6Hn3QpX8vB2mK9tL4wR7yZ",
									"livemode": true,
									"locale": "he",
									"members": 4,
									"name": "Haifa Dental Clinic",
									"object": "organization",
									"parent": "org_2Bc4De6Fg8Hi0Jk2Lm4No6",
									"plan": "growth",
									"region": "il",
									"slug": "haifa-dental-clinic",
									"status": "active"
								}
							}
						},
						"description": "The new client organisation."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a client organization",
				"tags": [
					"Organizations"
				],
				"x-morevoice-scopes": [
					"children:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst organization = await mv.organizations.create({\n\tadmin_email: \"owner@haifa-dental.example\",\n\tname: \"Haifa Dental Clinic\",\n\tplan: \"growth\",\n});\nconsole.log(organization);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\norganization = client.organizations.create({\n    \"admin_email\": \"owner@haifa-dental.example\",\n    \"name\": \"Haifa Dental Clinic\",\n    \"plan\": \"growth\",\n})\nprint(organization)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/organizations \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"admin_email\": \"owner@haifa-dental.example\",\n  \"name\": \"Haifa Dental Clinic\",\n  \"plan\": \"growth\"\n}'\n"
					}
				]
			}
		},
		"/organizations/{id}": {
			"get": {
				"operationId": "organizations_retrieve",
				"parameters": [
					{
						"description": "A org ID (`org_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^org_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Organization"
								},
								"example": {
									"billing_mode": "wholesale",
									"country": "IL",
									"created": "2026-11-03T09:14:22.000Z",
									"id": "org_6Hn3QpX8vB2mK9tL4wR7yZ",
									"livemode": true,
									"locale": "he",
									"members": 4,
									"name": "Haifa Dental Clinic",
									"object": "organization",
									"parent": "org_2Bc4De6Fg8Hi0Jk2Lm4No6",
									"plan": "growth",
									"region": "il",
									"slug": "haifa-dental-clinic",
									"status": "active"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a client organization",
				"tags": [
					"Organizations"
				],
				"x-morevoice-scopes": [
					"children:read"
				],
				"description": "Returns the `Organization` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=organizations_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst organization = await mv.organizations.retrieve(\"org_7Hk2Lm9Qp\");\nconsole.log(organization);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\norganization = client.organizations.retrieve(\"org_7Hk2Lm9Qp\")\nprint(organization)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/organizations/org_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/organizations/{id}/usage": {
			"get": {
				"description": "The client's metered usage, as `GET /v1/usage` reports it for its own key (the client's prices: wholesale for a wholesale client). Test keys get its test-mode usage.\n\n[Try it in the API playground](/api/playground/?op=organizations_usage_retrieve) with a test-mode key.",
				"operationId": "organizations_usage_retrieve",
				"parameters": [
					{
						"description": "The first day (YYYY-MM-DD, the organisation's time zone).",
						"in": "query",
						"name": "from",
						"required": true,
						"schema": {
							"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
							"type": "string"
						}
					},
					{
						"description": "The last day, inclusive. Per kind: up to 400 days; per assistant or campaign (and in test mode): up to 92 days.",
						"in": "query",
						"name": "to",
						"required": true,
						"schema": {
							"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
							"type": "string"
						}
					},
					{
						"description": "One row per day (default) or per calendar month.",
						"in": "query",
						"name": "granularity",
						"required": false,
						"schema": {
							"default": "day",
							"enum": [
								"day",
								"month"
							],
							"type": "string"
						}
					},
					{
						"description": "`kind` (default): one row per period and usage kind; `assistant` / `campaign`: also split by the assistant or campaign the usage belongs to.",
						"in": "query",
						"name": "group_by",
						"required": false,
						"schema": {
							"default": "kind",
							"enum": [
								"kind",
								"assistant",
								"campaign"
							],
							"type": "string"
						}
					},
					{
						"description": "Only this usage kind.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"enum": [
								"ai_minute",
								"pbx_minute",
								"carrier_minute",
								"copilot_minute",
								"seat_day",
								"copilot_seat_day",
								"qa_scored_call",
								"kb_storage_gb_day",
								"recording_storage_gb_day",
								"sms",
								"email",
								"did_month",
								"api_request",
								"platform_ai_usd",
								"did_setup"
							],
							"type": "string"
						}
					},
					{
						"description": "A org ID (`org_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^org_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UsageReport"
								},
								"example": {
									"data": [
										{
											"amount": {
												"amount": 41250,
												"currency": "ILS"
											},
											"events": 268,
											"kind": "ai_minute",
											"period": "2026-11-03",
											"quantity": 412.5,
											"unit": "minute"
										}
									],
									"from": "2026-11-01",
									"granularity": "day",
									"group_by": "kind",
									"livemode": true,
									"object": "usage_report",
									"timezone": "Asia/Jerusalem",
									"to": "2026-11-30",
									"total": {
										"amount": 41250,
										"currency": "ILS"
									},
									"totals": [
										{
											"amount": {
												"amount": 41250,
												"currency": "ILS"
											},
											"kind": "ai_minute",
											"quantity": 412.5,
											"unit": "minute"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a client organization's usage",
				"tags": [
					"Organizations"
				],
				"x-morevoice-scopes": [
					"children:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst usageReport = await mv.organizations.usage.retrieve(\"org_7Hk2Lm9Qp\", {\n\tfrom: \"2026-10-01\",\n\tto: \"2026-10-31\",\n});\nconsole.log(usageReport);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nusage_report = client.organizations.usage.retrieve(\"org_7Hk2Lm9Qp\", from_=\"2026-10-01\", to=\"2026-10-31\")\nprint(usage_report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -G https://api.morevoice.ai/v1/organizations/org_7Hk2Lm9Qp/usage \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  --data-urlencode 'from=2026-10-01' \\\n  --data-urlencode 'to=2026-10-31'\n"
					}
				]
			}
		},
		"/phone_numbers": {
			"get": {
				"description": "Numbers bought through the platform, then the numbers of your own SIP connections (their caller IDs and the numbers your inbound routes match exactly). Test-mode keys list sandbox numbers.\n\n[Try it in the API playground](/api/playground/?op=phone_numbers_list) with a test-mode key.",
				"operationId": "phone_numbers_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PhoneNumberList"
								},
								"example": {
									"data": [
										{
											"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
											"country": "IL",
											"created": null,
											"e164": "+97231234567",
											"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
											"inbound": true,
											"inbound_route_id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
											"label": "Main trunk",
											"livemode": true,
											"object": "phone_number",
											"outbound_caller_id": true,
											"provider": null,
											"source": "connection",
											"status": "active"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/phone_numbers"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List phone numbers",
				"tags": [
					"Phone numbers"
				],
				"x-morevoice-scopes": [
					"phone_numbers:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const phoneNumber of mv.phoneNumbers.list()) {\n\tconsole.log(phoneNumber);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor phone_number in client.phone_numbers.list():\n    print(phone_number)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/phone_numbers \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "With a test key: allocates a sandbox number (`source: sandbox`) in the +972 50 999 range, at no cost and with no carrier, at most 5 per organisation. Dial it with `POST /v1/test_helpers/inbound_calls`. A sandbox number never receives real calls. With a live key the endpoint is not available yet (buy numbers in the dashboard).\n\n[Try it in the API playground](/api/playground/?op=phone_numbers_create) with a test-mode key.",
				"operationId": "phone_numbers_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/PhoneNumberCreateParamsInput"
							},
							"example": {
								"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"label": "Support line (test)"
							}
						}
					},
					"required": false
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PhoneNumber"
								},
								"example": {
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"country": "IL",
									"created": null,
									"e164": "+97231234567",
									"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
									"inbound": true,
									"inbound_route_id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"label": "Main trunk",
									"livemode": true,
									"object": "phone_number",
									"outbound_caller_id": true,
									"provider": null,
									"source": "connection",
									"status": "active"
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a sandbox number (test mode)",
				"tags": [
					"Phone numbers"
				],
				"x-morevoice-scopes": [
					"phone_numbers:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst phoneNumber = await mv.phoneNumbers.create({\n\tassistant_id: \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n\tlabel: \"Support line (test)\",\n});\nconsole.log(phoneNumber);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nphone_number = client.phone_numbers.create({\n    \"assistant_id\": \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n    \"label\": \"Support line (test)\",\n})\nprint(phone_number)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/phone_numbers \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"assistant_id\": \"asst_4Gk2LmN9pQ4rS6tV8wX0yZ\",\n  \"label\": \"Support line (test)\"\n}'\n"
					}
				]
			}
		},
		"/phone_numbers/{id}": {
			"delete": {
				"description": "With a test key: releases a sandbox number. With a live key the endpoint is not available yet.\n\n[Try it in the API playground](/api/playground/?op=phone_numbers_delete) with a test-mode key.",
				"operationId": "phone_numbers_delete",
				"parameters": [
					{
						"description": "A phone number ID (`pn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^pn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedPhoneNumber"
								},
								"example": {
									"deleted": true,
									"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
									"object": "phone_number"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Release a sandbox number (test mode)",
				"tags": [
					"Phone numbers"
				],
				"x-morevoice-scopes": [
					"phone_numbers:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedPhoneNumber = await mv.phoneNumbers.delete(\"pn_7Hk2Lm9Qp\");\nconsole.log(deletedPhoneNumber);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_phone_number = client.phone_numbers.delete(\"pn_7Hk2Lm9Qp\")\nprint(deleted_phone_number)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/phone_numbers/pn_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "phone_numbers_retrieve",
				"parameters": [
					{
						"description": "A phone number ID (`pn_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^pn_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PhoneNumber"
								},
								"example": {
									"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
									"country": "IL",
									"created": null,
									"e164": "+97231234567",
									"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
									"inbound": true,
									"inbound_route_id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
									"label": "Main trunk",
									"livemode": true,
									"object": "phone_number",
									"outbound_caller_id": true,
									"provider": null,
									"source": "connection",
									"status": "active"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a phone number",
				"tags": [
					"Phone numbers"
				],
				"x-morevoice-scopes": [
					"phone_numbers:read"
				],
				"description": "Returns a phone number: its E.164 form, where it comes from (`source`: a number of one of your SIP connections, a number provisioned through the platform, or a test-mode sandbox number), whether it answers inbound calls (and the route that answers them) and whether it can be the caller ID of outbound calls.\n\n[Try it in the API playground](/api/playground/?op=phone_numbers_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst phoneNumber = await mv.phoneNumbers.retrieve(\"pn_7Hk2Lm9Qp\");\nconsole.log(phoneNumber);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nphone_number = client.phone_numbers.retrieve(\"pn_7Hk2Lm9Qp\")\nprint(phone_number)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/phone_numbers/pn_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/postman.json": {
			"get": {
				"description": "This API as a Postman collection (v2.1): one folder per resource, example bodies, Bearer `{{api_key}}`. Import it, or use the Run in Postman button in the docs. No API key needed.\n\n[Try it in the API playground](/api/playground/?op=openapi_postman) with a test-mode key.",
				"operationId": "openapi_postman",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"additionalProperties": {},
									"description": "A Postman collection (v2.1) of this API.",
									"examples": [
										{
											"info": {
												"name": "MoreVoice API",
												"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
											},
											"item": []
										}
									],
									"properties": {
										"info": {
											"additionalProperties": {},
											"properties": {
												"name": {
													"type": "string"
												},
												"schema": {
													"type": "string"
												}
											},
											"required": [
												"name",
												"schema"
											],
											"type": "object"
										},
										"item": {
											"items": {},
											"type": "array"
										}
									},
									"required": [
										"info",
										"item"
									],
									"type": "object"
								},
								"example": {
									"info": {
										"name": "MoreVoice API",
										"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
									},
									"item": []
								}
							}
						},
						"description": "The Postman collection."
					},
					"304": {
						"description": "Not modified"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [],
				"summary": "Get the Postman collection",
				"tags": [
					"OpenAPI"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst openapi = await mv.openapi.postman();\nconsole.log(openapi);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nopenapi = client.openapi.postman()\nprint(openapi)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/postman.json\n"
					}
				]
			}
		},
		"/qa/rubric": {
			"get": {
				"operationId": "qa_retrieve_rubric",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/QaRubric"
								},
								"example": {
									"builtin": false,
									"items": [
										{
											"critical": true,
											"description": "Says the call is recorded before any commitment.",
											"key": "disclosure",
											"label": "Disclosure",
											"type": "scale",
											"weight": 30
										},
										{
											"critical": false,
											"description": "Open questions before offering a solution.",
											"key": "discovery",
											"label": "Discovery",
											"type": "scale",
											"weight": 40
										},
										{
											"critical": false,
											"description": "Agrees a dated next step.",
											"key": "closing",
											"label": "Next step",
											"type": "boolean",
											"weight": 30
										}
									],
									"livemode": true,
									"name": "Sales and service",
									"object": "qa_rubric",
									"pass_threshold": 70
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve the QA rubric",
				"tags": [
					"QA"
				],
				"x-morevoice-scopes": [
					"qa:read"
				],
				"description": "Returns the `QaRubric` object.\n\n[Try it in the API playground](/api/playground/?op=qa_retrieve_rubric) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst qaRubric = await mv.qa.retrieveRubric();\nconsole.log(qaRubric);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqa_rubric = client.qa.retrieve_rubric()\nprint(qa_rubric)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/qa/rubric \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"put": {
				"description": "Replaces the organisation's rubric. Weights are relative, on one 0–100 scale (only the ratios count). Calls scored from now on use it; existing scorecards keep the rubric they were scored with.\n\n[Try it in the API playground](/api/playground/?op=qa_update_rubric) with a test-mode key.",
				"operationId": "qa_update_rubric",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QaRubricParamsInput"
							},
							"example": {
								"items": [
									{
										"key": "discovery",
										"label": "Discovery",
										"weight": 60
									},
									{
										"key": "closing",
										"label": "Next step",
										"type": "boolean",
										"weight": 40
									}
								],
								"pass_threshold": 75
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/QaRubric"
								},
								"example": {
									"builtin": false,
									"items": [
										{
											"critical": true,
											"description": "Says the call is recorded before any commitment.",
											"key": "disclosure",
											"label": "Disclosure",
											"type": "scale",
											"weight": 30
										},
										{
											"critical": false,
											"description": "Open questions before offering a solution.",
											"key": "discovery",
											"label": "Discovery",
											"type": "scale",
											"weight": 40
										},
										{
											"critical": false,
											"description": "Agrees a dated next step.",
											"key": "closing",
											"label": "Next step",
											"type": "boolean",
											"weight": 30
										}
									],
									"livemode": true,
									"name": "Sales and service",
									"object": "qa_rubric",
									"pass_threshold": 70
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Replace the QA rubric",
				"tags": [
					"QA"
				],
				"x-morevoice-scopes": [
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst qaRubric = await mv.qa.updateRubric({\n\titems: [\n\t\t{\n\t\t\tkey: \"discovery\",\n\t\t\tlabel: \"Discovery\",\n\t\t\tweight: 60,\n\t\t},\n\t\t{\n\t\t\tkey: \"closing\",\n\t\t\tlabel: \"Next step\",\n\t\t\ttype: \"boolean\",\n\t\t\tweight: 40,\n\t\t},\n\t],\n\tpass_threshold: 75,\n});\nconsole.log(qaRubric);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqa_rubric = client.qa.update_rubric({\n    \"items\": [\n        {\n            \"key\": \"discovery\",\n            \"label\": \"Discovery\",\n            \"weight\": 60,\n        },\n        {\n            \"key\": \"closing\",\n            \"label\": \"Next step\",\n            \"type\": \"boolean\",\n            \"weight\": 40,\n        },\n    ],\n    \"pass_threshold\": 75,\n})\nprint(qa_rubric)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PUT https://api.morevoice.ai/v1/qa/rubric \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"items\": [\n    {\n      \"key\": \"discovery\",\n      \"label\": \"Discovery\",\n      \"weight\": 60\n    },\n    {\n      \"key\": \"closing\",\n      \"label\": \"Next step\",\n      \"type\": \"boolean\",\n      \"weight\": 40\n    }\n  ],\n  \"pass_threshold\": 75\n}'\n"
					}
				]
			}
		},
		"/queues": {
			"get": {
				"description": "Your queues, newest first.\n\n[Try it in the API playground](/api/playground/?op=queues_list) with a test-mode key.",
				"operationId": "queues_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/QueueList"
								},
								"example": {
									"data": [
										{
											"away_on_missed": true,
											"callbacks": {
												"agent_id": null,
												"assistant_id": null,
												"priority": 5,
												"route": "agent_queue",
												"voicemail_to_callback": false
											},
											"copilot_profile_id": null,
											"created": "2026-11-03T09:14:22.000Z",
											"enabled": true,
											"hold": {
												"announce_position": false,
												"announcement": "",
												"audio": "music",
												"audio_asset_id": null,
												"position_interval_seconds": 45
											},
											"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"livemode": true,
											"max_wait_seconds": 120,
											"member_team_ids": [
												"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
											],
											"member_user_ids": [
												"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
											],
											"name": "Support",
											"object": "queue",
											"overflow": {
												"action": "assistant",
												"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
												"number": "",
												"queue_id": null,
												"user_id": null,
												"when_no_agents": true
											},
											"ring_timeout_seconds": 20,
											"strategy": "longest_idle",
											"updated": "2026-11-03T09:14:22.000Z",
											"voice_assistant_id": null,
											"voicemail": {
												"max_seconds": 90,
												"message": ""
											},
											"wait_keys": {
												"callback": "",
												"voicemail": ""
											},
											"wrap_up_seconds": 15
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/queues"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List queues",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const queue of mv.queues.list()) {\n\tconsole.log(queue);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor queue in client.queues.list():\n    print(queue)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/queues \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"operationId": "queues_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueCreateParamsInput"
							},
							"example": {
								"max_wait_seconds": 180,
								"member_team_ids": [
									"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								],
								"name": "Support",
								"overflow": {
									"action": "voicemail"
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Queue"
								},
								"example": {
									"away_on_missed": true,
									"callbacks": {
										"agent_id": null,
										"assistant_id": null,
										"priority": 5,
										"route": "agent_queue",
										"voicemail_to_callback": false
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"hold": {
										"announce_position": false,
										"announcement": "",
										"audio": "music",
										"audio_asset_id": null,
										"position_interval_seconds": 45
									},
									"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"livemode": true,
									"max_wait_seconds": 120,
									"member_team_ids": [
										"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
									],
									"member_user_ids": [
										"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
									],
									"name": "Support",
									"object": "queue",
									"overflow": {
										"action": "assistant",
										"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
										"number": "",
										"queue_id": null,
										"user_id": null,
										"when_no_agents": true
									},
									"ring_timeout_seconds": 20,
									"strategy": "longest_idle",
									"updated": "2026-11-03T09:14:22.000Z",
									"voice_assistant_id": null,
									"voicemail": {
										"max_seconds": 90,
										"message": ""
									},
									"wait_keys": {
										"callback": "",
										"voicemail": ""
									},
									"wrap_up_seconds": 15
								}
							}
						},
						"description": "The new queue."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a queue",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:write"
				],
				"description": "Returns the new `Queue`.\n\n[Try it in the API playground](/api/playground/?op=queues_create) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst queue = await mv.queues.create({\n\tmax_wait_seconds: 180,\n\tmember_team_ids: [\n\t\t\"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\",\n\t],\n\tname: \"Support\",\n\toverflow: {\n\t\taction: \"voicemail\",\n\t},\n});\nconsole.log(queue);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqueue = client.queues.create({\n    \"max_wait_seconds\": 180,\n    \"member_team_ids\": [\n        \"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\",\n    ],\n    \"name\": \"Support\",\n    \"overflow\": {\n        \"action\": \"voicemail\",\n    },\n})\nprint(queue)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/queues \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"max_wait_seconds\": 180,\n  \"member_team_ids\": [\n    \"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\"\n  ],\n  \"name\": \"Support\",\n  \"overflow\": {\n    \"action\": \"voicemail\"\n  }\n}'\n"
					}
				]
			}
		},
		"/queues/{id}": {
			"delete": {
				"description": "Deletes the queue. Inbound routes that sent calls to it no longer target a queue; callers waiting in it now overflow.\n\n[Try it in the API playground](/api/playground/?op=queues_delete) with a test-mode key.",
				"operationId": "queues_delete",
				"parameters": [
					{
						"description": "A queue ID (`q_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedQueue"
								},
								"example": {
									"deleted": true,
									"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"object": "queue"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a queue",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedQueue = await mv.queues.delete(\"q_7Hk2Lm9Qp\");\nconsole.log(deletedQueue);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_queue = client.queues.delete(\"q_7Hk2Lm9Qp\")\nprint(deleted_queue)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/queues/q_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "queues_retrieve",
				"parameters": [
					{
						"description": "A queue ID (`q_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Queue"
								},
								"example": {
									"away_on_missed": true,
									"callbacks": {
										"agent_id": null,
										"assistant_id": null,
										"priority": 5,
										"route": "agent_queue",
										"voicemail_to_callback": false
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"hold": {
										"announce_position": false,
										"announcement": "",
										"audio": "music",
										"audio_asset_id": null,
										"position_interval_seconds": 45
									},
									"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"livemode": true,
									"max_wait_seconds": 120,
									"member_team_ids": [
										"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
									],
									"member_user_ids": [
										"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
									],
									"name": "Support",
									"object": "queue",
									"overflow": {
										"action": "assistant",
										"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
										"number": "",
										"queue_id": null,
										"user_id": null,
										"when_no_agents": true
									},
									"ring_timeout_seconds": 20,
									"strategy": "longest_idle",
									"updated": "2026-11-03T09:14:22.000Z",
									"voice_assistant_id": null,
									"voicemail": {
										"max_seconds": 90,
										"message": ""
									},
									"wait_keys": {
										"callback": "",
										"voicemail": ""
									},
									"wrap_up_seconds": 15
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a queue",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:read"
				],
				"description": "Returns the `Queue` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=queues_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst queue = await mv.queues.retrieve(\"q_7Hk2Lm9Qp\");\nconsole.log(queue);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqueue = client.queues.retrieve(\"q_7Hk2Lm9Qp\")\nprint(queue)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/queues/q_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Updates the fields you send. Nested objects (`overflow`, `hold`, `callbacks`…) merge with the stored values; lists replace them.\n\n[Try it in the API playground](/api/playground/?op=queues_update) with a test-mode key.",
				"operationId": "queues_update",
				"parameters": [
					{
						"description": "A queue ID (`q_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueUpdateParamsInput"
							},
							"example": {
								"enabled": false
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Queue"
								},
								"example": {
									"away_on_missed": true,
									"callbacks": {
										"agent_id": null,
										"assistant_id": null,
										"priority": 5,
										"route": "agent_queue",
										"voicemail_to_callback": false
									},
									"copilot_profile_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"hold": {
										"announce_position": false,
										"announcement": "",
										"audio": "music",
										"audio_asset_id": null,
										"position_interval_seconds": 45
									},
									"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"livemode": true,
									"max_wait_seconds": 120,
									"member_team_ids": [
										"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
									],
									"member_user_ids": [
										"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
									],
									"name": "Support",
									"object": "queue",
									"overflow": {
										"action": "assistant",
										"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
										"number": "",
										"queue_id": null,
										"user_id": null,
										"when_no_agents": true
									},
									"ring_timeout_seconds": 20,
									"strategy": "longest_idle",
									"updated": "2026-11-03T09:14:22.000Z",
									"voice_assistant_id": null,
									"voicemail": {
										"max_seconds": 90,
										"message": ""
									},
									"wait_keys": {
										"callback": "",
										"voicemail": ""
									},
									"wrap_up_seconds": 15
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a queue",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst queue = await mv.queues.update(\"q_7Hk2Lm9Qp\", {\n\tenabled: false,\n});\nconsole.log(queue);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqueue = client.queues.update(\"q_7Hk2Lm9Qp\", {\n    \"enabled\": False,\n})\nprint(queue)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/queues/q_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"enabled\": false\n}'\n"
					}
				]
			}
		},
		"/queues/{id}/live": {
			"get": {
				"description": "Who is waiting and for how long, which agents can take the calls, and today's numbers. A snapshot: poll it, or follow `queue.*` events.\n\n[Try it in the API playground](/api/playground/?op=queues_retrieve_live) with a test-mode key.",
				"operationId": "queues_retrieve_live",
				"parameters": [
					{
						"description": "A queue ID (`q_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/QueueLive"
								},
								"example": {
									"agents": {
										"available": 2,
										"away": 1,
										"busy": 1,
										"online": 4,
										"wrap_up": 0
									},
									"as_of": "2026-11-03T09:14:22.000Z",
									"callbacks_offered": 0,
									"callers": [
										{
											"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
											"from": "+972501234567",
											"position": 1,
											"state": "ringing",
											"waited_seconds": 42
										}
									],
									"enabled": true,
									"livemode": true,
									"longest_wait_seconds": 42,
									"members": [
										{
											"call_id": null,
											"name": "Dana Levi",
											"since": "2026-11-03T09:10:00.000Z",
											"status": "available",
											"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
										}
									],
									"object": "queue_live",
									"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"today": {
										"abandoned": 4,
										"answered": 31,
										"average_wait_seconds": 18,
										"callbacks": 1,
										"calls": 37,
										"max_wait_seconds": 96,
										"overflowed": 2,
										"service_level": 0.84,
										"voicemails": 1
									},
									"waiting": 1
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a queue's live state",
				"tags": [
					"Queues"
				],
				"x-morevoice-scopes": [
					"queues:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst queueLive = await mv.queues.retrieveLive(\"q_7Hk2Lm9Qp\");\nconsole.log(queueLive);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nqueue_live = client.queues.retrieve_live(\"q_7Hk2Lm9Qp\")\nprint(queue_live)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/queues/q_7Hk2Lm9Qp/live \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/recordings/{token}": {
			"get": {
				"description": "The URL a recording link points at. No API key: the token is the credential, valid for one call for 15 minutes. Supports Range requests.\n\n[Try it in the API playground](/api/playground/?op=calls_download_recording) with a test-mode key.",
				"operationId": "calls_download_recording",
				"parameters": [
					{
						"description": "The signed token of a recording link.",
						"in": "path",
						"name": "token",
						"required": true,
						"schema": {
							"maxLength": 1024,
							"minLength": 1,
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"audio/ogg": {
								"schema": {
									"format": "binary",
									"type": "string"
								}
							},
							"audio/wav": {
								"schema": {
									"format": "binary",
									"type": "string"
								}
							}
						},
						"description": "The recording audio (the whole file, or the requested Range with 206)."
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [],
				"summary": "Download a recording (signed link)",
				"tags": [
					"Calls"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.calls.downloadRecording(\"token_123\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.calls.download_recording(\"token_123\")\nprint(len(data), \"bytes\")\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/recordings/token_123\n"
					}
				]
			}
		},
		"/report_runs/{id}/csv": {
			"get": {
				"description": "The CSV stored for a run (404 when the report has no CSV format, or no storage bucket is configured). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_download_run_csv) with a test-mode key.",
				"operationId": "reports_download_run_csv",
				"parameters": [
					{
						"description": "A report run ID (`rptrun_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rptrun_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/csv": {
								"schema": {
									"description": "The CSV file (UTF-8 with a byte-order mark).",
									"examples": [
										"widget,metric,value\r\nCall overview,Calls,1240\r\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The CSV file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Download a run's CSV",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.reports.downloadRunCsv(\"rptrun_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.reports.download_run_csv(\"rptrun_7Hk2Lm9Qp\")\nprint(data)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/report_runs/rptrun_7Hk2Lm9Qp/csv \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/report_runs/{id}/pdf": {
			"get": {
				"description": "The PDF stored for a run (404 when the report has no PDF format, or no storage bucket is configured). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_download_run_pdf) with a test-mode key.",
				"operationId": "reports_download_run_pdf",
				"parameters": [
					{
						"description": "A report run ID (`rptrun_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rptrun_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/pdf": {
								"schema": {
									"description": "The PDF file.",
									"format": "binary",
									"type": "string"
								}
							}
						},
						"description": "The PDF file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Download a run's PDF",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.reports.downloadRunPdf(\"rptrun_7Hk2Lm9Qp\");\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.reports.download_run_pdf(\"rptrun_7Hk2Lm9Qp\")\nprint(len(data), \"bytes\")\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/report_runs/rptrun_7Hk2Lm9Qp/pdf \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/reports": {
			"get": {
				"operationId": "reports_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ReportList"
								},
								"example": {
									"data": [
										{
											"cadence": {
												"day_of_month": null,
												"days": [],
												"frequency": "daily",
												"time": "08:00",
												"timezone": "Asia/Jerusalem"
											},
											"created": "2026-11-03T09:14:22.000Z",
											"enabled": true,
											"filters": {
												"agent_ids": [],
												"assistant_ids": [],
												"campaign_ids": [],
												"flow_ids": [],
												"queue_ids": [],
												"team_ids": []
											},
											"formats": {
												"csv": false,
												"email": true,
												"pdf": true
											},
											"id": "rpt_2dXk9QmZ4rTv",
											"language": "he",
											"last_run": null,
											"last_run_at": null,
											"livemode": true,
											"name": "Daily contact-centre summary",
											"next_run_at": "2026-11-04T06:00:00.000Z",
											"object": "report",
											"owner_id": null,
											"period": "yesterday",
											"recipients": [
												{
													"type": "email",
													"value": "ops@example.com"
												}
											],
											"updated": "2026-11-03T09:14:22.000Z",
											"widgets": [
												{
													"key": "w1",
													"params": {
														"limit": null,
														"sla_sec": null
													},
													"title": null,
													"type": "kpis"
												},
												{
													"key": "w2",
													"params": {
														"limit": null,
														"sla_sec": 20
													},
													"title": null,
													"type": "queues"
												}
											]
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/reports"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List reports",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"description": "Returns a page of `Report` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=reports_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const report of mv.reports.list()) {\n\tconsole.log(report);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor report in client.reports.list():\n    print(report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/reports \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Schedules a report: it is computed and emailed to its recipients on its cadence (the first send is `next_run_at`). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_create) with a test-mode key.",
				"operationId": "reports_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"cadence": {
									"frequency": "daily",
									"time": "08:00",
									"timezone": "Asia/Jerusalem"
								},
								"formats": {
									"email": true,
									"pdf": true
								},
								"name": "Daily contact-centre summary",
								"period": "yesterday",
								"recipients": [
									{
										"type": "email",
										"value": "ops@example.com"
									}
								],
								"widgets": [
									{
										"key": "w1",
										"type": "kpis"
									},
									{
										"key": "w2",
										"params": {
											"sla_sec": 20
										},
										"type": "queues"
									}
								]
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"cadence": {
										"additionalProperties": false,
										"properties": {
											"day_of_month": {
												"description": "monthly: 1–31, or -1 for the last day.",
												"maximum": 31,
												"minimum": -1,
												"type": "integer"
											},
											"days": {
												"description": "weekly: at least one weekday.",
												"items": {
													"enum": [
														"sun",
														"mon",
														"tue",
														"wed",
														"thu",
														"fri",
														"sat"
													],
													"type": "string"
												},
												"maxItems": 7,
												"minItems": 1,
												"type": "array"
											},
											"frequency": {
												"enum": [
													"daily",
													"weekly",
													"monthly"
												],
												"type": "string"
											},
											"time": {
												"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
												"type": "string"
											},
											"timezone": {
												"description": "Default Asia/Jerusalem.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											}
										},
										"required": [
											"frequency",
											"time"
										],
										"type": "object"
									},
									"enabled": {
										"type": "boolean"
									},
									"filters": {
										"additionalProperties": false,
										"properties": {
											"agent_ids": {
												"items": {
													"description": "A user ID (`usr_…`).",
													"maxLength": 200,
													"pattern": "^usr_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"assistant_ids": {
												"items": {
													"description": "A assistant ID (`asst_…`).",
													"maxLength": 200,
													"pattern": "^asst_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"campaign_ids": {
												"items": {
													"description": "A campaign ID (`cmp_…`).",
													"maxLength": 200,
													"pattern": "^cmp_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"flow_ids": {
												"items": {
													"description": "A flow ID (`flow_…`).",
													"maxLength": 200,
													"pattern": "^flow_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"queue_ids": {
												"items": {
													"description": "A queue ID (`q_…`).",
													"maxLength": 200,
													"pattern": "^q_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"team_ids": {
												"items": {
													"description": "A team ID (`team_…`).",
													"maxLength": 200,
													"pattern": "^team_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											}
										},
										"type": "object"
									},
									"formats": {
										"additionalProperties": false,
										"description": "Default: email and PDF.",
										"properties": {
											"csv": {
												"type": "boolean"
											},
											"email": {
												"type": "boolean"
											},
											"pdf": {
												"type": "boolean"
											}
										},
										"type": "object"
									},
									"language": {
										"description": "Default he.",
										"enum": [
											"he",
											"en"
										],
										"type": "string"
									},
									"name": {
										"maxLength": 120,
										"minLength": 1,
										"type": "string"
									},
									"period": {
										"description": "The window each report covers, in its time zone: `today`, `yesterday`, `last7`, `last30`, `thisWeek`, `lastWeek`, `thisMonth` or `lastMonth`. Default yesterday.",
										"enum": [
											"today",
											"yesterday",
											"last7",
											"last30",
											"thisWeek",
											"lastWeek",
											"thisMonth",
											"lastMonth"
										],
										"type": "string"
									},
									"recipients": {
										"items": {
											"additionalProperties": false,
											"properties": {
												"type": {
													"enum": [
														"user",
														"team",
														"email"
													],
													"type": "string"
												},
												"value": {
													"maxLength": 300,
													"minLength": 1,
													"type": "string"
												}
											},
											"required": [
												"type",
												"value"
											],
											"type": "object"
										},
										"maxItems": 100,
										"type": "array"
									},
									"widgets": {
										"items": {
											"additionalProperties": false,
											"properties": {
												"key": {
													"description": "Your key for the widget (unique in the report).",
													"maxLength": 40,
													"minLength": 1,
													"type": "string"
												},
												"params": {
													"additionalProperties": false,
													"properties": {
														"limit": {
															"maximum": 50,
															"minimum": 1,
															"type": "integer"
														},
														"sla_sec": {
															"maximum": 600,
															"minimum": 5,
															"type": "integer"
														}
													},
													"type": "object"
												},
												"title": {
													"maxLength": 120,
													"type": "string"
												},
												"type": {
													"enum": [
														"kpis",
														"volume",
														"queues",
														"agents",
														"ai",
														"cost",
														"campaigns",
														"qa",
														"ivr",
														"callbacks",
														"dnc"
													],
													"type": "string"
												}
											},
											"required": [
												"key",
												"type"
											],
											"type": "object"
										},
										"maxItems": 20,
										"minItems": 1,
										"type": "array"
									}
								},
								"required": [
									"name",
									"widgets",
									"cadence"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Report"
								},
								"example": {
									"cadence": {
										"day_of_month": null,
										"days": [],
										"frequency": "daily",
										"time": "08:00",
										"timezone": "Asia/Jerusalem"
									},
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"filters": {
										"agent_ids": [],
										"assistant_ids": [],
										"campaign_ids": [],
										"flow_ids": [],
										"queue_ids": [],
										"team_ids": []
									},
									"formats": {
										"csv": false,
										"email": true,
										"pdf": true
									},
									"id": "rpt_2dXk9QmZ4rTv",
									"language": "he",
									"last_run": null,
									"last_run_at": null,
									"livemode": true,
									"name": "Daily contact-centre summary",
									"next_run_at": "2026-11-04T06:00:00.000Z",
									"object": "report",
									"owner_id": null,
									"period": "yesterday",
									"recipients": [
										{
											"type": "email",
											"value": "ops@example.com"
										}
									],
									"updated": "2026-11-03T09:14:22.000Z",
									"widgets": [
										{
											"key": "w1",
											"params": {
												"limit": null,
												"sla_sec": null
											},
											"title": null,
											"type": "kpis"
										},
										{
											"key": "w2",
											"params": {
												"limit": null,
												"sla_sec": 20
											},
											"title": null,
											"type": "queues"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a report",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read",
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst report = await mv.reports.create({\n\tcadence: {\n\t\tfrequency: \"daily\",\n\t\ttime: \"08:00\",\n\t\ttimezone: \"Asia/Jerusalem\",\n\t},\n\tformats: {\n\t\temail: true,\n\t\tpdf: true,\n\t},\n\tname: \"Daily contact-centre summary\",\n\tperiod: \"yesterday\",\n\trecipients: [\n\t\t{\n\t\t\ttype: \"email\",\n\t\t\tvalue: \"ops@example.com\",\n\t\t},\n\t],\n\twidgets: [\n\t\t{\n\t\t\tkey: \"w1\",\n\t\t\ttype: \"kpis\",\n\t\t},\n\t\t{\n\t\t\tkey: \"w2\",\n\t\t\tparams: {\n\t\t\t\tsla_sec: 20,\n\t\t\t},\n\t\t\ttype: \"queues\",\n\t\t},\n\t],\n});\nconsole.log(report);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport = client.reports.create({\n    \"cadence\": {\n        \"frequency\": \"daily\",\n        \"time\": \"08:00\",\n        \"timezone\": \"Asia/Jerusalem\",\n    },\n    \"formats\": {\n        \"email\": True,\n        \"pdf\": True,\n    },\n    \"name\": \"Daily contact-centre summary\",\n    \"period\": \"yesterday\",\n    \"recipients\": [\n        {\n            \"type\": \"email\",\n            \"value\": \"ops@example.com\",\n        },\n    ],\n    \"widgets\": [\n        {\n            \"key\": \"w1\",\n            \"type\": \"kpis\",\n        },\n        {\n            \"key\": \"w2\",\n            \"params\": {\n                \"sla_sec\": 20,\n            },\n            \"type\": \"queues\",\n        },\n    ],\n})\nprint(report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/reports \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"cadence\": {\n    \"frequency\": \"daily\",\n    \"time\": \"08:00\",\n    \"timezone\": \"Asia/Jerusalem\"\n  },\n  \"formats\": {\n    \"email\": true,\n    \"pdf\": true\n  },\n  \"name\": \"Daily contact-centre summary\",\n  \"period\": \"yesterday\",\n  \"recipients\": [\n    {\n      \"type\": \"email\",\n      \"value\": \"ops@example.com\"\n    }\n  ],\n  \"widgets\": [\n    {\n      \"key\": \"w1\",\n      \"type\": \"kpis\"\n    },\n    {\n      \"key\": \"w2\",\n      \"params\": {\n        \"sla_sec\": 20\n      },\n      \"type\": \"queues\"\n    }\n  ]\n}'\n"
					}
				]
			}
		},
		"/reports/catalog": {
			"get": {
				"description": "The widgets a report can show, with the filters each honours; the periods and the cadences.\n\n[Try it in the API playground](/api/playground/?op=reports_catalog) with a test-mode key.",
				"operationId": "reports_catalog",
				"parameters": [
					{
						"description": "The language of names and descriptions (default en).",
						"in": "query",
						"name": "language",
						"required": false,
						"schema": {
							"default": "en",
							"enum": [
								"he",
								"en"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ReportCatalog"
								},
								"example": {
									"frequencies": [
										"daily",
										"weekly",
										"monthly"
									],
									"object": "report_catalog",
									"periods": [
										"today",
										"yesterday",
										"last7",
										"last30",
										"thisWeek",
										"lastWeek",
										"thisMonth",
										"lastMonth"
									],
									"widgets": [
										{
											"description": "Calls, answer rate, handle time and direction at a glance.",
											"filters": [
												"assistant_ids",
												"campaign_ids",
												"agent_ids",
												"team_ids"
											],
											"name": "Call overview",
											"type": "kpis"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List the report widgets",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst reportCatalog = await mv.reports.catalog();\nconsole.log(reportCatalog);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport_catalog = client.reports.catalog()\nprint(report_catalog)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/reports/catalog \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/reports/preview": {
			"post": {
				"description": "Computes widgets for a period now and returns the data (nothing is stored or sent). With `cadence`, also the next three send times. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_preview) with a test-mode key.",
				"operationId": "reports_preview",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"language": "en",
								"period": "last7",
								"widgets": [
									{
										"key": "w1",
										"type": "kpis"
									}
								]
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"cadence": {
										"additionalProperties": false,
										"description": "A cadence to list the next three send times for.",
										"properties": {
											"day_of_month": {
												"description": "monthly: 1–31, or -1 for the last day.",
												"maximum": 31,
												"minimum": -1,
												"type": "integer"
											},
											"days": {
												"description": "weekly: at least one weekday.",
												"items": {
													"enum": [
														"sun",
														"mon",
														"tue",
														"wed",
														"thu",
														"fri",
														"sat"
													],
													"type": "string"
												},
												"maxItems": 7,
												"minItems": 1,
												"type": "array"
											},
											"frequency": {
												"enum": [
													"daily",
													"weekly",
													"monthly"
												],
												"type": "string"
											},
											"time": {
												"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
												"type": "string"
											},
											"timezone": {
												"description": "Default Asia/Jerusalem.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											}
										},
										"required": [
											"frequency",
											"time"
										],
										"type": "object"
									},
									"filters": {
										"additionalProperties": false,
										"properties": {
											"agent_ids": {
												"items": {
													"description": "A user ID (`usr_…`).",
													"maxLength": 200,
													"pattern": "^usr_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"assistant_ids": {
												"items": {
													"description": "A assistant ID (`asst_…`).",
													"maxLength": 200,
													"pattern": "^asst_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"campaign_ids": {
												"items": {
													"description": "A campaign ID (`cmp_…`).",
													"maxLength": 200,
													"pattern": "^cmp_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"flow_ids": {
												"items": {
													"description": "A flow ID (`flow_…`).",
													"maxLength": 200,
													"pattern": "^flow_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"queue_ids": {
												"items": {
													"description": "A queue ID (`q_…`).",
													"maxLength": 200,
													"pattern": "^q_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"team_ids": {
												"items": {
													"description": "A team ID (`team_…`).",
													"maxLength": 200,
													"pattern": "^team_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											}
										},
										"type": "object"
									},
									"language": {
										"description": "The language of labels in the result (default en).",
										"enum": [
											"he",
											"en"
										],
										"type": "string"
									},
									"period": {
										"description": "The window each report covers, in its time zone: `today`, `yesterday`, `last7`, `last30`, `thisWeek`, `lastWeek`, `thisMonth` or `lastMonth`. Default yesterday.",
										"enum": [
											"today",
											"yesterday",
											"last7",
											"last30",
											"thisWeek",
											"lastWeek",
											"thisMonth",
											"lastMonth"
										],
										"type": "string"
									},
									"timezone": {
										"description": "Default Asia/Jerusalem.",
										"maxLength": 64,
										"minLength": 1,
										"type": "string"
									},
									"widgets": {
										"items": {
											"additionalProperties": false,
											"properties": {
												"key": {
													"description": "Your key for the widget (unique in the report).",
													"maxLength": 40,
													"minLength": 1,
													"type": "string"
												},
												"params": {
													"additionalProperties": false,
													"properties": {
														"limit": {
															"maximum": 50,
															"minimum": 1,
															"type": "integer"
														},
														"sla_sec": {
															"maximum": 600,
															"minimum": 5,
															"type": "integer"
														}
													},
													"type": "object"
												},
												"title": {
													"maxLength": 120,
													"type": "string"
												},
												"type": {
													"enum": [
														"kpis",
														"volume",
														"queues",
														"agents",
														"ai",
														"cost",
														"campaigns",
														"qa",
														"ivr",
														"callbacks",
														"dnc"
													],
													"type": "string"
												}
											},
											"required": [
												"key",
												"type"
											],
											"type": "object"
										},
										"maxItems": 20,
										"minItems": 1,
										"type": "array"
									}
								},
								"required": [
									"widgets"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ReportPreview"
								},
								"example": {
									"generated_at": "2026-11-04T09:00:00.000Z",
									"livemode": true,
									"object": "report_preview",
									"period": {
										"from": "2026-10-27T22:00:00.000Z",
										"label": "last7",
										"timezone": "Asia/Jerusalem",
										"to": "2026-11-03T22:00:00.000Z"
									},
									"upcoming_runs": [],
									"widgets": [
										{
											"chart": null,
											"empty": false,
											"error": null,
											"key": "w1",
											"kpis": [
												{
													"currency": null,
													"delta": 0.08,
													"format": "int",
													"key": "reports.k.calls",
													"label": "Calls",
													"up_is_good": true,
													"value": 1240
												}
											],
											"note": null,
											"table": null,
											"title": "Call overview",
											"type": "kpis"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Preview report data",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst reportPreview = await mv.reports.preview({\n\tlanguage: \"en\",\n\tperiod: \"last7\",\n\twidgets: [\n\t\t{\n\t\t\tkey: \"w1\",\n\t\t\ttype: \"kpis\",\n\t\t},\n\t],\n});\nconsole.log(reportPreview);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport_preview = client.reports.preview({\n    \"language\": \"en\",\n    \"period\": \"last7\",\n    \"widgets\": [\n        {\n            \"key\": \"w1\",\n            \"type\": \"kpis\",\n        },\n    ],\n})\nprint(report_preview)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/reports/preview \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"language\": \"en\",\n  \"period\": \"last7\",\n  \"widgets\": [\n    {\n      \"key\": \"w1\",\n      \"type\": \"kpis\"\n    }\n  ]\n}'\n"
					}
				]
			}
		},
		"/reports/{id}": {
			"delete": {
				"description": "Deletes the report, its runs and their stored files. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_delete) with a test-mode key.",
				"operationId": "reports_delete",
				"parameters": [
					{
						"description": "A report ID (`rpt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rpt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedReport"
								},
								"example": {
									"deleted": true,
									"id": "rpt_2dXk9QmZ4rTv",
									"object": "report"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a report",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read",
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedReport = await mv.reports.delete(\"rpt_7Hk2Lm9Qp\");\nconsole.log(deletedReport);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_report = client.reports.delete(\"rpt_7Hk2Lm9Qp\")\nprint(deleted_report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/reports/rpt_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "reports_retrieve",
				"parameters": [
					{
						"description": "A report ID (`rpt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rpt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Report"
								},
								"example": {
									"cadence": {
										"day_of_month": null,
										"days": [],
										"frequency": "daily",
										"time": "08:00",
										"timezone": "Asia/Jerusalem"
									},
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"filters": {
										"agent_ids": [],
										"assistant_ids": [],
										"campaign_ids": [],
										"flow_ids": [],
										"queue_ids": [],
										"team_ids": []
									},
									"formats": {
										"csv": false,
										"email": true,
										"pdf": true
									},
									"id": "rpt_2dXk9QmZ4rTv",
									"language": "he",
									"last_run": null,
									"last_run_at": null,
									"livemode": true,
									"name": "Daily contact-centre summary",
									"next_run_at": "2026-11-04T06:00:00.000Z",
									"object": "report",
									"owner_id": null,
									"period": "yesterday",
									"recipients": [
										{
											"type": "email",
											"value": "ops@example.com"
										}
									],
									"updated": "2026-11-03T09:14:22.000Z",
									"widgets": [
										{
											"key": "w1",
											"params": {
												"limit": null,
												"sla_sec": null
											},
											"title": null,
											"type": "kpis"
										},
										{
											"key": "w2",
											"params": {
												"limit": null,
												"sla_sec": 20
											},
											"title": null,
											"type": "queues"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a report",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"description": "Returns the `Report` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=reports_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst report = await mv.reports.retrieve(\"rpt_7Hk2Lm9Qp\");\nconsole.log(report);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport = client.reports.retrieve(\"rpt_7Hk2Lm9Qp\")\nprint(report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/reports/rpt_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Only the fields you send change (`filters`, `recipients`, `widgets` and `cadence` are replaced as a whole). Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_update) with a test-mode key.",
				"operationId": "reports_update",
				"parameters": [
					{
						"description": "A report ID (`rpt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rpt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"examples": {
								"example1": {
									"value": {
										"enabled": false
									}
								},
								"example2": {
									"value": {
										"recipients": [
											{
												"type": "email",
												"value": "ops@example.com"
											},
											{
												"type": "team",
												"value": "team_4Gk2LmN9pQ4rS6tV8wX0yZ"
											}
										]
									}
								}
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"cadence": {
										"additionalProperties": false,
										"properties": {
											"day_of_month": {
												"description": "monthly: 1–31, or -1 for the last day.",
												"maximum": 31,
												"minimum": -1,
												"type": "integer"
											},
											"days": {
												"description": "weekly: at least one weekday.",
												"items": {
													"enum": [
														"sun",
														"mon",
														"tue",
														"wed",
														"thu",
														"fri",
														"sat"
													],
													"type": "string"
												},
												"maxItems": 7,
												"minItems": 1,
												"type": "array"
											},
											"frequency": {
												"enum": [
													"daily",
													"weekly",
													"monthly"
												],
												"type": "string"
											},
											"time": {
												"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
												"type": "string"
											},
											"timezone": {
												"description": "Default Asia/Jerusalem.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											}
										},
										"required": [
											"frequency",
											"time"
										],
										"type": "object"
									},
									"enabled": {
										"type": "boolean"
									},
									"filters": {
										"additionalProperties": false,
										"properties": {
											"agent_ids": {
												"items": {
													"description": "A user ID (`usr_…`).",
													"maxLength": 200,
													"pattern": "^usr_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"assistant_ids": {
												"items": {
													"description": "A assistant ID (`asst_…`).",
													"maxLength": 200,
													"pattern": "^asst_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"campaign_ids": {
												"items": {
													"description": "A campaign ID (`cmp_…`).",
													"maxLength": 200,
													"pattern": "^cmp_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"flow_ids": {
												"items": {
													"description": "A flow ID (`flow_…`).",
													"maxLength": 200,
													"pattern": "^flow_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"queue_ids": {
												"items": {
													"description": "A queue ID (`q_…`).",
													"maxLength": 200,
													"pattern": "^q_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"team_ids": {
												"items": {
													"description": "A team ID (`team_…`).",
													"maxLength": 200,
													"pattern": "^team_[0-9A-Za-z]+$",
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											}
										},
										"type": "object"
									},
									"formats": {
										"additionalProperties": false,
										"description": "Default: email and PDF.",
										"properties": {
											"csv": {
												"type": "boolean"
											},
											"email": {
												"type": "boolean"
											},
											"pdf": {
												"type": "boolean"
											}
										},
										"type": "object"
									},
									"language": {
										"description": "Default he.",
										"enum": [
											"he",
											"en"
										],
										"type": "string"
									},
									"name": {
										"maxLength": 120,
										"minLength": 1,
										"type": "string"
									},
									"period": {
										"description": "The window each report covers, in its time zone: `today`, `yesterday`, `last7`, `last30`, `thisWeek`, `lastWeek`, `thisMonth` or `lastMonth`. Default yesterday.",
										"enum": [
											"today",
											"yesterday",
											"last7",
											"last30",
											"thisWeek",
											"lastWeek",
											"thisMonth",
											"lastMonth"
										],
										"type": "string"
									},
									"recipients": {
										"items": {
											"additionalProperties": false,
											"properties": {
												"type": {
													"enum": [
														"user",
														"team",
														"email"
													],
													"type": "string"
												},
												"value": {
													"maxLength": 300,
													"minLength": 1,
													"type": "string"
												}
											},
											"required": [
												"type",
												"value"
											],
											"type": "object"
										},
										"maxItems": 100,
										"type": "array"
									},
									"widgets": {
										"items": {
											"additionalProperties": false,
											"properties": {
												"key": {
													"description": "Your key for the widget (unique in the report).",
													"maxLength": 40,
													"minLength": 1,
													"type": "string"
												},
												"params": {
													"additionalProperties": false,
													"properties": {
														"limit": {
															"maximum": 50,
															"minimum": 1,
															"type": "integer"
														},
														"sla_sec": {
															"maximum": 600,
															"minimum": 5,
															"type": "integer"
														}
													},
													"type": "object"
												},
												"title": {
													"maxLength": 120,
													"type": "string"
												},
												"type": {
													"enum": [
														"kpis",
														"volume",
														"queues",
														"agents",
														"ai",
														"cost",
														"campaigns",
														"qa",
														"ivr",
														"callbacks",
														"dnc"
													],
													"type": "string"
												}
											},
											"required": [
												"key",
												"type"
											],
											"type": "object"
										},
										"maxItems": 20,
										"minItems": 1,
										"type": "array"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Report"
								},
								"example": {
									"cadence": {
										"day_of_month": null,
										"days": [],
										"frequency": "daily",
										"time": "08:00",
										"timezone": "Asia/Jerusalem"
									},
									"created": "2026-11-03T09:14:22.000Z",
									"enabled": true,
									"filters": {
										"agent_ids": [],
										"assistant_ids": [],
										"campaign_ids": [],
										"flow_ids": [],
										"queue_ids": [],
										"team_ids": []
									},
									"formats": {
										"csv": false,
										"email": true,
										"pdf": true
									},
									"id": "rpt_2dXk9QmZ4rTv",
									"language": "he",
									"last_run": null,
									"last_run_at": null,
									"livemode": true,
									"name": "Daily contact-centre summary",
									"next_run_at": "2026-11-04T06:00:00.000Z",
									"object": "report",
									"owner_id": null,
									"period": "yesterday",
									"recipients": [
										{
											"type": "email",
											"value": "ops@example.com"
										}
									],
									"updated": "2026-11-03T09:14:22.000Z",
									"widgets": [
										{
											"key": "w1",
											"params": {
												"limit": null,
												"sla_sec": null
											},
											"title": null,
											"type": "kpis"
										},
										{
											"key": "w2",
											"params": {
												"limit": null,
												"sla_sec": 20
											},
											"title": null,
											"type": "queues"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a report",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read",
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst report = await mv.reports.update(\"rpt_7Hk2Lm9Qp\", {\n\tenabled: false,\n});\nconsole.log(report);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport = client.reports.update(\"rpt_7Hk2Lm9Qp\", {\n    \"enabled\": False,\n})\nprint(report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/reports/rpt_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"enabled\": false\n}'\n"
					}
				]
			}
		},
		"/reports/{id}/runs": {
			"get": {
				"operationId": "reports_list_runs",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A report ID (`rpt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rpt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ReportRunList"
								},
								"example": {
									"data": [
										{
											"artifacts": {
												"csv": false,
												"pdf": true
											},
											"deliveries": [
												{
													"email": "ops@example.com",
													"error": null,
													"status": "sent"
												}
											],
											"error": null,
											"finished_at": "2026-11-04T06:00:09.000Z",
											"id": "rptrun_2nH8kQ1",
											"livemode": true,
											"object": "report_run",
											"period_from": "2026-11-02T22:00:00.000Z",
											"period_to": "2026-11-03T22:00:00.000Z",
											"recipients": [
												"ops@example.com"
											],
											"report_id": "rpt_2dXk9QmZ4rTv",
											"started_at": "2026-11-04T06:00:01.000Z",
											"status": "sent",
											"trigger": "manual"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/reports/rpt_2dXk9QmZ4rTv/runs"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List a report's runs",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read"
				],
				"description": "Returns a page of `ReportRun` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=reports_list_runs) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const report of mv.reports.listRuns(\"rpt_7Hk2Lm9Qp\")) {\n\tconsole.log(report);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor report in client.reports.list_runs(\"rpt_7Hk2Lm9Qp\"):\n    print(report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/reports/rpt_7Hk2Lm9Qp/runs \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/reports/{id}/send": {
			"post": {
				"description": "Computes the report for its period, stores the files and emails every recipient; returns the run when it finished. Send an Idempotency-Key: a retry with the same key returns the same run instead of emailing again. A second send of the same report while one is in progress is a 409. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=reports_send) with a test-mode key.",
				"operationId": "reports_send",
				"parameters": [
					{
						"description": "A report ID (`rpt_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rpt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReportSendParamsInput"
							},
							"example": {}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ReportRun"
								},
								"example": {
									"artifacts": {
										"csv": false,
										"pdf": true
									},
									"deliveries": [
										{
											"email": "ops@example.com",
											"error": null,
											"status": "sent"
										}
									],
									"error": null,
									"finished_at": "2026-11-04T06:00:09.000Z",
									"id": "rptrun_2nH8kQ1",
									"livemode": true,
									"object": "report_run",
									"period_from": "2026-11-02T22:00:00.000Z",
									"period_to": "2026-11-03T22:00:00.000Z",
									"recipients": [
										"ops@example.com"
									],
									"report_id": "rpt_2dXk9QmZ4rTv",
									"started_at": "2026-11-04T06:00:01.000Z",
									"status": "sent",
									"trigger": "manual"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Send a report now",
				"tags": [
					"Reports"
				],
				"x-morevoice-scopes": [
					"insights:read",
					"qa:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst reportRun = await mv.reports.send(\"rpt_7Hk2Lm9Qp\", {});\nconsole.log(reportRun);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nreport_run = client.reports.send(\"rpt_7Hk2Lm9Qp\", {})\nprint(report_run)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/reports/rpt_7Hk2Lm9Qp/send \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{}'\n"
					}
				]
			}
		},
		"/request_logs": {
			"get": {
				"description": "Your recent /v1 requests in this mode, newest first, with redacted bodies: what was sent, what came back, how long it took. Filters combine: `status` (`4xx`, `error`, `404`…), `method`, `path` (prefix), `key_id`, `request_id`, `operation_id`, `created[gte]`… Kept 30 days (test mode 7). Logging is switched on per organisation.\n\n[Try it in the API playground](/api/playground/?op=request_logs_list) with a test-mode key.",
				"operationId": "request_logs_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A status class (`2xx`, `3xx`, `4xx`, `5xx`), `error` (any 4xx or 5xx), or one status code (`404`).",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"pattern": "^([1-5]xx|error|[1-5]\\d\\d)$",
							"type": "string"
						}
					},
					{
						"description": "Only this HTTP method.",
						"in": "query",
						"name": "method",
						"required": false,
						"schema": {
							"enum": [
								"GET",
								"POST",
								"PATCH",
								"PUT",
								"DELETE"
							],
							"type": "string"
						}
					},
					{
						"description": "Only paths starting with this (`/v1/calls` matches `/v1/calls/call_…`).",
						"in": "query",
						"name": "path",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only requests made with this API key (`key_…`).",
						"in": "query",
						"name": "key_id",
						"required": false,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only the request with this X-Request-Id (`req_…`).",
						"in": "query",
						"name": "request_id",
						"required": false,
						"schema": {
							"maxLength": 128,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only this operation (`calls_create`).",
						"in": "query",
						"name": "operation_id",
						"required": false,
						"schema": {
							"maxLength": 128,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Filter on when the request arrived: created[gte], created[gt], created[lte], created[lt] (ISO-8601).",
						"explode": true,
						"in": "query",
						"name": "created",
						"required": false,
						"schema": {
							"additionalProperties": false,
							"properties": {
								"gt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"gte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lt": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								},
								"lte": {
									"format": "date-time",
									"maxLength": 40,
									"type": "string"
								}
							},
							"type": "object"
						},
						"style": "deepObject"
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RequestLogList"
								},
								"example": {
									"data": [
										{
											"api_version": "2026-11-01",
											"created": "2026-11-03T09:14:22.135Z",
											"error_code": "parameter_invalid",
											"id": "rlog_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"idempotency_key": "8e0f3a2c-5d1b-4c7e-9f6a-2b4d8c1e7a90",
											"ip": "203.0.113.7",
											"key_id": "key_3fT9kq2ZpLr8YwVbN1cX0a",
											"latency_ms": 42,
											"livemode": false,
											"method": "POST",
											"object": "request_log",
											"operation_id": "calls_create",
											"path": "/v1/calls",
											"query": null,
											"request_body": {
												"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
												"to": "+97250000000"
											},
											"request_id": "req_7Pq2Rk9sT1uV3wX5yZ8aBc",
											"response_body": {
												"error": {
													"code": "parameter_invalid",
													"message": "to must be an E.164 number",
													"param": "to",
													"type": "invalid_request_error"
												}
											},
											"route": "/v1/calls",
											"status": 400,
											"user_agent": "morevoice-node/0.4.0"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/request_logs"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List request logs",
				"tags": [
					"Request logs"
				],
				"x-morevoice-scopes": [
					"api_keys:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const requestLog of mv.requestLogs.list()) {\n\tconsole.log(requestLog);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor request_log in client.request_logs.list():\n    print(request_log)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/request_logs \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/request_logs/stream": {
			"get": {
				"description": "Server-Sent Events: each new request log (same filters as the list, without `created`) a few seconds after the request finished. Counts against the key's stream limit.\n\n[Try it in the API playground](/api/playground/?op=request_logs_stream) with a test-mode key.",
				"operationId": "request_logs_stream",
				"parameters": [
					{
						"description": "A status class (`2xx`, `3xx`, `4xx`, `5xx`), `error` (any 4xx or 5xx), or one status code (`404`).",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"pattern": "^([1-5]xx|error|[1-5]\\d\\d)$",
							"type": "string"
						}
					},
					{
						"description": "Only this HTTP method.",
						"in": "query",
						"name": "method",
						"required": false,
						"schema": {
							"enum": [
								"GET",
								"POST",
								"PATCH",
								"PUT",
								"DELETE"
							],
							"type": "string"
						}
					},
					{
						"description": "Only paths starting with this (`/v1/calls` matches `/v1/calls/call_…`).",
						"in": "query",
						"name": "path",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only requests made with this API key (`key_…`).",
						"in": "query",
						"name": "key_id",
						"required": false,
						"schema": {
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only the request with this X-Request-Id (`req_…`).",
						"in": "query",
						"name": "request_id",
						"required": false,
						"schema": {
							"maxLength": 128,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only this operation (`calls_create`).",
						"in": "query",
						"name": "operation_id",
						"required": false,
						"schema": {
							"maxLength": 128,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"text/event-stream": {
								"schema": {
									"description": "A text/event-stream of `request_log` objects as requests are logged (a few seconds after they finish): `id: <rlog_…>`, `event: request_log` and one `data:` line each. Comment lines (`: ping`) keep the connection alive every 15 s.",
									"examples": [
										"retry: 3000\n\nid: rlog_4Gk2LmN9pQ4rS6tV8wX0yZ\nevent: request_log\ndata: {\"id\":\"rlog_4Gk2LmN9pQ4rS6tV8wX0yZ\",\"object\":\"request_log\",\"livemode\":false,\"request_id\":\"req_7Pq2Rk9sT1uV3wX5yZ8aBc\",\"created\":\"2026-11-03T09:14:22.135Z\",\"method\":\"POST\",\"path\":\"/v1/calls\",\"query\":null,\"route\":\"/v1/calls\",\"operation_id\":\"calls_create\",\"api_version\":\"2026-11-01\",\"status\":400,\"error_code\":\"parameter_invalid\",\"latency_ms\":42,\"key_id\":\"key_3fT9kq2ZpLr8YwVbN1cX0a\",\"ip\":\"203.0.113.7\",\"user_agent\":\"morevoice-node/0.4.0\",\"idempotency_key\":\"8e0f3a2c-5d1b-4c7e-9f6a-2b4d8c1e7a90\",\"request_body\":{\"to\":\"+97250000000\",\"assistant_id\":\"asst_8tRPaZp5hLMbrGqdJ9AmNa\"},\"response_body\":{\"error\":{\"type\":\"invalid_request_error\",\"code\":\"parameter_invalid\",\"message\":\"to must be an E.164 number\",\"param\":\"to\"}}}\n\n"
									],
									"type": "string"
								}
							}
						},
						"description": "The request-log stream."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Stream request logs as they are written",
				"tags": [
					"Request logs"
				],
				"x-morevoice-scopes": [
					"api_keys:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const event of mv.requestLogs.stream()) {\n\tconsole.log(event);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "import os\n\nimport httpx\n\nurl = \"https://api.morevoice.ai/v1/request_logs/stream\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['MOREVOICE_API_KEY']}\", \"Accept\": \"text/event-stream\"}\nwith httpx.stream(\"GET\", url, headers=headers, timeout=None) as response:\n    response.raise_for_status()\n    for line in response.iter_lines():\n        if line.startswith(\"data:\"):\n            print(line[5:].strip())\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/request_logs/stream \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Accept: text/event-stream\" -N\n"
					}
				]
			}
		},
		"/request_logs/{id}": {
			"get": {
				"operationId": "request_logs_retrieve",
				"parameters": [
					{
						"description": "A request log ID (`rlog_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^rlog_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RequestLog"
								},
								"example": {
									"api_version": "2026-11-01",
									"created": "2026-11-03T09:14:22.135Z",
									"error_code": "parameter_invalid",
									"id": "rlog_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"idempotency_key": "8e0f3a2c-5d1b-4c7e-9f6a-2b4d8c1e7a90",
									"ip": "203.0.113.7",
									"key_id": "key_3fT9kq2ZpLr8YwVbN1cX0a",
									"latency_ms": 42,
									"livemode": false,
									"method": "POST",
									"object": "request_log",
									"operation_id": "calls_create",
									"path": "/v1/calls",
									"query": null,
									"request_body": {
										"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
										"to": "+97250000000"
									},
									"request_id": "req_7Pq2Rk9sT1uV3wX5yZ8aBc",
									"response_body": {
										"error": {
											"code": "parameter_invalid",
											"message": "to must be an E.164 number",
											"param": "to",
											"type": "invalid_request_error"
										}
									},
									"route": "/v1/calls",
									"status": 400,
									"user_agent": "morevoice-node/0.4.0"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a request log",
				"tags": [
					"Request logs"
				],
				"x-morevoice-scopes": [
					"api_keys:read"
				],
				"description": "Returns the `RequestLog` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=request_logs_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst requestLog = await mv.requestLogs.retrieve(\"rlog_7Hk2Lm9Qp\");\nconsole.log(requestLog);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nrequest_log = client.request_logs.retrieve(\"rlog_7Hk2Lm9Qp\")\nprint(request_log)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/request_logs/rlog_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/secrets": {
			"get": {
				"description": "Names and update times only, most recently changed first: values are never returned.\n\n[Try it in the API playground](/api/playground/?op=secrets_list) with a test-mode key.",
				"operationId": "secrets_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SecretList"
								},
								"example": {
									"data": [
										{
											"livemode": true,
											"name": "CRM_TOKEN",
											"object": "secret",
											"updated": "2026-11-03T09:14:22.000Z"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/secrets"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List secrets",
				"tags": [
					"Secrets"
				],
				"x-morevoice-scopes": [
					"secrets:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const secret of mv.secrets.list()) {\n\tconsole.log(secret);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor secret in client.secrets.list():\n    print(secret)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/secrets \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/secrets/{name}": {
			"delete": {
				"description": "Flows that still reference {{secret.NAME}} then get an empty value. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=secrets_delete) with a test-mode key.",
				"operationId": "secrets_delete",
				"parameters": [
					{
						"description": "The secret's name.",
						"in": "path",
						"name": "name",
						"required": true,
						"schema": {
							"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedSecret"
								},
								"example": {
									"deleted": true,
									"name": "CRM_TOKEN",
									"object": "secret"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a secret",
				"tags": [
					"Secrets"
				],
				"x-morevoice-scopes": [
					"secrets:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedSecret = await mv.secrets.delete(\"name_123\");\nconsole.log(deletedSecret);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_secret = client.secrets.delete(\"name_123\")\nprint(deleted_secret)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/secrets/name_123 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"put": {
				"description": "Sets the value of {{secret.NAME}} (creating it, or replacing the value). Write-only: the value is encrypted at rest and never returned. Flows and providers pick the new value up within seconds. Needs a live key.\n\n[Try it in the API playground](/api/playground/?op=secrets_set) with a test-mode key.",
				"operationId": "secrets_set",
				"parameters": [
					{
						"description": "The secret's name.",
						"in": "path",
						"name": "name",
						"required": true,
						"schema": {
							"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"value": "sk_live_…"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"value": {
										"description": "The value (up to 8 KB). Write-only: it is encrypted at rest and never returned.",
										"maxLength": 8192,
										"minLength": 1,
										"type": "string"
									}
								},
								"required": [
									"value"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Secret"
								},
								"example": {
									"livemode": true,
									"name": "CRM_TOKEN",
									"object": "secret",
									"updated": "2026-11-03T09:14:22.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create or replace a secret",
				"tags": [
					"Secrets"
				],
				"x-morevoice-scopes": [
					"secrets:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst secret = await mv.secrets.set(\"name_123\", {\n\tvalue: \"sk_live_…\",\n});\nconsole.log(secret);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nsecret = client.secrets.set(\"name_123\", {\n    \"value\": \"sk_live_…\",\n})\nprint(secret)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PUT https://api.morevoice.ai/v1/secrets/name_123 \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"value\": \"sk_live_…\"\n}'\n"
					}
				]
			}
		},
		"/teams": {
			"get": {
				"operationId": "teams_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TeamList"
								},
								"example": {
									"data": [
										{
											"created": "2026-10-01T12:00:00.000Z",
											"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
											"livemode": true,
											"member_count": 6,
											"name": "Sales",
											"object": "team"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/teams"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List teams",
				"tags": [
					"Teams"
				],
				"x-morevoice-scopes": [
					"teams:read"
				],
				"description": "Returns a page of `Team` objects, newest first. Pass `next_cursor` as `starting_after` for the next page; the SDKs iterate every page for you.\n\n[Try it in the API playground](/api/playground/?op=teams_list) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const team of mv.teams.list()) {\n\tconsole.log(team);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor team in client.teams.list():\n    print(team)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/teams \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"operationId": "teams_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TeamParamsInput"
							},
							"example": {
								"name": "Sales"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Team"
								},
								"example": {
									"created": "2026-10-01T12:00:00.000Z",
									"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
									"livemode": true,
									"member_count": 6,
									"name": "Sales",
									"object": "team"
								}
							}
						},
						"description": "The new team."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a team",
				"tags": [
					"Teams"
				],
				"x-morevoice-scopes": [
					"teams:write"
				],
				"description": "Returns the new `Team`.\n\n[Try it in the API playground](/api/playground/?op=teams_create) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst team = await mv.teams.create({\n\tname: \"Sales\",\n});\nconsole.log(team);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nteam = client.teams.create({\n    \"name\": \"Sales\",\n})\nprint(team)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/teams \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"name\": \"Sales\"\n}'\n"
					}
				]
			}
		},
		"/teams/{id}": {
			"delete": {
				"description": "Deletes the team. Its members stay in the organisation, in no team; queues that list the team no longer reach them through it.\n\n[Try it in the API playground](/api/playground/?op=teams_delete) with a test-mode key.",
				"operationId": "teams_delete",
				"parameters": [
					{
						"description": "A team ID (`team_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedTeam"
								},
								"example": {
									"deleted": true,
									"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
									"object": "team"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a team",
				"tags": [
					"Teams"
				],
				"x-morevoice-scopes": [
					"teams:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedTeam = await mv.teams.delete(\"team_7Hk2Lm9Qp\");\nconsole.log(deletedTeam);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_team = client.teams.delete(\"team_7Hk2Lm9Qp\")\nprint(deleted_team)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/teams/team_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "teams_retrieve",
				"parameters": [
					{
						"description": "A team ID (`team_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Team"
								},
								"example": {
									"created": "2026-10-01T12:00:00.000Z",
									"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
									"livemode": true,
									"member_count": 6,
									"name": "Sales",
									"object": "team"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a team",
				"tags": [
					"Teams"
				],
				"x-morevoice-scopes": [
					"teams:read"
				],
				"description": "Returns the `Team` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=teams_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst team = await mv.teams.retrieve(\"team_7Hk2Lm9Qp\");\nconsole.log(team);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nteam = client.teams.retrieve(\"team_7Hk2Lm9Qp\")\nprint(team)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/teams/team_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"operationId": "teams_update",
				"parameters": [
					{
						"description": "A team ID (`team_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TeamParamsInput"
							},
							"example": {
								"name": "Sales"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Team"
								},
								"example": {
									"created": "2026-10-01T12:00:00.000Z",
									"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
									"livemode": true,
									"member_count": 6,
									"name": "Sales",
									"object": "team"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Rename a team",
				"tags": [
					"Teams"
				],
				"x-morevoice-scopes": [
					"teams:write"
				],
				"description": "Changes only the fields you send. Returns the updated `Team`. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=teams_update) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst team = await mv.teams.update(\"team_7Hk2Lm9Qp\", {\n\tname: \"Sales\",\n});\nconsole.log(team);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nteam = client.teams.update(\"team_7Hk2Lm9Qp\", {\n    \"name\": \"Sales\",\n})\nprint(team)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/teams/team_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Sales\"\n}'\n"
					}
				]
			}
		},
		"/test_helpers/events": {
			"post": {
				"description": "Test mode only. Emits one sample event of `type`: it is stored and delivered to your test-mode webhook endpoints that subscribe to it, signed and retried like any event.\n\n[Try it in the API playground](/api/playground/?op=test_helpers_events_create) with a test-mode key.",
				"operationId": "test_helpers_events_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TestHelperEventCreateParamsInput"
							},
							"example": {
								"type": "call.ended"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TestHelperEvent"
								},
								"example": {
									"id": "evt_7Yb2Qx9LmN4tV8wK1cY0bZ",
									"livemode": false,
									"object": "test_event",
									"type": "call.ended"
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Send a sample event",
				"tags": [
					"Test helpers"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst testHelperEvent = await mv.testHelpersEvents.create({\n\ttype: \"call.ended\",\n});\nconsole.log(testHelperEvent);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ntest_helper_event = client.test_helpers_events.create({\n    \"type\": \"call.ended\",\n})\nprint(test_helper_event)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/test_helpers/events \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"type\": \"call.ended\"\n}'\n"
					}
				]
			}
		},
		"/test_helpers/inbound_calls": {
			"post": {
				"description": "Test mode only. A simulated caller dials one of your sandbox numbers: the call is routed like a real one (the number's assistant, flow or inbound route), runs on the virtual carrier with simulated speech and AI, and sends every call event to your test-mode webhook endpoints. Returns the call (status `ringing`); it is answered within a second.\n\n[Try it in the API playground](/api/playground/?op=test_helpers_inbound_calls_create) with a test-mode key.",
				"operationId": "test_helpers_inbound_calls_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InboundCallCreateParamsInput"
							},
							"example": {
								"from": "+972521234567",
								"script": "dtmf:1",
								"to": "+972509991234"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Call"
								},
								"example": {
									"agent_id": null,
									"ai_generated": true,
									"ai_segments": [
										{
											"end_ms": 99710,
											"source": "assistant",
											"start_ms": 0
										}
									],
									"answered_at": "2026-11-03T09:14:29.410Z",
									"answered_by": "human",
									"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
									"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"campaign_id": null,
									"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
									"contact_id": null,
									"cost": {
										"amount": 4,
										"amount_decimal": "4.2310",
										"currency": "USD",
										"estimate": true
									},
									"direction": "outbound",
									"disposition": null,
									"duration_ms": 99710,
									"end_reason": "customer-ended-call",
									"ended_at": "2026-11-03T09:16:02.120Z",
									"flow_id": null,
									"flow_version": null,
									"from": "+97237654321",
									"has_recording": true,
									"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
									"livemode": true,
									"metadata": {
										"crm_contact_id": "0031x00000AbCdE"
									},
									"object": "call",
									"purpose": "service",
									"queue_id": null,
									"started_at": "2026-11-03T09:14:22.000Z",
									"status": "ended",
									"summary": null,
									"to": "+972501234567",
									"transport": "sip",
									"type": "ai",
									"variables": {
										"customer_name": "Dana"
									}
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Simulate an inbound call",
				"tags": [
					"Test helpers"
				],
				"x-morevoice-scopes": [
					"calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst call = await mv.testHelpersInboundCalls.create({\n\tfrom: \"+972521234567\",\n\tscript: \"dtmf:1\",\n\tto: \"+972509991234\",\n});\nconsole.log(call);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ncall = client.test_helpers_inbound_calls.create({\n    \"from\": \"+972521234567\",\n    \"script\": \"dtmf:1\",\n    \"to\": \"+972509991234\",\n})\nprint(call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/test_helpers/inbound_calls \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"from\": \"+972521234567\",\n  \"script\": \"dtmf:1\",\n  \"to\": \"+972509991234\"\n}'\n"
					}
				]
			}
		},
		"/tools/test": {
			"post": {
				"description": "Runs a custom tool once with the arguments you give, the way a call runs it: the same request body, signed with your tool signing secret (Standard Webhooks headers; test-mode keys sign with the test secret) and sent through the same network guard. Webhook failures (an HTTP error, a timeout) are reported in the result; a URL that cannot be called at all is a 400.\n\n[Try it in the API playground](/api/playground/?op=tools_test) with a test-mode key.",
				"operationId": "tools_test",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"arguments": {
									"date": "2026-11-04"
								},
								"tool": {
									"headers": {
										"Authorization": "Bearer crm-secret"
									},
									"name": "find_slots",
									"timeout_seconds": 10,
									"url": "https://crm.example.com/voice/tools"
								}
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"arguments": {
										"additionalProperties": {},
										"description": "The arguments, as the model would pass them (default `{}`).",
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"assistant_id": {
										"description": "The assistant whose stored tool (with its stored headers) to test.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									"tool": {
										"$ref": "#/components/schemas/CustomToolParamsInput"
									},
									"tool_name": {
										"description": "The stored tool's name (with `assistant_id`).",
										"pattern": "^[a-zA-Z0-9_-]{1,64}$",
										"type": "string"
									}
								},
								"type": "object"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ToolTest"
								},
								"example": {
									"duration_ms": 182,
									"error": null,
									"livemode": true,
									"object": "tool_test",
									"ok": true,
									"result": {
										"slots": [
											"10:30",
											"11:00"
										]
									},
									"tool": "find_slots",
									"type": "webhook"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Test a custom tool",
				"tags": [
					"Tools"
				],
				"x-morevoice-scopes": [
					"tools:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst toolTest = await mv.tools.test({\n\targuments: {\n\t\tdate: \"2026-11-04\",\n\t},\n\ttool: {\n\t\theaders: {\n\t\t\tAuthorization: \"Bearer crm-secret\",\n\t\t},\n\t\tname: \"find_slots\",\n\t\ttimeout_seconds: 10,\n\t\turl: \"https://crm.example.com/voice/tools\",\n\t},\n});\nconsole.log(toolTest);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ntool_test = client.tools.test({\n    \"arguments\": {\n        \"date\": \"2026-11-04\",\n    },\n    \"tool\": {\n        \"headers\": {\n            \"Authorization\": \"Bearer crm-secret\",\n        },\n        \"name\": \"find_slots\",\n        \"timeout_seconds\": 10,\n        \"url\": \"https://crm.example.com/voice/tools\",\n    },\n})\nprint(tool_test)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/tools/test \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"arguments\": {\n    \"date\": \"2026-11-04\"\n  },\n  \"tool\": {\n    \"headers\": {\n      \"Authorization\": \"Bearer crm-secret\"\n    },\n    \"name\": \"find_slots\",\n    \"timeout_seconds\": 10,\n    \"url\": \"https://crm.example.com/voice/tools\"\n  }\n}'\n"
					}
				]
			}
		},
		"/usage": {
			"get": {
				"description": "Usage per day or month and kind, with its price from your price book (minor units of your billing currency). `totals` sums the range per kind: for a calendar month they are the billing page's figures. Test keys get their test-mode usage, which is never billed (amounts are null).\n\n[Try it in the API playground](/api/playground/?op=usage_retrieve) with a test-mode key.",
				"operationId": "usage_retrieve",
				"parameters": [
					{
						"description": "The first day (YYYY-MM-DD, the organisation's time zone).",
						"in": "query",
						"name": "from",
						"required": true,
						"schema": {
							"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
							"type": "string"
						}
					},
					{
						"description": "The last day, inclusive. Per kind: up to 400 days; per assistant or campaign (and in test mode): up to 92 days.",
						"in": "query",
						"name": "to",
						"required": true,
						"schema": {
							"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
							"type": "string"
						}
					},
					{
						"description": "One row per day (default) or per calendar month.",
						"in": "query",
						"name": "granularity",
						"required": false,
						"schema": {
							"default": "day",
							"enum": [
								"day",
								"month"
							],
							"type": "string"
						}
					},
					{
						"description": "`kind` (default): one row per period and usage kind; `assistant` / `campaign`: also split by the assistant or campaign the usage belongs to.",
						"in": "query",
						"name": "group_by",
						"required": false,
						"schema": {
							"default": "kind",
							"enum": [
								"kind",
								"assistant",
								"campaign"
							],
							"type": "string"
						}
					},
					{
						"description": "Only this usage kind.",
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"enum": [
								"ai_minute",
								"pbx_minute",
								"carrier_minute",
								"copilot_minute",
								"seat_day",
								"copilot_seat_day",
								"qa_scored_call",
								"kb_storage_gb_day",
								"recording_storage_gb_day",
								"sms",
								"email",
								"did_month",
								"api_request",
								"platform_ai_usd",
								"did_setup"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UsageReport"
								},
								"example": {
									"data": [
										{
											"amount": {
												"amount": 41250,
												"currency": "ILS"
											},
											"events": 268,
											"kind": "ai_minute",
											"period": "2026-11-03",
											"quantity": 412.5,
											"unit": "minute"
										}
									],
									"from": "2026-11-01",
									"granularity": "day",
									"group_by": "kind",
									"livemode": true,
									"object": "usage_report",
									"timezone": "Asia/Jerusalem",
									"to": "2026-11-30",
									"total": {
										"amount": 41250,
										"currency": "ILS"
									},
									"totals": [
										{
											"amount": {
												"amount": 41250,
												"currency": "ILS"
											},
											"kind": "ai_minute",
											"quantity": 412.5,
											"unit": "minute"
										}
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve usage",
				"tags": [
					"Usage"
				],
				"x-morevoice-scopes": [
					"usage:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst usageReport = await mv.usage.retrieve({\n\tfrom: \"2026-10-01\",\n\tto: \"2026-10-31\",\n});\nconsole.log(usageReport);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nusage_report = client.usage.retrieve(from_=\"2026-10-01\", to=\"2026-10-31\")\nprint(usage_report)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -G https://api.morevoice.ai/v1/usage \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  --data-urlencode 'from=2026-10-01' \\\n  --data-urlencode 'to=2026-10-31'\n"
					}
				]
			}
		},
		"/users": {
			"get": {
				"description": "Your organisation's members (deactivated ones included), newest first.\n\n[Try it in the API playground](/api/playground/?op=users_list) with a test-mode key.",
				"operationId": "users_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only members with this role.",
						"in": "query",
						"name": "role",
						"required": false,
						"schema": {
							"enum": [
								"owner",
								"admin",
								"supervisor",
								"agent"
							],
							"type": "string"
						}
					},
					{
						"description": "Only members in this status.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"active",
								"deactivated",
								"invited"
							],
							"type": "string"
						}
					},
					{
						"description": "Only members of this team.",
						"in": "query",
						"name": "team_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserList"
								},
								"example": {
									"data": [
										{
											"billing": false,
											"created": "2026-10-01T12:00:00.000Z",
											"email": "dana@example.com",
											"email_verified": true,
											"extension": "204",
											"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
											"last_login": "2026-11-03T08:01:10.000Z",
											"livemode": true,
											"name": "Dana Levi",
											"object": "user",
											"role": "agent",
											"status": "active",
											"takes_seat": true,
											"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/users"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List users",
				"tags": [
					"Users"
				],
				"x-morevoice-scopes": [
					"users:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const user of mv.users.list()) {\n\tconsole.log(user);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor user in client.users.list():\n    print(user)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/users \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/users/{id}": {
			"delete": {
				"description": "Deactivates the membership: they are signed out of this organisation, free their seat, and their open callbacks go back to their queue. They keep their account (and other organisations); `POST /v1/users/{id}/reactivate` undoes it.\n\n[Try it in the API playground](/api/playground/?op=users_delete) with a test-mode key.",
				"operationId": "users_delete",
				"parameters": [
					{
						"description": "A user ID (`usr_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/User"
								},
								"example": {
									"billing": false,
									"created": "2026-10-01T12:00:00.000Z",
									"email": "dana@example.com",
									"email_verified": true,
									"extension": "204",
									"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"last_login": "2026-11-03T08:01:10.000Z",
									"livemode": true,
									"name": "Dana Levi",
									"object": "user",
									"role": "agent",
									"status": "active",
									"takes_seat": true,
									"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								}
							}
						},
						"description": "The deactivated user."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Deactivate a user",
				"tags": [
					"Users"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst user = await mv.users.delete(\"usr_7Hk2Lm9Qp\");\nconsole.log(user);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nuser = client.users.delete(\"usr_7Hk2Lm9Qp\")\nprint(user)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/users/usr_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "users_retrieve",
				"parameters": [
					{
						"description": "A user ID (`usr_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/User"
								},
								"example": {
									"billing": false,
									"created": "2026-10-01T12:00:00.000Z",
									"email": "dana@example.com",
									"email_verified": true,
									"extension": "204",
									"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"last_login": "2026-11-03T08:01:10.000Z",
									"livemode": true,
									"name": "Dana Levi",
									"object": "user",
									"role": "agent",
									"status": "active",
									"takes_seat": true,
									"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a user",
				"tags": [
					"Users"
				],
				"x-morevoice-scopes": [
					"users:read"
				],
				"description": "Returns the `User` object. Answers `404` with the code `resource_missing` when nothing has this ID in this organisation and mode.\n\n[Try it in the API playground](/api/playground/?op=users_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst user = await mv.users.retrieve(\"usr_7Hk2Lm9Qp\");\nconsole.log(user);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nuser = client.users.retrieve(\"usr_7Hk2Lm9Qp\")\nprint(user)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/users/usr_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Changes a member's role, team or extension. A role change signs them in again in this organisation. API keys manage agents and supervisors: granting `owner` or `admin`, or changing an owner or admin, answers 403 — an owner does that in the dashboard.\n\n[Try it in the API playground](/api/playground/?op=users_update) with a test-mode key.",
				"operationId": "users_update",
				"parameters": [
					{
						"description": "A user ID (`usr_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UserUpdateParamsInput"
							},
							"example": {
								"role": "supervisor",
								"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/User"
								},
								"example": {
									"billing": false,
									"created": "2026-10-01T12:00:00.000Z",
									"email": "dana@example.com",
									"email_verified": true,
									"extension": "204",
									"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"last_login": "2026-11-03T08:01:10.000Z",
									"livemode": true,
									"name": "Dana Levi",
									"object": "user",
									"role": "agent",
									"status": "active",
									"takes_seat": true,
									"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a user",
				"tags": [
					"Users"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst user = await mv.users.update(\"usr_7Hk2Lm9Qp\", {\n\trole: \"supervisor\",\n\tteam_id: \"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\",\n});\nconsole.log(user);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nuser = client.users.update(\"usr_7Hk2Lm9Qp\", {\n    \"role\": \"supervisor\",\n    \"team_id\": \"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\",\n})\nprint(user)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/users/usr_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"role\": \"supervisor\",\n  \"team_id\": \"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw\"\n}'\n"
					}
				]
			}
		},
		"/users/{id}/reactivate": {
			"post": {
				"description": "Reactivates a deactivated member. They take a seat again (402 plan_limit when none is free).\n\n[Try it in the API playground](/api/playground/?op=users_reactivate) with a test-mode key.",
				"operationId": "users_reactivate",
				"parameters": [
					{
						"description": "A user ID (`usr_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/User"
								},
								"example": {
									"billing": false,
									"created": "2026-10-01T12:00:00.000Z",
									"email": "dana@example.com",
									"email_verified": true,
									"extension": "204",
									"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
									"last_login": "2026-11-03T08:01:10.000Z",
									"livemode": true,
									"name": "Dana Levi",
									"object": "user",
									"role": "agent",
									"status": "active",
									"takes_seat": true,
									"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Reactivate a user",
				"tags": [
					"Users"
				],
				"x-morevoice-scopes": [
					"users:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst user = await mv.users.reactivate(\"usr_7Hk2Lm9Qp\");\nconsole.log(user);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nuser = client.users.reactivate(\"usr_7Hk2Lm9Qp\")\nprint(user)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/users/usr_7Hk2Lm9Qp/reactivate \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/voices": {
			"get": {
				"description": "The voices assistants can speak with: your custom voices first, then the provider's library by name (the dashboard's order).\n\n[Try it in the API playground](/api/playground/?op=voices_list) with a test-mode key.",
				"operationId": "voices_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "Only prebuilt or only custom voices.",
						"in": "query",
						"name": "type",
						"required": false,
						"schema": {
							"enum": [
								"prebuilt",
								"custom"
							],
							"type": "string"
						}
					},
					{
						"description": "Only voices listing this language (`en` matches `en-US`).",
						"in": "query",
						"name": "language",
						"required": false,
						"schema": {
							"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/VoiceList"
								},
								"example": {
									"data": [
										{
											"accent": "American",
											"description": "Warm and upbeat.",
											"gender": "female",
											"languages": [
												"en-US"
											],
											"livemode": true,
											"name": "Fola",
											"object": "voice",
											"provider": "gemini",
											"type": "prebuilt",
											"voice_id": "en-us-fola"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/voices"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List voices",
				"tags": [
					"Voices"
				],
				"x-morevoice-scopes": [
					"voices:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const voice of mv.voices.list()) {\n\tconsole.log(voice);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor voice in client.voices.list():\n    print(voice)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/voices \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/voices/preview": {
			"post": {
				"description": "Speaks up to 300 characters in a voice and returns a WAV file. Test-mode keys get a synthetic tone of the same length instead, and no speech provider is called; the `Audio-Source` response header says which you got (`speech` or `synthetic`).\n\n[Try it in the API playground](/api/playground/?op=voices_preview) with a test-mode key.",
				"operationId": "voices_preview",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"example": {
								"language": "he",
								"style": "warm and friendly",
								"text": "שלום! ככה אני נשמעת.",
								"voice_id": "Kore"
							},
							"schema": {
								"additionalProperties": false,
								"properties": {
									"language": {
										"description": "The language of `text` (default `he`).",
										"pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$",
										"type": "string"
									},
									"model": {
										"description": "The TTS model (default: the assistants' default).",
										"maxLength": 100,
										"minLength": 1,
										"type": "string"
									},
									"style": {
										"description": "Delivery direction, e.g. `calm and reassuring`.",
										"maxLength": 1000,
										"type": "string"
									},
									"text": {
										"description": "What to say, up to 300 characters (default: a short greeting in `language`).",
										"maxLength": 300,
										"minLength": 1,
										"type": "string"
									},
									"voice_id": {
										"description": "The voice to hear (`voice_id` from `GET /v1/voices`).",
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									}
								},
								"required": [
									"voice_id"
								],
								"type": "object"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"audio/wav": {
								"schema": {
									"description": "A WAV file (16-bit PCM, mono, 24 kHz).",
									"format": "binary",
									"type": "string"
								}
							}
						},
						"description": "The WAV file."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Preview a voice",
				"tags": [
					"Voices"
				],
				"x-morevoice-scopes": [
					"voices:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst data = await mv.voices.preview({\n\tlanguage: \"he\",\n\tstyle: \"warm and friendly\",\n\ttext: \"שלום! ככה אני נשמעת.\",\n\tvoice_id: \"Kore\",\n});\nconsole.log(data);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndata = client.voices.preview({\n    \"language\": \"he\",\n    \"style\": \"warm and friendly\",\n    \"text\": \"שלום! ככה אני נשמעת.\",\n    \"voice_id\": \"Kore\",\n})\nprint(len(data), \"bytes\")\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/voices/preview \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"language\": \"he\",\n  \"style\": \"warm and friendly\",\n  \"text\": \"שלום! ככה אני נשמעת.\",\n  \"voice_id\": \"Kore\"\n}'\n"
					}
				]
			}
		},
		"/web_calls": {
			"post": {
				"description": "From the browser with a publishable key (`mv_live_pk_…`), or from your server with a secret key: returns the call ID and a single-use client token for `/ws/call`. With a publishable key the assistant must be public, the page must be one of the key's allowed origins (and of the assistant's widget origins, when it lists any), and each visitor may start 10 web calls a minute. The org's concurrent-call quota applies.\n\n[Try it in the API playground](/api/playground/?op=web_calls_create) with a test-mode key.",
				"operationId": "web_calls_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebCallCreateParamsInput"
							},
							"example": {
								"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
								"metadata": {
									"page": "/pricing"
								}
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebCall"
								},
								"example": {
									"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
									"call_id": "call_3slqGaD2htUzxdRsI",
									"client_token": "<client_token: short-lived JWT, pass it through unchanged>",
									"expires_at": "2026-11-03T09:19:22.000Z",
									"livemode": true,
									"object": "web_call",
									"ws_url": "wss://api.morevoice.ai/ws/call"
								}
							}
						},
						"description": "The web call, ready to connect."
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Start a web call",
				"tags": [
					"Web calls"
				],
				"x-morevoice-scopes": [
					"web_calls:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webCall = await mv.webCalls.create({\n\tassistant_id: \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n\tmetadata: {\n\t\tpage: \"/pricing\",\n\t},\n});\nconsole.log(webCall);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nweb_call = client.web_calls.create({\n    \"assistant_id\": \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n    \"metadata\": {\n        \"page\": \"/pricing\",\n    },\n})\nprint(web_call)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/web_calls \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"assistant_id\": \"asst_8tRPaZp5hLMbrGqdJ9AmNa\",\n  \"metadata\": {\n    \"page\": \"/pricing\"\n  }\n}'\n"
					}
				]
			}
		},
		"/webhook_deliveries": {
			"get": {
				"description": "Deliveries of events to your endpoints in this mode, newest first. Filter by endpoint, event or status (`status=failed` for the ones being retried). Kept 30 days.\n\n[Try it in the API playground](/api/playground/?op=webhook_deliveries_list) with a test-mode key.",
				"operationId": "webhook_deliveries_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "query",
						"name": "endpoint_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"description": "A event ID (`evt_…`).",
						"in": "query",
						"name": "event_id",
						"required": false,
						"schema": {
							"maxLength": 200,
							"pattern": "^evt_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"enum": [
								"pending",
								"failed",
								"succeeded",
								"dead"
							],
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookDeliveryList"
								},
								"example": {
									"data": [
										{
											"attempts": 2,
											"created": "2026-11-03T09:14:22.000Z",
											"delivered_at": null,
											"duration_ms": 412,
											"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"error": "HTTP 503",
											"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
											"event_type": "call.ended",
											"id": "whd_2N5bQ8",
											"last_attempt_at": "2026-11-03T09:14:42.000Z",
											"livemode": true,
											"next_attempt_at": "2026-11-03T09:15:02.000Z",
											"object": "webhook_delivery",
											"response_excerpt": "Service Unavailable",
											"response_status": 503,
											"status": "failed"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/webhook_deliveries"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List webhook deliveries",
				"tags": [
					"Webhook deliveries"
				],
				"x-morevoice-scopes": [
					"webhooks:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const webhookDelivery of mv.webhookDeliveries.list()) {\n\tconsole.log(webhookDelivery);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor webhook_delivery in client.webhook_deliveries.list():\n    print(webhook_delivery)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/webhook_deliveries \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/webhook_deliveries/{id}": {
			"get": {
				"description": "The delivery with the request as last sent (headers without the signatures, the exact body) and the start of the endpoint's answer.\n\n[Try it in the API playground](/api/playground/?op=webhook_deliveries_retrieve) with a test-mode key.",
				"operationId": "webhook_deliveries_retrieve",
				"parameters": [
					{
						"description": "A webhook delivery ID (`whd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^whd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookDelivery"
								},
								"example": {
									"attempts": 2,
									"created": "2026-11-03T09:14:22.000Z",
									"delivered_at": null,
									"duration_ms": 412,
									"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"error": "HTTP 503",
									"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
									"event_type": "call.ended",
									"id": "whd_2N5bQ8",
									"last_attempt_at": "2026-11-03T09:14:42.000Z",
									"livemode": true,
									"next_attempt_at": "2026-11-03T09:15:02.000Z",
									"object": "webhook_delivery",
									"response_excerpt": "Service Unavailable",
									"response_status": 503,
									"status": "failed"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a webhook delivery",
				"tags": [
					"Webhook deliveries"
				],
				"x-morevoice-scopes": [
					"webhooks:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookDelivery = await mv.webhookDeliveries.retrieve(\"whd_7Hk2Lm9Qp\");\nconsole.log(webhookDelivery);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_delivery = client.webhook_deliveries.retrieve(\"whd_7Hk2Lm9Qp\")\nprint(webhook_delivery)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/webhook_deliveries/whd_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/webhook_deliveries/{id}/retry": {
			"post": {
				"description": "Sends the delivery again right now (a dead one too) and returns it with the outcome. A retry that fails leaves a dead delivery dead; a delivery still being retried keeps its schedule.\n\n[Try it in the API playground](/api/playground/?op=webhook_deliveries_retry) with a test-mode key.",
				"operationId": "webhook_deliveries_retry",
				"parameters": [
					{
						"description": "A webhook delivery ID (`whd_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^whd_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookDelivery"
								},
								"example": {
									"attempts": 2,
									"created": "2026-11-03T09:14:22.000Z",
									"delivered_at": null,
									"duration_ms": 412,
									"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"error": "HTTP 503",
									"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
									"event_type": "call.ended",
									"id": "whd_2N5bQ8",
									"last_attempt_at": "2026-11-03T09:14:42.000Z",
									"livemode": true,
									"next_attempt_at": "2026-11-03T09:15:02.000Z",
									"object": "webhook_delivery",
									"response_excerpt": "Service Unavailable",
									"response_status": 503,
									"status": "failed"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retry a webhook delivery",
				"tags": [
					"Webhook deliveries"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookDelivery = await mv.webhookDeliveries.retry(\"whd_7Hk2Lm9Qp\");\nconsole.log(webhookDelivery);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_delivery = client.webhook_deliveries.retry(\"whd_7Hk2Lm9Qp\")\nprint(webhook_delivery)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/webhook_deliveries/whd_7Hk2Lm9Qp/retry \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			}
		},
		"/webhook_endpoints": {
			"get": {
				"description": "Your webhook endpoints in this mode, newest first. Signing secrets are never listed.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_list) with a test-mode key.",
				"operationId": "webhook_endpoints_list",
				"parameters": [
					{
						"description": "How many objects to return, 1–100 (default 20).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"default": 20,
							"maximum": 100,
							"minimum": 1,
							"type": "integer"
						}
					},
					{
						"description": "A cursor (`next_cursor`) or object ID: return the objects after it (older).",
						"in": "query",
						"name": "starting_after",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"description": "A cursor or object ID: return the objects before it (newer).",
						"in": "query",
						"name": "ending_before",
						"required": false,
						"schema": {
							"maxLength": 512,
							"minLength": 1,
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpointList"
								},
								"example": {
									"data": [
										{
											"api_version": "2026-11-01",
											"campaign_id": null,
											"created": "2026-11-03T09:14:22.000Z",
											"description": "CRM sync",
											"disabled_at": null,
											"disabled_reason": null,
											"enabled_events": [
												"call.ended",
												"call.analyzed"
											],
											"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
											"legacy_headers": false,
											"livemode": true,
											"max_in_flight": 10,
											"metadata": {},
											"object": "webhook_endpoint",
											"previous_public_key": null,
											"previous_secret_expires_at": null,
											"public_key": null,
											"signing": "hmac",
											"status": "enabled",
											"updated": "2026-11-03T09:14:22.000Z",
											"url": "https://hooks.example.com/webhooks"
										}
									],
									"has_more": false,
									"next_cursor": null,
									"object": "list",
									"url": "/v1/webhook_endpoints"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "List webhook endpoints",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nfor await (const webhookEndpoint of mv.webhookEndpoints.list()) {\n\tconsole.log(webhookEndpoint);\n}\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nfor webhook_endpoint in client.webhook_endpoints.list():\n    print(webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/webhook_endpoints \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"post": {
				"description": "Starts sending the selected events to `url`, signed with a new secret (`whsec_…`, Standard Webhooks). The response carries the secret: this is the only time it is shown (rotate it to get a new one). With `signing: ed25519` the events are signed with a new Ed25519 key pair instead (`v1a`): no secret is returned, and you verify with `public_key`. Live endpoints need https; private and local addresses are refused.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_create) with a test-mode key.",
				"operationId": "webhook_endpoints_create",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointCreateParamsInput"
							},
							"example": {
								"description": "CRM sync",
								"enabled_events": [
									"call.ended",
									"call.analyzed"
								],
								"url": "https://hooks.example.com/webhooks"
							}
						}
					},
					"required": true
				},
				"responses": {
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpoint"
								},
								"example": {
									"api_version": "2026-11-01",
									"campaign_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"description": "CRM sync",
									"disabled_at": null,
									"disabled_reason": null,
									"enabled_events": [
										"call.ended",
										"call.analyzed"
									],
									"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"legacy_headers": false,
									"livemode": true,
									"max_in_flight": 10,
									"metadata": {},
									"object": "webhook_endpoint",
									"previous_public_key": null,
									"previous_secret_expires_at": null,
									"public_key": null,
									"signing": "hmac",
									"status": "enabled",
									"updated": "2026-11-03T09:14:22.000Z",
									"url": "https://hooks.example.com/webhooks"
								}
							}
						},
						"description": "Created"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Create a webhook endpoint",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpoint = await mv.webhookEndpoints.create({\n\tdescription: \"CRM sync\",\n\tenabled_events: [\n\t\t\"call.ended\",\n\t\t\"call.analyzed\",\n\t],\n\turl: \"https://hooks.example.com/webhooks\",\n});\nconsole.log(webhookEndpoint);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint = client.webhook_endpoints.create({\n    \"description\": \"CRM sync\",\n    \"enabled_events\": [\n        \"call.ended\",\n        \"call.analyzed\",\n    ],\n    \"url\": \"https://hooks.example.com/webhooks\",\n})\nprint(webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/webhook_endpoints \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"description\": \"CRM sync\",\n  \"enabled_events\": [\n    \"call.ended\",\n    \"call.analyzed\"\n  ],\n  \"url\": \"https://hooks.example.com/webhooks\"\n}'\n"
					}
				]
			}
		},
		"/webhook_endpoints/{id}": {
			"delete": {
				"description": "Stops all deliveries to the endpoint at once; its queued deliveries are dropped.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_delete) with a test-mode key.",
				"operationId": "webhook_endpoints_delete",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedWebhookEndpoint"
								},
								"example": {
									"deleted": true,
									"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"object": "webhook_endpoint"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Delete a webhook endpoint",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst deletedWebhookEndpoint = await mv.webhookEndpoints.delete(\"we_7Hk2Lm9Qp\");\nconsole.log(deletedWebhookEndpoint);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\ndeleted_webhook_endpoint = client.webhook_endpoints.delete(\"we_7Hk2Lm9Qp\")\nprint(deleted_webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X DELETE https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\"\n"
					}
				]
			},
			"get": {
				"operationId": "webhook_endpoints_retrieve",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpoint"
								},
								"example": {
									"api_version": "2026-11-01",
									"campaign_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"description": "CRM sync",
									"disabled_at": null,
									"disabled_reason": null,
									"enabled_events": [
										"call.ended",
										"call.analyzed"
									],
									"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"legacy_headers": false,
									"livemode": true,
									"max_in_flight": 10,
									"metadata": {},
									"object": "webhook_endpoint",
									"previous_public_key": null,
									"previous_secret_expires_at": null,
									"public_key": null,
									"signing": "hmac",
									"status": "enabled",
									"updated": "2026-11-03T09:14:22.000Z",
									"url": "https://hooks.example.com/webhooks"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a webhook endpoint",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:read"
				],
				"description": "Returns a webhook endpoint: its URL, the events it receives, its status (and why it was disabled, if it was) and its API version. The signing secret is shown only when the endpoint is created and when the secret is rotated.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_retrieve) with a test-mode key.",
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpoint = await mv.webhookEndpoints.retrieve(\"we_7Hk2Lm9Qp\");\nconsole.log(webhookEndpoint);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint = client.webhook_endpoints.retrieve(\"we_7Hk2Lm9Qp\")\nprint(webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			},
			"patch": {
				"description": "Change the URL, the events, the description, the API version or the status. `status: enabled` resumes an endpoint that was disabled (or auto-disabled after 72 hours of failures).\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_update) with a test-mode key.",
				"operationId": "webhook_endpoints_update",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointUpdateParamsInput"
							},
							"example": {
								"enabled_events": [
									"call.*"
								],
								"status": "enabled"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpoint"
								},
								"example": {
									"api_version": "2026-11-01",
									"campaign_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"description": "CRM sync",
									"disabled_at": null,
									"disabled_reason": null,
									"enabled_events": [
										"call.ended",
										"call.analyzed"
									],
									"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"legacy_headers": false,
									"livemode": true,
									"max_in_flight": 10,
									"metadata": {},
									"object": "webhook_endpoint",
									"previous_public_key": null,
									"previous_secret_expires_at": null,
									"public_key": null,
									"signing": "hmac",
									"status": "enabled",
									"updated": "2026-11-03T09:14:22.000Z",
									"url": "https://hooks.example.com/webhooks"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Update a webhook endpoint",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpoint = await mv.webhookEndpoints.update(\"we_7Hk2Lm9Qp\", {\n\tenabled_events: [\n\t\t\"call.*\",\n\t],\n\tstatus: \"enabled\",\n});\nconsole.log(webhookEndpoint);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint = client.webhook_endpoints.update(\"we_7Hk2Lm9Qp\", {\n    \"enabled_events\": [\n        \"call.*\",\n    ],\n    \"status\": \"enabled\",\n})\nprint(webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X PATCH https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"enabled_events\": [\n    \"call.*\"\n  ],\n  \"status\": \"enabled\"\n}'\n"
					}
				]
			}
		},
		"/webhook_endpoints/{id}/public_key": {
			"get": {
				"description": "The Ed25519 public key that verifies an `ed25519` endpoint's `v1a` signatures, as `whpk_…` (Standard Webhooks) and as SPKI PEM, with the previous key while a rotation overlaps. An `hmac` endpoint has none (409 `resource_conflict`).\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_retrieve_public_key) with a test-mode key.",
				"operationId": "webhook_endpoints_retrieve_public_key",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpointPublicKey"
								},
								"example": {
									"algorithm": "ed25519",
									"endpoint_id": "we_5Hl3MnO0qR5sT7uW9xY1zA",
									"livemode": true,
									"object": "webhook_endpoint_public_key",
									"previous_expires_at": null,
									"previous_public_key": null,
									"previous_public_key_pem": null,
									"public_key": "whpk_7GfYlAqTA3D8UzyF8UoSc4n3+HcTsNFWO4gUnF2xOd0=",
									"public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA7GfYlAqTA3D8UzyF8UoSc4n3+HcTsNFWO4gUnF2xOd0=\n-----END PUBLIC KEY-----\n",
									"signature_version": "v1a"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve a webhook endpoint's public key",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:read"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpointPublicKey = await mv.webhookEndpoints.retrievePublicKey(\"we_7Hk2Lm9Qp\");\nconsole.log(webhookEndpointPublicKey);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint_public_key = client.webhook_endpoints.retrieve_public_key(\"we_7Hk2Lm9Qp\")\nprint(webhook_endpoint_public_key)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp/public_key \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		},
		"/webhook_endpoints/{id}/replay": {
			"post": {
				"description": "Queues a new delivery to this endpoint for every stored event since `since` that it subscribes to (optionally only `types`, or only the events whose deliveries to it never succeeded). At most 10 000 events; narrow the window otherwise. Events keep their ids, so receivers can deduplicate.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_replay) with a test-mode key.",
				"operationId": "webhook_endpoints_replay",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointReplayParamsInput"
							},
							"example": {
								"only_failed": true,
								"since": "2026-11-03T00:00:00Z"
							}
						}
					},
					"required": true
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookReplay"
								},
								"example": {
									"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"events_queued": 12,
									"object": "webhook_replay",
									"only_failed": true,
									"since": "2026-11-03T00:00:00.000Z",
									"types": [
										"*"
									],
									"until": "2026-11-04T00:00:00.000Z"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Replay events to an endpoint",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookReplay = await mv.webhookEndpoints.replay(\"we_7Hk2Lm9Qp\", {\n\tonly_failed: true,\n\tsince: \"2026-11-03T00:00:00Z\",\n});\nconsole.log(webhookReplay);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_replay = client.webhook_endpoints.replay(\"we_7Hk2Lm9Qp\", {\n    \"only_failed\": True,\n    \"since\": \"2026-11-03T00:00:00Z\",\n})\nprint(webhook_replay)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp/replay \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"only_failed\": true,\n  \"since\": \"2026-11-03T00:00:00Z\"\n}'\n"
					}
				]
			}
		},
		"/webhook_endpoints/{id}/rotate_secret": {
			"post": {
				"description": "Creates a new signing secret and returns it (this once). The previous secret keeps signing alongside it for `expire_previous_in_hours` (default 24), so `webhook-signature` carries both signatures until your receivers switch. An `ed25519` endpoint gets a new key pair instead: the response carries the new `public_key` and the previous one (no secret). `signing` switches the scheme with the same overlap.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_rotate_secret) with a test-mode key.",
				"operationId": "webhook_endpoints_rotate_secret",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointRotateSecretParamsInput"
							},
							"example": {
								"expire_previous_in_hours": 24
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpoint"
								},
								"example": {
									"api_version": "2026-11-01",
									"campaign_id": null,
									"created": "2026-11-03T09:14:22.000Z",
									"description": "CRM sync",
									"disabled_at": null,
									"disabled_reason": null,
									"enabled_events": [
										"call.ended",
										"call.analyzed"
									],
									"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"legacy_headers": false,
									"livemode": true,
									"max_in_flight": 10,
									"metadata": {},
									"object": "webhook_endpoint",
									"previous_public_key": null,
									"previous_secret_expires_at": null,
									"public_key": null,
									"signing": "hmac",
									"status": "enabled",
									"updated": "2026-11-03T09:14:22.000Z",
									"url": "https://hooks.example.com/webhooks"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Rotate a webhook endpoint's secret",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpoint = await mv.webhookEndpoints.rotateSecret(\"we_7Hk2Lm9Qp\", {\n\texpire_previous_in_hours: 24,\n});\nconsole.log(webhookEndpoint);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint = client.webhook_endpoints.rotate_secret(\"we_7Hk2Lm9Qp\", {\n    \"expire_previous_in_hours\": 24,\n})\nprint(webhook_endpoint)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp/rotate_secret \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"expire_previous_in_hours\": 24\n}'\n"
					}
				]
			}
		},
		"/webhook_endpoints/{id}/test": {
			"post": {
				"description": "Sends one sample event of `type` to the endpoint now, signed like a real delivery, and reports how it answered. Samples are not stored and never retried.\n\n[Try it in the API playground](/api/playground/?op=webhook_endpoints_test) with a test-mode key.",
				"operationId": "webhook_endpoints_test",
				"parameters": [
					{
						"description": "A webhook endpoint ID (`we_…`).",
						"in": "path",
						"name": "id",
						"required": true,
						"schema": {
							"maxLength": 200,
							"pattern": "^we_[0-9A-Za-z]+$",
							"type": "string"
						}
					},
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					},
					{
						"$ref": "#/components/parameters/IdempotencyKey"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointTestParamsInput"
							},
							"example": {
								"type": "call.ended"
							}
						}
					},
					"required": false
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/WebhookEndpointTest"
								},
								"example": {
									"delivered": true,
									"duration_ms": 182,
									"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"error": null,
									"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
									"object": "webhook_endpoint_test",
									"response_excerpt": "ok",
									"response_status": 200,
									"type": "call.ended"
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"404": {
						"$ref": "#/components/responses/NotFound"
					},
					"409": {
						"$ref": "#/components/responses/Conflict"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Send a test event",
				"tags": [
					"Webhook endpoints"
				],
				"x-morevoice-scopes": [
					"webhooks:write"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst webhookEndpointTest = await mv.webhookEndpoints.test(\"we_7Hk2Lm9Qp\", {\n\ttype: \"call.ended\",\n});\nconsole.log(webhookEndpointTest);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\nwebhook_endpoint_test = client.webhook_endpoints.test(\"we_7Hk2Lm9Qp\", {\n    \"type\": \"call.ended\",\n})\nprint(webhook_endpoint_test)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl -X POST https://api.morevoice.ai/v1/webhook_endpoints/we_7Hk2Lm9Qp/test \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n  \"type\": \"call.ended\"\n}'\n"
					}
				]
			}
		},
		"/whoami": {
			"get": {
				"description": "Returns the organisation, key, mode, scopes and API version of the key that authenticated the request.\n\n[Try it in the API playground](/api/playground/?op=whoami_retrieve) with a test-mode key.",
				"operationId": "whoami_retrieve",
				"parameters": [
					{
						"$ref": "#/components/parameters/MoreVoiceVersion"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiKeyPrincipal"
								},
								"example": {
									"api_version": "2026-11-01",
									"key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
									"livemode": true,
									"object": "api_key_principal",
									"org_id": "org_7n42DGM5Tflk9n8mt7Fhc9",
									"scopes": [
										"calls:read",
										"calls:write"
									]
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"$ref": "#/components/responses/BadRequest"
					},
					"401": {
						"$ref": "#/components/responses/Unauthorized"
					},
					"403": {
						"$ref": "#/components/responses/Forbidden"
					},
					"429": {
						"$ref": "#/components/responses/TooManyRequests"
					},
					"500": {
						"$ref": "#/components/responses/InternalError"
					}
				},
				"security": [
					{
						"bearerAuth": []
					}
				],
				"summary": "Retrieve the caller",
				"tags": [
					"Authentication"
				],
				"x-codeSamples": [
					{
						"lang": "ts",
						"label": "TypeScript",
						"source": "import MoreVoice from \"@morevoice/sdk\";\n\nconst mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment\n\nconst apiKeyPrincipal = await mv.whoami.retrieve();\nconsole.log(apiKeyPrincipal);\n"
					},
					{
						"lang": "python",
						"label": "Python",
						"source": "from morevoice import MoreVoice\n\nclient = MoreVoice()  # MOREVOICE_API_KEY from the environment\n\napi_key_principal = client.whoami.retrieve()\nprint(api_key_principal)\n"
					},
					{
						"lang": "sh",
						"label": "cURL",
						"source": "curl https://api.morevoice.ai/v1/whoami \\\n  -H \"Authorization: Bearer $MOREVOICE_API_KEY\"\n"
					}
				]
			}
		}
	},
	"webhooks": {
		"agent.status_changed": {
			"post": {
				"description": "An agent's presence changed.",
				"operationId": "webhooks_agent_status_changed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AgentStatusChangedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"from": "+972501234567",
										"reason": "…",
										"to": "+972541234567",
										"user_id": "usr_gPjo9aWrMGKeV8EWtSg1Ja"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "agent.status_changed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "agent.status_changed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"agent.wrapup_completed": {
			"post": {
				"description": "An agent finished the wrap-up time after a call and is back to their chosen status.",
				"operationId": "webhooks_agent_wrapup_completed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AgentWrapupCompletedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"duration_ms": 93120,
										"to": "+972541234567",
										"user_id": "usr_gPjo9aWrMGKeV8EWtSg1Ja"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "agent.wrapup_completed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "agent.wrapup_completed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"billing.invoice_issued": {
			"post": {
				"description": "An invoice was issued.",
				"operationId": "webhooks_billing_invoice_issued",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BillingInvoiceIssuedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"currency": "ILS",
										"id": "inv_6KfeOIK302YzCE37UNXjo8",
										"number": "…",
										"total": 12.4
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "billing.invoice_issued"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "billing.invoice_issued",
				"tags": [
					"Webhooks"
				]
			}
		},
		"billing.payment_failed": {
			"post": {
				"description": "A payment failed. `failure_code` says why.",
				"operationId": "webhooks_billing_payment_failed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BillingPaymentFailedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"amount_minor": 1,
										"currency": "ILS",
										"failure_code": "…",
										"invoice_id": "inv_j2AyKrDgwC8dIkyWV1rv6z",
										"object": "payment",
										"provider": "…",
										"provider_ref": "…",
										"status": "succeeded"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "billing.payment_failed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "billing.payment_failed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"billing.payment_succeeded": {
			"post": {
				"description": "A payment succeeded.",
				"operationId": "webhooks_billing_payment_succeeded",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BillingPaymentSucceededEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"amount_minor": 1,
										"currency": "ILS",
										"failure_code": "…",
										"invoice_id": "inv_j2AyKrDgwC8dIkyWV1rv6z",
										"object": "payment",
										"provider": "…",
										"provider_ref": "…",
										"status": "succeeded"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "billing.payment_succeeded"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "billing.payment_succeeded",
				"tags": [
					"Webhooks"
				]
			}
		},
		"billing.plan_changed": {
			"post": {
				"description": "The org's plan changed.",
				"operationId": "webhooks_billing_plan_changed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BillingPlanChangedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"from": "+972501234567",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "billing.plan_changed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "billing.plan_changed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"billing.subscription_changed": {
			"post": {
				"description": "The org's subscription changed: plan, status (trial, active, past due, suspended, cancelled), quantities or term. A plan change also sends `billing.plan_changed`.",
				"operationId": "webhooks_billing_subscription_changed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BillingSubscriptionChangedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"change": "…",
										"effective_at": "2026-11-03T09:14:22Z",
										"from": "+972501234567",
										"plan_changed": true,
										"previous_status": "…",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "billing.subscription_changed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "billing.subscription_changed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.analyzed": {
			"post": {
				"description": "Post-call analysis is ready: summary, intent, outcome, disposition, action items and extracted variables. Always carries the call's `metadata` ({} when it had none).",
				"operationId": "webhooks_call_analyzed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallAnalyzedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"action_items": [],
										"disposition": null,
										"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"intent": "Order status",
										"metadata": {
											"crm_contact_id": "0031x00000AbCdE"
										},
										"object": "call",
										"outcome": "Informed",
										"summary": "The customer asked about order A-1042; it ships on Monday.",
										"variables": {
											"customer_name": "Dana"
										}
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.analyzed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.analyzed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.answered": {
			"post": {
				"description": "The call was answered. `answered_by` says human or machine when answering-machine detection ran.",
				"operationId": "webhooks_call_answered",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallAnsweredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.answered"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.answered",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.cost_finalized": {
			"post": {
				"description": "The call's price is final: `total` and a `breakdown` per usage kind (AI minutes, telephony, carrier minutes…) in minor units of `currency`, as your invoice will bill it.",
				"operationId": "webhooks_call_cost_finalized",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallCostFinalizedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"breakdown": {
											"ai_minute": 120,
											"pbx_minute": 9
										},
										"currency": "ILS",
										"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"object": "call",
										"quantities": {
											"ai_minute": 2,
											"pbx_minute": 2
										},
										"total": 129
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.cost_finalized"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.cost_finalized",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.created": {
			"post": {
				"description": "A call was created (dialled, or an inbound call was accepted) and has not started ringing yet.",
				"operationId": "webhooks_call_created",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallCreatedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.created"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.created",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.dtmf": {
			"post": {
				"description": "Live: the caller pressed a key. A key typed into a question (an account number, an ID) arrives masked as `*`. Opt-in: sent only to endpoints that name this type; `*` and `call.*` don't include it.",
				"operationId": "webhooks_call_dtmf",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallDtmfEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"digit": "…",
										"masked": true
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.dtmf"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.dtmf",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.ended": {
			"post": {
				"description": "The call ended. Carries `end_reason`, `duration_ms` and the AI marking (`ai_generated`, `ai_segments`).",
				"operationId": "webhooks_call_ended",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallEndedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.ended"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.ended",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.ringing": {
			"post": {
				"description": "The far end is ringing.",
				"operationId": "webhooks_call_ringing",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallRingingEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.ringing"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.ringing",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.routing_decided": {
			"post": {
				"description": "An inbound route with an assistant-request URL decided who answers: your server's answer (`source: assistant_request`), or the route's own target when the request failed, timed out or was invalid (`source: route`, with `reason`).",
				"operationId": "webhooks_call_routing_decided",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallRoutingDecidedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"latency_ms": 93120,
										"reason": "…",
										"route_id": "rte_871CI4jp9jg26zg1VtMFoh",
										"source": "assistant_request",
										"status": 1,
										"target": {
											"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
											"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
											"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
											"type": "assistant"
										}
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.routing_decided"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.routing_decided",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.started": {
			"post": {
				"description": "The call's media started: the AI or an agent is on the line.",
				"operationId": "webhooks_call_started",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallStartedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.started"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.started",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.tool_called": {
			"post": {
				"description": "Live: an assistant's tool call finished during a call (name, arguments, result or error). Opt-in: sent only to endpoints that name this type; `*` and `call.*` don't include it.",
				"operationId": "webhooks_call_tool_called",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallToolCalledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"arguments": null,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"error": "…",
										"name": "…",
										"result": null,
										"status": "done",
										"tool_call_id": "tc_UQRmdLaptZPgzVzG5pa87G"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.tool_called"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.tool_called",
				"tags": [
					"Webhooks"
				]
			}
		},
		"call.transferred": {
			"post": {
				"description": "The call was transferred to a queue, a number, a SIP URI or another assistant.",
				"operationId": "webhooks_call_transferred",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallTransferredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"ai_generated": true,
										"ai_segments": [
											{
												"end_ms": 93120,
												"source": "assistant",
												"start_ms": 93120
											}
										],
										"answered_at": "2026-11-03T09:14:22Z",
										"answered_by": "human",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"contact_id": "ctc_NKhjnYPvBUr2gmEgqwqw5N",
										"direction": "inbound",
										"duration_ms": 93120,
										"end_reason": "…",
										"ended_at": "2026-11-03T09:14:22Z",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"from": "+972501234567",
										"id": "call_IGuHGrBtu5JTm5igG2I8EG",
										"metadata": {},
										"object": "call",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"started_at": "2026-11-03T09:14:22Z",
										"status": "…",
										"to": "+972541234567",
										"transfer": {
											"destination": "…",
											"mode": "…",
											"warm": true
										}
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.transferred"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "call.transferred",
				"tags": [
					"Webhooks"
				]
			}
		},
		"callback.cancelled": {
			"post": {
				"description": "A callback was cancelled before it was returned.",
				"operationId": "webhooks_callback_cancelled",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallbackCancelledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"attempts": 3,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"completed_at": "2026-11-03T09:14:22Z",
										"context": {
											"web": {
												"language": "he",
												"page": "…"
											}
										},
										"created": "2026-11-03T09:14:22Z",
										"due_at": "2026-11-03T09:14:22Z",
										"id": "cb_rHpPbEFvGSP3CK9gAuNkH4",
										"last_result": "…",
										"max_attempts": 3,
										"merged_requests": 1,
										"metadata": {},
										"name": "…",
										"object": "callback",
										"origin_call_id": "call_S7vVVKaQp2VnhqHQtXzIwV",
										"phone": "+972501234567",
										"priority": 1,
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"reason": "…",
										"route": "…",
										"site_id": "…",
										"source": "…",
										"status": "…",
										"updated": "…",
										"window_end": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "callback.cancelled"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "callback.cancelled",
				"tags": [
					"Webhooks"
				]
			}
		},
		"callback.completed": {
			"post": {
				"description": "A callback was completed.",
				"operationId": "webhooks_callback_completed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallbackCompletedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": null,
										"assistant_id": null,
										"attempts": 1,
										"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"completed_at": "2026-11-03T10:02:10.000Z",
										"context": {
											"web": {
												"language": "he",
												"page": "https://example.com/pricing"
											}
										},
										"created": "2026-11-03T09:14:22.000Z",
										"due_at": "2026-11-03T10:00:00.000Z",
										"id": "cb_2dXk9QmZ4rT",
										"last_result": "answered",
										"max_attempts": 3,
										"merged_requests": 0,
										"metadata": {},
										"name": "Dana",
										"object": "callback",
										"origin_call_id": null,
										"outcome": "answered",
										"phone": "+972501234567",
										"priority": 5,
										"queue_id": "q_3hRf8Kd2Lm",
										"route": "agent_queue",
										"site_id": "main-site",
										"source": "web",
										"status": "completed",
										"updated": "2026-11-03T09:14:22.000Z",
										"window_end": null
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "callback.completed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "callback.completed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"callback.failed": {
			"post": {
				"description": "A callback could not be completed.",
				"operationId": "webhooks_callback_failed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallbackFailedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"assistant_id": "asst_yosOhvUkeWL0SUSxrLfMTg",
										"attempts": 3,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"completed_at": "2026-11-03T09:14:22Z",
										"context": {
											"web": {
												"language": "he",
												"page": "…"
											}
										},
										"created": "2026-11-03T09:14:22Z",
										"due_at": "2026-11-03T09:14:22Z",
										"id": "cb_rHpPbEFvGSP3CK9gAuNkH4",
										"last_result": "…",
										"max_attempts": 3,
										"merged_requests": 1,
										"metadata": {},
										"name": "…",
										"object": "callback",
										"origin_call_id": "call_S7vVVKaQp2VnhqHQtXzIwV",
										"phone": "+972501234567",
										"priority": 1,
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"reason": "…",
										"route": "…",
										"site_id": "…",
										"source": "…",
										"status": "…",
										"updated": "…",
										"window_end": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "callback.failed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "callback.failed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"callback.scheduled": {
			"post": {
				"description": "A callback request was created, or a new request for the same number was merged into an open one (`merged_requests` counts them).",
				"operationId": "webhooks_callback_scheduled",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CallbackScheduledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": null,
										"assistant_id": null,
										"attempts": 0,
										"call_id": null,
										"completed_at": null,
										"context": {
											"web": {
												"language": "he",
												"page": "https://example.com/pricing"
											}
										},
										"created": "2026-11-03T09:14:22.000Z",
										"due_at": "2026-11-03T10:00:00.000Z",
										"id": "cb_2dXk9QmZ4rT",
										"last_result": null,
										"max_attempts": 3,
										"merged_requests": 0,
										"metadata": {},
										"name": "Dana",
										"object": "callback",
										"origin_call_id": null,
										"phone": "+972501234567",
										"priority": 5,
										"queue_id": "q_3hRf8Kd2Lm",
										"route": "agent_queue",
										"site_id": "main-site",
										"source": "web",
										"status": "pending",
										"updated": "2026-11-03T09:14:22.000Z",
										"window_end": null
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "callback.scheduled"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "callback.scheduled",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.blocked": {
			"post": {
				"description": "A campaign cannot dial right now: outside its calling window, Shabbat or a holiday, or a compliance gate.",
				"operationId": "webhooks_campaign_blocked",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignBlockedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.blocked"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.blocked",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.cancelled": {
			"post": {
				"description": "A campaign was cancelled.",
				"operationId": "webhooks_campaign_cancelled",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignCancelledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.cancelled"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.cancelled",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.completed": {
			"post": {
				"description": "A campaign finished: every contact reached a final state.",
				"operationId": "webhooks_campaign_completed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignCompletedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.completed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.completed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.paused": {
			"post": {
				"description": "A campaign was paused.",
				"operationId": "webhooks_campaign_paused",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignPausedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.paused"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.paused",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.resumed": {
			"post": {
				"description": "A paused campaign resumed.",
				"operationId": "webhooks_campaign_resumed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignResumedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.resumed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.resumed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"campaign.started": {
			"post": {
				"description": "A campaign started dialling.",
				"operationId": "webhooks_campaign_started",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CampaignStartedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"counts": {},
										"detail": "…",
										"id": "cmp_ojFwMD7YNTROjaTP0i3ZFb",
										"name": "…",
										"next_open_at": "2026-11-03T09:14:22Z",
										"object": "campaign",
										"paused_by": "user",
										"purpose": "…",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "campaign.started"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "campaign.started",
				"tags": [
					"Webhooks"
				]
			}
		},
		"connection.status_changed": {
			"post": {
				"description": "A SIP connection's registration went up or down.",
				"operationId": "webhooks_connection_status_changed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ConnectionStatusChangedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"from": "+972501234567",
										"id": "conn_rtcFZ4v7Gg3mfomNppGQci",
										"reason": "…",
										"to": "+972541234567"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "connection.status_changed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "connection.status_changed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"consent.recorded": {
			"post": {
				"description": "Consent to be called was recorded or revoked for a phone number.",
				"operationId": "webhooks_consent_recorded",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ConsentRecordedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"granted_at": "2026-11-03T09:14:22Z",
										"phone": "+972501234567",
										"revoked": true,
										"revoked_at": "2026-11-03T09:14:22Z",
										"scope": "…",
										"source": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "consent.recorded"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "consent.recorded",
				"tags": [
					"Webhooks"
				]
			}
		},
		"contact.attempted": {
			"post": {
				"description": "A dial attempt to a campaign contact finished (the legacy `attempt.completed`).",
				"operationId": "webhooks_contact_attempted",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactAttemptedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"attempt_id": "att_050AH24sUbYsgHAO3TEz7Z",
										"attempt_number": 3,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"disposition": "…",
										"id": "ctc_VfrTSF1RqTDCiV0IctzRc7",
										"next_attempt_at": "2026-11-03T09:14:22Z",
										"object": "contact",
										"phone": "+972501234567",
										"result": "…",
										"source": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "contact.attempted"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "contact.attempted",
				"tags": [
					"Webhooks"
				]
			}
		},
		"contact.completed": {
			"post": {
				"description": "A campaign contact reached a final status.",
				"operationId": "webhooks_contact_completed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactCompletedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"attempt_id": "att_050AH24sUbYsgHAO3TEz7Z",
										"attempt_number": 3,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"disposition": "…",
										"id": "ctc_VfrTSF1RqTDCiV0IctzRc7",
										"next_attempt_at": "2026-11-03T09:14:22Z",
										"object": "contact",
										"phone": "+972501234567",
										"result": "…",
										"source": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "contact.completed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "contact.completed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"contact.opted_out": {
			"post": {
				"description": "A phone number was added to the do-not-call list (the legacy `dnc.added`).",
				"operationId": "webhooks_contact_opted_out",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ContactOptedOutEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"attempt_id": "att_050AH24sUbYsgHAO3TEz7Z",
										"attempt_number": 3,
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"campaign_id": "cmp_FUcgwuMRgvytMFC432pOdi",
										"disposition": "…",
										"id": "ctc_VfrTSF1RqTDCiV0IctzRc7",
										"next_attempt_at": "2026-11-03T09:14:22Z",
										"object": "contact",
										"phone": "+972501234567",
										"result": "…",
										"source": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "contact.opted_out"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "contact.opted_out",
				"tags": [
					"Webhooks"
				]
			}
		},
		"flow.node_failed": {
			"post": {
				"description": "A flow node failed during a call.",
				"operationId": "webhooks_flow_node_failed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowNodeFailedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"error": "…",
										"flow_id": "flow_tR9pvZPjzIEif0WVmzbQUt",
										"node_id": "…",
										"version": 3
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "flow.node_failed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "flow.node_failed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"flow.published": {
			"post": {
				"description": "A flow version was published.",
				"operationId": "webhooks_flow_published",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FlowPublishedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "flow_854eDujN03pw1poABybAoX",
										"object": "flow",
										"version": 3
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "flow.published"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "flow.published",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kb.document.failed": {
			"post": {
				"description": "A knowledge-base document could not be processed.",
				"operationId": "webhooks_kb_document_failed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KbDocumentFailedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"error": "…",
										"id": "kbd_qQ4tKnNMAYNvPJisUH2xpn"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kb.document.failed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kb.document.failed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kb.document.ready": {
			"post": {
				"description": "A knowledge-base document finished processing.",
				"operationId": "webhooks_kb_document_ready",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KbDocumentReadyEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"chunks": 3,
										"id": "kbd_qQ4tKnNMAYNvPJisUH2xpn"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kb.document.ready"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kb.document.ready",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kyc.approved": {
			"post": {
				"description": "Business verification was approved: outbound calling is open.",
				"operationId": "webhooks_kyc_approved",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KycApprovedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "kyc_UhYXwh1cUMNBIX6yxg4O2D",
										"note": "…",
										"object": "outbound_kyc",
										"previous_status": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kyc.approved"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kyc.approved",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kyc.info_requested": {
			"post": {
				"description": "The reviewer needs more information. `note` says what.",
				"operationId": "webhooks_kyc_info_requested",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KycInfoRequestedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "kyc_UhYXwh1cUMNBIX6yxg4O2D",
										"note": "…",
										"object": "outbound_kyc",
										"previous_status": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kyc.info_requested"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kyc.info_requested",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kyc.rejected": {
			"post": {
				"description": "Business verification was rejected. `note` says why.",
				"operationId": "webhooks_kyc_rejected",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KycRejectedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "kyc_UhYXwh1cUMNBIX6yxg4O2D",
										"note": "…",
										"object": "outbound_kyc",
										"previous_status": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kyc.rejected"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kyc.rejected",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kyc.submitted": {
			"post": {
				"description": "The organisation submitted its business verification (outbound KYC) for review.",
				"operationId": "webhooks_kyc_submitted",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KycSubmittedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "kyc_UhYXwh1cUMNBIX6yxg4O2D",
										"note": "…",
										"object": "outbound_kyc",
										"previous_status": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kyc.submitted"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kyc.submitted",
				"tags": [
					"Webhooks"
				]
			}
		},
		"kyc.suspended": {
			"post": {
				"description": "Outbound calling was suspended after a verification review.",
				"operationId": "webhooks_kyc_suspended",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/KycSuspendedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "kyc_UhYXwh1cUMNBIX6yxg4O2D",
										"note": "…",
										"object": "outbound_kyc",
										"previous_status": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "kyc.suspended"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "kyc.suspended",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.kyc_approved": {
			"post": {
				"description": "The regulator's documents (a regulatory bundle) for a country's numbers were approved.",
				"operationId": "webhooks_number_kyc_approved",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberKycApprovedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"country": "…",
										"id": "rb_w4CRVxKPUOBDlwIekbVXah",
										"number_type": "…",
										"object": "regulatory_bundle",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.kyc_approved"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.kyc_approved",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.kyc_expired": {
			"post": {
				"description": "A regulatory bundle expired and must be renewed.",
				"operationId": "webhooks_number_kyc_expired",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberKycExpiredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"country": "…",
										"id": "rb_w4CRVxKPUOBDlwIekbVXah",
										"number_type": "…",
										"object": "regulatory_bundle",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.kyc_expired"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.kyc_expired",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.kyc_rejected": {
			"post": {
				"description": "A regulatory bundle was rejected. `reason` says why.",
				"operationId": "webhooks_number_kyc_rejected",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberKycRejectedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"country": "…",
										"id": "rb_w4CRVxKPUOBDlwIekbVXah",
										"number_type": "…",
										"object": "regulatory_bundle",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.kyc_rejected"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.kyc_rejected",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.port_completed": {
			"post": {
				"description": "A number port finished.",
				"operationId": "webhooks_number_port_completed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberPortCompletedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"e164": "+972501234567",
										"id": "pn_M4UyqWfNvEtH41s0p5iGIn"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.port_completed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.port_completed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.port_foc_scheduled": {
			"post": {
				"description": "A number port got its firm order commitment: `foc_at` is when the numbers move.",
				"operationId": "webhooks_number_port_foc_scheduled",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberPortFocScheduledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"foc_at": "2026-11-03T09:14:22Z",
										"id": "port_uCPasdApNGuxHPK7fTxhg3",
										"numbers": [
											"…"
										],
										"object": "porting_order",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.port_foc_scheduled"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.port_foc_scheduled",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.port_rejected": {
			"post": {
				"description": "A number port was rejected by the losing carrier. `reason` says why.",
				"operationId": "webhooks_number_port_rejected",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberPortRejectedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"foc_at": "2026-11-03T09:14:22Z",
										"id": "port_uCPasdApNGuxHPK7fTxhg3",
										"numbers": [
											"…"
										],
										"object": "porting_order",
										"reason": "…",
										"status": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.port_rejected"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.port_rejected",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.provisioned": {
			"post": {
				"description": "A phone number was provisioned for the org.",
				"operationId": "webhooks_number_provisioned",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberProvisionedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"e164": "+972501234567",
										"id": "pn_M4UyqWfNvEtH41s0p5iGIn"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.provisioned"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.provisioned",
				"tags": [
					"Webhooks"
				]
			}
		},
		"number.released": {
			"post": {
				"description": "A phone number was released.",
				"operationId": "webhooks_number_released",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NumberReleasedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"e164": "+972501234567",
										"id": "pn_M4UyqWfNvEtH41s0p5iGIn"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "number.released"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "number.released",
				"tags": [
					"Webhooks"
				]
			}
		},
		"qa.overridden": {
			"post": {
				"description": "A supervisor overrode a QA score.",
				"operationId": "webhooks_qa_overridden",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QaOverriddenEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"by": "usr_37tDTqPnAGvk1ErfsSC7nk",
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"disposition": "…",
										"item_id": "…",
										"item_score": 87,
										"kind": "item",
										"passed": true,
										"previous_disposition": "…",
										"previous_item_score": 87,
										"reason": "…",
										"score": 87
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "qa.overridden"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "qa.overridden",
				"tags": [
					"Webhooks"
				]
			}
		},
		"qa.scored": {
			"post": {
				"description": "A call was scored against the QA scorecard (the legacy `call.analyzed` payload).",
				"operationId": "webhooks_qa_scored",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QaScoredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"compliance": null,
										"disposition": "…",
										"passed": true,
										"score": 87
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "qa.scored"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "qa.scored",
				"tags": [
					"Webhooks"
				]
			}
		},
		"queue.call_abandoned": {
			"post": {
				"description": "The caller hung up while waiting in a queue.",
				"operationId": "webhooks_queue_call_abandoned",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueCallAbandonedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"wait_ms": 93120
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "queue.call_abandoned"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "queue.call_abandoned",
				"tags": [
					"Webhooks"
				]
			}
		},
		"queue.call_answered": {
			"post": {
				"description": "An agent answered a queued call.",
				"operationId": "webhooks_queue_call_answered",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueCallAnsweredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"agent_id": "usr_yhfp6RLIuxEKA5Zn4hcCNX",
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"wait_ms": 93120
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "queue.call_answered"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "queue.call_answered",
				"tags": [
					"Webhooks"
				]
			}
		},
		"queue.call_entered": {
			"post": {
				"description": "A call entered a queue.",
				"operationId": "webhooks_queue_call_entered",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueCallEnteredEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"position": 3,
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "queue.call_entered"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "queue.call_entered",
				"tags": [
					"Webhooks"
				]
			}
		},
		"queue.overflowed": {
			"post": {
				"description": "A queued call overflowed to its overflow target.",
				"operationId": "webhooks_queue_overflowed",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/QueueOverflowedEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"queue_id": "q_FG2uL2gdWXNMUfXZyRFLfT",
										"target": "…",
										"wait_ms": 93120
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "queue.overflowed"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "queue.overflowed",
				"tags": [
					"Webhooks"
				]
			}
		},
		"recording.ready": {
			"post": {
				"description": "The call recording is stored (a recording is addressed through its call). `url` is a signed URL that expires at `url_expires_at`.",
				"operationId": "webhooks_recording_ready",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RecordingReadyEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"channels": 2,
										"duration_ms": 93120,
										"url": "https://example.com/hook",
										"url_expires_at": "2026-11-03T09:14:22Z"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "recording.ready"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "recording.ready",
				"tags": [
					"Webhooks"
				]
			}
		},
		"test": {
			"post": {
				"description": "A test event, sent on request to check an endpoint.",
				"operationId": "webhooks_test",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TestEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"message": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "test"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "test",
				"tags": [
					"Webhooks"
				]
			}
		},
		"transcript.final": {
			"post": {
				"description": "Live: a final transcript line of a call in progress (the caller's or the assistant's). Opt-in: sent only to endpoints that name this type; `*` and `transcript.*` don't include it.",
				"operationId": "webhooks_transcript_final",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TranscriptFinalEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"speaker": "customer",
										"text": "…",
										"utterance_id": "…"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "transcript.final"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "transcript.final",
				"tags": [
					"Webhooks"
				]
			}
		},
		"transcript.ready": {
			"post": {
				"description": "The call transcript is final (a transcript is addressed through its call).",
				"operationId": "webhooks_transcript_ready",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TranscriptReadyEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"call_id": "call_Oxtl48GXWtJCwMfHzxm0oL",
										"language": "he",
										"turns": 3
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "transcript.ready"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "transcript.ready",
				"tags": [
					"Webhooks"
				]
			}
		},
		"usage.threshold": {
			"post": {
				"description": "Usage crossed a configured share of a limit or of the credit balance.",
				"operationId": "webhooks_usage_threshold",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UsageThresholdEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"limit": 12.4,
										"metric": "…",
										"period": "…",
										"threshold_pct": 80,
										"used": 12.4
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "usage.threshold"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "usage.threshold",
				"tags": [
					"Webhooks"
				]
			}
		},
		"webhook_endpoint.disabled": {
			"post": {
				"description": "A webhook endpoint was disabled after failing for too long.",
				"operationId": "webhooks_webhook_endpoint_disabled",
				"parameters": [
					{
						"$ref": "#/components/parameters/WebhookId"
					},
					{
						"$ref": "#/components/parameters/WebhookTimestamp"
					},
					{
						"$ref": "#/components/parameters/WebhookSignature"
					}
				],
				"requestBody": {
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WebhookEndpointDisabledEvent"
							},
							"example": {
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.000Z",
								"data": {
									"object": {
										"id": "we_Fr16fYQoriAw3w17jl7hn3",
										"reason": "…",
										"url": "https://example.com/hook"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "webhook_endpoint.disabled"
							}
						}
					},
					"required": true
				},
				"responses": {
					"2XX": {
						"description": "Acknowledge the event with any 2xx status within 15 seconds. Anything else, or a timeout, is retried for up to 72 hours."
					}
				},
				"summary": "webhook_endpoint.disabled",
				"tags": [
					"Webhooks"
				]
			}
		}
	},
	"components": {
		"headers": {
			"RequestId": {
				"description": "The request's ID (`req_…`). Quote it when you contact support.",
				"schema": {
					"type": "string"
				}
			},
			"RetryAfter": {
				"description": "Seconds to wait before retrying.",
				"schema": {
					"minimum": 0,
					"type": "integer"
				}
			}
		},
		"parameters": {
			"IdempotencyKey": {
				"description": "A unique key (for example a UUID) that makes this request safe to retry: for 24 hours, a retry with the same key and parameters returns the first response instead of acting twice.",
				"example": "5f0c1e8a-7b2d-4c3e-9f1a-2b6d8e4c0a17",
				"in": "header",
				"name": "Idempotency-Key",
				"required": false,
				"schema": {
					"maxLength": 255,
					"minLength": 1,
					"type": "string"
				}
			},
			"MoreVoiceVersion": {
				"description": "The API version to use for this request. Defaults to the version the API key is pinned to.",
				"example": "2026-11-01",
				"in": "header",
				"name": "MoreVoice-Version",
				"required": false,
				"schema": {
					"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
					"type": "string"
				}
			},
			"WebhookId": {
				"description": "The event ID (`evt_…`); the same on every retry. Deduplicate on it.",
				"example": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
				"in": "header",
				"name": "webhook-id",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"WebhookSignature": {
				"description": "Space-separated `v1,<base64 HMAC-SHA256>` signatures of `<webhook-id>.<webhook-timestamp>.<body>` with the endpoint secret (two while a secret rotates).",
				"example": "v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=",
				"in": "header",
				"name": "webhook-signature",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"WebhookTimestamp": {
				"description": "Unix seconds of this delivery attempt. Reject deliveries more than 5 minutes old.",
				"example": "1762161262",
				"in": "header",
				"name": "webhook-timestamp",
				"required": true,
				"schema": {
					"type": "string"
				}
			}
		},
		"responses": {
			"BadRequest": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "parameter_missing",
								"doc_url": "https://docs.morevoice.ai/api/errors#parameter-missing",
								"message": "Missing required parameter: to.",
								"param": "to",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "invalid_request_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "The request is invalid: a parameter is missing, malformed or unknown, or the version header is unknown.",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"Conflict": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "idempotency_mismatch",
								"doc_url": "https://docs.morevoice.ai/api/errors#idempotency-mismatch",
								"message": "This Idempotency-Key was already used with different parameters.",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "idempotency_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "The request conflicts with the object's state, or the Idempotency-Key was reused with other parameters.",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"Forbidden": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "missing_scope",
								"doc_url": "https://docs.morevoice.ai/api/errors#missing-scope",
								"message": "This API key lacks the calls:write scope.",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "permission_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "The key may not do this (a missing scope, a plan limit, or a compliance block).",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"InternalError": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "internal_error",
								"doc_url": "https://docs.morevoice.ai/api/errors#internal-error",
								"message": "Something went wrong on MoreVoice's side.",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "api_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "Something went wrong on MoreVoice's side. Retry with the same Idempotency-Key.",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"NotFound": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "resource_missing",
								"doc_url": "https://docs.morevoice.ai/api/errors#resource-missing",
								"message": "No such object: 'call_4Gk2'.",
								"param": "id",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "not_found"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "No object with this ID exists in this organisation and mode.",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"TooManyRequests": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "rate_limited",
								"doc_url": "https://docs.morevoice.ai/api/errors#rate-limited",
								"message": "Too many requests. Retry after 1 second.",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "rate_limit_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "Too many requests, or no call capacity right now. Retry after the Retry-After delay.",
				"headers": {
					"Retry-After": {
						"$ref": "#/components/headers/RetryAfter"
					},
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			},
			"Unauthorized": {
				"content": {
					"application/json": {
						"example": {
							"error": {
								"code": "invalid_api_key",
								"doc_url": "https://docs.morevoice.ai/api/errors#invalid-api-key",
								"message": "Invalid API key.",
								"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"type": "authentication_error"
							}
						},
						"schema": {
							"$ref": "#/components/schemas/ErrorEnvelope"
						}
					}
				},
				"description": "No valid API key was sent.",
				"headers": {
					"X-Request-Id": {
						"$ref": "#/components/headers/RequestId"
					}
				}
			}
		},
		"schemas": {
			"AgentStatus": {
				"description": "A human agent's presence right now.",
				"examples": [
					{
						"call": {
							"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
							"direction": "inbound",
							"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
							"started": "2026-11-03T09:12:05.000Z"
						},
						"livemode": true,
						"object": "agent_status",
						"queue_ids": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"ringing": false,
						"since": "2026-11-03T09:12:05.000Z",
						"status": "busy",
						"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
						"wrap_up_until": null
					}
				],
				"properties": {
					"call": {
						"anyOf": [
							{
								"properties": {
									"call_id": {
										"description": "A call ID (prefix `call_`).",
										"examples": [
											"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"direction": {
										"enum": [
											"inbound",
											"outbound"
										],
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"description": "A queue ID (prefix `q_`).",
												"examples": [
													"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
												],
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started": {
										"description": "An ISO-8601 timestamp in UTC.",
										"examples": [
											"2026-11-03T09:14:22.000Z"
										],
										"format": "date-time",
										"type": "string"
									}
								},
								"required": [
									"call_id",
									"direction",
									"queue_id",
									"started"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The call the agent is on."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "agent_status",
						"type": "string"
					},
					"queue_ids": {
						"description": "Enabled queues the agent answers.",
						"items": {
							"description": "A queue ID (prefix `q_`).",
							"examples": [
								"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
							],
							"pattern": "^q_[0-9A-Za-z]+$",
							"type": "string"
						},
						"type": "array"
					},
					"ringing": {
						"description": "A queue call is ringing the agent right now.",
						"type": "boolean"
					},
					"since": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When the status began (null while offline)."
					},
					"status": {
						"description": "`available` and `away` are chosen by the agent; `busy` and `wrap_up` follow their calls; `offline`: not signed in.",
						"enum": [
							"available",
							"busy",
							"wrap_up",
							"away",
							"offline"
						],
						"type": "string"
					},
					"user_id": {
						"description": "A user ID (prefix `usr_`).",
						"examples": [
							"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^usr_[0-9A-Za-z]+$",
						"type": "string"
					},
					"wrap_up_until": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"object",
					"user_id",
					"livemode",
					"status",
					"since",
					"ringing",
					"call",
					"wrap_up_until",
					"queue_ids"
				],
				"type": "object"
			},
			"AgentStatusChangedEvent": {
				"description": "An agent's presence changed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "agent.status_changed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `agent.status_changed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"to": {
										"type": "string"
									},
									"user_id": {
										"minLength": 1,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "agent.status_changed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"AgentWrapupCompletedEvent": {
				"description": "An agent finished the wrap-up time after a call and is back to their chosen status.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "agent.wrapup_completed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `agent.wrapup_completed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"to": {
										"type": "string"
									},
									"user_id": {
										"minLength": 1,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "agent.wrapup_completed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ApiKeyPrincipal": {
				"description": "The caller of the request: which organisation, key, mode, scopes and API version.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
						"livemode": true,
						"object": "api_key_principal",
						"org_id": "org_7n42DGM5Tflk9n8mt7Fhc9",
						"scopes": [
							"calls:read",
							"calls:write"
						]
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version this request was answered in (MoreVoice-Version header, else the key's pinned version).",
						"type": "string"
					},
					"key_id": {
						"anyOf": [
							{
								"pattern": "^key_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The API key (`key_…`); null for OAuth app tokens."
					},
					"livemode": {
						"description": "false for test-mode keys (`mv_test_…`).",
						"type": "boolean"
					},
					"object": {
						"const": "api_key_principal",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the key belongs to (`org_…`).",
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"scopes": {
						"description": "The scopes granted to the key; [\"*\"] means every scope.",
						"items": {
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"org_id",
					"key_id",
					"livemode",
					"scopes",
					"api_version"
				],
				"type": "object"
			},
			"Assistant": {
				"description": "An AI voice assistant: what it says and knows, how it sounds and listens, and the tools it can use. Assistants are shared by live and test mode.",
				"examples": [
					{
						"advanced": {
							"expression_tags": [
								"breath",
								"laugh"
							],
							"idle": {
								"max_messages": 3,
								"messages": [
									"את/ה עדיין איתי?"
								],
								"timeout_seconds": 7.5
							},
							"intelligent_turn_taking": false,
							"latency": {
								"acknowledgement_after_ms": 700,
								"acknowledgement_phrases": [
									"אממ…"
								],
								"acknowledgements": true,
								"early_start": true,
								"early_start_ms": 300,
								"first_chunk_max_words": 25
							},
							"llm_routing": {
								"complex_model": null,
								"mode": "off",
								"simple_model": "gpt-4.1-mini",
								"sticky_turns": 3
							},
							"max_endpoint_delay_ms": 1000,
							"silence_timeout_seconds": 30,
							"start_speaking_plan": {
								"on_no_punctuation_seconds": 1.5,
								"on_number_seconds": 0.5,
								"on_punctuation_seconds": 0.1,
								"smart_endpointing": "off",
								"wait_seconds": 0.4
							},
							"stop_speaking_plan": {
								"backoff_seconds": 1,
								"interruption_confirm_ms": 900,
								"num_words": 0,
								"voice_seconds": 0.2
							}
						},
						"answering_machine_detection": {
							"max_decision_ms": 3500,
							"message": "",
							"mode": "off"
						},
						"artifacts": {
							"logging": true,
							"recording": true,
							"summary": true,
							"transcript": true
						},
						"created": "2026-11-03T09:14:22.000Z",
						"end_call_message": "תודה ששוחחת איתי, יום נעים!",
						"end_call_phrases": [
							"להתראות"
						],
						"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
						"first_message_mode": "assistant_speaks_first",
						"flow_id": null,
						"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"language": "he",
						"livemode": true,
						"llm": {
							"max_output_tokens": 400,
							"model": "gpt-4.1",
							"provider": "openai",
							"temperature": 1
						},
						"max_duration_seconds": 600,
						"metadata": {
							"crm_id": "0031x00000AbCdE"
						},
						"name": "Clinic receptionist",
						"object": "assistant",
						"public": false,
						"system_prompt": "You book, move and cancel appointments. Keep answers short.",
						"tools": {
							"add_participant": null,
							"custom": [
								{
									"contract": "legacy",
									"description": "Find free appointment slots for a doctor and date",
									"enabled": true,
									"header_names": [
										"Authorization"
									],
									"mock_response": "{\"ok\": true}",
									"name": "find_slots",
									"parameters": {
										"properties": {
											"date": {
												"type": "string"
											},
											"doctor": {
												"type": "string"
											}
										},
										"required": [
											"date"
										],
										"type": "object"
									},
									"request_start_message": "רגע, אני בודקת",
									"timeout_seconds": 15,
									"type": "webhook",
									"url": "https://crm.example.com/voice/tools"
								}
							],
							"end_call": true,
							"get_current_time": false,
							"transfer_call": {
								"destination": "queue:reception"
							},
							"web_search": false
						},
						"transcriber": {
							"context": "",
							"language_hints": [
								"he",
								"en"
							],
							"model": "stt-rt-v5",
							"provider": "soniox",
							"strict_language_hints": false,
							"terms": [
								"השרון"
							]
						},
						"updated": "2026-11-03T09:14:22.000Z",
						"voice": {
							"expressions": true,
							"model": "gemini-3.8-flash-tts",
							"provider": "gemini",
							"style": "warm",
							"style_mode": "dynamic",
							"tier": "auto",
							"voice_id": "Kore"
						}
					}
				],
				"properties": {
					"advanced": {
						"$ref": "#/components/schemas/AssistantAdvanced"
					},
					"answering_machine_detection": {
						"$ref": "#/components/schemas/AssistantAnsweringMachineDetection"
					},
					"artifacts": {
						"$ref": "#/components/schemas/AssistantArtifacts"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"end_call_message": {
						"description": "Said before the assistant ends the call.",
						"type": "string"
					},
					"end_call_phrases": {
						"description": "Phrases that end the call when the assistant says them.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"first_message": {
						"description": "What the assistant says first.",
						"type": "string"
					},
					"first_message_mode": {
						"description": "Whether the assistant speaks first (`first_message`), waits for the caller, or generates its opening.",
						"enum": [
							"assistant_speaks_first",
							"assistant_waits_for_user",
							"assistant_generates_first_message"
						],
						"type": "string"
					},
					"flow_id": {
						"anyOf": [
							{
								"description": "The voice flow that drives the call, or null (the system prompt does).",
								"examples": [
									"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^flow_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"id": {
						"description": "The assistant's ID.",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"language": {
						"description": "The call language (BCP-47, e.g. `he`, `en`).",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"llm": {
						"$ref": "#/components/schemas/AssistantLlm"
					},
					"max_duration_seconds": {
						"description": "Calls end after this long.",
						"type": "number"
					},
					"metadata": {
						"$ref": "#/components/schemas/Metadata"
					},
					"name": {
						"description": "The assistant's name (yours; callers never hear it).",
						"type": "string"
					},
					"object": {
						"const": "assistant",
						"type": "string"
					},
					"public": {
						"description": "Publishable keys (the browser widget) may start web calls to this assistant.",
						"type": "boolean"
					},
					"system_prompt": {
						"description": "The instructions the model follows.",
						"type": "string"
					},
					"tools": {
						"$ref": "#/components/schemas/AssistantTools"
					},
					"transcriber": {
						"$ref": "#/components/schemas/AssistantTranscriber"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"voice": {
						"$ref": "#/components/schemas/AssistantVoice"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"language",
					"system_prompt",
					"first_message",
					"first_message_mode",
					"voice",
					"transcriber",
					"llm",
					"tools",
					"flow_id",
					"end_call_message",
					"end_call_phrases",
					"max_duration_seconds",
					"answering_machine_detection",
					"artifacts",
					"public",
					"metadata",
					"advanced",
					"created",
					"updated"
				],
				"type": "object"
			},
			"AssistantAdvanced": {
				"description": "Pipeline tuning. The defaults suit most assistants.",
				"properties": {
					"expression_tags": {
						"description": "The vocal events the model may use when `voice.expressions` is on.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"idle": {
						"properties": {
							"max_messages": {
								"description": "How many idle messages before giving up.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"messages": {
								"description": "Said in turn when the caller is silent.",
								"items": {
									"type": "string"
								},
								"type": "array"
							},
							"timeout_seconds": {
								"description": "Silence before an idle message.",
								"type": "number"
							}
						},
						"required": [
							"messages",
							"max_messages",
							"timeout_seconds"
						],
						"type": "object"
					},
					"intelligent_turn_taking": {
						"description": "Semantic end-of-turn detection instead of fixed silence delays.",
						"type": "boolean"
					},
					"latency": {
						"properties": {
							"acknowledgement_after_ms": {
								"description": "Delay before a filler.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"acknowledgement_phrases": {
								"description": "The fillers.",
								"items": {
									"type": "string"
								},
								"type": "array"
							},
							"acknowledgements": {
								"description": "Play a short filler if the answer is not audible yet.",
								"type": "boolean"
							},
							"early_start": {
								"description": "Start preparing the answer during the caller's pause.",
								"type": "boolean"
							},
							"early_start_ms": {
								"description": "Pause after which the early answer starts.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"first_chunk_max_words": {
								"description": "The longest first spoken chunk without punctuation.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"acknowledgements",
							"acknowledgement_phrases",
							"acknowledgement_after_ms",
							"early_start",
							"early_start_ms",
							"first_chunk_max_words"
						],
						"type": "object"
					},
					"llm_routing": {
						"properties": {
							"complex_model": {
								"description": "The model for everything else (null: `llm.model`).",
								"type": [
									"string",
									"null"
								]
							},
							"mode": {
								"description": "`auto`: simple turns go to `simple_model`.",
								"enum": [
									"off",
									"auto"
								],
								"type": "string"
							},
							"simple_model": {
								"description": "The model for simple turns.",
								"type": "string"
							},
							"sticky_turns": {
								"description": "Turns that stay on the complex model after an escalation.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"mode",
							"simple_model",
							"complex_model",
							"sticky_turns"
						],
						"type": "object"
					},
					"max_endpoint_delay_ms": {
						"description": "With intelligent turn taking: the longest wait after speech before the turn ends.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"silence_timeout_seconds": {
						"description": "End the call after this much silence.",
						"type": "number"
					},
					"start_speaking_plan": {
						"properties": {
							"on_no_punctuation_seconds": {
								"description": "Wait after a transcript without final punctuation.",
								"type": "number"
							},
							"on_number_seconds": {
								"description": "Wait after a transcript that ends with a number (the caller may be dictating).",
								"type": "number"
							},
							"on_punctuation_seconds": {
								"description": "Wait after a transcript that ends with punctuation.",
								"type": "number"
							},
							"smart_endpointing": {
								"description": "Model-based end-of-turn detection.",
								"enum": [
									"off",
									"livekit"
								],
								"type": "string"
							},
							"wait_seconds": {
								"description": "Silence after the caller stops before the assistant answers.",
								"type": "number"
							}
						},
						"required": [
							"wait_seconds",
							"smart_endpointing",
							"on_punctuation_seconds",
							"on_no_punctuation_seconds",
							"on_number_seconds"
						],
						"type": "object"
					},
					"stop_speaking_plan": {
						"properties": {
							"backoff_seconds": {
								"description": "Pause before the assistant speaks again after an interruption.",
								"type": "number"
							},
							"interruption_confirm_ms": {
								"description": "With `num_words: 0`: how long to wait for a real word before resuming.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"num_words": {
								"description": "Words the caller must say to interrupt the assistant (0: voice alone).",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"voice_seconds": {
								"description": "Seconds of caller voice that count as an interruption.",
								"type": "number"
							}
						},
						"required": [
							"num_words",
							"voice_seconds",
							"backoff_seconds",
							"interruption_confirm_ms"
						],
						"type": "object"
					}
				},
				"required": [
					"start_speaking_plan",
					"stop_speaking_plan",
					"intelligent_turn_taking",
					"max_endpoint_delay_ms",
					"silence_timeout_seconds",
					"idle",
					"latency",
					"expression_tags",
					"llm_routing"
				],
				"type": "object"
			},
			"AssistantAnsweringMachineDetection": {
				"description": "Answering-machine detection on outbound calls.",
				"properties": {
					"max_decision_ms": {
						"description": "The longest the verdict may take after answer; unsure counts as a person.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"message": {
						"description": "The message left with `leave_message`.",
						"type": "string"
					},
					"mode": {
						"description": "On outbound calls: `off`, `hang_up` on a machine, or `leave_message` after the beep.",
						"enum": [
							"off",
							"hang_up",
							"leave_message"
						],
						"type": "string"
					}
				},
				"required": [
					"mode",
					"message",
					"max_decision_ms"
				],
				"type": "object"
			},
			"AssistantArtifacts": {
				"description": "What is kept after a call.",
				"properties": {
					"logging": {
						"description": "Keep the call's event log.",
						"type": "boolean"
					},
					"recording": {
						"description": "Record the call.",
						"type": "boolean"
					},
					"summary": {
						"description": "Write an AI summary (intent, outcome, action items) when the call ends.",
						"type": "boolean"
					},
					"transcript": {
						"description": "Keep the transcript.",
						"type": "boolean"
					}
				},
				"required": [
					"recording",
					"transcript",
					"summary",
					"logging"
				],
				"type": "object"
			},
			"AssistantCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new assistant. Only `name` is required; the rest takes the defaults (`GET /v1/assistants/{id}` shows them all). `metadata` entries with an empty string are dropped.",
				"examples": [
					{
						"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
						"language": "he",
						"metadata": {
							"crm_id": "0031x00000AbCdE"
						},
						"name": "Clinic receptionist",
						"system_prompt": "You book, move and cancel appointments. Keep answers short.",
						"tools": {
							"custom": [
								{
									"description": "Find free appointment slots for a doctor and date",
									"headers": {
										"Authorization": "Bearer crm-secret"
									},
									"name": "find_slots",
									"parameters": {
										"properties": {
											"date": {
												"type": "string"
											},
											"doctor": {
												"type": "string"
											}
										},
										"required": [
											"date"
										],
										"type": "object"
									},
									"url": "https://crm.example.com/voice/tools"
								}
							],
							"end_call": true,
							"transfer_call": {
								"destination": "queue:reception"
							}
						},
						"voice": {
							"provider": "gemini",
							"style": "warm",
							"voice_id": "Kore"
						}
					}
				],
				"properties": {
					"advanced": {
						"additionalProperties": false,
						"properties": {
							"expression_tags": {
								"description": "The vocal events the model may use.",
								"items": {
									"maxLength": 50,
									"type": "string"
								},
								"maxItems": 50,
								"type": "array"
							},
							"idle": {
								"additionalProperties": false,
								"properties": {
									"max_messages": {
										"description": "1–10.",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"messages": {
										"description": "Said in turn when the caller is silent.",
										"items": {
											"maxLength": 500,
											"type": "string"
										},
										"maxItems": 20,
										"type": "array"
									},
									"timeout_seconds": {
										"description": "1–60.",
										"maximum": 60,
										"minimum": 1,
										"type": "number"
									}
								},
								"type": "object"
							},
							"intelligent_turn_taking": {
								"type": "boolean"
							},
							"latency": {
								"additionalProperties": false,
								"properties": {
									"acknowledgement_after_ms": {
										"description": "0–3000.",
										"maximum": 3000,
										"minimum": 0,
										"type": "integer"
									},
									"acknowledgement_phrases": {
										"description": "The fillers.",
										"items": {
											"maxLength": 100,
											"type": "string"
										},
										"maxItems": 20,
										"type": "array"
									},
									"acknowledgements": {
										"type": "boolean"
									},
									"early_start": {
										"type": "boolean"
									},
									"early_start_ms": {
										"description": "100–1500.",
										"maximum": 1500,
										"minimum": 100,
										"type": "integer"
									},
									"first_chunk_max_words": {
										"description": "8–60.",
										"maximum": 60,
										"minimum": 8,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"llm_routing": {
								"additionalProperties": false,
								"properties": {
									"complex_model": {
										"anyOf": [
											{
												"maxLength": 100,
												"minLength": 1,
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"mode": {
										"enum": [
											"off",
											"auto"
										],
										"type": "string"
									},
									"simple_model": {
										"maxLength": 100,
										"minLength": 1,
										"type": "string"
									},
									"sticky_turns": {
										"description": "0–20.",
										"maximum": 20,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"max_endpoint_delay_ms": {
								"description": "500–3000.",
								"maximum": 3000,
								"minimum": 500,
								"type": "integer"
							},
							"silence_timeout_seconds": {
								"description": "5–3600.",
								"maximum": 3600,
								"minimum": 5,
								"type": "number"
							},
							"start_speaking_plan": {
								"additionalProperties": false,
								"properties": {
									"on_no_punctuation_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"on_number_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"on_punctuation_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"smart_endpointing": {
										"enum": [
											"off",
											"livekit"
										],
										"type": "string"
									},
									"wait_seconds": {
										"description": "0–5.",
										"maximum": 5,
										"minimum": 0,
										"type": "number"
									}
								},
								"type": "object"
							},
							"stop_speaking_plan": {
								"additionalProperties": false,
								"properties": {
									"backoff_seconds": {
										"description": "0–10.",
										"maximum": 10,
										"minimum": 0,
										"type": "number"
									},
									"interruption_confirm_ms": {
										"description": "0–3000.",
										"maximum": 3000,
										"minimum": 0,
										"type": "integer"
									},
									"num_words": {
										"description": "0–10.",
										"maximum": 10,
										"minimum": 0,
										"type": "integer"
									},
									"voice_seconds": {
										"description": "0–0.5.",
										"maximum": 0.5,
										"minimum": 0,
										"type": "number"
									}
								},
								"type": "object"
							}
						},
						"type": "object"
					},
					"answering_machine_detection": {
						"additionalProperties": false,
						"properties": {
							"max_decision_ms": {
								"description": "1500–8000.",
								"maximum": 8000,
								"minimum": 1500,
								"type": "integer"
							},
							"message": {
								"description": "The message left with `leave_message`.",
								"maxLength": 2000,
								"type": "string"
							},
							"mode": {
								"enum": [
									"off",
									"hang_up",
									"leave_message"
								],
								"type": "string"
							}
						},
						"type": "object"
					},
					"artifacts": {
						"additionalProperties": false,
						"properties": {
							"logging": {
								"type": "boolean"
							},
							"recording": {
								"type": "boolean"
							},
							"summary": {
								"type": "boolean"
							},
							"transcript": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"end_call_message": {
						"description": "Said before the assistant ends the call.",
						"maxLength": 2000,
						"type": "string"
					},
					"end_call_phrases": {
						"description": "Phrases that end the call.",
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"first_message": {
						"description": "What the assistant says first.",
						"maxLength": 2000,
						"type": "string"
					},
					"first_message_mode": {
						"enum": [
							"assistant_speaks_first",
							"assistant_waits_for_user",
							"assistant_generates_first_message"
						],
						"type": "string"
					},
					"flow_id": {
						"anyOf": [
							{
								"description": "A published voice flow (`flow_…`) to drive the call; null removes it.",
								"maxLength": 200,
								"pattern": "^flow_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"language": {
						"description": "The call language.",
						"pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$",
						"type": "string"
					},
					"llm": {
						"additionalProperties": false,
						"properties": {
							"max_output_tokens": {
								"description": "16–8192.",
								"maximum": 8192,
								"minimum": 16,
								"type": "integer"
							},
							"model": {
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"enum": [
									"openai"
								],
								"type": "string"
							},
							"temperature": {
								"description": "0–2.",
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"max_duration_seconds": {
						"description": "10–43200 (12 hours).",
						"maximum": 43200,
						"minimum": 10,
						"type": "number"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput"
					},
					"name": {
						"description": "The assistant's name (yours; callers never hear it).",
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"public": {
						"description": "Allow publishable keys (the browser widget) to call this assistant. Default false.",
						"type": "boolean"
					},
					"system_prompt": {
						"description": "The instructions the model follows.",
						"maxLength": 100000,
						"type": "string"
					},
					"tools": {
						"additionalProperties": false,
						"description": "Fields you leave out are kept.",
						"properties": {
							"add_participant": {
								"anyOf": [
									{
										"additionalProperties": false,
										"properties": {
											"allow": {
												"enum": [
													"any",
													"il_mobile",
													"list"
												],
												"type": "string"
											},
											"numbers": {
												"description": "The numbers allowed with `allow: list`.",
												"items": {
													"maxLength": 32,
													"type": "string"
												},
												"maxItems": 100,
												"type": "array"
											}
										},
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "null turns adding participants off."
							},
							"custom": {
								"description": "Replaces the whole list. A tool sent without `headers` keeps the stored headers of the tool with the same name.",
								"items": {
									"$ref": "#/components/schemas/CustomToolParamsInput"
								},
								"maxItems": 50,
								"type": "array"
							},
							"end_call": {
								"type": "boolean"
							},
							"get_current_time": {
								"type": "boolean"
							},
							"transfer_call": {
								"anyOf": [
									{
										"additionalProperties": false,
										"properties": {
											"destination": {
												"description": "`queue:<queue id or name>`, a phone number, or a `sip:` URI.",
												"maxLength": 300,
												"minLength": 1,
												"type": "string"
											}
										},
										"required": [
											"destination"
										],
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "null turns transfers off."
							},
							"web_search": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"transcriber": {
						"additionalProperties": false,
						"properties": {
							"context": {
								"description": "Free text that helps recognition.",
								"maxLength": 10000,
								"type": "string"
							},
							"language_hints": {
								"description": "Languages to expect (ISO 639-1).",
								"items": {
									"maxLength": 16,
									"type": "string"
								},
								"maxItems": 10,
								"type": "array"
							},
							"model": {
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"enum": [
									"soniox"
								],
								"type": "string"
							},
							"strict_language_hints": {
								"type": "boolean"
							},
							"terms": {
								"description": "Words and names to recognise better.",
								"items": {
									"maxLength": 200,
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							}
						},
						"type": "object"
					},
					"voice": {
						"additionalProperties": false,
						"properties": {
							"expressions": {
								"type": "boolean"
							},
							"model": {
								"description": "The TTS model.",
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"description": "The text-to-speech provider.",
								"enum": [
									"gemini"
								],
								"type": "string"
							},
							"style": {
								"description": "Delivery direction.",
								"maxLength": 1000,
								"type": "string"
							},
							"style_mode": {
								"enum": [
									"dynamic",
									"fixed"
								],
								"type": "string"
							},
							"tier": {
								"enum": [
									"auto",
									"premium",
									"lite"
								],
								"type": "string"
							},
							"voice_id": {
								"description": "A voice from `GET /v1/voices`.",
								"maxLength": 200,
								"minLength": 1,
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"AssistantList": {
				"description": "A page of assistants, newest first.",
				"examples": [
					{
						"data": [
							{
								"advanced": {
									"expression_tags": [
										"breath",
										"laugh"
									],
									"idle": {
										"max_messages": 3,
										"messages": [
											"את/ה עדיין איתי?"
										],
										"timeout_seconds": 7.5
									},
									"intelligent_turn_taking": false,
									"latency": {
										"acknowledgement_after_ms": 700,
										"acknowledgement_phrases": [
											"אממ…"
										],
										"acknowledgements": true,
										"early_start": true,
										"early_start_ms": 300,
										"first_chunk_max_words": 25
									},
									"llm_routing": {
										"complex_model": null,
										"mode": "off",
										"simple_model": "gpt-4.1-mini",
										"sticky_turns": 3
									},
									"max_endpoint_delay_ms": 1000,
									"silence_timeout_seconds": 30,
									"start_speaking_plan": {
										"on_no_punctuation_seconds": 1.5,
										"on_number_seconds": 0.5,
										"on_punctuation_seconds": 0.1,
										"smart_endpointing": "off",
										"wait_seconds": 0.4
									},
									"stop_speaking_plan": {
										"backoff_seconds": 1,
										"interruption_confirm_ms": 900,
										"num_words": 0,
										"voice_seconds": 0.2
									}
								},
								"answering_machine_detection": {
									"max_decision_ms": 3500,
									"message": "",
									"mode": "off"
								},
								"artifacts": {
									"logging": true,
									"recording": true,
									"summary": true,
									"transcript": true
								},
								"created": "2026-11-03T09:14:22.000Z",
								"end_call_message": "תודה ששוחחת איתי, יום נעים!",
								"end_call_phrases": [
									"להתראות"
								],
								"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
								"first_message_mode": "assistant_speaks_first",
								"flow_id": null,
								"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"language": "he",
								"livemode": true,
								"llm": {
									"max_output_tokens": 400,
									"model": "gpt-4.1",
									"provider": "openai",
									"temperature": 1
								},
								"max_duration_seconds": 600,
								"metadata": {
									"crm_id": "0031x00000AbCdE"
								},
								"name": "Clinic receptionist",
								"object": "assistant",
								"public": false,
								"system_prompt": "You book, move and cancel appointments. Keep answers short.",
								"tools": {
									"add_participant": null,
									"custom": [
										{
											"contract": "legacy",
											"description": "Find free appointment slots for a doctor and date",
											"enabled": true,
											"header_names": [
												"Authorization"
											],
											"mock_response": "{\"ok\": true}",
											"name": "find_slots",
											"parameters": {
												"properties": {
													"date": {
														"type": "string"
													},
													"doctor": {
														"type": "string"
													}
												},
												"required": [
													"date"
												],
												"type": "object"
											},
											"request_start_message": "רגע, אני בודקת",
											"timeout_seconds": 15,
											"type": "webhook",
											"url": "https://crm.example.com/voice/tools"
										}
									],
									"end_call": true,
									"get_current_time": false,
									"transfer_call": {
										"destination": "queue:reception"
									},
									"web_search": false
								},
								"transcriber": {
									"context": "",
									"language_hints": [
										"he",
										"en"
									],
									"model": "stt-rt-v5",
									"provider": "soniox",
									"strict_language_hints": false,
									"terms": [
										"השרון"
									]
								},
								"updated": "2026-11-03T09:14:22.000Z",
								"voice": {
									"expressions": true,
									"model": "gemini-3.8-flash-tts",
									"provider": "gemini",
									"style": "warm",
									"style_mode": "dynamic",
									"tier": "auto",
									"voice_id": "Kore"
								}
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/assistants"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Assistant"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"AssistantLlm": {
				"description": "The language model behind the assistant.",
				"properties": {
					"max_output_tokens": {
						"description": "The longest reply, in tokens.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"model": {
						"description": "The model, e.g. `gpt-4.1`.",
						"type": "string"
					},
					"provider": {
						"description": "The language-model provider.",
						"enum": [
							"openai"
						],
						"type": "string"
					},
					"temperature": {
						"description": "Sampling temperature, 0–2.",
						"type": "number"
					}
				},
				"required": [
					"provider",
					"model",
					"temperature",
					"max_output_tokens"
				],
				"type": "object"
			},
			"AssistantTools": {
				"description": "The tools the assistant can use.",
				"properties": {
					"add_participant": {
						"anyOf": [
							{
								"properties": {
									"allow": {
										"description": "Who may be added: any number, Israeli mobiles only, or the `numbers` list.",
										"enum": [
											"any",
											"il_mobile",
											"list"
										],
										"type": "string"
									},
									"numbers": {
										"description": "The numbers allowed with `allow: list`.",
										"items": {
											"type": "string"
										},
										"type": "array"
									}
								},
								"required": [
									"allow",
									"numbers"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The assistant may add a person to the call (three-way), or null."
					},
					"custom": {
						"description": "Your own tools (webhooks).",
						"items": {
							"$ref": "#/components/schemas/CustomTool"
						},
						"type": "array"
					},
					"end_call": {
						"description": "The assistant may end the call (`end_call`).",
						"type": "boolean"
					},
					"get_current_time": {
						"description": "The assistant may look up the current date and time.",
						"type": "boolean"
					},
					"transfer_call": {
						"anyOf": [
							{
								"properties": {
									"destination": {
										"description": "`queue:<queue id or name>`, a phone number, or a `sip:` URI.",
										"type": "string"
									}
								},
								"required": [
									"destination"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "Transfers to a human, or null when the assistant cannot transfer."
					},
					"web_search": {
						"description": "The assistant may search the web.",
						"type": "boolean"
					}
				},
				"required": [
					"end_call",
					"get_current_time",
					"web_search",
					"transfer_call",
					"add_participant",
					"custom"
				],
				"type": "object"
			},
			"AssistantTranscriber": {
				"description": "How the assistant hears.",
				"properties": {
					"context": {
						"description": "Free text that helps recognition (the business, the topic).",
						"type": "string"
					},
					"language_hints": {
						"description": "Languages to expect (ISO 639-1).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"model": {
						"description": "The STT model.",
						"type": "string"
					},
					"provider": {
						"description": "The speech-to-text provider.",
						"enum": [
							"soniox"
						],
						"type": "string"
					},
					"strict_language_hints": {
						"description": "Only transcribe the hinted languages.",
						"type": "boolean"
					},
					"terms": {
						"description": "Words and names to recognise better (products, people, places).",
						"items": {
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": [
					"provider",
					"model",
					"language_hints",
					"strict_language_hints",
					"terms",
					"context"
				],
				"type": "object"
			},
			"AssistantUpdateParamsInput": {
				"additionalProperties": false,
				"description": "Assistant fields to change. Nested objects merge with the stored values and arrays are replaced. `metadata` keys merge too; send a key with an empty string to remove it.",
				"examples": [
					{
						"advanced": {
							"stop_speaking_plan": {
								"num_words": 2
							}
						},
						"metadata": {
							"stage": "beta"
						},
						"voice": {
							"style": "calm and reassuring"
						}
					}
				],
				"properties": {
					"advanced": {
						"additionalProperties": false,
						"properties": {
							"expression_tags": {
								"description": "The vocal events the model may use.",
								"items": {
									"maxLength": 50,
									"type": "string"
								},
								"maxItems": 50,
								"type": "array"
							},
							"idle": {
								"additionalProperties": false,
								"properties": {
									"max_messages": {
										"description": "1–10.",
										"maximum": 10,
										"minimum": 1,
										"type": "integer"
									},
									"messages": {
										"description": "Said in turn when the caller is silent.",
										"items": {
											"maxLength": 500,
											"type": "string"
										},
										"maxItems": 20,
										"type": "array"
									},
									"timeout_seconds": {
										"description": "1–60.",
										"maximum": 60,
										"minimum": 1,
										"type": "number"
									}
								},
								"type": "object"
							},
							"intelligent_turn_taking": {
								"type": "boolean"
							},
							"latency": {
								"additionalProperties": false,
								"properties": {
									"acknowledgement_after_ms": {
										"description": "0–3000.",
										"maximum": 3000,
										"minimum": 0,
										"type": "integer"
									},
									"acknowledgement_phrases": {
										"description": "The fillers.",
										"items": {
											"maxLength": 100,
											"type": "string"
										},
										"maxItems": 20,
										"type": "array"
									},
									"acknowledgements": {
										"type": "boolean"
									},
									"early_start": {
										"type": "boolean"
									},
									"early_start_ms": {
										"description": "100–1500.",
										"maximum": 1500,
										"minimum": 100,
										"type": "integer"
									},
									"first_chunk_max_words": {
										"description": "8–60.",
										"maximum": 60,
										"minimum": 8,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"llm_routing": {
								"additionalProperties": false,
								"properties": {
									"complex_model": {
										"anyOf": [
											{
												"maxLength": 100,
												"minLength": 1,
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"mode": {
										"enum": [
											"off",
											"auto"
										],
										"type": "string"
									},
									"simple_model": {
										"maxLength": 100,
										"minLength": 1,
										"type": "string"
									},
									"sticky_turns": {
										"description": "0–20.",
										"maximum": 20,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"max_endpoint_delay_ms": {
								"description": "500–3000.",
								"maximum": 3000,
								"minimum": 500,
								"type": "integer"
							},
							"silence_timeout_seconds": {
								"description": "5–3600.",
								"maximum": 3600,
								"minimum": 5,
								"type": "number"
							},
							"start_speaking_plan": {
								"additionalProperties": false,
								"properties": {
									"on_no_punctuation_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"on_number_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"on_punctuation_seconds": {
										"description": "0–3.",
										"maximum": 3,
										"minimum": 0,
										"type": "number"
									},
									"smart_endpointing": {
										"enum": [
											"off",
											"livekit"
										],
										"type": "string"
									},
									"wait_seconds": {
										"description": "0–5.",
										"maximum": 5,
										"minimum": 0,
										"type": "number"
									}
								},
								"type": "object"
							},
							"stop_speaking_plan": {
								"additionalProperties": false,
								"properties": {
									"backoff_seconds": {
										"description": "0–10.",
										"maximum": 10,
										"minimum": 0,
										"type": "number"
									},
									"interruption_confirm_ms": {
										"description": "0–3000.",
										"maximum": 3000,
										"minimum": 0,
										"type": "integer"
									},
									"num_words": {
										"description": "0–10.",
										"maximum": 10,
										"minimum": 0,
										"type": "integer"
									},
									"voice_seconds": {
										"description": "0–0.5.",
										"maximum": 0.5,
										"minimum": 0,
										"type": "number"
									}
								},
								"type": "object"
							}
						},
						"type": "object"
					},
					"answering_machine_detection": {
						"additionalProperties": false,
						"properties": {
							"max_decision_ms": {
								"description": "1500–8000.",
								"maximum": 8000,
								"minimum": 1500,
								"type": "integer"
							},
							"message": {
								"description": "The message left with `leave_message`.",
								"maxLength": 2000,
								"type": "string"
							},
							"mode": {
								"enum": [
									"off",
									"hang_up",
									"leave_message"
								],
								"type": "string"
							}
						},
						"type": "object"
					},
					"artifacts": {
						"additionalProperties": false,
						"properties": {
							"logging": {
								"type": "boolean"
							},
							"recording": {
								"type": "boolean"
							},
							"summary": {
								"type": "boolean"
							},
							"transcript": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"end_call_message": {
						"description": "Said before the assistant ends the call.",
						"maxLength": 2000,
						"type": "string"
					},
					"end_call_phrases": {
						"description": "Phrases that end the call.",
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"first_message": {
						"description": "What the assistant says first.",
						"maxLength": 2000,
						"type": "string"
					},
					"first_message_mode": {
						"enum": [
							"assistant_speaks_first",
							"assistant_waits_for_user",
							"assistant_generates_first_message"
						],
						"type": "string"
					},
					"flow_id": {
						"anyOf": [
							{
								"description": "A published voice flow (`flow_…`) to drive the call; null removes it.",
								"maxLength": 200,
								"pattern": "^flow_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"language": {
						"description": "The call language.",
						"pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$",
						"type": "string"
					},
					"llm": {
						"additionalProperties": false,
						"properties": {
							"max_output_tokens": {
								"description": "16–8192.",
								"maximum": 8192,
								"minimum": 16,
								"type": "integer"
							},
							"model": {
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"enum": [
									"openai"
								],
								"type": "string"
							},
							"temperature": {
								"description": "0–2.",
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"max_duration_seconds": {
						"description": "10–43200 (12 hours).",
						"maximum": 43200,
						"minimum": 10,
						"type": "number"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput"
					},
					"name": {
						"description": "The assistant's name (yours; callers never hear it).",
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"public": {
						"description": "Allow publishable keys (the browser widget) to call this assistant. Default false.",
						"type": "boolean"
					},
					"system_prompt": {
						"description": "The instructions the model follows.",
						"maxLength": 100000,
						"type": "string"
					},
					"tools": {
						"additionalProperties": false,
						"description": "Fields you leave out are kept.",
						"properties": {
							"add_participant": {
								"anyOf": [
									{
										"additionalProperties": false,
										"properties": {
											"allow": {
												"enum": [
													"any",
													"il_mobile",
													"list"
												],
												"type": "string"
											},
											"numbers": {
												"description": "The numbers allowed with `allow: list`.",
												"items": {
													"maxLength": 32,
													"type": "string"
												},
												"maxItems": 100,
												"type": "array"
											}
										},
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "null turns adding participants off."
							},
							"custom": {
								"description": "Replaces the whole list. A tool sent without `headers` keeps the stored headers of the tool with the same name.",
								"items": {
									"$ref": "#/components/schemas/CustomToolParamsInput"
								},
								"maxItems": 50,
								"type": "array"
							},
							"end_call": {
								"type": "boolean"
							},
							"get_current_time": {
								"type": "boolean"
							},
							"transfer_call": {
								"anyOf": [
									{
										"additionalProperties": false,
										"properties": {
											"destination": {
												"description": "`queue:<queue id or name>`, a phone number, or a `sip:` URI.",
												"maxLength": 300,
												"minLength": 1,
												"type": "string"
											}
										},
										"required": [
											"destination"
										],
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "null turns transfers off."
							},
							"web_search": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"transcriber": {
						"additionalProperties": false,
						"properties": {
							"context": {
								"description": "Free text that helps recognition.",
								"maxLength": 10000,
								"type": "string"
							},
							"language_hints": {
								"description": "Languages to expect (ISO 639-1).",
								"items": {
									"maxLength": 16,
									"type": "string"
								},
								"maxItems": 10,
								"type": "array"
							},
							"model": {
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"enum": [
									"soniox"
								],
								"type": "string"
							},
							"strict_language_hints": {
								"type": "boolean"
							},
							"terms": {
								"description": "Words and names to recognise better.",
								"items": {
									"maxLength": 200,
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							}
						},
						"type": "object"
					},
					"voice": {
						"additionalProperties": false,
						"properties": {
							"expressions": {
								"type": "boolean"
							},
							"model": {
								"description": "The TTS model.",
								"maxLength": 100,
								"minLength": 1,
								"type": "string"
							},
							"provider": {
								"description": "The text-to-speech provider.",
								"enum": [
									"gemini"
								],
								"type": "string"
							},
							"style": {
								"description": "Delivery direction.",
								"maxLength": 1000,
								"type": "string"
							},
							"style_mode": {
								"enum": [
									"dynamic",
									"fixed"
								],
								"type": "string"
							},
							"tier": {
								"enum": [
									"auto",
									"premium",
									"lite"
								],
								"type": "string"
							},
							"voice_id": {
								"description": "A voice from `GET /v1/voices`.",
								"maxLength": 200,
								"minLength": 1,
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"type": "object"
			},
			"AssistantVoice": {
				"description": "How the assistant sounds.",
				"properties": {
					"expressions": {
						"description": "Let the model add vocal events (breaths, laughs, pauses).",
						"type": "boolean"
					},
					"model": {
						"description": "The TTS model.",
						"type": "string"
					},
					"provider": {
						"description": "The text-to-speech provider.",
						"enum": [
							"gemini"
						],
						"type": "string"
					},
					"style": {
						"description": "Delivery direction, e.g. `warm, friendly and natural`. With `style_mode: dynamic` it is the fallback.",
						"type": "string"
					},
					"style_mode": {
						"description": "`dynamic`: the model adapts the delivery to the caller per reply. `fixed`: `style` is always used.",
						"enum": [
							"dynamic",
							"fixed"
						],
						"type": "string"
					},
					"tier": {
						"description": "TTS tier: `auto` (the plan's default), `premium` or `lite`.",
						"enum": [
							"auto",
							"premium",
							"lite"
						],
						"type": "string"
					},
					"voice_id": {
						"description": "A voice from `GET /v1/voices` (its `voice_id`).",
						"type": "string"
					}
				},
				"required": [
					"provider",
					"voice_id",
					"model",
					"style",
					"style_mode",
					"expressions",
					"tier"
				],
				"type": "object"
			},
			"AudioAsset": {
				"description": "An uploaded recording: an IVR prompt or hold music. Use its ID in a flow's say / menu nodes or as a queue's hold audio.",
				"examples": [
					{
						"created": "2026-11-03T09:14:22.000Z",
						"duration_ms": 4210,
						"id": "aud_8b2KxQ4mLp9",
						"kind": "prompt",
						"livemode": true,
						"name": "Welcome (Hebrew)",
						"object": "audio_asset",
						"sample_rate": 16000,
						"text": "שלום, הגעתם ל…"
					}
				],
				"properties": {
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"duration_ms": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"id": {
						"description": "A audio asset ID (prefix `aud_`).",
						"examples": [
							"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"kind": {
						"description": "`prompt` (an IVR / flow prompt) or `music` (queue hold music).",
						"enum": [
							"prompt",
							"music"
						],
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "audio_asset",
						"type": "string"
					},
					"sample_rate": {
						"description": "The stored rate (mono PCM16, up to 16 kHz).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"text": {
						"description": "What the recording says (shown in the flow editor and the transcript).",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"name",
					"kind",
					"sample_rate",
					"duration_ms",
					"text",
					"created"
				],
				"type": "object"
			},
			"AudioAssetList": {
				"description": "A page of audio assets, newest first.",
				"examples": [
					{
						"data": [
							{
								"created": "2026-11-03T09:14:22.000Z",
								"duration_ms": 4210,
								"id": "aud_8b2KxQ4mLp9",
								"kind": "prompt",
								"livemode": true,
								"name": "Welcome (Hebrew)",
								"object": "audio_asset",
								"sample_rate": 16000,
								"text": "שלום, הגעתם ל…"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/audio_assets"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/AudioAsset"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"BillingInvoiceIssuedEvent": {
				"description": "An invoice was issued.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "billing.invoice_issued"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `billing.invoice_issued` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"currency": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^inv_[0-9A-Za-z]+$",
										"type": "string"
									},
									"number": {
										"type": "string"
									},
									"total": {
										"type": "number"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "billing.invoice_issued",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"BillingPaymentFailedEvent": {
				"description": "A payment failed. `failure_code` says why.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "billing.payment_failed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `billing.payment_failed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"amount_minor": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"currency": {
										"type": "string"
									},
									"failure_code": {
										"type": [
											"string",
											"null"
										]
									},
									"invoice_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^inv_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"object": {
										"const": "payment",
										"type": "string"
									},
									"provider": {
										"type": "string"
									},
									"provider_ref": {
										"type": "string"
									},
									"status": {
										"enum": [
											"succeeded",
											"failed"
										],
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "billing.payment_failed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"BillingPaymentSucceededEvent": {
				"description": "A payment succeeded.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "billing.payment_succeeded"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `billing.payment_succeeded` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"amount_minor": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"currency": {
										"type": "string"
									},
									"failure_code": {
										"type": [
											"string",
											"null"
										]
									},
									"invoice_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^inv_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"object": {
										"const": "payment",
										"type": "string"
									},
									"provider": {
										"type": "string"
									},
									"provider_ref": {
										"type": "string"
									},
									"status": {
										"enum": [
											"succeeded",
											"failed"
										],
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "billing.payment_succeeded",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"BillingPlanChangedEvent": {
				"description": "The org's plan changed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "billing.plan_changed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `billing.plan_changed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"to": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "billing.plan_changed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"BillingSubscriptionChangedEvent": {
				"description": "The org's subscription changed: plan, status (trial, active, past due, suspended, cancelled), quantities or term. A plan change also sends `billing.plan_changed`.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "billing.subscription_changed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `billing.subscription_changed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"change": {
										"type": "string"
									},
									"effective_at": {
										"type": "string"
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"plan_changed": {
										"type": "boolean"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "billing.subscription_changed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"Call": {
				"description": "An inbound, outbound or browser call.",
				"examples": [
					{
						"agent_id": null,
						"ai_generated": true,
						"ai_segments": [
							{
								"end_ms": 99710,
								"source": "assistant",
								"start_ms": 0
							}
						],
						"answered_at": "2026-11-03T09:14:29.410Z",
						"answered_by": "human",
						"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
						"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"campaign_id": null,
						"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
						"contact_id": null,
						"cost": {
							"amount": 4,
							"amount_decimal": "4.2310",
							"currency": "USD",
							"estimate": true
						},
						"direction": "outbound",
						"disposition": null,
						"duration_ms": 99710,
						"end_reason": "customer-ended-call",
						"ended_at": "2026-11-03T09:16:02.120Z",
						"flow_id": null,
						"flow_version": null,
						"from": "+97237654321",
						"has_recording": true,
						"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"livemode": true,
						"metadata": {
							"crm_contact_id": "0031x00000AbCdE"
						},
						"object": "call",
						"purpose": "service",
						"queue_id": null,
						"started_at": "2026-11-03T09:14:22.000Z",
						"status": "ended",
						"summary": null,
						"to": "+972501234567",
						"transport": "sip",
						"type": "ai",
						"variables": {
							"customer_name": "Dana"
						}
					}
				],
				"properties": {
					"agent_id": {
						"anyOf": [
							{
								"description": "A user ID (prefix `usr_`).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The human agent who handled the call (`usr_…`)."
					},
					"ai_generated": {
						"description": "Machine-readable marking (EU AI Act Art. 50(2)): true when the call contains speech generated by AI — an AI voice agent, or synthetic-voice IVR prompts. Recordings of such calls carry the same tag in their file metadata.",
						"type": "boolean"
					},
					"ai_segments": {
						"description": "When AI-generated speech was played, in ms from the start of the call (empty when `ai_generated` is false).",
						"items": {
							"$ref": "#/components/schemas/CallAiSegment"
						},
						"type": "array"
					},
					"answered_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"answered_by": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/CallAnsweredBy"
							},
							{
								"type": "null"
							}
						]
					},
					"api_key_id": {
						"anyOf": [
							{
								"description": "A api key ID (prefix `key_`).",
								"examples": [
									"key_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^key_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The API key that created the call (`key_…`)."
					},
					"assistant": {
						"$ref": "#/components/schemas/CallAssistant",
						"description": "The assistant, with expand[]=assistant."
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"campaign_id": {
						"anyOf": [
							{
								"description": "A campaign ID (prefix `cmp_`).",
								"examples": [
									"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cmp_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "A connection ID (prefix `conn_`).",
								"examples": [
									"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"contact_id": {
						"anyOf": [
							{
								"description": "A contact ID (prefix `ctc_`).",
								"examples": [
									"ctc_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^ctc_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"cost": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/CallCost"
							},
							{
								"type": "null"
							}
						],
						"description": "Set once the call has ended (never null then); null while it is in progress."
					},
					"direction": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/CallDirection"
							},
							{
								"type": "null"
							}
						]
					},
					"disposition": {
						"description": "The business outcome recorded on the call (set_outcome tool, or the summary).",
						"type": [
							"string",
							"null"
						]
					},
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"end_reason": {
						"description": "Why the call ended, e.g. `customer-ended-call`, `assistant-ended-call`, `customer-busy`, `customer-did-not-answer`.",
						"type": [
							"string",
							"null"
						]
					},
					"ended_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"flow_id": {
						"anyOf": [
							{
								"description": "A flow ID (prefix `flow_`).",
								"examples": [
									"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^flow_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"flow_version": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "The flow version that ran (0: an unpublished draft)."
					},
					"from": {
						"description": "The calling number (E.164 when it is a phone number) or name.",
						"type": [
							"string",
							"null"
						]
					},
					"has_recording": {
						"type": "boolean"
					},
					"id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"metadata": {
						"$ref": "#/components/schemas/Metadata"
					},
					"object": {
						"const": "call",
						"type": "string"
					},
					"purpose": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/CallPurpose"
							},
							{
								"type": "null"
							}
						]
					},
					"queue_id": {
						"anyOf": [
							{
								"description": "A queue ID (prefix `q_`).",
								"examples": [
									"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^q_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"started_at": {
						"description": "When the call started: dialled out, or rang in.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"status": {
						"$ref": "#/components/schemas/CallStatus"
					},
					"summary": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/CallSummary"
							},
							{
								"type": "null"
							}
						]
					},
					"to": {
						"description": "The called number (E.164 when it is a phone number) or destination.",
						"type": [
							"string",
							"null"
						]
					},
					"transport": {
						"description": "`sip` for phone calls, `webrtc` for browser calls and conference rooms.",
						"enum": [
							"sip",
							"webrtc"
						],
						"type": "string"
					},
					"type": {
						"$ref": "#/components/schemas/CallType"
					},
					"variables": {
						"additionalProperties": {
							"type": "string"
						},
						"description": "The variables the call was created with.",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"direction",
					"transport",
					"status",
					"from",
					"to",
					"assistant_id",
					"flow_id",
					"flow_version",
					"queue_id",
					"agent_id",
					"campaign_id",
					"contact_id",
					"connection_id",
					"api_key_id",
					"purpose",
					"started_at",
					"answered_at",
					"ended_at",
					"duration_ms",
					"end_reason",
					"answered_by",
					"disposition",
					"has_recording",
					"ai_generated",
					"ai_segments",
					"summary",
					"cost",
					"variables",
					"metadata",
					"livemode"
				],
				"type": "object"
			},
			"CallAiSegment": {
				"description": "A stretch of the call during which AI-generated speech was played to the other party.",
				"examples": [
					{
						"end_ms": 99710,
						"source": "assistant",
						"start_ms": 0
					}
				],
				"properties": {
					"end_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": 0,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "End, in ms from the start of the call; null while that segment is still running."
					},
					"source": {
						"description": "`assistant`: an AI voice agent spoke; `ivr`: synthetic-voice menu prompts.",
						"enum": [
							"assistant",
							"ivr"
						],
						"type": "string"
					},
					"start_ms": {
						"description": "Start, in ms from the start of the call.",
						"maximum": 9007199254740991,
						"minimum": 0,
						"type": "integer"
					}
				},
				"required": [
					"start_ms",
					"end_ms",
					"source"
				],
				"type": "object"
			},
			"CallAnalyzedEvent": {
				"description": "Post-call analysis is ready: summary, intent, outcome, disposition, action items and extracted variables. Always carries the call's `metadata` ({} when it had none).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {
								"action_items": [],
								"disposition": null,
								"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
								"intent": "Order status",
								"metadata": {
									"crm_contact_id": "0031x00000AbCdE"
								},
								"object": "call",
								"outcome": "Informed",
								"summary": "The customer asked about order A-1042; it ships on Monday.",
								"variables": {
									"customer_name": "Dana"
								}
							}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.analyzed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.analyzed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"examples": [
									{
										"action_items": [],
										"disposition": null,
										"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"intent": "Order status",
										"metadata": {
											"crm_contact_id": "0031x00000AbCdE"
										},
										"object": "call",
										"outcome": "Informed",
										"summary": "The customer asked about order A-1042; it ships on Monday.",
										"variables": {
											"customer_name": "Dana"
										}
									}
								],
								"properties": {
									"action_items": {
										"items": {},
										"type": "array"
									},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"intent": {
										"type": [
											"string",
											"null"
										]
									},
									"metadata": {
										"additionalProperties": {
											"type": "string"
										},
										"default": {},
										"description": "The call's metadata as set on POST /v1/calls; {} when none.",
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"outcome": {
										"type": [
											"string",
											"null"
										]
									},
									"summary": {
										"type": [
											"string",
											"null"
										]
									},
									"variables": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									}
								},
								"required": [
									"metadata"
								],
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.analyzed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallAnsweredBy": {
				"description": "The answering-machine detection verdict.",
				"enum": [
					"human",
					"machine",
					"unknown"
				],
				"examples": [
					"human"
				],
				"type": "string"
			},
			"CallAnsweredEvent": {
				"description": "The call was answered. `answered_by` says human or machine when answering-machine detection ran.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.answered"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.answered` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.answered",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallAssistant": {
				"description": "The assistant of the call (expand[]=assistant).",
				"examples": [
					{
						"id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"name": "Support (Hebrew)",
						"object": "assistant"
					}
				],
				"properties": {
					"id": {
						"description": "A assistant ID (prefix `asst_`).",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "assistant",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"name"
				],
				"type": "object"
			},
			"CallControl": {
				"description": "The live control state of a call.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"consult": null,
						"held": false,
						"object": "call_control",
						"participants": [
							{
								"held": false,
								"joined_at": "2026-11-03T09:14:22.000Z",
								"kind": "client",
								"muted": false,
								"name": "+972501234567",
								"number": "+972501234567",
								"participant_id": "client",
								"role": "member",
								"state": "connected",
								"user_id": null
							},
							{
								"held": false,
								"joined_at": "2026-11-03T09:14:22.000Z",
								"kind": "agent",
								"muted": false,
								"name": "Noa",
								"number": null,
								"participant_id": "agent",
								"role": "moderator",
								"state": "connected",
								"user_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
							}
						],
						"phase": "active",
						"recording": true,
						"status": "in_progress",
						"type": "human"
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"consult": {
						"anyOf": [
							{
								"properties": {
									"fail_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"name": {
										"type": "string"
									},
									"state": {
										"enum": [
											"ringing",
											"talking",
											"failed",
											"ended"
										],
										"type": "string"
									},
									"talking_to": {
										"enum": [
											"caller",
											"consulted"
										],
										"type": "string"
									}
								},
								"required": [
									"name",
									"state",
									"talking_to",
									"fail_reason"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "A running consultation (warm transfer)."
					},
					"held": {
						"description": "The customer is on hold.",
						"type": "boolean"
					},
					"object": {
						"const": "call_control",
						"type": "string"
					},
					"participants": {
						"items": {
							"$ref": "#/components/schemas/CallParticipant"
						},
						"type": "array"
					},
					"phase": {
						"enum": [
							"active",
							"held",
							"consulting",
							"conference"
						],
						"type": "string"
					},
					"recording": {
						"type": "boolean"
					},
					"status": {
						"$ref": "#/components/schemas/CallStatus"
					},
					"type": {
						"$ref": "#/components/schemas/CallType",
						"description": "Who handles the call now. Hold, DTMF, consult and participants need a human-handled call."
					}
				},
				"required": [
					"object",
					"call_id",
					"status",
					"type",
					"phase",
					"held",
					"consult",
					"participants",
					"recording"
				],
				"type": "object"
			},
			"CallCost": {
				"description": "What the call cost (an ended call with no recorded provider usage costs 0).",
				"examples": [
					{
						"amount": 4,
						"amount_decimal": "4.2310",
						"currency": "USD",
						"estimate": true
					}
				],
				"properties": {
					"amount": {
						"description": "The amount in the currency's minor unit (cents, agorot), rounded.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"amount_decimal": {
						"description": "The exact amount in minor units, as a decimal string (sub-cent precision).",
						"pattern": "^-?\\d+(\\.\\d+)?$",
						"type": "string"
					},
					"currency": {
						"description": "ISO 4217 currency code.",
						"pattern": "^[A-Z]{3}$",
						"type": "string"
					},
					"estimate": {
						"description": "true: an estimate from provider usage, not a billed amount.",
						"type": "boolean"
					}
				},
				"required": [
					"amount",
					"amount_decimal",
					"currency",
					"estimate"
				],
				"type": "object"
			},
			"CallCostFinalizedEvent": {
				"description": "The call's price is final: `total` and a `breakdown` per usage kind (AI minutes, telephony, carrier minutes…) in minor units of `currency`, as your invoice will bill it.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {
								"breakdown": {
									"ai_minute": 120,
									"pbx_minute": 9
								},
								"currency": "ILS",
								"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
								"object": "call",
								"quantities": {
									"ai_minute": 2,
									"pbx_minute": 2
								},
								"total": 129
							}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.cost_finalized"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.cost_finalized` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"examples": [
									{
										"breakdown": {
											"ai_minute": 120,
											"pbx_minute": 9
										},
										"currency": "ILS",
										"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"object": "call",
										"quantities": {
											"ai_minute": 2,
											"pbx_minute": 2
										},
										"total": 129
									}
								],
								"properties": {
									"breakdown": {
										"additionalProperties": {
											"type": "number"
										},
										"description": "Minor units per usage kind (ai_minute, pbx_minute, carrier_minute…).",
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"currency": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"quantities": {
										"additionalProperties": {
											"type": "number"
										},
										"description": "The metered quantity per usage kind (minutes).",
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"total": {
										"description": "The call's price in minor units (agorot, cents).",
										"type": "number"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.cost_finalized",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallCreatedEvent": {
				"description": "A call was created (dialled, or an inbound call was accepted) and has not started ringing yet.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.created"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.created` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.created",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallDeleted": {
				"description": "A deleted call.",
				"examples": [
					{
						"deleted": true,
						"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"object": "call"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "call",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"CallDirection": {
				"description": "`browser`: a call from a web page (the dashboard, a widget). Same values as the call.* webhook events.",
				"enum": [
					"inbound",
					"outbound",
					"browser"
				],
				"examples": [
					"outbound"
				],
				"type": "string"
			},
			"CallDtmfEvent": {
				"description": "Live: the caller pressed a key. A key typed into a question (an account number, an ID) arrives masked as `*`. Opt-in: sent only to endpoints that name this type; `*` and `call.*` don't include it.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.dtmf"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.dtmf` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"digit": {
										"type": "string"
									},
									"masked": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.dtmf",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallEndedEvent": {
				"description": "The call ended. Carries `end_reason`, `duration_ms` and the AI marking (`ai_generated`, `ai_segments`).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.ended"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.ended` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.ended",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallList": {
				"description": "A page of calls, newest first.",
				"examples": [
					{
						"data": [
							{
								"agent_id": null,
								"ai_generated": true,
								"ai_segments": [
									{
										"end_ms": 99710,
										"source": "assistant",
										"start_ms": 0
									}
								],
								"answered_at": "2026-11-03T09:14:29.410Z",
								"answered_by": "human",
								"api_key_id": "key_9i2E2pKO6g3z4nXl57Qb4g",
								"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"campaign_id": null,
								"connection_id": "conn_2bF8kQ1nR7sT3vW5xY9zA0",
								"contact_id": null,
								"cost": {
									"amount": 4,
									"amount_decimal": "4.2310",
									"currency": "USD",
									"estimate": true
								},
								"direction": "outbound",
								"disposition": null,
								"duration_ms": 99710,
								"end_reason": "customer-ended-call",
								"ended_at": "2026-11-03T09:16:02.120Z",
								"flow_id": null,
								"flow_version": null,
								"from": "+97237654321",
								"has_recording": true,
								"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
								"livemode": true,
								"metadata": {
									"crm_contact_id": "0031x00000AbCdE"
								},
								"object": "call",
								"purpose": "service",
								"queue_id": null,
								"started_at": "2026-11-03T09:14:22.000Z",
								"status": "ended",
								"summary": null,
								"to": "+972501234567",
								"transport": "sip",
								"type": "ai",
								"variables": {
									"customer_name": "Dana"
								}
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/calls"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Call"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CallParticipant": {
				"description": "Someone on a call.",
				"properties": {
					"held": {
						"type": "boolean"
					},
					"joined_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"kind": {
						"enum": [
							"client",
							"agent",
							"external",
							"supervisor",
							"ai",
							"guest"
						],
						"type": "string"
					},
					"muted": {
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"number": {
						"type": [
							"string",
							"null"
						]
					},
					"participant_id": {
						"description": "Unique within the call: `client` (the customer), `agent` (the call's agent), or a generated id.",
						"type": "string"
					},
					"role": {
						"enum": [
							"moderator",
							"member"
						],
						"type": "string"
					},
					"state": {
						"enum": [
							"ringing",
							"connected",
							"left",
							"failed"
						],
						"type": "string"
					},
					"user_id": {
						"anyOf": [
							{
								"description": "A user ID (prefix `usr_`).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"participant_id",
					"kind",
					"name",
					"user_id",
					"number",
					"role",
					"muted",
					"held",
					"state",
					"joined_at"
				],
				"type": "object"
			},
			"CallParticipantCreated": {
				"description": "A participant being added to a call.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"name": "035551234",
						"object": "call_participant",
						"participant_id": "L4f8k2",
						"state": "ringing"
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "call_participant",
						"type": "string"
					},
					"participant_id": {
						"type": "string"
					},
					"state": {
						"enum": [
							"ringing",
							"connected"
						],
						"type": "string"
					}
				},
				"required": [
					"object",
					"call_id",
					"participant_id",
					"name",
					"state"
				],
				"type": "object"
			},
			"CallPci": {
				"description": "A call's payment (PCI) pause.",
				"examples": [
					{
						"call_id": "call_2fT0a8Kq1Lb3Xc9Zp4Rm",
						"destination_participant_id": null,
						"object": "call_pci",
						"paused": true,
						"paused_at": "2026-10-05T12:00:00.000Z",
						"reason": "payment",
						"resumes_at": "2026-10-05T12:05:00.000Z"
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"destination_participant_id": {
						"description": "The participant the pause named as the payment line, if any (otherwise a participant on one of the organisation's payment numbers).",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "call_pci",
						"type": "string"
					},
					"paused": {
						"description": "Recording and transcription are paused for a payment.",
						"type": "boolean"
					},
					"paused_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"reason": {
						"description": "Why (e.g. `payment`), while paused.",
						"type": [
							"string",
							"null"
						]
					},
					"resumes_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When the pause ends by itself unless resumed earlier."
					}
				},
				"required": [
					"object",
					"call_id",
					"paused",
					"reason",
					"paused_at",
					"resumes_at",
					"destination_participant_id"
				],
				"type": "object"
			},
			"CallPurpose": {
				"description": "Why an outbound call is made. `marketing` adds the §30A consent and national do-not-call registry checks.",
				"enum": [
					"service",
					"marketing",
					"survey"
				],
				"examples": [
					"service"
				],
				"type": "string"
			},
			"CallRingingEvent": {
				"description": "The far end is ringing.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.ringing"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.ringing` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.ringing",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallRoutingDecidedEvent": {
				"description": "An inbound route with an assistant-request URL decided who answers: your server's answer (`source: assistant_request`), or the route's own target when the request failed, timed out or was invalid (`source: route`, with `reason`).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.routing_decided"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.routing_decided` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"latency_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"route_id": {
										"minLength": 1,
										"pattern": "^rte_[0-9A-Za-z]+$",
										"type": "string"
									},
									"source": {
										"enum": [
											"assistant_request",
											"route"
										],
										"type": "string"
									},
									"status": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": -9007199254740991,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"target": {
										"anyOf": [
											{
												"additionalProperties": {},
												"properties": {
													"assistant_id": {
														"minLength": 1,
														"pattern": "^asst_[0-9A-Za-z]+$",
														"type": "string"
													},
													"flow_id": {
														"minLength": 1,
														"pattern": "^flow_[0-9A-Za-z]+$",
														"type": "string"
													},
													"queue_id": {
														"minLength": 1,
														"pattern": "^q_[0-9A-Za-z]+$",
														"type": "string"
													},
													"type": {
														"enum": [
															"assistant",
															"flow",
															"queue"
														],
														"type": "string"
													}
												},
												"required": [
													"type"
												],
												"type": "object"
											},
											{
												"type": "null"
											}
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.routing_decided",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallStartedEvent": {
				"description": "The call's media started: the AI or an agent is on the line.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.started"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.started` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.started",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallStatus": {
				"description": "`queued` (placed, not ringing yet), `ringing`, `in_progress` (answered, or an inbound call being handled) or `ended`.",
				"enum": [
					"queued",
					"ringing",
					"in_progress",
					"ended"
				],
				"examples": [
					"in_progress"
				],
				"type": "string"
			},
			"CallSummary": {
				"description": "The AI summary of a call.",
				"examples": [
					{
						"action_items": [],
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"generated_at": "2026-11-03T09:14:22.000Z",
						"intent": "Order status",
						"key_points": [
							"Order A-1042 ships on Monday"
						],
						"object": "call_summary",
						"outcome": "Customer informed; no follow-up needed",
						"sentiment": "positive",
						"text": "The customer asked about the status of order A-1042. The assistant confirmed it ships on Monday."
					}
				],
				"properties": {
					"action_items": {
						"description": "Follow-ups for your business; empty when there are none.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"generated_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"intent": {
						"description": "What the caller wanted.",
						"type": "string"
					},
					"key_points": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"object": {
						"const": "call_summary",
						"type": "string"
					},
					"outcome": {
						"description": "How the call ended, or what was agreed.",
						"type": "string"
					},
					"sentiment": {
						"enum": [
							"positive",
							"neutral",
							"negative",
							"mixed"
						],
						"type": "string"
					},
					"text": {
						"description": "A two-to-four sentence summary, in the language of the call.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"call_id",
					"text",
					"intent",
					"outcome",
					"sentiment",
					"key_points",
					"action_items",
					"generated_at"
				],
				"type": "object"
			},
			"CallToolCalledEvent": {
				"description": "Live: an assistant's tool call finished during a call (name, arguments, result or error). Opt-in: sent only to endpoints that name this type; `*` and `call.*` don't include it.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.tool_called"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.tool_called` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"arguments": {},
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"error": {
										"type": [
											"string",
											"null"
										]
									},
									"name": {
										"type": "string"
									},
									"result": {},
									"status": {
										"enum": [
											"done",
											"error"
										],
										"type": "string"
									},
									"tool_call_id": {
										"minLength": 1,
										"pattern": "^tc_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.tool_called",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallTransferredEvent": {
				"description": "The call was transferred to a queue, a number, a SIP URI or another assistant.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.transferred"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `call.transferred` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"ai_generated": {
										"type": "boolean"
									},
									"ai_segments": {
										"items": {
											"additionalProperties": {},
											"properties": {
												"end_ms": {
													"anyOf": [
														{
															"maximum": 9007199254740991,
															"minimum": 0,
															"type": "integer"
														},
														{
															"type": "null"
														}
													]
												},
												"source": {
													"enum": [
														"assistant",
														"ivr"
													],
													"type": "string"
												},
												"start_ms": {
													"maximum": 9007199254740991,
													"minimum": 0,
													"type": "integer"
												}
											},
											"required": [
												"start_ms",
												"end_ms",
												"source"
											],
											"type": "object"
										},
										"type": "array"
									},
									"answered_at": {
										"type": [
											"string",
											"null"
										]
									},
									"answered_by": {
										"anyOf": [
											{
												"enum": [
													"human",
													"machine",
													"unknown"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"contact_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^ctc_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"direction": {
										"anyOf": [
											{
												"enum": [
													"inbound",
													"outbound",
													"browser"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"duration_ms": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": 0,
												"type": "integer"
											},
											{
												"type": "null"
											}
										]
									},
									"end_reason": {
										"type": [
											"string",
											"null"
										]
									},
									"ended_at": {
										"type": [
											"string",
											"null"
										]
									},
									"flow_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^flow_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"metadata": {
										"additionalProperties": {},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"object": {
										"const": "call",
										"type": "string"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"started_at": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									},
									"transfer": {
										"additionalProperties": {},
										"properties": {
											"destination": {
												"type": [
													"string",
													"null"
												]
											},
											"mode": {
												"type": "string"
											},
											"warm": {
												"type": "boolean"
											}
										},
										"type": "object"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "call.transferred",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallType": {
				"description": "Who handles the call: an AI assistant, a human agent, an IVR flow, a conference room, or a voicemail box.",
				"enum": [
					"ai",
					"human",
					"ivr",
					"conference",
					"voicemail"
				],
				"examples": [
					"ai"
				],
				"type": "string"
			},
			"Callback": {
				"description": "A request to call someone back, and its progress.",
				"examples": [
					{
						"agent_id": null,
						"assistant_id": null,
						"attempts": 0,
						"call_id": null,
						"completed_at": null,
						"context": {
							"web": null
						},
						"created": "2026-11-03T09:14:22.000Z",
						"due_at": "2026-11-03T10:00:00.000Z",
						"id": "cb_2dXk9QmZ4rTv",
						"last_attempt_at": null,
						"last_result": null,
						"livemode": true,
						"max_attempts": 3,
						"merged_requests": 0,
						"metadata": {
							"crm_ticket": "T-1042"
						},
						"name": "Dana Levi",
						"notes": "Asked about the renewal offer.",
						"object": "callback",
						"origin_call_id": null,
						"phone": "+972501234567",
						"priority": 5,
						"queue_id": "q_3hRf8Kd2LmPq",
						"route": "agent_queue",
						"site_id": null,
						"sla_at": "2026-11-03T11:00:00.000Z",
						"source": "api",
						"status": "pending",
						"summary": null,
						"updated": "2026-11-03T09:14:22.000Z",
						"window_end": null
					}
				],
				"properties": {
					"agent_id": {
						"anyOf": [
							{
								"description": "The agent who returns it (a user ID), or null.",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"attempts": {
						"description": "Call-back attempts made so far.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"call_id": {
						"anyOf": [
							{
								"description": "The call that returned it, once there is one.",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"completed_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"context": {
						"properties": {
							"web": {
								"anyOf": [
									{
										"properties": {
											"language": {
												"type": [
													"string",
													"null"
												]
											},
											"page": {
												"type": [
													"string",
													"null"
												]
											}
										},
										"required": [
											"page",
											"language"
										],
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "Web-form requests: the page and language of the form."
							}
						},
						"required": [
							"web"
						],
						"type": "object"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"due_at": {
						"description": "The earliest time to call back (moved into business hours).",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"id": {
						"description": "A callback ID (prefix `cb_`).",
						"examples": [
							"cb_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cb_[0-9A-Za-z]+$",
						"type": "string"
					},
					"last_attempt_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"last_result": {
						"description": "The last attempt's result, e.g. `answered`, `no-answer`, `busy`, `done-manually`.",
						"type": [
							"string",
							"null"
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"max_attempts": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"merged_requests": {
						"description": "Later requests for the same number merged into this one.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"metadata": {
						"$ref": "#/components/schemas/Metadata"
					},
					"name": {
						"description": "The person's name, when known.",
						"type": "string"
					},
					"notes": {
						"description": "Notes for whoever returns it (each note is stamped with its time and author).",
						"type": "string"
					},
					"object": {
						"const": "callback",
						"type": "string"
					},
					"origin_call_id": {
						"anyOf": [
							{
								"description": "The call the request came from, if any.",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"phone": {
						"description": "The number to call back, E.164.",
						"type": "string"
					},
					"priority": {
						"description": "1 (low) … 10 (urgent); higher is returned sooner.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"queue_id": {
						"anyOf": [
							{
								"description": "A queue ID (prefix `q_`).",
								"examples": [
									"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^q_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"route": {
						"description": "Who returns it: `agent_queue` (offered to the next free agent of `queue_id`, then dialled), `agent` (`agent_id` calls back) or `assistant` (the AI `assistant_id` calls back).",
						"type": "string"
					},
					"site_id": {
						"description": "The website form it came from (`source` = web).",
						"type": [
							"string",
							"null"
						]
					},
					"sla_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When it should have been returned by (the SLA target, in business hours)."
					},
					"source": {
						"description": "Where the request came from: `queue` (a caller pressed the callback key), `ivr`, `flow`, `ai` (the assistant booked it), `web` (a website form), `manual`, `campaign`, `voicemail` or `api`.",
						"type": "string"
					},
					"status": {
						"description": "`pending` (waiting for its time), `offered` (ringing an agent), `dialing`, `connected` (on the call back), `completed`, `failed` (attempts used up), `cancelled` or `expired` (past its window, or too old).",
						"type": "string"
					},
					"summary": {
						"description": "The AI summary of the originating call, when there is one.",
						"type": [
							"string",
							"null"
						]
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"window_end": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Don't call after this time; null: no limit."
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"phone",
					"name",
					"status",
					"source",
					"site_id",
					"due_at",
					"window_end",
					"priority",
					"route",
					"queue_id",
					"agent_id",
					"assistant_id",
					"attempts",
					"max_attempts",
					"last_attempt_at",
					"last_result",
					"call_id",
					"origin_call_id",
					"notes",
					"summary",
					"sla_at",
					"merged_requests",
					"context",
					"metadata",
					"completed_at",
					"created",
					"updated"
				],
				"type": "object"
			},
			"CallbackCancelledEvent": {
				"description": "A callback was cancelled before it was returned.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "callback.cancelled"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `callback.cancelled` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempts": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"completed_at": {
										"type": [
											"string",
											"null"
										]
									},
									"context": {
										"additionalProperties": {},
										"properties": {
											"web": {
												"anyOf": [
													{
														"additionalProperties": {},
														"properties": {
															"language": {
																"type": [
																	"string",
																	"null"
																]
															},
															"page": {
																"description": "The page the visitor submitted the form on.",
																"type": [
																	"string",
																	"null"
																]
															}
														},
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											}
										},
										"type": "object"
									},
									"created": {
										"type": "string"
									},
									"due_at": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"last_result": {
										"type": [
											"string",
											"null"
										]
									},
									"max_attempts": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"merged_requests": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"metadata": {
										"additionalProperties": {
											"type": "string"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"name": {
										"type": "string"
									},
									"object": {
										"const": "callback",
										"type": "string"
									},
									"origin_call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"phone": {
										"type": "string"
									},
									"priority": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"route": {
										"type": "string"
									},
									"site_id": {
										"description": "The web-form site the request came from (`source` = web).",
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									},
									"updated": {
										"type": "string"
									},
									"window_end": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "callback.cancelled",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallbackCompletedEvent": {
				"description": "A callback was completed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {
								"agent_id": null,
								"assistant_id": null,
								"attempts": 1,
								"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
								"completed_at": "2026-11-03T10:02:10.000Z",
								"context": {
									"web": {
										"language": "he",
										"page": "https://example.com/pricing"
									}
								},
								"created": "2026-11-03T09:14:22.000Z",
								"due_at": "2026-11-03T10:00:00.000Z",
								"id": "cb_2dXk9QmZ4rT",
								"last_result": "answered",
								"max_attempts": 3,
								"merged_requests": 0,
								"metadata": {},
								"name": "Dana",
								"object": "callback",
								"origin_call_id": null,
								"outcome": "answered",
								"phone": "+972501234567",
								"priority": 5,
								"queue_id": "q_3hRf8Kd2Lm",
								"route": "agent_queue",
								"site_id": "main-site",
								"source": "web",
								"status": "completed",
								"updated": "2026-11-03T09:14:22.000Z",
								"window_end": null
							}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "callback.completed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `callback.completed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"examples": [
									{
										"agent_id": null,
										"assistant_id": null,
										"attempts": 1,
										"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
										"completed_at": "2026-11-03T10:02:10.000Z",
										"context": {
											"web": {
												"language": "he",
												"page": "https://example.com/pricing"
											}
										},
										"created": "2026-11-03T09:14:22.000Z",
										"due_at": "2026-11-03T10:00:00.000Z",
										"id": "cb_2dXk9QmZ4rT",
										"last_result": "answered",
										"max_attempts": 3,
										"merged_requests": 0,
										"metadata": {},
										"name": "Dana",
										"object": "callback",
										"origin_call_id": null,
										"outcome": "answered",
										"phone": "+972501234567",
										"priority": 5,
										"queue_id": "q_3hRf8Kd2Lm",
										"route": "agent_queue",
										"site_id": "main-site",
										"source": "web",
										"status": "completed",
										"updated": "2026-11-03T09:14:22.000Z",
										"window_end": null
									}
								],
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempts": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"completed_at": {
										"type": [
											"string",
											"null"
										]
									},
									"context": {
										"additionalProperties": {},
										"properties": {
											"web": {
												"anyOf": [
													{
														"additionalProperties": {},
														"properties": {
															"language": {
																"type": [
																	"string",
																	"null"
																]
															},
															"page": {
																"description": "The page the visitor submitted the form on.",
																"type": [
																	"string",
																	"null"
																]
															}
														},
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											}
										},
										"type": "object"
									},
									"created": {
										"type": "string"
									},
									"due_at": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"last_result": {
										"type": [
											"string",
											"null"
										]
									},
									"max_attempts": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"merged_requests": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"metadata": {
										"additionalProperties": {
											"type": "string"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"name": {
										"type": "string"
									},
									"object": {
										"const": "callback",
										"type": "string"
									},
									"origin_call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"outcome": {
										"type": [
											"string",
											"null"
										]
									},
									"phone": {
										"type": "string"
									},
									"priority": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"route": {
										"type": "string"
									},
									"site_id": {
										"description": "The web-form site the request came from (`source` = web).",
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									},
									"updated": {
										"type": "string"
									},
									"window_end": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "callback.completed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallbackFailedEvent": {
				"description": "A callback could not be completed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "callback.failed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `callback.failed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempts": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"completed_at": {
										"type": [
											"string",
											"null"
										]
									},
									"context": {
										"additionalProperties": {},
										"properties": {
											"web": {
												"anyOf": [
													{
														"additionalProperties": {},
														"properties": {
															"language": {
																"type": [
																	"string",
																	"null"
																]
															},
															"page": {
																"description": "The page the visitor submitted the form on.",
																"type": [
																	"string",
																	"null"
																]
															}
														},
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											}
										},
										"type": "object"
									},
									"created": {
										"type": "string"
									},
									"due_at": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"last_result": {
										"type": [
											"string",
											"null"
										]
									},
									"max_attempts": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"merged_requests": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"metadata": {
										"additionalProperties": {
											"type": "string"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"name": {
										"type": "string"
									},
									"object": {
										"const": "callback",
										"type": "string"
									},
									"origin_call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"phone": {
										"type": "string"
									},
									"priority": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"route": {
										"type": "string"
									},
									"site_id": {
										"description": "The web-form site the request came from (`source` = web).",
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									},
									"updated": {
										"type": "string"
									},
									"window_end": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "callback.failed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallbackList": {
				"description": "A page of callbacks, newest request first.",
				"examples": [
					{
						"data": [
							{
								"agent_id": null,
								"assistant_id": null,
								"attempts": 0,
								"call_id": null,
								"completed_at": null,
								"context": {
									"web": null
								},
								"created": "2026-11-03T09:14:22.000Z",
								"due_at": "2026-11-03T10:00:00.000Z",
								"id": "cb_2dXk9QmZ4rTv",
								"last_attempt_at": null,
								"last_result": null,
								"livemode": true,
								"max_attempts": 3,
								"merged_requests": 0,
								"metadata": {
									"crm_ticket": "T-1042"
								},
								"name": "Dana Levi",
								"notes": "Asked about the renewal offer.",
								"object": "callback",
								"origin_call_id": null,
								"phone": "+972501234567",
								"priority": 5,
								"queue_id": "q_3hRf8Kd2LmPq",
								"route": "agent_queue",
								"site_id": null,
								"sla_at": "2026-11-03T11:00:00.000Z",
								"source": "api",
								"status": "pending",
								"summary": null,
								"updated": "2026-11-03T09:14:22.000Z",
								"window_end": null
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/callbacks"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Callback"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CallbackScheduledEvent": {
				"description": "A callback request was created, or a new request for the same number was merged into an open one (`merged_requests` counts them).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {
								"agent_id": null,
								"assistant_id": null,
								"attempts": 0,
								"call_id": null,
								"completed_at": null,
								"context": {
									"web": {
										"language": "he",
										"page": "https://example.com/pricing"
									}
								},
								"created": "2026-11-03T09:14:22.000Z",
								"due_at": "2026-11-03T10:00:00.000Z",
								"id": "cb_2dXk9QmZ4rT",
								"last_result": null,
								"max_attempts": 3,
								"merged_requests": 0,
								"metadata": {},
								"name": "Dana",
								"object": "callback",
								"origin_call_id": null,
								"phone": "+972501234567",
								"priority": 5,
								"queue_id": "q_3hRf8Kd2Lm",
								"route": "agent_queue",
								"site_id": "main-site",
								"source": "web",
								"status": "pending",
								"updated": "2026-11-03T09:14:22.000Z",
								"window_end": null
							}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "callback.scheduled"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `callback.scheduled` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"examples": [
									{
										"agent_id": null,
										"assistant_id": null,
										"attempts": 0,
										"call_id": null,
										"completed_at": null,
										"context": {
											"web": {
												"language": "he",
												"page": "https://example.com/pricing"
											}
										},
										"created": "2026-11-03T09:14:22.000Z",
										"due_at": "2026-11-03T10:00:00.000Z",
										"id": "cb_2dXk9QmZ4rT",
										"last_result": null,
										"max_attempts": 3,
										"merged_requests": 0,
										"metadata": {},
										"name": "Dana",
										"object": "callback",
										"origin_call_id": null,
										"phone": "+972501234567",
										"priority": 5,
										"queue_id": "q_3hRf8Kd2Lm",
										"route": "agent_queue",
										"site_id": "main-site",
										"source": "web",
										"status": "pending",
										"updated": "2026-11-03T09:14:22.000Z",
										"window_end": null
									}
								],
								"properties": {
									"agent_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^usr_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"assistant_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^asst_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempts": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"completed_at": {
										"type": [
											"string",
											"null"
										]
									},
									"context": {
										"additionalProperties": {},
										"properties": {
											"web": {
												"anyOf": [
													{
														"additionalProperties": {},
														"properties": {
															"language": {
																"type": [
																	"string",
																	"null"
																]
															},
															"page": {
																"description": "The page the visitor submitted the form on.",
																"type": [
																	"string",
																	"null"
																]
															}
														},
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											}
										},
										"type": "object"
									},
									"created": {
										"type": "string"
									},
									"due_at": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"last_result": {
										"type": [
											"string",
											"null"
										]
									},
									"max_attempts": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"merged_requests": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"metadata": {
										"additionalProperties": {
											"type": "string"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"name": {
										"type": "string"
									},
									"object": {
										"const": "callback",
										"type": "string"
									},
									"origin_call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"phone": {
										"type": "string"
									},
									"priority": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"queue_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^q_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"route": {
										"type": "string"
									},
									"site_id": {
										"description": "The web-form site the request came from (`source` = web).",
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									},
									"updated": {
										"type": "string"
									},
									"window_end": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "callback.scheduled",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CallbackStats": {
				"description": "Callback totals for a period (requests made in it).",
				"examples": [
					{
						"attempts": 51,
						"avg_return_ms": 1860000,
						"breached_open": 1,
						"by_agent": [
							{
								"agent_id": "usr_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"count": 12
							}
						],
						"by_source": [
							{
								"completed": 24,
								"count": 30,
								"source": "queue"
							}
						],
						"cancelled": 1,
						"completed": 31,
						"expired": 2,
						"failed": 3,
						"from": "2026-10-27T09:00:00.000Z",
						"livemode": true,
						"object": "callback_stats",
						"open": 5,
						"sla_rate": 0.871,
						"to": "2026-11-03T09:00:00.000Z",
						"total": 42,
						"within_sla": 27
					}
				],
				"properties": {
					"attempts": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"avg_return_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "Average time from request to completion."
					},
					"breached_open": {
						"description": "Still open past their SLA target.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"by_agent": {
						"items": {
							"properties": {
								"agent_id": {
									"anyOf": [
										{
											"description": "A user ID (prefix `usr_`).",
											"examples": [
												"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^usr_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"count": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								}
							},
							"required": [
								"agent_id",
								"count"
							],
							"type": "object"
						},
						"type": "array"
					},
					"by_source": {
						"items": {
							"properties": {
								"completed": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"count": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"source": {
									"type": "string"
								}
							},
							"required": [
								"source",
								"count",
								"completed"
							],
							"type": "object"
						},
						"type": "array"
					},
					"cancelled": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"completed": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"expired": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"failed": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"from": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "callback_stats",
						"type": "string"
					},
					"open": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"sla_rate": {
						"description": "within_sla / completed; null with nothing completed.",
						"type": [
							"number",
							"null"
						]
					},
					"to": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"total": {
						"description": "Requests in the period.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"within_sla": {
						"description": "Completed within their SLA target.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"object",
					"livemode",
					"from",
					"to",
					"total",
					"open",
					"completed",
					"failed",
					"expired",
					"cancelled",
					"within_sla",
					"breached_open",
					"sla_rate",
					"avg_return_ms",
					"attempts",
					"by_source",
					"by_agent"
				],
				"type": "object"
			},
			"CallingWindow": {
				"description": "A weekly calling window in the campaign's time zone.",
				"examples": [
					{
						"days": [
							"sun",
							"mon",
							"tue",
							"wed",
							"thu"
						],
						"end": "20:00",
						"start": "09:00"
					}
				],
				"properties": {
					"days": {
						"description": "Weekdays the window applies to.",
						"items": {
							"enum": [
								"sun",
								"mon",
								"tue",
								"wed",
								"thu",
								"fri",
								"sat"
							],
							"type": "string"
						},
						"maxItems": 7,
						"minItems": 1,
						"type": "array"
					},
					"end": {
						"description": "Closes at, local time (HH:MM, 24-hour).",
						"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$|^24:00$",
						"type": "string"
					},
					"start": {
						"description": "Opens at, local time (HH:MM, 24-hour).",
						"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$|^24:00$",
						"type": "string"
					}
				},
				"required": [
					"days",
					"start",
					"end"
				],
				"type": "object"
			},
			"CallingWindowInput": {
				"description": "A weekly calling window in the campaign's time zone.",
				"examples": [
					{
						"days": [
							"sun",
							"mon",
							"tue",
							"wed",
							"thu"
						],
						"end": "20:00",
						"start": "09:00"
					}
				],
				"properties": {
					"days": {
						"description": "Weekdays the window applies to.",
						"items": {
							"enum": [
								"sun",
								"mon",
								"tue",
								"wed",
								"thu",
								"fri",
								"sat"
							],
							"type": "string"
						},
						"maxItems": 7,
						"minItems": 1,
						"type": "array"
					},
					"end": {
						"description": "Closes at, local time (HH:MM, 24-hour).",
						"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$|^24:00$",
						"type": "string"
					},
					"start": {
						"description": "Opens at, local time (HH:MM, 24-hour).",
						"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$|^24:00$",
						"type": "string"
					}
				},
				"required": [
					"days",
					"start",
					"end"
				],
				"type": "object"
			},
			"Campaign": {
				"description": "An outbound calling campaign.",
				"examples": [
					{
						"amd": {
							"message": "",
							"mode": "off"
						},
						"assistant_id": "asst_3kTzL9Qe2R",
						"caller_id": "+97235550100",
						"calls_per_second": 0,
						"completed_at": null,
						"connection_id": "conn_8DbH2nXy",
						"created_at": "2026-11-01T08:00:00.000Z",
						"disclosure": {
							"enabled": null,
							"text": ""
						},
						"dispositions": [
							"interested",
							"not-interested",
							"callback-requested"
						],
						"first_message": "",
						"id": "cmp_2Yb7mCq9aPLk",
						"livemode": true,
						"max_concurrent": 10,
						"name": "November renewals",
						"object": "campaign",
						"opt_out_dtmf_key": null,
						"pause_reason": null,
						"priority": 5,
						"purpose": "marketing",
						"retry": {
							"busy": {
								"delay_minutes": 15,
								"enabled": true
							},
							"declined": {
								"delay_minutes": 240,
								"enabled": false
							},
							"failed": {
								"delay_minutes": 10,
								"enabled": true
							},
							"max_attempts": 3,
							"no_answer": {
								"delay_minutes": 60,
								"enabled": true
							},
							"voicemail": {
								"delay_minutes": 120,
								"enabled": true
							}
						},
						"ring_timeout_seconds": 30,
						"schedule": {
							"end_at": null,
							"respect_holidays": true,
							"respect_shabbat": true,
							"start_at": null,
							"timezone": "Asia/Jerusalem",
							"windows": [
								{
									"days": [
										"sun",
										"mon",
										"tue",
										"wed",
										"thu"
									],
									"end": "20:00",
									"start": "09:00"
								},
								{
									"days": [
										"fri"
									],
									"end": "13:00",
									"start": "09:00"
								}
							]
						},
						"script": "Offer the {{plan}} renewal at the loyalty price.",
						"started_at": "2026-11-02T07:00:00.000Z",
						"state": "running",
						"stats": {
							"by_status": {
								"callback": 3,
								"cancelled": 0,
								"dialing": 5,
								"dnc": 9,
								"done": 120,
								"failed": 6,
								"invalid": 1,
								"pending": 812,
								"scheduled": 40,
								"skipped": 4
							},
							"finished": 140,
							"live": {
								"connected": 1,
								"dialing": 2,
								"ringing": 2
							},
							"total": 1000
						},
						"updated_at": "2026-11-02T07:00:00.000Z"
					}
				],
				"properties": {
					"amd": {
						"$ref": "#/components/schemas/CampaignAmd"
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"caller_id": {
						"description": "The number presented to contacts; null: the connection's default.",
						"type": [
							"string",
							"null"
						]
					},
					"calls_per_second": {
						"description": "New calls per second; 0: only the connection limits it.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"completed_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "A connection ID (prefix `conn_`).",
								"examples": [
									"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The SIP connection it dials through; null: the default one."
					},
					"created_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"disclosure": {
						"$ref": "#/components/schemas/CampaignDisclosure"
					},
					"dispositions": {
						"description": "Outcomes the assistant can record.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"first_message": {
						"description": "Overrides the assistant's first message ({{variables}} allowed); empty: the assistant's.",
						"type": "string"
					},
					"id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"max_concurrent": {
						"description": "Simultaneous calls this campaign may hold.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "campaign",
						"type": "string"
					},
					"opt_out_dtmf_key": {
						"description": "The key that opts a contact out; null: the organisation's.",
						"type": [
							"string",
							"null"
						]
					},
					"pause_reason": {
						"description": "Why the campaign paused itself (for example, the national registry can't check it).",
						"type": [
							"string",
							"null"
						]
					},
					"priority": {
						"description": "1–10; higher is served first when campaigns compete for lines.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"purpose": {
						"description": "marketing needs recorded consent with evidence (§30A) and a national-registry check for Israeli numbers.",
						"enum": [
							"marketing",
							"service",
							"survey"
						],
						"type": "string"
					},
					"retry": {
						"$ref": "#/components/schemas/CampaignRetry"
					},
					"ring_timeout_seconds": {
						"description": "Hang up an unanswered call after this long.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"schedule": {
						"$ref": "#/components/schemas/CampaignSchedule"
					},
					"script": {
						"description": "Extra instructions for this campaign ({{variables}} allowed).",
						"type": "string"
					},
					"started_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"state": {
						"description": "draft → running ⇄ paused → completed | cancelled (scheduled: waits for schedule.start_at).",
						"enum": [
							"draft",
							"scheduled",
							"running",
							"paused",
							"completed",
							"cancelled"
						],
						"type": "string"
					},
					"stats": {
						"$ref": "#/components/schemas/CampaignStats"
					},
					"updated_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"state",
					"purpose",
					"assistant_id",
					"connection_id",
					"caller_id",
					"priority",
					"max_concurrent",
					"calls_per_second",
					"schedule",
					"ring_timeout_seconds",
					"retry",
					"amd",
					"disclosure",
					"first_message",
					"script",
					"dispositions",
					"opt_out_dtmf_key",
					"pause_reason",
					"stats",
					"created_at",
					"updated_at",
					"started_at",
					"completed_at"
				],
				"type": "object"
			},
			"CampaignActionParamsInput": {
				"additionalProperties": false,
				"description": "No parameters.",
				"examples": [
					{}
				],
				"properties": {},
				"type": "object"
			},
			"CampaignAmd": {
				"description": "Answering-machine detection.",
				"properties": {
					"message": {
						"description": "The voicemail message (leave_message).",
						"type": "string"
					},
					"mode": {
						"description": "Answering-machine detection: off, hang up on a machine, or leave `message`.",
						"enum": [
							"off",
							"hangup",
							"leave_message"
						],
						"type": "string"
					}
				},
				"required": [
					"mode",
					"message"
				],
				"type": "object"
			},
			"CampaignAttempt": {
				"description": "One dial attempt of a campaign contact.",
				"properties": {
					"answered_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"attempt_number": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"call_id": {
						"anyOf": [
							{
								"description": "A call ID (prefix `call_`).",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"contact_id": {
						"description": "A contact ID (prefix `ctc_`).",
						"examples": [
							"ctc_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^ctc_[0-9A-Za-z]+$",
						"type": "string"
					},
					"disposition": {
						"type": [
							"string",
							"null"
						]
					},
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"end_reason": {
						"type": [
							"string",
							"null"
						]
					},
					"ended_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"id": {
						"description": "A attempt ID (prefix `att_`).",
						"examples": [
							"att_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^att_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "campaign_attempt",
						"type": "string"
					},
					"phone": {
						"type": "string"
					},
					"result": {
						"description": "The result: answered, voicemail, voicemail_left, busy, no_answer, declined, invalid, failed, opted_out, interrupted, not_dialled.",
						"type": [
							"string",
							"null"
						]
					},
					"ring_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"ringing_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"sip_status": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"started_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"status": {
						"description": "dialing, ringing, connected or done.",
						"type": "string"
					},
					"talk_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"campaign_id",
					"contact_id",
					"call_id",
					"attempt_number",
					"phone",
					"status",
					"result",
					"sip_status",
					"end_reason",
					"disposition",
					"started_at",
					"ringing_at",
					"answered_at",
					"ended_at",
					"ring_ms",
					"talk_ms",
					"duration_ms"
				],
				"type": "object"
			},
			"CampaignAttemptList": {
				"description": "A contact's dial attempts, newest first.",
				"examples": [
					{
						"data": [
							{
								"answered_at": "2026-11-02T09:14:09.900Z",
								"attempt_number": 1,
								"call_id": "call_3Hk9PqR2sT",
								"campaign_id": "cmp_2Yb7mCq9aPLk",
								"contact_id": "ctc_1aB2cD3eF4g",
								"disposition": "interested",
								"duration_ms": 210000,
								"end_reason": "assistant-ended",
								"ended_at": "2026-11-02T09:17:30.000Z",
								"id": "att_4dE5fG6hJ7",
								"livemode": true,
								"object": "campaign_attempt",
								"phone": "+972501234567",
								"result": "answered",
								"ring_ms": 8700,
								"ringing_at": "2026-11-02T09:14:01.200Z",
								"sip_status": 200,
								"started_at": "2026-11-02T09:14:00.000Z",
								"status": "done",
								"talk_ms": 200100
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/campaigns/cmp_2Yb7mCq9aPLk/contacts/ctc_1aB2cD3eF4g/attempts"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/CampaignAttempt"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CampaignBlockedEvent": {
				"description": "A campaign cannot dial right now: outside its calling window, Shabbat or a holiday, or a compliance gate.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.blocked"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.blocked` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.blocked",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignCancelledEvent": {
				"description": "A campaign was cancelled.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.cancelled"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.cancelled` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.cancelled",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignCompletedEvent": {
				"description": "A campaign finished: every contact reached a final state.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.completed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.completed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.completed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignContact": {
				"description": "A contact in a campaign, with its dialling state and result.",
				"examples": [
					{
						"attempts": 1,
						"campaign_id": "cmp_2Yb7mCq9aPLk",
						"completed_at": "2026-11-02T09:17:30.000Z",
						"consent": true,
						"created_at": "2026-11-01T08:00:00.000Z",
						"id": "ctc_1aB2cD3eF4g",
						"last_attempt_at": "2026-11-02T09:14:00.000Z",
						"last_call_id": "call_3Hk9PqR2sT",
						"last_result": "answered",
						"livemode": true,
						"name": "Dana Levi",
						"next_attempt_at": null,
						"object": "campaign_contact",
						"outcome": "interested",
						"outcome_data": {
							"notes": "Wants the annual plan"
						},
						"phone": "+972501234567",
						"row": 2,
						"skip_reason": null,
						"status": "done",
						"timezone": null,
						"updated_at": "2026-11-02T09:17:30.000Z",
						"variables": {
							"plan": "Gold"
						}
					}
				],
				"properties": {
					"attempts": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"completed_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"consent": {
						"description": "The import said the person consented. Marketing calls also need a consent record with evidence (§30A).",
						"type": "boolean"
					},
					"created_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"id": {
						"description": "A contact ID (prefix `ctc_`).",
						"examples": [
							"ctc_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^ctc_[0-9A-Za-z]+$",
						"type": "string"
					},
					"last_attempt_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"last_call_id": {
						"anyOf": [
							{
								"description": "A call ID (prefix `call_`).",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"last_result": {
						"description": "The last attempt's result (answered, no_answer, busy, voicemail, …).",
						"type": [
							"string",
							"null"
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"next_attempt_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When it is due (dialable statuses only)."
					},
					"object": {
						"const": "campaign_contact",
						"type": "string"
					},
					"outcome": {
						"description": "The disposition the assistant recorded.",
						"type": [
							"string",
							"null"
						]
					},
					"outcome_data": {
						"anyOf": [
							{
								"additionalProperties": {},
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							{
								"type": "null"
							}
						]
					},
					"phone": {
						"description": "E.164.",
						"type": "string"
					},
					"row": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "The row it came from in its import."
					},
					"skip_reason": {
						"description": "Why it is not dialled: dnc_import, dnc_dial_time, registry, no_consent, no_consent_evidence, no_calling_window, manual, …",
						"type": [
							"string",
							"null"
						]
					},
					"status": {
						"description": "pending → dialing → scheduled | callback → … → done | failed; skipped, dnc, invalid and cancelled are never dialled.",
						"enum": [
							"pending",
							"scheduled",
							"callback",
							"dialing",
							"done",
							"failed",
							"dnc",
							"skipped",
							"invalid",
							"cancelled"
						],
						"type": "string"
					},
					"timezone": {
						"type": [
							"string",
							"null"
						]
					},
					"updated_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"variables": {
						"additionalProperties": {
							"type": "string"
						},
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"campaign_id",
					"phone",
					"name",
					"variables",
					"timezone",
					"consent",
					"status",
					"skip_reason",
					"attempts",
					"next_attempt_at",
					"last_result",
					"outcome",
					"outcome_data",
					"last_call_id",
					"last_attempt_at",
					"completed_at",
					"row",
					"created_at",
					"updated_at"
				],
				"type": "object"
			},
			"CampaignContactList": {
				"description": "A page of a campaign's contacts, newest first.",
				"examples": [
					{
						"data": [],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/campaigns/cmp_2Yb7mCq9aPLk/contacts"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/CampaignContact"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CampaignCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new campaign (state draft). Unset fields take the defaults the dashboard uses.",
				"examples": [
					{
						"assistant_id": "asst_3kTzL9Qe2R",
						"name": "November renewals",
						"purpose": "marketing",
						"retry": {
							"busy": {
								"delay_minutes": 30
							},
							"max_attempts": 3,
							"no_answer": {
								"delay_minutes": 240
							}
						},
						"schedule": {
							"respect_shabbat": true,
							"timezone": "Asia/Jerusalem",
							"windows": [
								{
									"days": [
										"sun",
										"mon",
										"tue",
										"wed",
										"thu"
									],
									"end": "19:00",
									"start": "09:00"
								}
							]
						}
					}
				],
				"properties": {
					"amd": {
						"additionalProperties": false,
						"properties": {
							"message": {
								"maxLength": 1000,
								"type": "string"
							},
							"mode": {
								"enum": [
									"off",
									"hangup",
									"leave_message"
								],
								"type": "string"
							}
						},
						"type": "object"
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"caller_id": {
						"anyOf": [
							{
								"maxLength": 32,
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"calls_per_second": {
						"maximum": 100,
						"minimum": 0,
						"type": "integer"
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "A connection ID (`conn_…`).",
								"maxLength": 200,
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"disclosure": {
						"additionalProperties": false,
						"properties": {
							"enabled": {
								"description": "null: the organisation's default (on for marketing). A marketing campaign can't turn it off through the API.",
								"type": [
									"boolean",
									"null"
								]
							},
							"text": {
								"maxLength": 1000,
								"type": "string"
							}
						},
						"type": "object"
					},
					"dispositions": {
						"items": {
							"maxLength": 60,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"first_message": {
						"description": "Overrides the assistant's first message. {{variables}} come from the contacts' variables, name and phone.",
						"maxLength": 2000,
						"type": "string"
					},
					"max_concurrent": {
						"maximum": 500,
						"minimum": 1,
						"type": "integer"
					},
					"name": {
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"opt_out_dtmf_key": {
						"anyOf": [
							{
								"pattern": "^[0-9*#]$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"priority": {
						"maximum": 10,
						"minimum": 1,
						"type": "integer"
					},
					"purpose": {
						"description": "Required on create: marketing, service or survey. It decides the compliance checks.",
						"enum": [
							"marketing",
							"service",
							"survey"
						],
						"type": "string"
					},
					"retry": {
						"additionalProperties": false,
						"properties": {
							"busy": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"declined": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"failed": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"max_attempts": {
								"maximum": 20,
								"minimum": 1,
								"type": "integer"
							},
							"no_answer": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"voicemail": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							}
						},
						"type": "object"
					},
					"ring_timeout_seconds": {
						"maximum": 120,
						"minimum": 5,
						"type": "integer"
					},
					"schedule": {
						"additionalProperties": false,
						"properties": {
							"end_at": {
								"anyOf": [
									{
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"respect_holidays": {
								"description": "Never dial on Jewish holidays. Like respect_shabbat, it can only add to the organisation's setting.",
								"type": "boolean"
							},
							"respect_shabbat": {
								"description": "Never dial on Shabbat. The organisation's compliance settings enforce Shabbat for every campaign by default; this flag can add the restriction, never remove it.",
								"type": "boolean"
							},
							"start_at": {
								"anyOf": [
									{
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"timezone": {
								"description": "IANA time zone of the windows and of contacts without their own, e.g. Asia/Jerusalem.",
								"maxLength": 64,
								"minLength": 1,
								"type": "string"
							},
							"windows": {
								"items": {
									"$ref": "#/components/schemas/CallingWindowInput"
								},
								"maxItems": 14,
								"type": "array"
							}
						},
						"type": "object"
					},
					"script": {
						"description": "Extra instructions for the assistant. {{variables}} come from the contacts' variables, name and phone.",
						"maxLength": 10000,
						"type": "string"
					}
				},
				"required": [
					"name",
					"purpose"
				],
				"type": "object"
			},
			"CampaignDisclosure": {
				"description": "The AI and recording disclosure played at the start of each call.",
				"properties": {
					"enabled": {
						"description": "Play the AI / recording disclosure before the first message. null: the organisation's default (on for marketing).",
						"type": [
							"boolean",
							"null"
						]
					},
					"text": {
						"description": "The disclosure text; empty: the organisation's.",
						"type": "string"
					}
				},
				"required": [
					"enabled",
					"text"
				],
				"type": "object"
			},
			"CampaignList": {
				"description": "A page of campaigns, newest first.",
				"examples": [
					{
						"data": [
							{
								"amd": {
									"message": "",
									"mode": "off"
								},
								"assistant_id": "asst_3kTzL9Qe2R",
								"caller_id": "+97235550100",
								"calls_per_second": 0,
								"completed_at": null,
								"connection_id": "conn_8DbH2nXy",
								"created_at": "2026-11-01T08:00:00.000Z",
								"disclosure": {
									"enabled": null,
									"text": ""
								},
								"dispositions": [
									"interested",
									"not-interested",
									"callback-requested"
								],
								"first_message": "",
								"id": "cmp_2Yb7mCq9aPLk",
								"livemode": true,
								"max_concurrent": 10,
								"name": "November renewals",
								"object": "campaign",
								"opt_out_dtmf_key": null,
								"pause_reason": null,
								"priority": 5,
								"purpose": "marketing",
								"retry": {
									"busy": {
										"delay_minutes": 15,
										"enabled": true
									},
									"declined": {
										"delay_minutes": 240,
										"enabled": false
									},
									"failed": {
										"delay_minutes": 10,
										"enabled": true
									},
									"max_attempts": 3,
									"no_answer": {
										"delay_minutes": 60,
										"enabled": true
									},
									"voicemail": {
										"delay_minutes": 120,
										"enabled": true
									}
								},
								"ring_timeout_seconds": 30,
								"schedule": {
									"end_at": null,
									"respect_holidays": true,
									"respect_shabbat": true,
									"start_at": null,
									"timezone": "Asia/Jerusalem",
									"windows": [
										{
											"days": [
												"sun",
												"mon",
												"tue",
												"wed",
												"thu"
											],
											"end": "20:00",
											"start": "09:00"
										},
										{
											"days": [
												"fri"
											],
											"end": "13:00",
											"start": "09:00"
										}
									]
								},
								"script": "Offer the {{plan}} renewal at the loyalty price.",
								"started_at": "2026-11-02T07:00:00.000Z",
								"state": "running",
								"stats": {
									"by_status": {
										"callback": 3,
										"cancelled": 0,
										"dialing": 5,
										"dnc": 9,
										"done": 120,
										"failed": 6,
										"invalid": 1,
										"pending": 812,
										"scheduled": 40,
										"skipped": 4
									},
									"finished": 140,
									"live": {
										"connected": 1,
										"dialing": 2,
										"ringing": 2
									},
									"total": 1000
								},
								"updated_at": "2026-11-02T07:00:00.000Z"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/campaigns"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Campaign"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CampaignPausedEvent": {
				"description": "A campaign was paused.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.paused"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.paused` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.paused",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignPreflight": {
				"description": "The checks a start runs, without starting: the same checks as the dashboard's Start button.",
				"examples": [
					{
						"campaign_id": "cmp_2Yb7mCq9aPLk",
						"dialable": 852,
						"errors": [],
						"next_window_at": "2026-11-02T09:00:00.000Z",
						"object": "campaign_preflight",
						"ok": true,
						"warnings": [
							"12 contact(s) have no recorded marketing consent and will be skipped"
						],
						"window_open": true
					}
				],
				"properties": {
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"dialable": {
						"description": "Contacts the dialer may call.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"errors": {
						"description": "What blocks the start (missing assistant or connection, no contacts, no marketing consent, no registry, …).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"next_window_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When calling is next allowed; null if never in the next 3 weeks."
					},
					"object": {
						"const": "campaign_preflight",
						"type": "string"
					},
					"ok": {
						"description": "No errors: the campaign can start.",
						"type": "boolean"
					},
					"warnings": {
						"description": "What the dialer will skip or delay (contacts without consent, outside calling hours now, …).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"window_open": {
						"description": "Calling is allowed right now (calling hours, Shabbat, holidays).",
						"type": "boolean"
					}
				},
				"required": [
					"object",
					"campaign_id",
					"ok",
					"errors",
					"warnings",
					"dialable",
					"window_open",
					"next_window_at"
				],
				"type": "object"
			},
			"CampaignResults": {
				"description": "A campaign's results: contacts per status, attempts per result, dispositions and compliance skips.",
				"examples": [
					{
						"attempts": {
							"average_ring_seconds": 11.4,
							"by_result": {
								"answered": 128,
								"busy": 22,
								"no_answer": 140,
								"voicemail": 20
							},
							"talk_seconds": 9120,
							"total": 310
						},
						"campaign_id": "cmp_2Yb7mCq9aPLk",
						"contacts": {
							"by_status": {
								"callback": 3,
								"cancelled": 0,
								"dialing": 5,
								"dnc": 9,
								"done": 120,
								"failed": 6,
								"invalid": 1,
								"pending": 812,
								"scheduled": 40,
								"skipped": 4
							},
							"finished": 140,
							"live": {
								"connected": 1,
								"dialing": 2,
								"ringing": 2
							},
							"total": 1000
						},
						"livemode": true,
						"object": "campaign_stats",
						"outcomes": {
							"interested": 41,
							"not-interested": 60
						},
						"skip_reasons": {
							"dnc_import": 7,
							"no_consent": 4,
							"registry": 2
						}
					}
				],
				"properties": {
					"attempts": {
						"properties": {
							"average_ring_seconds": {
								"description": "Average ringing time of the attempts.",
								"type": [
									"number",
									"null"
								]
							},
							"by_result": {
								"additionalProperties": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"description": "Attempts per result (answered, no_answer, busy, voicemail, …).",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							"talk_seconds": {
								"description": "Total talk time.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"total": {
								"description": "Dial attempts made.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"total",
							"talk_seconds",
							"average_ring_seconds",
							"by_result"
						],
						"type": "object"
					},
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"contacts": {
						"$ref": "#/components/schemas/CampaignStats"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "campaign_stats",
						"type": "string"
					},
					"outcomes": {
						"additionalProperties": {
							"maximum": 9007199254740991,
							"minimum": -9007199254740991,
							"type": "integer"
						},
						"description": "Contacts per recorded disposition (interested, not-interested, …).",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"skip_reasons": {
						"additionalProperties": {
							"maximum": 9007199254740991,
							"minimum": -9007199254740991,
							"type": "integer"
						},
						"description": "Contacts the compliance checks or a user took out, per reason (dnc_import, registry, no_consent, …).",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"object",
					"campaign_id",
					"livemode",
					"contacts",
					"attempts",
					"outcomes",
					"skip_reasons"
				],
				"type": "object"
			},
			"CampaignResumedEvent": {
				"description": "A paused campaign resumed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.resumed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.resumed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.resumed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignRetry": {
				"description": "Retry policy per call result.",
				"properties": {
					"busy": {
						"properties": {
							"delay_minutes": {
								"description": "Minutes before the next attempt.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"enabled": {
								"description": "Retry after this result.",
								"type": "boolean"
							}
						},
						"required": [
							"enabled",
							"delay_minutes"
						],
						"type": "object"
					},
					"declined": {
						"properties": {
							"delay_minutes": {
								"description": "Minutes before the next attempt.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"enabled": {
								"description": "Retry after this result.",
								"type": "boolean"
							}
						},
						"required": [
							"enabled",
							"delay_minutes"
						],
						"type": "object"
					},
					"failed": {
						"description": "Network or carrier errors and interrupted calls.",
						"properties": {
							"delay_minutes": {
								"description": "Minutes before the next attempt.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"enabled": {
								"description": "Retry after this result.",
								"type": "boolean"
							}
						},
						"required": [
							"enabled",
							"delay_minutes"
						],
						"type": "object"
					},
					"max_attempts": {
						"description": "Total dial attempts per contact, the first one included.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"no_answer": {
						"properties": {
							"delay_minutes": {
								"description": "Minutes before the next attempt.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"enabled": {
								"description": "Retry after this result.",
								"type": "boolean"
							}
						},
						"required": [
							"enabled",
							"delay_minutes"
						],
						"type": "object"
					},
					"voicemail": {
						"description": "An answering machine was detected.",
						"properties": {
							"delay_minutes": {
								"description": "Minutes before the next attempt.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"enabled": {
								"description": "Retry after this result.",
								"type": "boolean"
							}
						},
						"required": [
							"enabled",
							"delay_minutes"
						],
						"type": "object"
					}
				},
				"required": [
					"max_attempts",
					"busy",
					"no_answer",
					"voicemail",
					"declined",
					"failed"
				],
				"type": "object"
			},
			"CampaignSchedule": {
				"description": "When the campaign dials.",
				"properties": {
					"end_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Stop dialling after this time."
					},
					"respect_holidays": {
						"description": "Never dial on Jewish holidays. Like respect_shabbat, it can only add to the organisation's setting.",
						"type": "boolean"
					},
					"respect_shabbat": {
						"description": "Never dial on Shabbat. The organisation's compliance settings enforce Shabbat for every campaign by default; this flag can add the restriction, never remove it.",
						"type": "boolean"
					},
					"start_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Planned start; null to start when started."
					},
					"timezone": {
						"description": "IANA time zone of the windows and of contacts without their own, e.g. Asia/Jerusalem.",
						"maxLength": 64,
						"minLength": 1,
						"type": "string"
					},
					"windows": {
						"description": "When the campaign may dial. The organisation's calling hours apply on top: a call happens only inside both.",
						"items": {
							"$ref": "#/components/schemas/CallingWindow"
						},
						"maxItems": 14,
						"type": "array"
					}
				},
				"required": [
					"timezone",
					"windows",
					"respect_shabbat",
					"respect_holidays",
					"start_at",
					"end_at"
				],
				"type": "object"
			},
			"CampaignStartParamsInput": {
				"additionalProperties": false,
				"description": "Optional start time.",
				"examples": [
					{},
					{
						"start_at": "2026-11-03T09:00:00+02:00"
					}
				],
				"properties": {
					"start_at": {
						"anyOf": [
							{
								"examples": [
									"2026-11-03T09:00:00+02:00"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Start later: the campaign is scheduled and starts dialling at this time."
					}
				},
				"type": "object"
			},
			"CampaignStartedEvent": {
				"description": "A campaign started dialling.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "campaign.started"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `campaign.started` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"counts": {
										"additionalProperties": {
											"type": "number"
										},
										"propertyNames": {
											"type": "string"
										},
										"type": "object"
									},
									"detail": {
										"description": "A readable explanation next to `reason`.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^cmp_[0-9A-Za-z]+$",
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"next_open_at": {
										"description": "campaign.blocked: when the calling window opens again.",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "campaign",
										"type": "string"
									},
									"paused_by": {
										"anyOf": [
											{
												"enum": [
													"user",
													"api",
													"system",
													"compliance"
												],
												"type": "string"
											},
											{
												"type": "null"
											}
										],
										"description": "Who paused it (campaign.paused)."
									},
									"purpose": {
										"type": [
											"string",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "campaign.started",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"CampaignStats": {
				"description": "Contact counts per status and the calls in progress.",
				"properties": {
					"by_status": {
						"description": "Contacts per status.",
						"properties": {
							"callback": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"cancelled": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"dialing": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"dnc": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"done": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"failed": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"invalid": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"pending": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"scheduled": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"skipped": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"pending",
							"scheduled",
							"callback",
							"dialing",
							"done",
							"failed",
							"dnc",
							"skipped",
							"invalid",
							"cancelled"
						],
						"type": "object"
					},
					"finished": {
						"description": "Contacts that will not be dialled again (done, failed, do-not-call, skipped, invalid, cancelled).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"live": {
						"description": "Calls in progress right now (this server's dialer).",
						"properties": {
							"connected": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"dialing": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"ringing": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"dialing",
							"ringing",
							"connected"
						],
						"type": "object"
					},
					"total": {
						"description": "Contacts in the campaign.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"total",
					"finished",
					"by_status",
					"live"
				],
				"type": "object"
			},
			"CampaignUpdateParamsInput": {
				"additionalProperties": false,
				"description": "Fields to change; nested objects (schedule, retry, amd, disclosure) are merged. A completed or cancelled campaign can't be changed, and a running one must be paused to change its purpose.",
				"examples": [
					{
						"max_concurrent": 20,
						"schedule": {
							"end_at": "2026-11-30T18:00:00+02:00"
						}
					}
				],
				"properties": {
					"amd": {
						"additionalProperties": false,
						"properties": {
							"message": {
								"maxLength": 1000,
								"type": "string"
							},
							"mode": {
								"enum": [
									"off",
									"hangup",
									"leave_message"
								],
								"type": "string"
							}
						},
						"type": "object"
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"caller_id": {
						"anyOf": [
							{
								"maxLength": 32,
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"calls_per_second": {
						"maximum": 100,
						"minimum": 0,
						"type": "integer"
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "A connection ID (`conn_…`).",
								"maxLength": 200,
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"disclosure": {
						"additionalProperties": false,
						"properties": {
							"enabled": {
								"description": "null: the organisation's default (on for marketing). A marketing campaign can't turn it off through the API.",
								"type": [
									"boolean",
									"null"
								]
							},
							"text": {
								"maxLength": 1000,
								"type": "string"
							}
						},
						"type": "object"
					},
					"dispositions": {
						"items": {
							"maxLength": 60,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"first_message": {
						"description": "Overrides the assistant's first message. {{variables}} come from the contacts' variables, name and phone.",
						"maxLength": 2000,
						"type": "string"
					},
					"max_concurrent": {
						"maximum": 500,
						"minimum": 1,
						"type": "integer"
					},
					"name": {
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"opt_out_dtmf_key": {
						"anyOf": [
							{
								"pattern": "^[0-9*#]$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"priority": {
						"maximum": 10,
						"minimum": 1,
						"type": "integer"
					},
					"purpose": {
						"description": "Required on create: marketing, service or survey. It decides the compliance checks.",
						"enum": [
							"marketing",
							"service",
							"survey"
						],
						"type": "string"
					},
					"retry": {
						"additionalProperties": false,
						"properties": {
							"busy": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"declined": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"failed": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"max_attempts": {
								"maximum": 20,
								"minimum": 1,
								"type": "integer"
							},
							"no_answer": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							},
							"voicemail": {
								"additionalProperties": false,
								"properties": {
									"delay_minutes": {
										"maximum": 20160,
										"minimum": 1,
										"type": "integer"
									},
									"enabled": {
										"type": "boolean"
									}
								},
								"type": "object"
							}
						},
						"type": "object"
					},
					"ring_timeout_seconds": {
						"maximum": 120,
						"minimum": 5,
						"type": "integer"
					},
					"schedule": {
						"additionalProperties": false,
						"properties": {
							"end_at": {
								"anyOf": [
									{
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"respect_holidays": {
								"description": "Never dial on Jewish holidays. Like respect_shabbat, it can only add to the organisation's setting.",
								"type": "boolean"
							},
							"respect_shabbat": {
								"description": "Never dial on Shabbat. The organisation's compliance settings enforce Shabbat for every campaign by default; this flag can add the restriction, never remove it.",
								"type": "boolean"
							},
							"start_at": {
								"anyOf": [
									{
										"examples": [
											"2026-11-03T09:00:00+02:00"
										],
										"format": "date-time",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"timezone": {
								"description": "IANA time zone of the windows and of contacts without their own, e.g. Asia/Jerusalem.",
								"maxLength": 64,
								"minLength": 1,
								"type": "string"
							},
							"windows": {
								"items": {
									"$ref": "#/components/schemas/CallingWindowInput"
								},
								"maxItems": 14,
								"type": "array"
							}
						},
						"type": "object"
					},
					"script": {
						"description": "Extra instructions for the assistant. {{variables}} come from the contacts' variables, name and phone.",
						"maxLength": 10000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"CliToolResult": {
				"description": "The answer reached the call.",
				"examples": [
					{
						"accepted": true,
						"id": "clitc_7cJ9kL4mP2qR5sT8uV1wXy",
						"object": "cli_tool_result",
						"session_id": "clis_5bH8jK3mN6pQ9rT2vW4xYz"
					}
				],
				"properties": {
					"accepted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"pattern": "^clitc_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "cli_tool_result",
						"type": "string"
					},
					"session_id": {
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"session_id",
					"accepted"
				],
				"type": "object"
			},
			"CliToolResultParamsInput": {
				"additionalProperties": false,
				"description": "Your local tool server's answer to a relayed tool call.",
				"examples": [
					{
						"body": "{\"status\":\"shipped\"}",
						"id": "clitc_7cJ9kL4mP2qR5sT8uV1wXy",
						"status": 200
					}
				],
				"properties": {
					"body": {
						"description": "Your local server's response body, as is (the tool's answer).",
						"maxLength": 1048576,
						"type": "string"
					},
					"error": {
						"description": "Your local server could not be reached: the tool call fails with this message.",
						"maxLength": 500,
						"type": "string"
					},
					"headers": {
						"additionalProperties": {
							"maxLength": 2000,
							"type": "string"
						},
						"description": "Your local server's response headers (informational).",
						"propertyNames": {
							"maxLength": 100,
							"type": "string"
						},
						"type": "object"
					},
					"id": {
						"description": "The `tool_call` frame's `id`.",
						"maxLength": 64,
						"pattern": "^clitc_[0-9A-Za-z]+$",
						"type": "string"
					},
					"status": {
						"description": "Your local server's HTTP status (default 200).",
						"maximum": 599,
						"minimum": 100,
						"type": "integer"
					}
				},
				"required": [
					"id"
				],
				"type": "object"
			},
			"ClientToken": {
				"description": "A short-lived, single-use token a browser uses to start one call (the @morevoice/web SDK takes it as `token`). Mint it on your server: it keeps your secret key off the page.",
				"examples": [
					{
						"agent_user_id": null,
						"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
						"call_id": "call_3slqGaD2htUzxdRsI",
						"expires_at": "2026-11-03T09:19:22.000Z",
						"livemode": true,
						"object": "client_token",
						"origin": "https://shop.example",
						"token": "<client_token: short-lived JWT, pass it through unchanged>",
						"ws_url": "wss://api.morevoice.ai/ws/call"
					}
				],
				"properties": {
					"agent_user_id": {
						"anyOf": [
							{
								"description": "A user ID (prefix `usr_`).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"call_id": {
						"description": "The call the token opens (the same ID the call will have).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"expires_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "client_token",
						"type": "string"
					},
					"origin": {
						"description": "The website the token is bound to, or null.",
						"type": [
							"string",
							"null"
						]
					},
					"token": {
						"description": "The client token (a signed JWT). Give it to the browser; it opens one call, once, before `expires_at`.",
						"type": "string"
					},
					"ws_url": {
						"description": "Where the browser connects: `<ws_url>?client_token=<token>` (the @morevoice/web SDK does it for you).",
						"type": "string"
					}
				},
				"required": [
					"object",
					"token",
					"expires_at",
					"call_id",
					"assistant_id",
					"agent_user_id",
					"origin",
					"livemode",
					"ws_url"
				],
				"type": "object"
			},
			"ClientTokenCreateParamsInput": {
				"description": "What the token opens: one call to one assistant (or one agent softphone).",
				"examples": [
					{
						"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
						"metadata": {
							"crm_contact_id": "0031x00000AbCdE"
						},
						"origin": "https://shop.example",
						"ttl_s": 300
					}
				],
				"properties": {
					"agent_user_id": {
						"description": "The agent whose softphone the token opens (the embeddable softphone; `/ws/call` refuses agent tokens).",
						"maxLength": 200,
						"pattern": "^usr_[0-9A-Za-z]+$",
						"type": "string"
					},
					"assistant_id": {
						"description": "The assistant the browser will talk to.",
						"maxLength": 200,
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput",
						"description": "Stored on the call (`metadata`), as on POST /v1/calls."
					},
					"origin": {
						"description": "The only website the token works from (`https://shop.example`): the browser's Origin must match. Strongly recommended. http is accepted for localhost only.",
						"maxLength": 300,
						"pattern": "^(https:\\/\\/[^/\\s?#]+|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d{1,5})?)\\/?$",
						"type": "string"
					},
					"ttl_s": {
						"default": 300,
						"description": "How long the token can be used to start the call, in seconds (300–900, default 300). The call itself may run longer.",
						"maximum": 900,
						"minimum": 300,
						"type": "integer"
					}
				},
				"type": "object"
			},
			"ConferenceInviteBatch": {
				"description": "Invitations emailed with the room's guest link, phone dial-in and a calendar file.",
				"examples": [
					{
						"livemode": true,
						"object": "conference_invite_batch",
						"results": [
							{
								"email": "dana@example.com",
								"error": null,
								"status": "sent"
							}
						],
						"room_id": "room_2dXk9QmZ4rTv",
						"sent": 1
					}
				],
				"properties": {
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "conference_invite_batch",
						"type": "string"
					},
					"results": {
						"items": {
							"properties": {
								"email": {
									"type": "string"
								},
								"error": {
									"type": [
										"string",
										"null"
									]
								},
								"status": {
									"description": "`sent`, or why it was not.",
									"type": "string"
								}
							},
							"required": [
								"email",
								"status",
								"error"
							],
							"type": "object"
						},
						"type": "array"
					},
					"room_id": {
						"description": "A conference room ID (prefix `room_`).",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"sent": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"object",
					"livemode",
					"room_id",
					"sent",
					"results"
				],
				"type": "object"
			},
			"ConferenceLive": {
				"description": "Who is in the room right now.",
				"examples": [
					{
						"active": true,
						"livemode": true,
						"locked": false,
						"object": "conference_live",
						"participants": [
							{
								"held": false,
								"joined_at": "2026-11-03T08:01:10.000Z",
								"kind": "guest",
								"muted": false,
								"name": "Dana",
								"participant_id": "g7Hk2pQx",
								"phone": null,
								"role": "member",
								"state": "connected",
								"talking": false,
								"user_id": null
							}
						],
						"recording": true,
						"room_id": "room_2dXk9QmZ4rTv",
						"session_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"started_at": "2026-11-03T08:00:40.000Z"
					}
				],
				"properties": {
					"active": {
						"description": "A session is in progress.",
						"type": "boolean"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"locked": {
						"type": "boolean"
					},
					"object": {
						"const": "conference_live",
						"type": "string"
					},
					"participants": {
						"items": {
							"properties": {
								"held": {
									"type": "boolean"
								},
								"joined_at": {
									"anyOf": [
										{
											"description": "An ISO-8601 timestamp in UTC.",
											"examples": [
												"2026-11-03T09:14:22.000Z"
											],
											"format": "date-time",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"kind": {
									"description": "`guest` (web link), `agent` (a member), `external` (phone), `supervisor` or `ai`.",
									"type": "string"
								},
								"muted": {
									"type": "boolean"
								},
								"name": {
									"type": "string"
								},
								"participant_id": {
									"description": "The participant's id in this session (moderate with it).",
									"type": "string"
								},
								"phone": {
									"type": [
										"string",
										"null"
									]
								},
								"role": {
									"enum": [
										"moderator",
										"member"
									],
									"type": "string"
								},
								"state": {
									"enum": [
										"ringing",
										"connected",
										"left",
										"failed"
									],
									"type": "string"
								},
								"talking": {
									"type": "boolean"
								},
								"user_id": {
									"anyOf": [
										{
											"description": "A user ID (prefix `usr_`).",
											"examples": [
												"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^usr_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								}
							},
							"required": [
								"participant_id",
								"kind",
								"name",
								"user_id",
								"phone",
								"role",
								"muted",
								"held",
								"talking",
								"state",
								"joined_at"
							],
							"type": "object"
						},
						"type": "array"
					},
					"recording": {
						"type": "boolean"
					},
					"room_id": {
						"description": "A conference room ID (prefix `room_`).",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"session_id": {
						"anyOf": [
							{
								"description": "The session's call record (its recording, transcript and AI notes).",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"started_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"object",
					"livemode",
					"room_id",
					"active",
					"session_id",
					"started_at",
					"locked",
					"recording",
					"participants"
				],
				"type": "object"
			},
			"ConferenceRoom": {
				"description": "A conference room: a web link for guests, optional phone dial-in with a PIN, and moderator controls.",
				"examples": [
					{
						"active": true,
						"created": "2026-11-01T09:14:22.000Z",
						"dial_in": [
							"+97233761234"
						],
						"has_moderator_pin": false,
						"has_pin": true,
						"id": "room_2dXk9QmZ4rTv",
						"live": null,
						"livemode": true,
						"name": "Weekly sales sync",
						"object": "conference_room",
						"owner_id": null,
						"pin_length": 4,
						"schedule": {
							"end_at": "2026-11-03T08:30:00.000Z",
							"recurrence": "weekly",
							"start_at": "2026-11-03T08:00:00.000Z",
							"timezone": "Asia/Jerusalem"
						},
						"settings": {
							"ai_note_taker": true,
							"announce": true,
							"description": "",
							"language": "he",
							"lock_on_start": false,
							"max_participants": 20,
							"mute_on_entry": false,
							"record": true,
							"transcribe": true,
							"wait_for_moderator": false
						},
						"updated": "2026-11-01T09:14:22.000Z"
					}
				],
				"properties": {
					"active": {
						"description": "Switched off rooms can't be joined.",
						"type": "boolean"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"dial_in": {
						"description": "Phone numbers routed to this room (inbound routes).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"has_moderator_pin": {
						"type": "boolean"
					},
					"has_pin": {
						"description": "Phone participants need a PIN (never returned).",
						"type": "boolean"
					},
					"id": {
						"description": "A conference room ID (prefix `room_`).",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"live": {
						"anyOf": [
							{
								"properties": {
									"participants": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"started_at": {
										"description": "An ISO-8601 timestamp in UTC.",
										"examples": [
											"2026-11-03T09:14:22.000Z"
										],
										"format": "date-time",
										"type": "string"
									}
								},
								"required": [
									"started_at",
									"participants"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The session in progress, or null."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "conference_room",
						"type": "string"
					},
					"owner_id": {
						"anyOf": [
							{
								"description": "The member who owns the room, or null (created through the API).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"pin_length": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"schedule": {
						"$ref": "#/components/schemas/ConferenceRoomSchedule"
					},
					"settings": {
						"$ref": "#/components/schemas/ConferenceRoomSettings"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"name",
					"owner_id",
					"active",
					"has_pin",
					"pin_length",
					"has_moderator_pin",
					"dial_in",
					"settings",
					"schedule",
					"live",
					"created",
					"updated"
				],
				"type": "object"
			},
			"ConferenceRoomLinkParamsInput": {
				"additionalProperties": false,
				"description": "No parameters.",
				"examples": [
					{}
				],
				"properties": {},
				"type": "object"
			},
			"ConferenceRoomList": {
				"description": "A page of the organisation's active conference rooms (without their guest links).",
				"examples": [
					{
						"data": [
							{
								"active": true,
								"created": "2026-11-01T09:14:22.000Z",
								"dial_in": [
									"+97233761234"
								],
								"has_moderator_pin": false,
								"has_pin": true,
								"id": "room_2dXk9QmZ4rTv",
								"live": null,
								"livemode": true,
								"name": "Weekly sales sync",
								"object": "conference_room",
								"owner_id": null,
								"pin_length": 4,
								"schedule": {
									"end_at": "2026-11-03T08:30:00.000Z",
									"recurrence": "weekly",
									"start_at": "2026-11-03T08:00:00.000Z",
									"timezone": "Asia/Jerusalem"
								},
								"settings": {
									"ai_note_taker": true,
									"announce": true,
									"description": "",
									"language": "he",
									"lock_on_start": false,
									"max_participants": 20,
									"mute_on_entry": false,
									"record": true,
									"transcribe": true,
									"wait_for_moderator": false
								},
								"updated": "2026-11-01T09:14:22.000Z"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/conference_rooms"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/ConferenceRoom"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ConferenceRoomSchedule": {
				"description": "A scheduled room can be joined from 15 minutes before each occurrence until 2 hours after it ends.",
				"properties": {
					"end_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"recurrence": {
						"description": "`weekdays` skips Friday and Saturday.",
						"enum": [
							"none",
							"daily",
							"weekly",
							"weekdays"
						],
						"type": "string"
					},
					"start_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When the meeting starts; null: an always-open room."
					},
					"timezone": {
						"type": "string"
					}
				},
				"required": [
					"start_at",
					"end_at",
					"recurrence",
					"timezone"
				],
				"type": "object"
			},
			"ConferenceRoomSettings": {
				"properties": {
					"ai_note_taker": {
						"description": "AI meeting notes (summary, decisions, action items) when the room empties.",
						"type": "boolean"
					},
					"announce": {
						"description": "Join and leave chimes.",
						"type": "boolean"
					},
					"description": {
						"maxLength": 1000,
						"type": "string"
					},
					"language": {
						"description": "The language of the phone prompts and invitations.",
						"enum": [
							"he",
							"en"
						],
						"type": "string"
					},
					"lock_on_start": {
						"description": "Lock the room as soon as it starts: only moderators can let more people in.",
						"type": "boolean"
					},
					"max_participants": {
						"maximum": 50,
						"minimum": 2,
						"type": "integer"
					},
					"mute_on_entry": {
						"description": "Members join muted (moderators never).",
						"type": "boolean"
					},
					"record": {
						"description": "Record the sessions.",
						"type": "boolean"
					},
					"transcribe": {
						"description": "Transcribe the sessions (needed for AI notes).",
						"type": "boolean"
					},
					"wait_for_moderator": {
						"description": "Phone callers wait for a moderator before they're seated.",
						"type": "boolean"
					}
				},
				"required": [
					"record",
					"transcribe",
					"mute_on_entry",
					"announce",
					"lock_on_start",
					"max_participants",
					"ai_note_taker",
					"wait_for_moderator",
					"language",
					"description"
				],
				"type": "object"
			},
			"ConferenceRoomWithLink": {
				"description": "A conference room with its new guest link (returned only when the link is created).",
				"examples": [
					{
						"active": true,
						"created": "2026-11-01T09:14:22.000Z",
						"dial_in": [
							"+97233761234"
						],
						"has_moderator_pin": false,
						"has_pin": true,
						"id": "room_2dXk9QmZ4rTv",
						"join_url": "https://app.example.com/join/k3J9xQ2mV8pL5sT1wR7yZ4bN",
						"live": null,
						"livemode": true,
						"name": "Weekly sales sync",
						"object": "conference_room",
						"owner_id": null,
						"pin_length": 4,
						"schedule": {
							"end_at": "2026-11-03T08:30:00.000Z",
							"recurrence": "weekly",
							"start_at": "2026-11-03T08:00:00.000Z",
							"timezone": "Asia/Jerusalem"
						},
						"settings": {
							"ai_note_taker": true,
							"announce": true,
							"description": "",
							"language": "he",
							"lock_on_start": false,
							"max_participants": 20,
							"mute_on_entry": false,
							"record": true,
							"transcribe": true,
							"wait_for_moderator": false
						},
						"updated": "2026-11-01T09:14:22.000Z"
					}
				],
				"properties": {
					"active": {
						"description": "Switched off rooms can't be joined.",
						"type": "boolean"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"dial_in": {
						"description": "Phone numbers routed to this room (inbound routes).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"has_moderator_pin": {
						"type": "boolean"
					},
					"has_pin": {
						"description": "Phone participants need a PIN (never returned).",
						"type": "boolean"
					},
					"id": {
						"description": "A conference room ID (prefix `room_`).",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"join_url": {
						"description": "The guest link: anyone with it can join as a guest. Shown only now — store it.",
						"type": "string"
					},
					"live": {
						"anyOf": [
							{
								"properties": {
									"participants": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"started_at": {
										"description": "An ISO-8601 timestamp in UTC.",
										"examples": [
											"2026-11-03T09:14:22.000Z"
										],
										"format": "date-time",
										"type": "string"
									}
								},
								"required": [
									"started_at",
									"participants"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The session in progress, or null."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "conference_room",
						"type": "string"
					},
					"owner_id": {
						"anyOf": [
							{
								"description": "The member who owns the room, or null (created through the API).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"pin_length": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"schedule": {
						"$ref": "#/components/schemas/ConferenceRoomSchedule"
					},
					"settings": {
						"$ref": "#/components/schemas/ConferenceRoomSettings"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"name",
					"owner_id",
					"active",
					"has_pin",
					"pin_length",
					"has_moderator_pin",
					"dial_in",
					"settings",
					"schedule",
					"live",
					"created",
					"updated",
					"join_url"
				],
				"type": "object"
			},
			"ConferenceSession": {
				"description": "A past session of a room.",
				"examples": [
					{
						"duration_ms": 1800000,
						"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"notes": {
							"action_items": [
								"Dana: send the deck"
							],
							"decisions": [
								"Ship the pilot"
							],
							"summary": "Agreed the Q4 targets."
						},
						"object": "conference_session",
						"participants": 4,
						"started_at": "2026-11-03T08:00:40.000Z",
						"status": "ended"
					}
				],
				"properties": {
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"id": {
						"description": "The session's call record.",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"notes": {
						"anyOf": [
							{
								"additionalProperties": {},
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The AI meeting notes (summary, decisions, action items), when the note taker was on."
					},
					"object": {
						"const": "conference_session",
						"type": "string"
					},
					"participants": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"started_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"status": {
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"started_at",
					"duration_ms",
					"status",
					"participants",
					"notes"
				],
				"type": "object"
			},
			"ConferenceSessionList": {
				"description": "The room's recent sessions, newest first.",
				"examples": [
					{
						"data": [
							{
								"duration_ms": 1800000,
								"id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
								"notes": {
									"action_items": [
										"Dana: send the deck"
									],
									"decisions": [
										"Ship the pilot"
									],
									"summary": "Agreed the Q4 targets."
								},
								"object": "conference_session",
								"participants": 4,
								"started_at": "2026-11-03T08:00:40.000Z",
								"status": "ended"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/conference_rooms/room_2dXk9QmZ4rTv/history"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/ConferenceSession"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"Connection": {
				"description": "A SIP trunk or registration to your carrier. Live mode only.",
				"examples": [
					{
						"active_calls": 2,
						"answer_inbound": true,
						"auth_username": "",
						"backend": "native",
						"caller_ids": [
							"+97231234567"
						],
						"codecs": [
							"pcma",
							"pcmu"
						],
						"created": "2026-11-03T09:14:22.000Z",
						"default_caller_id": "+97231234567",
						"display_name": "",
						"enabled": true,
						"host": "sip.carrier.example.com",
						"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
						"inbound_acl": [
							"198.51.100.0/24"
						],
						"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"inbound_reserve_pct": 15,
						"livemode": true,
						"max_channels": 30,
						"max_cps": 5,
						"name": "Main trunk",
						"object": "connection",
						"overflow_policy": "busy",
						"password_set": false,
						"port": 5060,
						"register": false,
						"register_expires_seconds": 300,
						"status": {
							"error": null,
							"expires_seconds": null,
							"registered_at": null,
							"state": "listening"
						},
						"transport": "udp",
						"type": "trunk",
						"updated": "2026-11-03T09:14:22.000Z",
						"username": ""
					}
				],
				"properties": {
					"active_calls": {
						"description": "Calls on the connection right now.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"answer_inbound": {
						"description": "Answer inbound calls on this connection.",
						"type": "boolean"
					},
					"auth_username": {
						"description": "The authentication user, when it differs from `username`.",
						"type": "string"
					},
					"backend": {
						"description": "`native`: the platform's own SIP stack. `freeswitch`: FreeSWITCH in front.",
						"enum": [
							"native",
							"freeswitch"
						],
						"type": "string"
					},
					"caller_ids": {
						"description": "Numbers this connection may present as caller ID.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"codecs": {
						"description": "Audio codecs, in preference order.",
						"items": {
							"enum": [
								"pcma",
								"pcmu"
							],
							"type": "string"
						},
						"type": "array"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"default_caller_id": {
						"description": "The caller ID used when a call names none.",
						"type": "string"
					},
					"display_name": {
						"type": "string"
					},
					"enabled": {
						"description": "Disabled connections neither register nor carry calls.",
						"type": "boolean"
					},
					"host": {
						"description": "The carrier's SIP host.",
						"type": "string"
					},
					"id": {
						"description": "The connection's ID.",
						"examples": [
							"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^conn_[0-9A-Za-z]+$",
						"type": "string"
					},
					"inbound_acl": {
						"description": "Trunks: extra source IPs / CIDRs allowed to send calls (the host's addresses always are).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"inbound_assistant_id": {
						"anyOf": [
							{
								"description": "The assistant that answers inbound calls no inbound route matches, or null.",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"inbound_reserve_pct": {
						"description": "Share of `max_channels` outbound campaigns never use, kept for inbound calls.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"max_channels": {
						"description": "Simultaneous calls (0: unlimited).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"max_cps": {
						"description": "New outbound calls per second (0: unlimited).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "connection",
						"type": "string"
					},
					"overflow_policy": {
						"description": "When the connection is full: `busy` (486) or `unavailable` (503, lets a carrier fail over).",
						"enum": [
							"busy",
							"unavailable"
						],
						"type": "string"
					},
					"password_set": {
						"description": "Whether a password is stored. Passwords are write-only.",
						"type": "boolean"
					},
					"port": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"register": {
						"description": "Send REGISTER to the host.",
						"type": "boolean"
					},
					"register_expires_seconds": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"status": {
						"$ref": "#/components/schemas/ConnectionStatus"
					},
					"transport": {
						"enum": [
							"udp"
						],
						"type": "string"
					},
					"type": {
						"description": "`registration`: registers like a phone/extension. `trunk`: a carrier trunk (IP or credential authentication).",
						"enum": [
							"registration",
							"trunk"
						],
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"username": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"enabled",
					"type",
					"backend",
					"host",
					"port",
					"transport",
					"username",
					"auth_username",
					"password_set",
					"display_name",
					"register",
					"register_expires_seconds",
					"caller_ids",
					"default_caller_id",
					"max_channels",
					"max_cps",
					"inbound_reserve_pct",
					"answer_inbound",
					"inbound_assistant_id",
					"inbound_acl",
					"overflow_policy",
					"codecs",
					"status",
					"active_calls",
					"created",
					"updated"
				],
				"type": "object"
			},
			"ConnectionCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new connection. Fields you leave out take their defaults.",
				"examples": [
					{
						"caller_ids": [
							"+97231234567"
						],
						"default_caller_id": "+97231234567",
						"host": "sip.carrier.example.com",
						"inbound_acl": [
							"198.51.100.0/24"
						],
						"max_channels": 30,
						"max_cps": 5,
						"name": "Main trunk",
						"register": false,
						"type": "trunk"
					}
				],
				"properties": {
					"answer_inbound": {
						"type": "boolean"
					},
					"auth_username": {
						"maxLength": 200,
						"type": "string"
					},
					"backend": {
						"enum": [
							"native",
							"freeswitch"
						],
						"type": "string"
					},
					"caller_ids": {
						"items": {
							"description": "A phone number (E.164 preferred).",
							"pattern": "^\\+?[0-9\\s()-]{2,24}$",
							"type": "string"
						},
						"maxItems": 500,
						"type": "array"
					},
					"codecs": {
						"items": {
							"enum": [
								"pcma",
								"pcmu"
							],
							"type": "string"
						},
						"maxItems": 2,
						"minItems": 1,
						"type": "array"
					},
					"default_caller_id": {
						"anyOf": [
							{
								"description": "A phone number (E.164 preferred).",
								"pattern": "^\\+?[0-9\\s()-]{2,24}$",
								"type": "string"
							},
							{
								"const": "",
								"type": "string"
							}
						],
						"description": "The caller ID used when a call names none (empty: none)."
					},
					"display_name": {
						"maxLength": 200,
						"type": "string"
					},
					"enabled": {
						"type": "boolean"
					},
					"host": {
						"description": "The carrier's SIP host (a name or an IP address).",
						"maxLength": 253,
						"type": "string"
					},
					"inbound_acl": {
						"items": {
							"pattern": "^[0-9a-fA-F:.]{2,45}(\\/\\d{1,3})?$",
							"type": "string"
						},
						"maxItems": 100,
						"type": "array"
					},
					"inbound_assistant_id": {
						"anyOf": [
							{
								"description": "The assistant for inbound calls no route matches; null for none.",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"inbound_reserve_pct": {
						"maximum": 90,
						"minimum": 0,
						"type": "integer"
					},
					"max_channels": {
						"maximum": 10000,
						"minimum": 0,
						"type": "integer"
					},
					"max_cps": {
						"maximum": 1000,
						"minimum": 0,
						"type": "integer"
					},
					"name": {
						"maxLength": 80,
						"minLength": 1,
						"type": "string"
					},
					"overflow_policy": {
						"enum": [
							"busy",
							"unavailable"
						],
						"type": "string"
					},
					"password": {
						"anyOf": [
							{
								"maxLength": 500,
								"minLength": 1,
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Write-only. A string sets it, null removes it; leave it out to keep the stored one."
					},
					"port": {
						"maximum": 65535,
						"minimum": 1,
						"type": "integer"
					},
					"register": {
						"type": "boolean"
					},
					"register_expires_seconds": {
						"maximum": 3600,
						"minimum": 60,
						"type": "integer"
					},
					"transport": {
						"enum": [
							"udp"
						],
						"type": "string"
					},
					"type": {
						"enum": [
							"registration",
							"trunk"
						],
						"type": "string"
					},
					"username": {
						"maxLength": 200,
						"type": "string"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"ConnectionList": {
				"description": "Your connections, oldest first.",
				"examples": [
					{
						"data": [
							{
								"active_calls": 2,
								"answer_inbound": true,
								"auth_username": "",
								"backend": "native",
								"caller_ids": [
									"+97231234567"
								],
								"codecs": [
									"pcma",
									"pcmu"
								],
								"created": "2026-11-03T09:14:22.000Z",
								"default_caller_id": "+97231234567",
								"display_name": "",
								"enabled": true,
								"host": "sip.carrier.example.com",
								"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
								"inbound_acl": [
									"198.51.100.0/24"
								],
								"inbound_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"inbound_reserve_pct": 15,
								"livemode": true,
								"max_channels": 30,
								"max_cps": 5,
								"name": "Main trunk",
								"object": "connection",
								"overflow_policy": "busy",
								"password_set": false,
								"port": 5060,
								"register": false,
								"register_expires_seconds": 300,
								"status": {
									"error": null,
									"expires_seconds": null,
									"registered_at": null,
									"state": "listening"
								},
								"transport": "udp",
								"type": "trunk",
								"updated": "2026-11-03T09:14:22.000Z",
								"username": ""
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/connections"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Connection"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ConnectionRegistration": {
				"description": "A registration was requested; `status` is the state right after the request (registration completes asynchronously).",
				"examples": [
					{
						"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
						"livemode": true,
						"object": "connection_registration",
						"status": {
							"error": null,
							"expires_seconds": null,
							"registered_at": null,
							"state": "registering"
						}
					}
				],
				"properties": {
					"connection_id": {
						"description": "A connection ID (prefix `conn_`).",
						"examples": [
							"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^conn_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "connection_registration",
						"type": "string"
					},
					"status": {
						"$ref": "#/components/schemas/ConnectionStatus"
					}
				},
				"required": [
					"object",
					"livemode",
					"connection_id",
					"status"
				],
				"type": "object"
			},
			"ConnectionStatus": {
				"description": "The connection's live state.",
				"properties": {
					"error": {
						"description": "The last registration error, or null.",
						"type": [
							"string",
							"null"
						]
					},
					"expires_seconds": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "The registration's lifetime."
					},
					"registered_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When the last registration succeeded."
					},
					"state": {
						"description": "`registered` / `listening`: ready. `incomplete`: settings are missing. `failed`: see `error`.",
						"enum": [
							"disabled",
							"incomplete",
							"registering",
							"registered",
							"listening",
							"failed"
						],
						"type": "string"
					}
				},
				"required": [
					"state",
					"error",
					"registered_at",
					"expires_seconds"
				],
				"type": "object"
			},
			"ConnectionStatusChangedEvent": {
				"description": "A SIP connection's registration went up or down.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "connection.status_changed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `connection.status_changed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"from": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^conn_[0-9A-Za-z]+$",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"to": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "connection.status_changed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ConnectionUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The fields to change; everything else is kept.",
				"examples": [
					{
						"max_cps": 10,
						"password": "n3w-pa55"
					}
				],
				"properties": {
					"answer_inbound": {
						"type": "boolean"
					},
					"auth_username": {
						"maxLength": 200,
						"type": "string"
					},
					"backend": {
						"enum": [
							"native",
							"freeswitch"
						],
						"type": "string"
					},
					"caller_ids": {
						"items": {
							"description": "A phone number (E.164 preferred).",
							"pattern": "^\\+?[0-9\\s()-]{2,24}$",
							"type": "string"
						},
						"maxItems": 500,
						"type": "array"
					},
					"codecs": {
						"items": {
							"enum": [
								"pcma",
								"pcmu"
							],
							"type": "string"
						},
						"maxItems": 2,
						"minItems": 1,
						"type": "array"
					},
					"default_caller_id": {
						"anyOf": [
							{
								"description": "A phone number (E.164 preferred).",
								"pattern": "^\\+?[0-9\\s()-]{2,24}$",
								"type": "string"
							},
							{
								"const": "",
								"type": "string"
							}
						],
						"description": "The caller ID used when a call names none (empty: none)."
					},
					"display_name": {
						"maxLength": 200,
						"type": "string"
					},
					"enabled": {
						"type": "boolean"
					},
					"host": {
						"description": "The carrier's SIP host (a name or an IP address).",
						"maxLength": 253,
						"type": "string"
					},
					"inbound_acl": {
						"items": {
							"pattern": "^[0-9a-fA-F:.]{2,45}(\\/\\d{1,3})?$",
							"type": "string"
						},
						"maxItems": 100,
						"type": "array"
					},
					"inbound_assistant_id": {
						"anyOf": [
							{
								"description": "The assistant for inbound calls no route matches; null for none.",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"inbound_reserve_pct": {
						"maximum": 90,
						"minimum": 0,
						"type": "integer"
					},
					"max_channels": {
						"maximum": 10000,
						"minimum": 0,
						"type": "integer"
					},
					"max_cps": {
						"maximum": 1000,
						"minimum": 0,
						"type": "integer"
					},
					"name": {
						"maxLength": 80,
						"minLength": 1,
						"type": "string"
					},
					"overflow_policy": {
						"enum": [
							"busy",
							"unavailable"
						],
						"type": "string"
					},
					"password": {
						"anyOf": [
							{
								"maxLength": 500,
								"minLength": 1,
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Write-only. A string sets it, null removes it; leave it out to keep the stored one."
					},
					"port": {
						"maximum": 65535,
						"minimum": 1,
						"type": "integer"
					},
					"register": {
						"type": "boolean"
					},
					"register_expires_seconds": {
						"maximum": 3600,
						"minimum": 60,
						"type": "integer"
					},
					"transport": {
						"enum": [
							"udp"
						],
						"type": "string"
					},
					"type": {
						"enum": [
							"registration",
							"trunk"
						],
						"type": "string"
					},
					"username": {
						"maxLength": 200,
						"type": "string"
					}
				},
				"type": "object"
			},
			"Consent": {
				"description": "A recorded consent to marketing calls (§30A). Revoking keeps the record (with `revoked_at`) as evidence.",
				"examples": [
					{
						"active": true,
						"created": "2026-10-30T12:00:01.000Z",
						"evidence": "https://example.com/forms/123 (checkbox, IP 198.51.100.7)",
						"granted_at": "2026-10-30T12:00:00.000Z",
						"livemode": true,
						"object": "consent",
						"phone": "+972501234567",
						"revoked_at": null,
						"scope": "marketing",
						"source": "web_form"
					}
				],
				"properties": {
					"active": {
						"description": "Not revoked.",
						"type": "boolean"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"evidence": {
						"description": "What proves it (a form URL, a recording, a reference).",
						"type": "string"
					},
					"granted_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "consent",
						"type": "string"
					},
					"phone": {
						"description": "The number, E.164.",
						"type": "string"
					},
					"revoked_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"scope": {
						"description": "`marketing`.",
						"type": "string"
					},
					"source": {
						"description": "Where the consent was given, e.g. `web_form`, `api`, `import`.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"phone",
					"scope",
					"source",
					"evidence",
					"active",
					"granted_at",
					"revoked_at",
					"created"
				],
				"type": "object"
			},
			"ConsentBatch": {
				"description": "The outcome of recording consents.",
				"examples": [
					{
						"invalid": [],
						"livemode": true,
						"object": "consent_batch",
						"recorded": [
							"+972501234567"
						]
					}
				],
				"properties": {
					"invalid": {
						"description": "Entries that are not valid phone numbers, as sent.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "consent_batch",
						"type": "string"
					},
					"recorded": {
						"description": "Numbers a consent record was added for (E.164).",
						"items": {
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"livemode",
					"recorded",
					"invalid"
				],
				"type": "object"
			},
			"ConsentEvidenceInput": {
				"additionalProperties": false,
				"description": "Evidence of consent to marketing calls (§30A): when, where and how the person agreed.",
				"examples": [
					{
						"channel": "web",
						"granted_at": "2026-09-20T14:02:00+03:00",
						"source": "website_form_2026"
					}
				],
				"properties": {
					"channel": {
						"description": "How they agreed.",
						"enum": [
							"web",
							"phone",
							"sms",
							"email",
							"whatsapp",
							"app",
							"written",
							"in_person",
							"other"
						],
						"type": "string"
					},
					"granted_at": {
						"description": "When the person agreed to marketing calls.",
						"examples": [
							"2026-11-03T09:00:00+02:00"
						],
						"format": "date-time",
						"type": "string"
					},
					"source": {
						"description": "Where they agreed, e.g. the form or campaign name.",
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"granted_at",
					"source",
					"channel"
				],
				"type": "object"
			},
			"ConsentList": {
				"description": "A page of consent records, newest first.",
				"examples": [
					{
						"data": [
							{
								"active": true,
								"created": "2026-10-30T12:00:01.000Z",
								"evidence": "https://example.com/forms/123 (checkbox, IP 198.51.100.7)",
								"granted_at": "2026-10-30T12:00:00.000Z",
								"livemode": true,
								"object": "consent",
								"phone": "+972501234567",
								"revoked_at": null,
								"scope": "marketing",
								"source": "web_form"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/consents"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Consent"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ConsentRecordedEvent": {
				"description": "Consent to be called was recorded or revoked for a phone number.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "consent.recorded"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `consent.recorded` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"granted_at": {
										"type": [
											"string",
											"null"
										]
									},
									"phone": {
										"type": "string"
									},
									"revoked": {
										"type": "boolean"
									},
									"revoked_at": {
										"type": [
											"string",
											"null"
										]
									},
									"scope": {
										"type": "string"
									},
									"source": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "consent.recorded",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ConsentRevocation": {
				"description": "Every active consent of the number was revoked (the records are kept).",
				"examples": [
					{
						"livemode": true,
						"object": "consent_revocation",
						"phone": "+972501234567",
						"revoked_at": "2026-11-03T09:14:22.000Z"
					}
				],
				"properties": {
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "consent_revocation",
						"type": "string"
					},
					"phone": {
						"type": "string"
					},
					"revoked_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"phone",
					"revoked_at"
				],
				"type": "object"
			},
			"ContactAttemptedEvent": {
				"description": "A dial attempt to a campaign contact finished (the legacy `attempt.completed`).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "contact.attempted"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `contact.attempted` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"attempt_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^att_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempt_number": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^ctc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"next_attempt_at": {
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "contact",
										"type": "string"
									},
									"phone": {
										"type": "string"
									},
									"result": {
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "contact.attempted",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ContactBatchParamsInput": {
				"additionalProperties": false,
				"description": "Contacts to add, checked like a dashboard import: normalised, de-duplicated, scrubbed against the do-not-call list and, for marketing, consent.",
				"examples": [
					{
						"contacts": [
							{
								"consent": {
									"channel": "web",
									"granted_at": "2026-09-20T14:02:00+03:00",
									"source": "website_form_2026"
								},
								"name": "Dana Levi",
								"phone": "+972501234567",
								"variables": {
									"plan": "Gold"
								}
							},
							{
								"name": "Yossi Cohen",
								"phone": "052-765-4321",
								"variables": {
									"plan": "Silver"
								}
							}
						],
						"default_country": "IL"
					}
				],
				"properties": {
					"contacts": {
						"description": "Up to 1000 contacts.",
						"items": {
							"$ref": "#/components/schemas/ContactInputInput"
						},
						"maxItems": 1000,
						"minItems": 1,
						"type": "array"
					},
					"default_country": {
						"description": "Country of numbers written without a country code (ISO 3166-1 alpha-2, default IL).",
						"pattern": "^[A-Z]{2}$",
						"type": "string"
					},
					"drop_dnc": {
						"description": "Leave numbers on the do-not-call list out entirely (default false: they are kept with status dnc, for the record, and never dialled).",
						"type": "boolean"
					}
				},
				"required": [
					"contacts"
				],
				"type": "object"
			},
			"ContactBatchResult": {
				"description": "What a batch added and why anything was left out.",
				"examples": [
					{
						"campaign_id": "cmp_2Yb7mCq9aPLk",
						"consent_recorded": 1,
						"errors": [
							{
								"index": 2,
								"message": "On the do-not-call list",
								"phone": "+972541112233",
								"reason": "dnc"
							}
						],
						"imported": 2,
						"livemode": true,
						"object": "contact_batch_result",
						"received": 3,
						"rejected": 1,
						"rejected_reasons": {
							"dnc": 1,
							"duplicate": 0,
							"invalid": 0
						},
						"warnings": [],
						"without_consent": 1
					}
				],
				"properties": {
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"consent_recorded": {
						"description": "Consent records created from the evidence sent.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"errors": {
						"description": "Rejected contacts (the first 100).",
						"items": {
							"properties": {
								"index": {
									"description": "Position in `contacts` (0-based).",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"message": {
									"type": "string"
								},
								"phone": {
									"description": "The number as sent.",
									"type": "string"
								},
								"reason": {
									"enum": [
										"invalid",
										"duplicate",
										"dnc",
										"consent_without_evidence"
									],
									"type": "string"
								}
							},
							"required": [
								"index",
								"phone",
								"reason",
								"message"
							],
							"type": "object"
						},
						"type": "array"
					},
					"imported": {
						"description": "Contacts added to the campaign for dialling.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "contact_batch_result",
						"type": "string"
					},
					"received": {
						"description": "Non-empty contacts / rows received.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"rejected": {
						"description": "Contacts not added for dialling (invalid, duplicate, do-not-call).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"rejected_reasons": {
						"$ref": "#/components/schemas/ContactRejectedReasons"
					},
					"warnings": {
						"description": "Contacts added with a problem, e.g. consent claimed without complete evidence (the first 100).",
						"items": {
							"properties": {
								"index": {
									"description": "Position in `contacts` (0-based).",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"message": {
									"type": "string"
								},
								"phone": {
									"description": "The number as sent.",
									"type": "string"
								},
								"reason": {
									"enum": [
										"invalid",
										"duplicate",
										"dnc",
										"consent_without_evidence"
									],
									"type": "string"
								}
							},
							"required": [
								"index",
								"phone",
								"reason",
								"message"
							],
							"type": "object"
						},
						"type": "array"
					},
					"without_consent": {
						"description": "Marketing: contacts added without a consent record. The dialer skips them (§30A) unless consent is recorded first.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"object",
					"campaign_id",
					"livemode",
					"received",
					"imported",
					"rejected",
					"rejected_reasons",
					"without_consent",
					"consent_recorded",
					"errors",
					"warnings"
				],
				"type": "object"
			},
			"ContactCompletedEvent": {
				"description": "A campaign contact reached a final status.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "contact.completed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `contact.completed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"attempt_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^att_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempt_number": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^ctc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"next_attempt_at": {
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "contact",
										"type": "string"
									},
									"phone": {
										"type": "string"
									},
									"result": {
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "contact.completed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ContactImport": {
				"description": "A background contact-list import and its result. Poll it until status is succeeded or failed.",
				"examples": [
					{
						"campaign_id": "cmp_2Yb7mCq9aPLk",
						"completed_at": "2026-11-02T07:00:03.870Z",
						"consent_recorded": 0,
						"created_at": "2026-11-02T07:00:00.000Z",
						"error": null,
						"errors": [
							{
								"message": "too-short",
								"phone": "05012",
								"reason": "invalid",
								"row": 17
							}
						],
						"filename": "contacts.csv",
						"id": "imp_7RkXq2Lm9PvTz4nB1c8Ya",
						"imported": 4890,
						"livemode": true,
						"object": "import",
						"received": 5000,
						"rejected": 110,
						"rejected_reasons": {
							"dnc": 20,
							"duplicate": 40,
							"invalid": 50
						},
						"source": "csv",
						"started_at": "2026-11-02T07:00:00.120Z",
						"status": "succeeded",
						"warnings": [],
						"without_consent": 0
					}
				],
				"properties": {
					"campaign_id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"completed_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"consent_recorded": {
						"description": "Consent records created from the evidence sent.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"created_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"error": {
						"anyOf": [
							{
								"properties": {
									"code": {
										"type": "string"
									},
									"message": {
										"type": "string"
									}
								},
								"required": [
									"code",
									"message"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "Why the import failed (status failed): a stable code and a message to show."
					},
					"errors": {
						"description": "Rejected rows (the first 100).",
						"items": {
							"properties": {
								"message": {
									"type": "string"
								},
								"phone": {
									"description": "The number as sent.",
									"type": "string"
								},
								"reason": {
									"enum": [
										"invalid",
										"duplicate",
										"dnc",
										"consent_without_evidence"
									],
									"type": "string"
								},
								"row": {
									"description": "Row in the file (1-based, the header is row 1).",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								}
							},
							"required": [
								"row",
								"phone",
								"reason",
								"message"
							],
							"type": "object"
						},
						"type": "array"
					},
					"filename": {
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "A import ID (prefix `imp_`).",
						"examples": [
							"imp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^imp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"imported": {
						"description": "Contacts added to the campaign for dialling.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "import",
						"type": "string"
					},
					"received": {
						"description": "Non-empty contacts / rows received.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"rejected": {
						"description": "Contacts not added for dialling (invalid, duplicate, do-not-call).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"rejected_reasons": {
						"$ref": "#/components/schemas/ContactRejectedReasons"
					},
					"source": {
						"enum": [
							"csv",
							"xlsx",
							"url"
						],
						"type": "string"
					},
					"started_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"status": {
						"description": "pending → processing → succeeded | failed. Poll GET /v1/imports/{id}.",
						"enum": [
							"pending",
							"processing",
							"succeeded",
							"failed"
						],
						"type": "string"
					},
					"warnings": {
						"description": "Rows added with a problem (the first 100).",
						"items": {
							"properties": {
								"message": {
									"type": "string"
								},
								"phone": {
									"description": "The number as sent.",
									"type": "string"
								},
								"reason": {
									"enum": [
										"invalid",
										"duplicate",
										"dnc",
										"consent_without_evidence"
									],
									"type": "string"
								},
								"row": {
									"description": "Row in the file (1-based, the header is row 1).",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								}
							},
							"required": [
								"row",
								"phone",
								"reason",
								"message"
							],
							"type": "object"
						},
						"type": "array"
					},
					"without_consent": {
						"description": "Marketing: contacts added without a consent record. The dialer skips them (§30A) unless consent is recorded first.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"campaign_id",
					"status",
					"source",
					"filename",
					"received",
					"imported",
					"rejected",
					"rejected_reasons",
					"without_consent",
					"consent_recorded",
					"errors",
					"warnings",
					"error",
					"created_at",
					"started_at",
					"completed_at"
				],
				"type": "object"
			},
			"ContactImportParamsInput": {
				"additionalProperties": false,
				"description": "A contact list to import in the background (up to 50,000 rows). Send exactly one of csv, file and url.",
				"examples": [
					{
						"csv": "Mobile,Name,Plan\n0501234567,Dana Levi,Gold\n0527654321,Yossi Cohen,Silver\n",
						"default_country": "IL",
						"mapping": {
							"name": "Name",
							"phone": "Mobile",
							"variables": {
								"plan": "Plan"
							}
						}
					}
				],
				"properties": {
					"consent_channel": {
						"description": "How every consenting row consented, when the file has no channel column.",
						"enum": [
							"web",
							"phone",
							"sms",
							"email",
							"whatsapp",
							"app",
							"written",
							"in_person",
							"other"
						],
						"type": "string"
					},
					"consent_source": {
						"description": "Where every consenting row consented, when the file has no source column.",
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					},
					"csv": {
						"description": "The list as CSV text (UTF-8; comma, semicolon, tab or pipe separated).",
						"maxLength": 10485760,
						"minLength": 1,
						"type": "string"
					},
					"default_country": {
						"description": "Country of numbers written without a country code (ISO 3166-1 alpha-2, default IL).",
						"pattern": "^[A-Z]{2}$",
						"type": "string"
					},
					"drop_dnc": {
						"description": "Leave do-not-call numbers out entirely (default false: kept with status dnc, never dialled).",
						"type": "boolean"
					},
					"file": {
						"additionalProperties": false,
						"description": "A CSV or XLSX file.",
						"properties": {
							"content_base64": {
								"description": "The file, base64-encoded (≤ 10 MB decoded).",
								"maxLength": 13981018,
								"minLength": 1,
								"type": "string"
							},
							"filename": {
								"description": "Its name; .xlsx is read as a spreadsheet, anything else as CSV.",
								"maxLength": 200,
								"minLength": 1,
								"type": "string"
							}
						},
						"required": [
							"filename",
							"content_base64"
						],
						"type": "object"
					},
					"has_header": {
						"description": "The first row holds column names (default: detected).",
						"type": "boolean"
					},
					"mapping": {
						"$ref": "#/components/schemas/ImportMappingInput"
					},
					"url": {
						"description": "An https URL to download the CSV / XLSX from (public addresses only, ≤ 10 MB).",
						"format": "uri",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"ContactInputInput": {
				"additionalProperties": false,
				"description": "A contact to add to a campaign.",
				"properties": {
					"consent": {
						"$ref": "#/components/schemas/ConsentEvidenceInput",
						"description": "Marketing campaigns: the person's consent with its evidence. Without it the contact is imported but not dialled."
					},
					"name": {
						"maxLength": 200,
						"type": "string"
					},
					"phone": {
						"description": "The number, E.164 (+972…) or national (050-…, read with default_country).",
						"maxLength": 40,
						"minLength": 1,
						"type": "string"
					},
					"timezone": {
						"description": "The contact's IANA time zone, if not the campaign's.",
						"maxLength": 64,
						"type": "string"
					},
					"variables": {
						"additionalProperties": {
							"maxLength": 500,
							"type": "string"
						},
						"description": "Values for {{variables}} in the campaign's first message and script.",
						"propertyNames": {
							"pattern": "^[A-Za-z0-9_\\u0590-\\u05FF]{1,40}$",
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"phone"
				],
				"type": "object"
			},
			"ContactOptedOutEvent": {
				"description": "A phone number was added to the do-not-call list (the legacy `dnc.added`).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "contact.opted_out"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `contact.opted_out` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"attempt_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^att_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"attempt_number": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"campaign_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^cmp_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^ctc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"next_attempt_at": {
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "contact",
										"type": "string"
									},
									"phone": {
										"type": "string"
									},
									"result": {
										"type": [
											"string",
											"null"
										]
									},
									"source": {
										"type": "string"
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "contact.opted_out",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"ContactRejectedReasons": {
				"description": "Rejected contacts per reason.",
				"properties": {
					"dnc": {
						"description": "On the organisation's do-not-call list.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"duplicate": {
						"description": "Repeated in the request, or already in the campaign.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"invalid": {
						"description": "Not a valid phone number.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"invalid",
					"duplicate",
					"dnc"
				],
				"type": "object"
			},
			"ContactUpdateParamsInput": {
				"additionalProperties": false,
				"description": "Requeue or skip a contact, like the dashboard's contact actions.",
				"examples": [
					{
						"status": "skipped"
					}
				],
				"properties": {
					"status": {
						"description": "scheduled: dial it again now (refused for a do-not-call number); skipped: take it out of the campaign.",
						"enum": [
							"scheduled",
							"skipped"
						],
						"type": "string"
					}
				},
				"required": [
					"status"
				],
				"type": "object"
			},
			"CopilotEvent": {
				"description": "One real-time copilot event of a call.",
				"properties": {
					"at_ms": {
						"description": "Milliseconds from the start of the call.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"card_id": {
						"type": [
							"string",
							"null"
						]
					},
					"copilot_profile_id": {
						"anyOf": [
							{
								"description": "A copilot profile ID (prefix `cop_`).",
								"examples": [
									"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cop_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"copilot_profile_version": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"created_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"anyOf": [
							{
								"additionalProperties": {},
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							{
								"type": "null"
							}
						]
					},
					"kind": {
						"type": [
							"string",
							"null"
						]
					},
					"latency_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"object": {
						"const": "copilot_event",
						"type": "string"
					},
					"type": {
						"description": "e.g. card.shown, card.used, card.dismissed, kb.search, deep.answer.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"type",
					"at_ms",
					"card_id",
					"kind",
					"latency_ms",
					"copilot_profile_id",
					"copilot_profile_version",
					"data",
					"created_at"
				],
				"type": "object"
			},
			"CopilotEventList": {
				"description": "A page of a call's copilot events, newest first.",
				"examples": [
					{
						"data": [
							{
								"at_ms": 48200,
								"card_id": "c12",
								"copilot_profile_id": "cop_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"copilot_profile_version": 2,
								"created_at": "2026-11-03T09:14:22.000Z",
								"data": null,
								"kind": "kb",
								"latency_ms": 640,
								"object": "copilot_event",
								"type": "card.used"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/calls/call_8tRPaZp5hLMbrGqdJ9AmNa/copilot_events"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/CopilotEvent"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CopilotProfile": {
				"description": "How the real-time agent copilot coaches one kind of call: stages, objections, knowledge, fields, compliance, alerts and the QA rubric.",
				"examples": [
					{
						"alerts": [
							{
								"key": "escalation",
								"kind": "escalation",
								"label": "Asks for a manager",
								"message": "Acknowledge and offer a solution.",
								"notify_supervisor": true,
								"phrases": [
									"manager"
								],
								"severity": "critical",
								"threshold": 0
							}
						],
						"coaching": {
							"monologue_seconds_max": 40,
							"silence_seconds_max": 7,
							"talk_ratio_max": 0.65,
							"wpm_max": 175,
							"wpm_min": 0
						},
						"company": "Acme",
						"compliance": {
							"forbidden_phrases": [
								{
									"instead": "In most cases",
									"phrase": "guaranteed",
									"reason": "No guarantees",
									"severity": "warn"
								}
							],
							"required_disclosures": []
						},
						"created": "2026-11-03T09:14:22.000Z",
						"fields": [
							{
								"hint": "",
								"key": "budget",
								"label": "Monthly budget",
								"options": [],
								"pattern": "",
								"required": false,
								"type": "money"
							}
						],
						"goal": "Book a demo or a clear next step.",
						"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
						"kb": {
							"document_ids": [
								"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
							],
							"links": [],
							"min_score": 0.35
						},
						"language": "en",
						"livemode": true,
						"model": {
							"api": "chat",
							"deep_path": true,
							"fallback_model": "gpt-4.1-nano",
							"max_calls_per_minute": 12,
							"model": "gpt-4.1-mini",
							"objection_similarity": 0.72,
							"priority": true,
							"speculative": true,
							"temperature": 0.3
						},
						"name": "Outbound sales",
						"object": "copilot_profile",
						"objections": [
							{
								"examples": [
									"it costs too much"
								],
								"follow_up": "What do you pay now?",
								"kb_query": "price list",
								"key": "price",
								"label": "Too expensive",
								"response": "Compare it with what downtime costs you today.",
								"triggers": [
									"too expensive"
								]
							}
						],
						"product": "Acme Cloud PBX",
						"qa_rubric": [
							{
								"description": "Asked open questions first.",
								"key": "discovery",
								"label": "Discovery",
								"weight": 60
							},
							{
								"description": "Agreed a dated next step.",
								"key": "close",
								"label": "Next step",
								"weight": 40
							}
						],
						"script": {
							"flow_id": null,
							"version": "published"
						},
						"stages": [
							{
								"checklist": [
									{
										"ask": "",
										"key": "recorded",
										"label": "Say the call is recorded",
										"phrases": [
											"this call is recorded"
										],
										"required": true
									}
								],
								"goal": "Introduce yourself and ask for two minutes",
								"key": "opening",
								"label": "Opening"
							}
						],
						"template_id": "sales-outbound",
						"tone": "Warm, confident, never pushy.",
						"updated": "2026-11-03T09:14:22.000Z",
						"version": 4
					}
				],
				"properties": {
					"alerts": {
						"items": {
							"properties": {
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"kind": {
									"enum": [
										"keyword",
										"sentiment",
										"silence",
										"monologue",
										"talk_ratio",
										"long_call",
										"escalation"
									],
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"message": {
									"maxLength": 1000,
									"type": "string"
								},
								"notify_supervisor": {
									"description": "Also raise it on the supervisor board.",
									"type": "boolean"
								},
								"phrases": {
									"description": "keyword / escalation: customer phrases.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"severity": {
									"enum": [
										"info",
										"warn",
										"critical"
									],
									"type": "string"
								},
								"threshold": {
									"description": "sentiment: below this (−1…1); silence / monologue: seconds; talk_ratio: agent share; long_call: minutes.",
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"kind",
								"phrases",
								"threshold",
								"message",
								"severity",
								"notify_supervisor"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"coaching": {
						"properties": {
							"monologue_seconds_max": {
								"description": "Continuous agent speech before \"ask a question\".",
								"minimum": 5,
								"type": "number"
							},
							"silence_seconds_max": {
								"description": "Dead air before a nudge.",
								"minimum": 2,
								"type": "number"
							},
							"talk_ratio_max": {
								"description": "Agent share of talk time above which to nudge (0–1).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"wpm_max": {
								"minimum": 60,
								"type": "number"
							},
							"wpm_min": {
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"talk_ratio_max",
							"monologue_seconds_max",
							"silence_seconds_max",
							"wpm_max",
							"wpm_min"
						],
						"type": "object"
					},
					"company": {
						"description": "Who the agent represents.",
						"maxLength": 500,
						"type": "string"
					},
					"compliance": {
						"properties": {
							"forbidden_phrases": {
								"items": {
									"properties": {
										"instead": {
											"description": "Safer wording shown on the alert.",
											"maxLength": 1000,
											"type": "string"
										},
										"phrase": {
											"maxLength": 500,
											"type": "string"
										},
										"reason": {
											"maxLength": 1000,
											"type": "string"
										},
										"severity": {
											"enum": [
												"info",
												"warn",
												"critical"
											],
											"type": "string"
										}
									},
									"required": [
										"phrase",
										"reason",
										"instead",
										"severity"
									],
									"type": "object"
								},
								"maxItems": 300,
								"type": "array"
							},
							"required_disclosures": {
								"items": {
									"properties": {
										"before_stage_key": {
											"description": "…or before leaving this stage.",
											"maxLength": 64,
											"type": "string"
										},
										"deadline_seconds": {
											"description": "Alert when not said this long into the call (0: before the call ends).",
											"minimum": 0,
											"type": "number"
										},
										"key": {
											"description": "Your stable identifier of the item.",
											"maxLength": 64,
											"minLength": 1,
											"type": "string"
										},
										"label": {
											"maxLength": 500,
											"type": "string"
										},
										"phrases": {
											"items": {
												"maxLength": 500,
												"type": "string"
											},
											"maxItems": 200,
											"type": "array"
										},
										"script": {
											"description": "The exact wording to read out if it was missed.",
											"maxLength": 4000,
											"type": "string"
										}
									},
									"required": [
										"key",
										"label",
										"phrases",
										"script",
										"deadline_seconds",
										"before_stage_key"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							}
						},
						"required": [
							"required_disclosures",
							"forbidden_phrases"
						],
						"type": "object"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"fields": {
						"description": "Details the copilot picks out of the conversation.",
						"items": {
							"properties": {
								"hint": {
									"description": "A hint for the extractor.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"required": {
									"type": "boolean"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"money",
										"phone",
										"email",
										"date",
										"enum",
										"boolean",
										"id"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"type",
								"options",
								"pattern",
								"required",
								"hint"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"goal": {
						"description": "What the call should achieve.",
						"maxLength": 4000,
						"type": "string"
					},
					"id": {
						"description": "The profile's ID.",
						"examples": [
							"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cop_[0-9A-Za-z]+$",
						"type": "string"
					},
					"kb": {
						"properties": {
							"document_ids": {
								"description": "Knowledge-base documents the profile may use (empty: all).",
								"items": {
									"description": "A kb document ID (prefix `kbd_`).",
									"examples": [
										"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^kbd_[0-9A-Za-z]+$",
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							},
							"links": {
								"description": "Reference links shown to the agent.",
								"items": {
									"properties": {
										"label": {
											"maxLength": 200,
											"type": "string"
										},
										"url": {
											"maxLength": 2000,
											"type": "string"
										}
									},
									"required": [
										"label",
										"url"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							},
							"min_score": {
								"description": "Minimum confidence (0–1) to show a knowledge card unasked.",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"document_ids",
							"links",
							"min_score"
						],
						"type": "object"
					},
					"language": {
						"description": "The calls' language (`he`, `en`, …).",
						"maxLength": 10,
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"model": {
						"properties": {
							"api": {
								"enum": [
									"chat",
									"responses"
								],
								"type": "string"
							},
							"deep_path": {
								"description": "false: the fast path only (no model calls).",
								"type": "boolean"
							},
							"fallback_model": {
								"maxLength": 80,
								"type": "string"
							},
							"max_calls_per_minute": {
								"description": "Model calls per minute per call.",
								"maximum": 60,
								"minimum": 0,
								"type": "integer"
							},
							"model": {
								"maxLength": 80,
								"type": "string"
							},
							"objection_similarity": {
								"description": "Meaning-based objection match threshold (cosine).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"priority": {
								"description": "Priority processing: steadier, lower latency, higher token price.",
								"type": "boolean"
							},
							"speculative": {
								"description": "Start on stable interim text, before the utterance is final.",
								"type": "boolean"
							},
							"temperature": {
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"model",
							"fallback_model",
							"temperature",
							"api",
							"priority",
							"max_calls_per_minute",
							"speculative",
							"deep_path",
							"objection_similarity"
						],
						"type": "object"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "copilot_profile",
						"type": "string"
					},
					"objections": {
						"description": "The objection library.",
						"items": {
							"properties": {
								"examples": {
									"description": "Paraphrases for the meaning-based match.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"follow_up": {
									"maxLength": 1000,
									"type": "string"
								},
								"kb_query": {
									"description": "A knowledge-base query whose facts are attached to the card.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"response": {
									"description": "The recommended answer shown on the card.",
									"maxLength": 4000,
									"type": "string"
								},
								"triggers": {
									"description": "Customer phrases that fire it at once.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								}
							},
							"required": [
								"key",
								"label",
								"triggers",
								"examples",
								"response",
								"follow_up",
								"kb_query"
							],
							"type": "object"
						},
						"maxItems": 300,
						"type": "array"
					},
					"product": {
						"maxLength": 2000,
						"type": "string"
					},
					"qa_rubric": {
						"description": "The QA rubric this profile's calls are scored against (empty: the organisation's rubric).",
						"items": {
							"properties": {
								"description": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"weight": {
									"description": "Relative importance on one 0–100 scale (points out of 100); only the ratios count.",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"weight",
								"description"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"script": {
						"properties": {
							"flow_id": {
								"anyOf": [
									{
										"description": "A flow ID (prefix `flow_`).",
										"examples": [
											"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "An agent-script flow that drives the call branch by branch (null: the linear `stages`)."
							},
							"version": {
								"anyOf": [
									{
										"const": "published",
										"type": "string"
									},
									{
										"maximum": 9007199254740991,
										"minimum": 1,
										"type": "integer"
									}
								],
								"description": "`published`, or a pinned version number."
							}
						},
						"required": [
							"flow_id",
							"version"
						],
						"type": "object"
					},
					"stages": {
						"description": "The call's stages, each with a checklist (used when no `script` flow is set).",
						"items": {
							"properties": {
								"checklist": {
									"items": {
										"properties": {
											"ask": {
												"description": "The question the copilot suggests while it is open.",
												"maxLength": 1000,
												"type": "string"
											},
											"key": {
												"description": "Your stable identifier of the item.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											},
											"label": {
												"maxLength": 500,
												"type": "string"
											},
											"phrases": {
												"description": "Agent phrases that tick it automatically; a trailing * matches a prefix.",
												"items": {
													"maxLength": 500,
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"required": {
												"type": "boolean"
											}
										},
										"required": [
											"key",
											"label",
											"phrases",
											"ask",
											"required"
										],
										"type": "object"
									},
									"maxItems": 100,
									"type": "array"
								},
								"goal": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"goal",
								"checklist"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"template_id": {
						"description": "The template it was created from.",
						"type": [
							"string",
							"null"
						]
					},
					"tone": {
						"description": "How the agent should sound.",
						"maxLength": 2000,
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"version": {
						"description": "Goes up on every change.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"version",
					"template_id",
					"goal",
					"tone",
					"company",
					"product",
					"language",
					"stages",
					"objections",
					"kb",
					"fields",
					"compliance",
					"coaching",
					"alerts",
					"qa_rubric",
					"script",
					"model",
					"created",
					"updated"
				],
				"type": "object"
			},
			"CopilotProfileCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new profile: a template, your own settings, or both.",
				"examples": [
					{
						"company": "Acme",
						"name": "Outbound sales",
						"product": "Acme Cloud PBX",
						"template_id": "sales-outbound"
					}
				],
				"properties": {
					"alerts": {
						"items": {
							"additionalProperties": false,
							"properties": {
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"kind": {
									"enum": [
										"keyword",
										"sentiment",
										"silence",
										"monologue",
										"talk_ratio",
										"long_call",
										"escalation"
									],
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"message": {
									"maxLength": 1000,
									"type": "string"
								},
								"notify_supervisor": {
									"description": "Also raise it on the supervisor board.",
									"type": "boolean"
								},
								"phrases": {
									"description": "keyword / escalation: customer phrases.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"severity": {
									"enum": [
										"info",
										"warn",
										"critical"
									],
									"type": "string"
								},
								"threshold": {
									"description": "sentiment: below this (−1…1); silence / monologue: seconds; talk_ratio: agent share; long_call: minutes.",
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"kind"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"coaching": {
						"additionalProperties": false,
						"properties": {
							"monologue_seconds_max": {
								"description": "Continuous agent speech before \"ask a question\".",
								"minimum": 5,
								"type": "number"
							},
							"silence_seconds_max": {
								"description": "Dead air before a nudge.",
								"minimum": 2,
								"type": "number"
							},
							"talk_ratio_max": {
								"description": "Agent share of talk time above which to nudge (0–1).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"wpm_max": {
								"minimum": 60,
								"type": "number"
							},
							"wpm_min": {
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"company": {
						"description": "Who the agent represents.",
						"maxLength": 500,
						"type": "string"
					},
					"compliance": {
						"additionalProperties": false,
						"properties": {
							"forbidden_phrases": {
								"items": {
									"additionalProperties": false,
									"properties": {
										"instead": {
											"description": "Safer wording shown on the alert.",
											"maxLength": 1000,
											"type": "string"
										},
										"phrase": {
											"maxLength": 500,
											"type": "string"
										},
										"reason": {
											"maxLength": 1000,
											"type": "string"
										},
										"severity": {
											"enum": [
												"info",
												"warn",
												"critical"
											],
											"type": "string"
										}
									},
									"required": [
										"phrase"
									],
									"type": "object"
								},
								"maxItems": 300,
								"type": "array"
							},
							"required_disclosures": {
								"items": {
									"additionalProperties": false,
									"properties": {
										"before_stage_key": {
											"description": "…or before leaving this stage.",
											"maxLength": 64,
											"type": "string"
										},
										"deadline_seconds": {
											"description": "Alert when not said this long into the call (0: before the call ends).",
											"minimum": 0,
											"type": "number"
										},
										"key": {
											"description": "Your stable identifier of the item.",
											"maxLength": 64,
											"minLength": 1,
											"type": "string"
										},
										"label": {
											"maxLength": 500,
											"type": "string"
										},
										"phrases": {
											"items": {
												"maxLength": 500,
												"type": "string"
											},
											"maxItems": 200,
											"type": "array"
										},
										"script": {
											"description": "The exact wording to read out if it was missed.",
											"maxLength": 4000,
											"type": "string"
										}
									},
									"required": [
										"key",
										"label"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							}
						},
						"type": "object"
					},
					"fields": {
						"description": "Details the copilot picks out of the conversation.",
						"items": {
							"additionalProperties": false,
							"properties": {
								"hint": {
									"description": "A hint for the extractor.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"required": {
									"type": "boolean"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"money",
										"phone",
										"email",
										"date",
										"enum",
										"boolean",
										"id"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"goal": {
						"description": "What the call should achieve.",
						"maxLength": 4000,
						"type": "string"
					},
					"kb": {
						"additionalProperties": false,
						"properties": {
							"document_ids": {
								"description": "Knowledge-base documents the profile may use (empty: all).",
								"items": {
									"description": "A kb document ID (`kbd_…`).",
									"maxLength": 200,
									"pattern": "^kbd_[0-9A-Za-z]+$",
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							},
							"links": {
								"description": "Reference links shown to the agent.",
								"items": {
									"properties": {
										"label": {
											"maxLength": 200,
											"type": "string"
										},
										"url": {
											"maxLength": 2000,
											"type": "string"
										}
									},
									"required": [
										"label",
										"url"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							},
							"min_score": {
								"description": "Minimum confidence (0–1) to show a knowledge card unasked.",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"language": {
						"description": "The calls' language (`he`, `en`, …).",
						"maxLength": 10,
						"type": "string"
					},
					"model": {
						"additionalProperties": false,
						"properties": {
							"api": {
								"enum": [
									"chat",
									"responses"
								],
								"type": "string"
							},
							"deep_path": {
								"description": "false: the fast path only (no model calls).",
								"type": "boolean"
							},
							"fallback_model": {
								"maxLength": 80,
								"type": "string"
							},
							"max_calls_per_minute": {
								"description": "Model calls per minute per call.",
								"maximum": 60,
								"minimum": 0,
								"type": "integer"
							},
							"model": {
								"maxLength": 80,
								"type": "string"
							},
							"objection_similarity": {
								"description": "Meaning-based objection match threshold (cosine).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"priority": {
								"description": "Priority processing: steadier, lower latency, higher token price.",
								"type": "boolean"
							},
							"speculative": {
								"description": "Start on stable interim text, before the utterance is final.",
								"type": "boolean"
							},
							"temperature": {
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"name": {
						"description": "Default: the template's name.",
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"objections": {
						"description": "The objection library.",
						"items": {
							"additionalProperties": false,
							"properties": {
								"examples": {
									"description": "Paraphrases for the meaning-based match.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"follow_up": {
									"maxLength": 1000,
									"type": "string"
								},
								"kb_query": {
									"description": "A knowledge-base query whose facts are attached to the card.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"response": {
									"description": "The recommended answer shown on the card.",
									"maxLength": 4000,
									"type": "string"
								},
								"triggers": {
									"description": "Customer phrases that fire it at once.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								}
							},
							"required": [
								"key",
								"label",
								"response"
							],
							"type": "object"
						},
						"maxItems": 300,
						"type": "array"
					},
					"product": {
						"maxLength": 2000,
						"type": "string"
					},
					"qa_rubric": {
						"description": "The QA rubric this profile's calls are scored against (empty: the organisation's rubric).",
						"items": {
							"additionalProperties": false,
							"properties": {
								"description": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"weight": {
									"description": "Relative importance on one 0–100 scale (points out of 100); only the ratios count.",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"script": {
						"additionalProperties": false,
						"properties": {
							"flow_id": {
								"anyOf": [
									{
										"description": "A flow ID (`flow_…`).",
										"maxLength": 200,
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "An agent-script flow that drives the call branch by branch (null: the linear `stages`)."
							},
							"version": {
								"anyOf": [
									{
										"const": "published",
										"type": "string"
									},
									{
										"maximum": 9007199254740991,
										"minimum": 1,
										"type": "integer"
									}
								],
								"description": "`published`, or a pinned version number."
							}
						},
						"type": "object"
					},
					"stages": {
						"description": "The call's stages, each with a checklist (used when no `script` flow is set).",
						"items": {
							"additionalProperties": false,
							"properties": {
								"checklist": {
									"items": {
										"additionalProperties": false,
										"properties": {
											"ask": {
												"description": "The question the copilot suggests while it is open.",
												"maxLength": 1000,
												"type": "string"
											},
											"key": {
												"description": "Your stable identifier of the item.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											},
											"label": {
												"maxLength": 500,
												"type": "string"
											},
											"phrases": {
												"description": "Agent phrases that tick it automatically; a trailing * matches a prefix.",
												"items": {
													"maxLength": 500,
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"required": {
												"type": "boolean"
											}
										},
										"required": [
											"key",
											"label"
										],
										"type": "object"
									},
									"maxItems": 100,
									"type": "array"
								},
								"goal": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"template_id": {
						"description": "Start from a template (GET /v1/copilot_profiles/templates); the fields you send override it.",
						"enum": [
							"sales-outbound",
							"customer-service"
						],
						"type": "string"
					},
					"tone": {
						"description": "How the agent should sound.",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"CopilotProfileList": {
				"description": "Your copilot profiles, newest first. A new organisation gets one profile per template on its first list.",
				"examples": [
					{
						"data": [
							{
								"alerts": [
									{
										"key": "escalation",
										"kind": "escalation",
										"label": "Asks for a manager",
										"message": "Acknowledge and offer a solution.",
										"notify_supervisor": true,
										"phrases": [
											"manager"
										],
										"severity": "critical",
										"threshold": 0
									}
								],
								"coaching": {
									"monologue_seconds_max": 40,
									"silence_seconds_max": 7,
									"talk_ratio_max": 0.65,
									"wpm_max": 175,
									"wpm_min": 0
								},
								"company": "Acme",
								"compliance": {
									"forbidden_phrases": [
										{
											"instead": "In most cases",
											"phrase": "guaranteed",
											"reason": "No guarantees",
											"severity": "warn"
										}
									],
									"required_disclosures": []
								},
								"created": "2026-11-03T09:14:22.000Z",
								"fields": [
									{
										"hint": "",
										"key": "budget",
										"label": "Monthly budget",
										"options": [],
										"pattern": "",
										"required": false,
										"type": "money"
									}
								],
								"goal": "Book a demo or a clear next step.",
								"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
								"kb": {
									"document_ids": [
										"kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7"
									],
									"links": [],
									"min_score": 0.35
								},
								"language": "en",
								"livemode": true,
								"model": {
									"api": "chat",
									"deep_path": true,
									"fallback_model": "gpt-4.1-nano",
									"max_calls_per_minute": 12,
									"model": "gpt-4.1-mini",
									"objection_similarity": 0.72,
									"priority": true,
									"speculative": true,
									"temperature": 0.3
								},
								"name": "Outbound sales",
								"object": "copilot_profile",
								"objections": [
									{
										"examples": [
											"it costs too much"
										],
										"follow_up": "What do you pay now?",
										"kb_query": "price list",
										"key": "price",
										"label": "Too expensive",
										"response": "Compare it with what downtime costs you today.",
										"triggers": [
											"too expensive"
										]
									}
								],
								"product": "Acme Cloud PBX",
								"qa_rubric": [
									{
										"description": "Asked open questions first.",
										"key": "discovery",
										"label": "Discovery",
										"weight": 60
									},
									{
										"description": "Agreed a dated next step.",
										"key": "close",
										"label": "Next step",
										"weight": 40
									}
								],
								"script": {
									"flow_id": null,
									"version": "published"
								},
								"stages": [
									{
										"checklist": [
											{
												"ask": "",
												"key": "recorded",
												"label": "Say the call is recorded",
												"phrases": [
													"this call is recorded"
												],
												"required": true
											}
										],
										"goal": "Introduce yourself and ask for two minutes",
										"key": "opening",
										"label": "Opening"
									}
								],
								"template_id": "sales-outbound",
								"tone": "Warm, confident, never pushy.",
								"updated": "2026-11-03T09:14:22.000Z",
								"version": 4
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/copilot_profiles"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/CopilotProfile"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CopilotProfileTemplate": {
				"description": "A ready-made profile to start from (`template_id` on create).",
				"examples": [
					{
						"alerts": [
							{
								"key": "escalation",
								"kind": "escalation",
								"label": "Asks for a manager",
								"message": "Acknowledge and offer a solution.",
								"notify_supervisor": true,
								"phrases": [
									"manager"
								],
								"severity": "critical",
								"threshold": 0
							}
						],
						"coaching": {
							"monologue_seconds_max": 40,
							"silence_seconds_max": 7,
							"talk_ratio_max": 0.65,
							"wpm_max": 175,
							"wpm_min": 0
						},
						"company": "Acme",
						"compliance": {
							"forbidden_phrases": [
								{
									"instead": "In most cases",
									"phrase": "guaranteed",
									"reason": "No guarantees",
									"severity": "warn"
								}
							],
							"required_disclosures": []
						},
						"description": "Opening, discovery, offer, objections and close.",
						"fields": [
							{
								"hint": "",
								"key": "budget",
								"label": "Monthly budget",
								"options": [],
								"pattern": "",
								"required": false,
								"type": "money"
							}
						],
						"goal": "Book a demo or a clear next step.",
						"kb": {
							"document_ids": [],
							"links": [],
							"min_score": 0.35
						},
						"language": "en",
						"model": {
							"api": "chat",
							"deep_path": true,
							"fallback_model": "gpt-4.1-nano",
							"max_calls_per_minute": 12,
							"model": "gpt-4.1-mini",
							"objection_similarity": 0.72,
							"priority": true,
							"speculative": true,
							"temperature": 0.3
						},
						"name": "Outbound sales",
						"object": "copilot_profile_template",
						"objections": [
							{
								"examples": [
									"it costs too much"
								],
								"follow_up": "What do you pay now?",
								"kb_query": "price list",
								"key": "price",
								"label": "Too expensive",
								"response": "Compare it with what downtime costs you today.",
								"triggers": [
									"too expensive"
								]
							}
						],
						"product": "Acme Cloud PBX",
						"qa_rubric": [
							{
								"description": "Asked open questions first.",
								"key": "discovery",
								"label": "Discovery",
								"weight": 60
							},
							{
								"description": "Agreed a dated next step.",
								"key": "close",
								"label": "Next step",
								"weight": 40
							}
						],
						"script": {
							"flow_id": null,
							"version": "published"
						},
						"stages": [
							{
								"checklist": [
									{
										"ask": "",
										"key": "recorded",
										"label": "Say the call is recorded",
										"phrases": [
											"this call is recorded"
										],
										"required": true
									}
								],
								"goal": "Introduce yourself and ask for two minutes",
								"key": "opening",
								"label": "Opening"
							}
						],
						"template_id": "sales-outbound",
						"tone": "Warm, confident, never pushy."
					}
				],
				"properties": {
					"alerts": {
						"items": {
							"properties": {
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"kind": {
									"enum": [
										"keyword",
										"sentiment",
										"silence",
										"monologue",
										"talk_ratio",
										"long_call",
										"escalation"
									],
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"message": {
									"maxLength": 1000,
									"type": "string"
								},
								"notify_supervisor": {
									"description": "Also raise it on the supervisor board.",
									"type": "boolean"
								},
								"phrases": {
									"description": "keyword / escalation: customer phrases.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"severity": {
									"enum": [
										"info",
										"warn",
										"critical"
									],
									"type": "string"
								},
								"threshold": {
									"description": "sentiment: below this (−1…1); silence / monologue: seconds; talk_ratio: agent share; long_call: minutes.",
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"kind",
								"phrases",
								"threshold",
								"message",
								"severity",
								"notify_supervisor"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"coaching": {
						"properties": {
							"monologue_seconds_max": {
								"description": "Continuous agent speech before \"ask a question\".",
								"minimum": 5,
								"type": "number"
							},
							"silence_seconds_max": {
								"description": "Dead air before a nudge.",
								"minimum": 2,
								"type": "number"
							},
							"talk_ratio_max": {
								"description": "Agent share of talk time above which to nudge (0–1).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"wpm_max": {
								"minimum": 60,
								"type": "number"
							},
							"wpm_min": {
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"talk_ratio_max",
							"monologue_seconds_max",
							"silence_seconds_max",
							"wpm_max",
							"wpm_min"
						],
						"type": "object"
					},
					"company": {
						"description": "Who the agent represents.",
						"maxLength": 500,
						"type": "string"
					},
					"compliance": {
						"properties": {
							"forbidden_phrases": {
								"items": {
									"properties": {
										"instead": {
											"description": "Safer wording shown on the alert.",
											"maxLength": 1000,
											"type": "string"
										},
										"phrase": {
											"maxLength": 500,
											"type": "string"
										},
										"reason": {
											"maxLength": 1000,
											"type": "string"
										},
										"severity": {
											"enum": [
												"info",
												"warn",
												"critical"
											],
											"type": "string"
										}
									},
									"required": [
										"phrase",
										"reason",
										"instead",
										"severity"
									],
									"type": "object"
								},
								"maxItems": 300,
								"type": "array"
							},
							"required_disclosures": {
								"items": {
									"properties": {
										"before_stage_key": {
											"description": "…or before leaving this stage.",
											"maxLength": 64,
											"type": "string"
										},
										"deadline_seconds": {
											"description": "Alert when not said this long into the call (0: before the call ends).",
											"minimum": 0,
											"type": "number"
										},
										"key": {
											"description": "Your stable identifier of the item.",
											"maxLength": 64,
											"minLength": 1,
											"type": "string"
										},
										"label": {
											"maxLength": 500,
											"type": "string"
										},
										"phrases": {
											"items": {
												"maxLength": 500,
												"type": "string"
											},
											"maxItems": 200,
											"type": "array"
										},
										"script": {
											"description": "The exact wording to read out if it was missed.",
											"maxLength": 4000,
											"type": "string"
										}
									},
									"required": [
										"key",
										"label",
										"phrases",
										"script",
										"deadline_seconds",
										"before_stage_key"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							}
						},
						"required": [
							"required_disclosures",
							"forbidden_phrases"
						],
						"type": "object"
					},
					"description": {
						"type": "string"
					},
					"fields": {
						"description": "Details the copilot picks out of the conversation.",
						"items": {
							"properties": {
								"hint": {
									"description": "A hint for the extractor.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"required": {
									"type": "boolean"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"money",
										"phone",
										"email",
										"date",
										"enum",
										"boolean",
										"id"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"type",
								"options",
								"pattern",
								"required",
								"hint"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"goal": {
						"description": "What the call should achieve.",
						"maxLength": 4000,
						"type": "string"
					},
					"kb": {
						"properties": {
							"document_ids": {
								"description": "Knowledge-base documents the profile may use (empty: all).",
								"items": {
									"description": "A kb document ID (prefix `kbd_`).",
									"examples": [
										"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^kbd_[0-9A-Za-z]+$",
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							},
							"links": {
								"description": "Reference links shown to the agent.",
								"items": {
									"properties": {
										"label": {
											"maxLength": 200,
											"type": "string"
										},
										"url": {
											"maxLength": 2000,
											"type": "string"
										}
									},
									"required": [
										"label",
										"url"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							},
							"min_score": {
								"description": "Minimum confidence (0–1) to show a knowledge card unasked.",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"document_ids",
							"links",
							"min_score"
						],
						"type": "object"
					},
					"language": {
						"description": "The calls' language (`he`, `en`, …).",
						"maxLength": 10,
						"type": "string"
					},
					"model": {
						"properties": {
							"api": {
								"enum": [
									"chat",
									"responses"
								],
								"type": "string"
							},
							"deep_path": {
								"description": "false: the fast path only (no model calls).",
								"type": "boolean"
							},
							"fallback_model": {
								"maxLength": 80,
								"type": "string"
							},
							"max_calls_per_minute": {
								"description": "Model calls per minute per call.",
								"maximum": 60,
								"minimum": 0,
								"type": "integer"
							},
							"model": {
								"maxLength": 80,
								"type": "string"
							},
							"objection_similarity": {
								"description": "Meaning-based objection match threshold (cosine).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"priority": {
								"description": "Priority processing: steadier, lower latency, higher token price.",
								"type": "boolean"
							},
							"speculative": {
								"description": "Start on stable interim text, before the utterance is final.",
								"type": "boolean"
							},
							"temperature": {
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"required": [
							"model",
							"fallback_model",
							"temperature",
							"api",
							"priority",
							"max_calls_per_minute",
							"speculative",
							"deep_path",
							"objection_similarity"
						],
						"type": "object"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "copilot_profile_template",
						"type": "string"
					},
					"objections": {
						"description": "The objection library.",
						"items": {
							"properties": {
								"examples": {
									"description": "Paraphrases for the meaning-based match.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"follow_up": {
									"maxLength": 1000,
									"type": "string"
								},
								"kb_query": {
									"description": "A knowledge-base query whose facts are attached to the card.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"response": {
									"description": "The recommended answer shown on the card.",
									"maxLength": 4000,
									"type": "string"
								},
								"triggers": {
									"description": "Customer phrases that fire it at once.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								}
							},
							"required": [
								"key",
								"label",
								"triggers",
								"examples",
								"response",
								"follow_up",
								"kb_query"
							],
							"type": "object"
						},
						"maxItems": 300,
						"type": "array"
					},
					"product": {
						"maxLength": 2000,
						"type": "string"
					},
					"qa_rubric": {
						"description": "The QA rubric this profile's calls are scored against (empty: the organisation's rubric).",
						"items": {
							"properties": {
								"description": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"weight": {
									"description": "Relative importance on one 0–100 scale (points out of 100); only the ratios count.",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"weight",
								"description"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"script": {
						"properties": {
							"flow_id": {
								"anyOf": [
									{
										"description": "A flow ID (prefix `flow_`).",
										"examples": [
											"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "An agent-script flow that drives the call branch by branch (null: the linear `stages`)."
							},
							"version": {
								"anyOf": [
									{
										"const": "published",
										"type": "string"
									},
									{
										"maximum": 9007199254740991,
										"minimum": 1,
										"type": "integer"
									}
								],
								"description": "`published`, or a pinned version number."
							}
						},
						"required": [
							"flow_id",
							"version"
						],
						"type": "object"
					},
					"stages": {
						"description": "The call's stages, each with a checklist (used when no `script` flow is set).",
						"items": {
							"properties": {
								"checklist": {
									"items": {
										"properties": {
											"ask": {
												"description": "The question the copilot suggests while it is open.",
												"maxLength": 1000,
												"type": "string"
											},
											"key": {
												"description": "Your stable identifier of the item.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											},
											"label": {
												"maxLength": 500,
												"type": "string"
											},
											"phrases": {
												"description": "Agent phrases that tick it automatically; a trailing * matches a prefix.",
												"items": {
													"maxLength": 500,
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"required": {
												"type": "boolean"
											}
										},
										"required": [
											"key",
											"label",
											"phrases",
											"ask",
											"required"
										],
										"type": "object"
									},
									"maxItems": 100,
									"type": "array"
								},
								"goal": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"goal",
								"checklist"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"template_id": {
						"description": "Pass as `template_id` on create.",
						"enum": [
							"sales-outbound",
							"customer-service"
						],
						"type": "string"
					},
					"tone": {
						"description": "How the agent should sound.",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"required": [
					"object",
					"template_id",
					"name",
					"description",
					"goal",
					"tone",
					"company",
					"product",
					"language",
					"stages",
					"objections",
					"kb",
					"fields",
					"compliance",
					"coaching",
					"alerts",
					"qa_rubric",
					"script",
					"model"
				],
				"type": "object"
			},
			"CopilotProfileTemplateList": {
				"description": "The built-in templates.",
				"examples": [
					{
						"data": [
							{
								"alerts": [
									{
										"key": "escalation",
										"kind": "escalation",
										"label": "Asks for a manager",
										"message": "Acknowledge and offer a solution.",
										"notify_supervisor": true,
										"phrases": [
											"manager"
										],
										"severity": "critical",
										"threshold": 0
									}
								],
								"coaching": {
									"monologue_seconds_max": 40,
									"silence_seconds_max": 7,
									"talk_ratio_max": 0.65,
									"wpm_max": 175,
									"wpm_min": 0
								},
								"company": "Acme",
								"compliance": {
									"forbidden_phrases": [
										{
											"instead": "In most cases",
											"phrase": "guaranteed",
											"reason": "No guarantees",
											"severity": "warn"
										}
									],
									"required_disclosures": []
								},
								"description": "Opening, discovery, offer, objections and close.",
								"fields": [
									{
										"hint": "",
										"key": "budget",
										"label": "Monthly budget",
										"options": [],
										"pattern": "",
										"required": false,
										"type": "money"
									}
								],
								"goal": "Book a demo or a clear next step.",
								"kb": {
									"document_ids": [],
									"links": [],
									"min_score": 0.35
								},
								"language": "en",
								"model": {
									"api": "chat",
									"deep_path": true,
									"fallback_model": "gpt-4.1-nano",
									"max_calls_per_minute": 12,
									"model": "gpt-4.1-mini",
									"objection_similarity": 0.72,
									"priority": true,
									"speculative": true,
									"temperature": 0.3
								},
								"name": "Outbound sales",
								"object": "copilot_profile_template",
								"objections": [
									{
										"examples": [
											"it costs too much"
										],
										"follow_up": "What do you pay now?",
										"kb_query": "price list",
										"key": "price",
										"label": "Too expensive",
										"response": "Compare it with what downtime costs you today.",
										"triggers": [
											"too expensive"
										]
									}
								],
								"product": "Acme Cloud PBX",
								"qa_rubric": [
									{
										"description": "Asked open questions first.",
										"key": "discovery",
										"label": "Discovery",
										"weight": 60
									},
									{
										"description": "Agreed a dated next step.",
										"key": "close",
										"label": "Next step",
										"weight": 40
									}
								],
								"script": {
									"flow_id": null,
									"version": "published"
								},
								"stages": [
									{
										"checklist": [
											{
												"ask": "",
												"key": "recorded",
												"label": "Say the call is recorded",
												"phrases": [
													"this call is recorded"
												],
												"required": true
											}
										],
										"goal": "Introduce yourself and ask for two minutes",
										"key": "opening",
										"label": "Opening"
									}
								],
								"template_id": "sales-outbound",
								"tone": "Warm, confident, never pushy."
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/copilot_profiles/templates"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/CopilotProfileTemplate"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"CopilotProfileUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The fields to change. Nested objects (`kb`, `compliance`, `coaching`, `script`, `model`) merge with the stored values; lists replace them.",
				"examples": [
					{
						"coaching": {
							"talk_ratio_max": 0.6
						}
					}
				],
				"properties": {
					"alerts": {
						"items": {
							"additionalProperties": false,
							"properties": {
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"kind": {
									"enum": [
										"keyword",
										"sentiment",
										"silence",
										"monologue",
										"talk_ratio",
										"long_call",
										"escalation"
									],
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"message": {
									"maxLength": 1000,
									"type": "string"
								},
								"notify_supervisor": {
									"description": "Also raise it on the supervisor board.",
									"type": "boolean"
								},
								"phrases": {
									"description": "keyword / escalation: customer phrases.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"severity": {
									"enum": [
										"info",
										"warn",
										"critical"
									],
									"type": "string"
								},
								"threshold": {
									"description": "sentiment: below this (−1…1); silence / monologue: seconds; talk_ratio: agent share; long_call: minutes.",
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"kind"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"coaching": {
						"additionalProperties": false,
						"properties": {
							"monologue_seconds_max": {
								"description": "Continuous agent speech before \"ask a question\".",
								"minimum": 5,
								"type": "number"
							},
							"silence_seconds_max": {
								"description": "Dead air before a nudge.",
								"minimum": 2,
								"type": "number"
							},
							"talk_ratio_max": {
								"description": "Agent share of talk time above which to nudge (0–1).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"wpm_max": {
								"minimum": 60,
								"type": "number"
							},
							"wpm_min": {
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"company": {
						"description": "Who the agent represents.",
						"maxLength": 500,
						"type": "string"
					},
					"compliance": {
						"additionalProperties": false,
						"properties": {
							"forbidden_phrases": {
								"items": {
									"additionalProperties": false,
									"properties": {
										"instead": {
											"description": "Safer wording shown on the alert.",
											"maxLength": 1000,
											"type": "string"
										},
										"phrase": {
											"maxLength": 500,
											"type": "string"
										},
										"reason": {
											"maxLength": 1000,
											"type": "string"
										},
										"severity": {
											"enum": [
												"info",
												"warn",
												"critical"
											],
											"type": "string"
										}
									},
									"required": [
										"phrase"
									],
									"type": "object"
								},
								"maxItems": 300,
								"type": "array"
							},
							"required_disclosures": {
								"items": {
									"additionalProperties": false,
									"properties": {
										"before_stage_key": {
											"description": "…or before leaving this stage.",
											"maxLength": 64,
											"type": "string"
										},
										"deadline_seconds": {
											"description": "Alert when not said this long into the call (0: before the call ends).",
											"minimum": 0,
											"type": "number"
										},
										"key": {
											"description": "Your stable identifier of the item.",
											"maxLength": 64,
											"minLength": 1,
											"type": "string"
										},
										"label": {
											"maxLength": 500,
											"type": "string"
										},
										"phrases": {
											"items": {
												"maxLength": 500,
												"type": "string"
											},
											"maxItems": 200,
											"type": "array"
										},
										"script": {
											"description": "The exact wording to read out if it was missed.",
											"maxLength": 4000,
											"type": "string"
										}
									},
									"required": [
										"key",
										"label"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							}
						},
						"type": "object"
					},
					"fields": {
						"description": "Details the copilot picks out of the conversation.",
						"items": {
							"additionalProperties": false,
							"properties": {
								"hint": {
									"description": "A hint for the extractor.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"required": {
									"type": "boolean"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"money",
										"phone",
										"email",
										"date",
										"enum",
										"boolean",
										"id"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 100,
						"type": "array"
					},
					"goal": {
						"description": "What the call should achieve.",
						"maxLength": 4000,
						"type": "string"
					},
					"kb": {
						"additionalProperties": false,
						"properties": {
							"document_ids": {
								"description": "Knowledge-base documents the profile may use (empty: all).",
								"items": {
									"description": "A kb document ID (`kbd_…`).",
									"maxLength": 200,
									"pattern": "^kbd_[0-9A-Za-z]+$",
									"type": "string"
								},
								"maxItems": 500,
								"type": "array"
							},
							"links": {
								"description": "Reference links shown to the agent.",
								"items": {
									"properties": {
										"label": {
											"maxLength": 200,
											"type": "string"
										},
										"url": {
											"maxLength": 2000,
											"type": "string"
										}
									},
									"required": [
										"label",
										"url"
									],
									"type": "object"
								},
								"maxItems": 50,
								"type": "array"
							},
							"min_score": {
								"description": "Minimum confidence (0–1) to show a knowledge card unasked.",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"language": {
						"description": "The calls' language (`he`, `en`, …).",
						"maxLength": 10,
						"type": "string"
					},
					"model": {
						"additionalProperties": false,
						"properties": {
							"api": {
								"enum": [
									"chat",
									"responses"
								],
								"type": "string"
							},
							"deep_path": {
								"description": "false: the fast path only (no model calls).",
								"type": "boolean"
							},
							"fallback_model": {
								"maxLength": 80,
								"type": "string"
							},
							"max_calls_per_minute": {
								"description": "Model calls per minute per call.",
								"maximum": 60,
								"minimum": 0,
								"type": "integer"
							},
							"model": {
								"maxLength": 80,
								"type": "string"
							},
							"objection_similarity": {
								"description": "Meaning-based objection match threshold (cosine).",
								"maximum": 1,
								"minimum": 0,
								"type": "number"
							},
							"priority": {
								"description": "Priority processing: steadier, lower latency, higher token price.",
								"type": "boolean"
							},
							"speculative": {
								"description": "Start on stable interim text, before the utterance is final.",
								"type": "boolean"
							},
							"temperature": {
								"maximum": 2,
								"minimum": 0,
								"type": "number"
							}
						},
						"type": "object"
					},
					"name": {
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"objections": {
						"description": "The objection library.",
						"items": {
							"additionalProperties": false,
							"properties": {
								"examples": {
									"description": "Paraphrases for the meaning-based match.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"follow_up": {
									"maxLength": 1000,
									"type": "string"
								},
								"kb_query": {
									"description": "A knowledge-base query whose facts are attached to the card.",
									"maxLength": 500,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"response": {
									"description": "The recommended answer shown on the card.",
									"maxLength": 4000,
									"type": "string"
								},
								"triggers": {
									"description": "Customer phrases that fire it at once.",
									"items": {
										"maxLength": 500,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								}
							},
							"required": [
								"key",
								"label",
								"response"
							],
							"type": "object"
						},
						"maxItems": 300,
						"type": "array"
					},
					"product": {
						"maxLength": 2000,
						"type": "string"
					},
					"qa_rubric": {
						"description": "The QA rubric this profile's calls are scored against (empty: the organisation's rubric).",
						"items": {
							"additionalProperties": false,
							"properties": {
								"description": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								},
								"weight": {
									"description": "Relative importance on one 0–100 scale (points out of 100); only the ratios count.",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"script": {
						"additionalProperties": false,
						"properties": {
							"flow_id": {
								"anyOf": [
									{
										"description": "A flow ID (`flow_…`).",
										"maxLength": 200,
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "An agent-script flow that drives the call branch by branch (null: the linear `stages`)."
							},
							"version": {
								"anyOf": [
									{
										"const": "published",
										"type": "string"
									},
									{
										"maximum": 9007199254740991,
										"minimum": 1,
										"type": "integer"
									}
								],
								"description": "`published`, or a pinned version number."
							}
						},
						"type": "object"
					},
					"stages": {
						"description": "The call's stages, each with a checklist (used when no `script` flow is set).",
						"items": {
							"additionalProperties": false,
							"properties": {
								"checklist": {
									"items": {
										"additionalProperties": false,
										"properties": {
											"ask": {
												"description": "The question the copilot suggests while it is open.",
												"maxLength": 1000,
												"type": "string"
											},
											"key": {
												"description": "Your stable identifier of the item.",
												"maxLength": 64,
												"minLength": 1,
												"type": "string"
											},
											"label": {
												"maxLength": 500,
												"type": "string"
											},
											"phrases": {
												"description": "Agent phrases that tick it automatically; a trailing * matches a prefix.",
												"items": {
													"maxLength": 500,
													"type": "string"
												},
												"maxItems": 200,
												"type": "array"
											},
											"required": {
												"type": "boolean"
											}
										},
										"required": [
											"key",
											"label"
										],
										"type": "object"
									},
									"maxItems": 100,
									"type": "array"
								},
								"goal": {
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable identifier of the item.",
									"maxLength": 64,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 500,
									"type": "string"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 50,
						"type": "array"
					},
					"tone": {
						"description": "How the agent should sound.",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"CustomTool": {
				"description": "A tool the assistant can call during a call.",
				"properties": {
					"contract": {
						"description": "The request/response contract: `legacy` ({tool, arguments, call:{id}}) or `v1` (rich call context and `say` / `end_call` / `transfer` responses).",
						"enum": [
							"legacy",
							"v1"
						],
						"type": "string"
					},
					"description": {
						"description": "What the tool does and when to call it, for the model.",
						"type": "string"
					},
					"enabled": {
						"description": "Disabled tools are kept but not offered to the model.",
						"type": "boolean"
					},
					"header_names": {
						"description": "Names of the extra request headers stored for this tool. Header values are write-only and never returned.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"mock_response": {
						"description": "The answer of a `mock` tool; `{{argument}}` placeholders are filled in.",
						"type": "string"
					},
					"name": {
						"description": "The function name the model calls (letters, digits, `_` and `-`).",
						"type": "string"
					},
					"parameters": {
						"additionalProperties": {},
						"description": "JSON Schema of the arguments the model passes.",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"request_start_message": {
						"description": "Spoken while the tool runs (empty: nothing).",
						"type": "string"
					},
					"timeout_seconds": {
						"description": "How long to wait for the webhook to answer.",
						"type": "number"
					},
					"type": {
						"description": "`webhook`: a signed request is POSTed to `url`. `mock`: answers `mock_response` without any request (for testing prompts).",
						"enum": [
							"webhook",
							"mock"
						],
						"type": "string"
					},
					"url": {
						"description": "The webhook URL (`webhook` tools).",
						"type": [
							"string",
							"null"
						]
					}
				},
				"required": [
					"name",
					"description",
					"parameters",
					"type",
					"url",
					"header_names",
					"timeout_seconds",
					"contract",
					"request_start_message",
					"mock_response",
					"enabled"
				],
				"type": "object"
			},
			"CustomToolParamsInput": {
				"additionalProperties": false,
				"description": "A custom tool as you send it. `headers` are write-only: stored with the assistant, never returned.",
				"examples": [
					{
						"description": "Find free appointment slots",
						"headers": {
							"Authorization": "Bearer crm-secret"
						},
						"name": "find_slots",
						"parameters": {
							"properties": {
								"date": {
									"type": "string"
								}
							},
							"required": [
								"date"
							],
							"type": "object"
						},
						"url": "https://crm.example.com/voice/tools"
					}
				],
				"properties": {
					"contract": {
						"description": "Default `legacy`.",
						"enum": [
							"legacy",
							"v1"
						],
						"type": "string"
					},
					"description": {
						"description": "What the tool does and when to call it.",
						"maxLength": 2000,
						"type": "string"
					},
					"enabled": {
						"description": "Default true.",
						"type": "boolean"
					},
					"headers": {
						"additionalProperties": {
							"maxLength": 4096,
							"type": "string"
						},
						"description": "Extra request headers, e.g. `Authorization`. Write-only. On update, leave it out to keep the stored headers; send `{}` to remove them.",
						"propertyNames": {
							"pattern": "^[!#$%&'*+.^_`|~0-9A-Za-z-]{1,100}$",
							"type": "string"
						},
						"type": "object"
					},
					"mock_response": {
						"description": "The answer of a `mock` tool.",
						"maxLength": 10000,
						"type": "string"
					},
					"name": {
						"description": "The function name the model calls (unique per assistant).",
						"pattern": "^[a-zA-Z0-9_-]{1,64}$",
						"type": "string"
					},
					"parameters": {
						"additionalProperties": {},
						"description": "JSON Schema (an object schema) of the arguments.",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"request_start_message": {
						"description": "Spoken while the tool runs.",
						"maxLength": 500,
						"type": "string"
					},
					"timeout_seconds": {
						"description": "How long to wait for the webhook, 1–60 (default 15).",
						"maximum": 60,
						"minimum": 1,
						"type": "number"
					},
					"type": {
						"description": "Default: `webhook` when `url` is set, else `mock`.",
						"enum": [
							"webhook",
							"mock"
						],
						"type": "string"
					},
					"url": {
						"description": "The webhook URL (http or https). Required for `webhook` tools. `cli://<name>` sends the tool's calls to your CLI `listen --forward-tools` session instead (development).",
						"maxLength": 2048,
						"type": "string"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"DeletedAssistant": {
				"description": "The assistant was deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"object": "assistant"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A assistant ID (prefix `asst_`).",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "assistant",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedAudioAsset": {
				"examples": [
					{
						"deleted": true,
						"id": "aud_8b2KxQ4mLp9",
						"object": "audio_asset"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A audio asset ID (prefix `aud_`).",
						"examples": [
							"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "audio_asset",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"deleted"
				],
				"type": "object"
			},
			"DeletedCampaign": {
				"description": "The deleted campaign's ID.",
				"examples": [
					{
						"deleted": true,
						"id": "cmp_2Yb7mCq9aPLk",
						"object": "campaign"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A campaign ID (prefix `cmp_`).",
						"examples": [
							"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cmp_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "campaign",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedConferenceRoom": {
				"examples": [
					{
						"deleted": true,
						"id": "room_2dXk9QmZ4rTv",
						"object": "conference_room"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A conference room ID (prefix `room_`).",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "conference_room",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"deleted"
				],
				"type": "object"
			},
			"DeletedConnection": {
				"description": "The connection was deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
						"object": "connection"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A connection ID (prefix `conn_`).",
						"examples": [
							"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^conn_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "connection",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedCopilotProfile": {
				"description": "The profile was deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "cop_8Ps2Ux5Zc7Eh0Jm3Or6Tw9",
						"object": "copilot_profile"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A copilot profile ID (prefix `cop_`).",
						"examples": [
							"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^cop_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "copilot_profile",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedDncEntry": {
				"description": "The number was removed from the do-not-call list.",
				"examples": [
					{
						"deleted": true,
						"object": "dnc_entry",
						"phone": "+972501234567"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"object": {
						"const": "dnc_entry",
						"type": "string"
					},
					"phone": {
						"type": "string"
					}
				},
				"required": [
					"object",
					"phone",
					"deleted"
				],
				"type": "object"
			},
			"DeletedFlow": {
				"description": "The flow and its versions were deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"object": "flow"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "flow",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedInboundRoute": {
				"description": "The route was deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
						"object": "inbound_route"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A inbound route ID (prefix `rte_`).",
						"examples": [
							"rte_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rte_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "inbound_route",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedInvitation": {
				"description": "The invitation was withdrawn: its link no longer works.",
				"examples": [
					{
						"deleted": true,
						"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
						"object": "invitation"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A invitation ID (prefix `inv_t_`).",
						"examples": [
							"inv_t_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^inv_t_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "invitation",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedKbDocument": {
				"description": "The document and its stored original were deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
						"object": "kb_document"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A kb document ID (prefix `kbd_`).",
						"examples": [
							"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^kbd_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "kb_document",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedPhoneNumber": {
				"description": "The sandbox number was released.",
				"examples": [
					{
						"deleted": true,
						"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
						"object": "phone_number"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "The released number's ID.",
						"examples": [
							"pn_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^pn_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "phone_number",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedQueue": {
				"description": "The queue was deleted.",
				"examples": [
					{
						"deleted": true,
						"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"object": "queue"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A queue ID (prefix `q_`).",
						"examples": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "queue",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedReport": {
				"examples": [
					{
						"deleted": true,
						"id": "rpt_2dXk9QmZ4rTv",
						"object": "report"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A report ID (prefix `rpt_`).",
						"examples": [
							"rpt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rpt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "report",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"deleted"
				],
				"type": "object"
			},
			"DeletedSecret": {
				"examples": [
					{
						"deleted": true,
						"name": "CRM_TOKEN",
						"object": "secret"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "secret",
						"type": "string"
					}
				},
				"required": [
					"object",
					"name",
					"deleted"
				],
				"type": "object"
			},
			"DeletedTeam": {
				"description": "The team was deleted; its members are in no team now.",
				"examples": [
					{
						"deleted": true,
						"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
						"object": "team"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A team ID (prefix `team_`).",
						"examples": [
							"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^team_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "team",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DeletedWebhookEndpoint": {
				"description": "The endpoint was deleted; its queued deliveries are dropped.",
				"examples": [
					{
						"deleted": true,
						"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"object": "webhook_endpoint"
					}
				],
				"properties": {
					"deleted": {
						"const": true,
						"type": "boolean"
					},
					"id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "webhook_endpoint",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"deleted"
				],
				"type": "object"
			},
			"DncBatch": {
				"description": "The outcome of adding numbers to the do-not-call list. Queued campaign contacts with these numbers are taken out at once.",
				"examples": [
					{
						"added": [
							"+972501234567"
						],
						"already_listed": [
							"+972527654321"
						],
						"invalid": [],
						"livemode": true,
						"object": "dnc_batch"
					}
				],
				"properties": {
					"added": {
						"description": "Numbers added now (E.164). Each emits one `contact.opted_out` event.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"already_listed": {
						"description": "Numbers that were on the list already (E.164).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"invalid": {
						"description": "Entries that are not valid phone numbers, as sent.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "dnc_batch",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"added",
					"already_listed",
					"invalid"
				],
				"type": "object"
			},
			"DncCheck": {
				"description": "Whether each number may be called for `purpose`, from your do-not-call list, your consent records and the national registry. Live keys look numbers up in the registry when no recent answer is cached; test keys use cached answers only, and a missing answer does not block them (test calls never consult the registry). Nothing is changed.",
				"examples": [
					{
						"livemode": true,
						"object": "dnc_check",
						"purpose": "marketing",
						"results": [
							{
								"callable": true,
								"consent": true,
								"input": "+972501234567",
								"org_dnc": false,
								"phone": "+972501234567",
								"reasons": [],
								"registry": {
									"cached": true,
									"checked_at": "2026-11-01T08:00:00.000Z",
									"status": "clear"
								},
								"valid": true
							}
						]
					}
				],
				"properties": {
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "dnc_check",
						"type": "string"
					},
					"purpose": {
						"enum": [
							"service",
							"marketing",
							"survey"
						],
						"type": "string"
					},
					"results": {
						"items": {
							"properties": {
								"callable": {
									"description": "A call with this purpose would be allowed now (the calling window is checked when dialling).",
									"type": "boolean"
								},
								"consent": {
									"description": "An active marketing consent is recorded.",
									"type": "boolean"
								},
								"input": {
									"description": "The number as sent.",
									"type": "string"
								},
								"org_dnc": {
									"description": "On your do-not-call list.",
									"type": "boolean"
								},
								"phone": {
									"description": "The number in E.164, or null when it is not a valid number.",
									"type": [
										"string",
										"null"
									]
								},
								"reasons": {
									"description": "Why not, when `callable` is false.",
									"items": {
										"enum": [
											"invalid_number",
											"dnc_listed",
											"consent_missing",
											"registry_listed",
											"registry_unavailable"
										],
										"type": "string"
									},
									"type": "array"
								},
								"registry": {
									"properties": {
										"cached": {
											"description": "The answer came from the recent-answers cache.",
											"type": "boolean"
										},
										"checked_at": {
											"anyOf": [
												{
													"description": "An ISO-8601 timestamp in UTC.",
													"examples": [
														"2026-11-03T09:14:22.000Z"
													],
													"format": "date-time",
													"type": "string"
												},
												{
													"type": "null"
												}
											],
											"description": "When the registry answered."
										},
										"status": {
											"description": "The national do-not-call registry: `clear`, `registered`, `unavailable` (it did not answer), `not_checked` (the registry is not connected or switched off, or a test key found no cached answer) or `not_applicable` (not an Israeli number). Live marketing calls need `clear`: no answer blocks them unless a supervisor granted a registry override.",
											"enum": [
												"clear",
												"registered",
												"unavailable",
												"not_checked",
												"not_applicable"
											],
											"type": "string"
										}
									},
									"required": [
										"status",
										"checked_at",
										"cached"
									],
									"type": "object"
								},
								"valid": {
									"type": "boolean"
								}
							},
							"required": [
								"input",
								"phone",
								"valid",
								"org_dnc",
								"consent",
								"registry",
								"callable",
								"reasons"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"livemode",
					"purpose",
					"results"
				],
				"type": "object"
			},
			"DncEntry": {
				"description": "A number on your do-not-call list. No call of any purpose reaches it.",
				"examples": [
					{
						"call_id": null,
						"campaign_id": null,
						"created": "2026-11-03T09:14:22.000Z",
						"livemode": true,
						"object": "dnc_entry",
						"phone": "+972501234567",
						"reason": "Asked not to be called",
						"source": "api"
					}
				],
				"properties": {
					"call_id": {
						"anyOf": [
							{
								"description": "The call the person opted out on, or null.",
								"examples": [
									"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^call_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"campaign_id": {
						"anyOf": [
							{
								"description": "The campaign whose call the person opted out on, or null.",
								"examples": [
									"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cmp_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "dnc_entry",
						"type": "string"
					},
					"phone": {
						"description": "The number, E.164.",
						"type": "string"
					},
					"reason": {
						"description": "A free-text note.",
						"type": "string"
					},
					"source": {
						"description": "How it was added: `manual`, `import`, `api`, `opt_out_tool` (asked the AI), `opt_out_phrase` or `opt_out_dtmf`.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"phone",
					"source",
					"reason",
					"campaign_id",
					"call_id",
					"created"
				],
				"type": "object"
			},
			"DncEntryList": {
				"description": "A page of your do-not-call list, newest first.",
				"examples": [
					{
						"data": [
							{
								"call_id": null,
								"campaign_id": null,
								"created": "2026-11-03T09:14:22.000Z",
								"livemode": true,
								"object": "dnc_entry",
								"phone": "+972501234567",
								"reason": "Asked not to be called",
								"source": "api"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/dnc"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/DncEntry"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"DuplicateCopilotProfileParamsInput": {
				"additionalProperties": false,
				"description": "Options for the copy.",
				"examples": [
					{
						"name": "Outbound sales B"
					}
				],
				"properties": {
					"name": {
						"description": "Default: the original's name with \"(copy)\".",
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					}
				},
				"type": "object"
			},
			"DuplicateFlowParamsInput": {
				"additionalProperties": false,
				"description": "Options for the copy (of the draft).",
				"examples": [
					{
						"name": "Reception B"
					}
				],
				"properties": {
					"name": {
						"description": "Default: the original's name with \"(copy)\".",
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					}
				},
				"type": "object"
			},
			"ErrorEnvelope": {
				"description": "Every /v1 error.",
				"examples": [
					{
						"error": {
							"code": "parameter_missing",
							"doc_url": "https://docs.morevoice.ai/api/errors#parameter-missing",
							"message": "Missing required parameter: to.",
							"param": "to",
							"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
							"type": "invalid_request_error"
						}
					}
				],
				"properties": {
					"error": {
						"properties": {
							"code": {
								"description": "A stable, machine-readable code from the error-code catalogue.",
								"type": "string"
							},
							"details": {
								"additionalProperties": {},
								"description": "Structured context, e.g. `required_scope` or the compliance `verdict`.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							"doc_url": {
								"description": "A link to the documentation of this code.",
								"type": "string"
							},
							"message": {
								"description": "A human-readable explanation. Do not parse it.",
								"type": "string"
							},
							"param": {
								"description": "The request parameter the error relates to, e.g. `to` or `metadata[order_id]`.",
								"type": "string"
							},
							"request_id": {
								"description": "The X-Request-Id of this request. Quote it when you contact support.",
								"type": "string"
							},
							"type": {
								"description": "The category of the error.",
								"enum": [
									"invalid_request_error",
									"authentication_error",
									"permission_error",
									"not_found",
									"conflict",
									"rate_limit_error",
									"compliance_error",
									"idempotency_error",
									"api_error"
								],
								"type": "string"
							}
						},
						"required": [
							"type",
							"code",
							"message",
							"doc_url",
							"request_id"
						],
						"type": "object"
					}
				},
				"required": [
					"error"
				],
				"type": "object"
			},
			"Event": {
				"description": "Something that happened in your organisation: what webhooks deliver, kept 30 days.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22Z",
						"data": {
							"object": {
								"duration_ms": 93120,
								"end_reason": "hangup",
								"id": "call_7Hk2LmN9pQ4rS6tV8wX0yZ",
								"metadata": {},
								"object": "call",
								"status": "ended"
							}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "call.ended"
					}
				],
				"properties": {
					"api_version": {
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"properties": {
							"legacy_event": {
								"description": "The previous webhook name of this event (e.g. `dnc.added`), when it has one.",
								"type": "string"
							},
							"object": {
								"additionalProperties": {},
								"description": "The object the event is about (its shape per type: the `webhooks` section of this document).",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID (also the `webhook-id` header of its deliveries).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "A org ID (prefix `org_`).",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"enum": [
							"call.created",
							"call.started",
							"call.ringing",
							"call.answered",
							"call.transferred",
							"call.ended",
							"call.analyzed",
							"call.cost_finalized",
							"recording.ready",
							"transcript.ready",
							"campaign.started",
							"campaign.paused",
							"campaign.resumed",
							"campaign.completed",
							"campaign.cancelled",
							"campaign.blocked",
							"contact.attempted",
							"contact.completed",
							"contact.opted_out",
							"consent.recorded",
							"callback.scheduled",
							"callback.completed",
							"callback.failed",
							"queue.call_entered",
							"queue.call_answered",
							"queue.call_abandoned",
							"queue.overflowed",
							"agent.status_changed",
							"qa.scored",
							"qa.overridden",
							"flow.published",
							"flow.node_failed",
							"kb.document.ready",
							"kb.document.failed",
							"connection.status_changed",
							"usage.threshold",
							"billing.payment_succeeded",
							"billing.payment_failed",
							"billing.invoice_issued",
							"billing.plan_changed",
							"number.provisioned",
							"number.released",
							"number.port_completed",
							"webhook_endpoint.disabled",
							"test",
							"callback.cancelled",
							"agent.wrapup_completed",
							"transcript.final",
							"call.tool_called",
							"call.dtmf",
							"billing.subscription_changed",
							"number.kyc_approved",
							"number.kyc_rejected",
							"number.kyc_expired",
							"number.port_foc_scheduled",
							"number.port_rejected",
							"kyc.submitted",
							"kyc.approved",
							"kyc.rejected",
							"kyc.info_requested",
							"kyc.suspended",
							"call.routing_decided"
						],
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"EventList": {
				"description": "A page of events, newest first.",
				"examples": [
					{
						"data": [
							{
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22Z",
								"data": {
									"object": {
										"duration_ms": 93120,
										"end_reason": "hangup",
										"id": "call_7Hk2LmN9pQ4rS6tV8wX0yZ",
										"metadata": {},
										"object": "call",
										"status": "ended"
									}
								},
								"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"livemode": true,
								"object": "event",
								"org_id": "org_0000000000000000000001",
								"request": {
									"id": null,
									"idempotency_key": null
								},
								"type": "call.ended"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/events"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Event"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"Flow": {
				"description": "A call flow: an editable draft and its published, immutable versions.",
				"examples": [
					{
						"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"description": "Identify the caller and route them.",
						"draft_rev": 17,
						"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"kind": "voice",
						"latest_version": 3,
						"livemode": true,
						"name": "Reception",
						"node_count": 12,
						"object": "flow",
						"published_version": 3,
						"status": "published",
						"template_id": null,
						"updated": "2026-11-03T09:14:22.000Z"
					}
				],
				"properties": {
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"description": {
						"type": "string"
					},
					"draft_rev": {
						"description": "The draft's revision: send it as `base_rev` when you write the draft.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"id": {
						"description": "The flow's ID.",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"kind": {
						"description": "voice: drives an AI assistant; agent_script: a human agent's branching script; ivr: a phone menu.",
						"enum": [
							"voice",
							"agent_script",
							"ivr"
						],
						"type": "string"
					},
					"latest_version": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"node_count": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"object": {
						"const": "flow",
						"type": "string"
					},
					"published_version": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "The version calls run (null: never published)."
					},
					"status": {
						"enum": [
							"draft",
							"published",
							"archived"
						],
						"type": "string"
					},
					"template_id": {
						"type": [
							"string",
							"null"
						]
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"description",
					"kind",
					"status",
					"published_version",
					"latest_version",
					"draft_rev",
					"assistant_id",
					"template_id",
					"node_count",
					"updated"
				],
				"type": "object"
			},
			"FlowAnalytics": {
				"description": "How calls went through a flow: visits, drop-off and errors per node, conversion per transition, how calls ended.",
				"examples": [
					{
						"calls": 120,
						"ends": [
							{
								"calls": 98,
								"reason": "flow-ended"
							},
							{
								"calls": 22,
								"reason": "customer-hangup"
							}
						],
						"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"from": "2026-11-01T00:00:00.000Z",
						"ivr": null,
						"livemode": true,
						"nodes": [
							{
								"avg_turns": 0.2,
								"calls": 120,
								"drop_off": 4,
								"errors": 0,
								"node_key": "start",
								"node_type": "start",
								"visits": 120
							},
							{
								"avg_turns": 1.4,
								"calls": 116,
								"drop_off": 9,
								"errors": 0,
								"node_key": "ask_id",
								"node_type": "question",
								"visits": 131
							}
						],
						"object": "flow_analytics",
						"to": null,
						"transitions": [
							{
								"node_key": "start",
								"rate": 0.967,
								"taken": 116,
								"transition_key": "t_next"
							}
						],
						"version": null
					}
				],
				"properties": {
					"calls": {
						"description": "Calls that ran the flow in the range (at most the latest 5000).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"ends": {
						"items": {
							"properties": {
								"calls": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"reason": {
									"type": "string"
								}
							},
							"required": [
								"reason",
								"calls"
							],
							"type": "object"
						},
						"type": "array"
					},
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"from": {
						"type": [
							"string",
							"null"
						]
					},
					"ivr": {
						"anyOf": [
							{
								"properties": {
									"abandon_rate": {
										"type": "number"
									},
									"avg_ivr_ms": {
										"type": "number"
									},
									"by_menu": {
										"items": {
											"properties": {
												"abandoned": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"avg_ms": {
													"type": "number"
												},
												"entered": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"invalid": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"no_input": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"node_key": {
													"type": "string"
												}
											},
											"required": [
												"node_key",
												"entered",
												"invalid",
												"no_input",
												"abandoned",
												"avg_ms"
											],
											"type": "object"
										},
										"type": "array"
									},
									"calls": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"containment": {
										"type": "number"
									},
									"dtmf_share": {
										"type": "number"
									},
									"exits": {
										"items": {
											"properties": {
												"calls": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"kind": {
													"type": "string"
												}
											},
											"required": [
												"kind",
												"calls"
											],
											"type": "object"
										},
										"type": "array"
									},
									"invalid_rate": {
										"type": "number"
									},
									"no_input_rate": {
										"type": "number"
									},
									"speech_share": {
										"type": "number"
									}
								},
								"required": [
									"calls",
									"containment",
									"abandon_rate",
									"avg_ivr_ms",
									"dtmf_share",
									"speech_share",
									"invalid_rate",
									"no_input_rate",
									"by_menu",
									"exits"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "IVR flows: containment, abandon rate, keypad vs speech, per menu."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"nodes": {
						"items": {
							"properties": {
								"avg_turns": {
									"description": "Caller turns per visit.",
									"type": "number"
								},
								"calls": {
									"description": "Calls that entered it.",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"drop_off": {
									"description": "Calls that ended here without reaching a closing node (end, transfer, …).",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"errors": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"node_key": {
									"type": "string"
								},
								"node_type": {
									"description": "The node's v1 type (`internal`: a type outside the public subset).",
									"enum": [
										"start",
										"say",
										"question",
										"ai_agent",
										"kb_answer",
										"api",
										"post_api",
										"integration",
										"post_integration",
										"set_variable",
										"decision",
										"dtmf_menu",
										"hours",
										"transfer",
										"end",
										"internal"
									],
									"type": "string"
								},
								"visits": {
									"description": "Times the node was entered.",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								}
							},
							"required": [
								"node_key",
								"node_type",
								"visits",
								"calls",
								"drop_off",
								"avg_turns",
								"errors"
							],
							"type": "object"
						},
						"type": "array"
					},
					"object": {
						"const": "flow_analytics",
						"type": "string"
					},
					"to": {
						"type": [
							"string",
							"null"
						]
					},
					"transitions": {
						"items": {
							"properties": {
								"node_key": {
									"type": [
										"string",
										"null"
									]
								},
								"rate": {
									"description": "taken / exits of its node, 0–1.",
									"type": "number"
								},
								"taken": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"transition_key": {
									"type": [
										"string",
										"null"
									]
								}
							},
							"required": [
								"node_key",
								"transition_key",
								"taken",
								"rate"
							],
							"type": "object"
						},
						"type": "array"
					},
					"version": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"object",
					"flow_id",
					"livemode",
					"from",
					"to",
					"version",
					"calls",
					"nodes",
					"transitions",
					"ends",
					"ivr"
				],
				"type": "object"
			},
			"FlowAssignment": {
				"properties": {
					"value": {
						"description": "A literal or a {{template}}.",
						"maxLength": 4000,
						"type": "string"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"value"
				],
				"type": "object"
			},
			"FlowAssignmentInput": {
				"properties": {
					"value": {
						"description": "A literal or a {{template}}.",
						"maxLength": 4000,
						"type": "string"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"value"
				],
				"type": "object"
			},
			"FlowCollectField": {
				"properties": {
					"required": {
						"type": "boolean"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"required"
				],
				"type": "object"
			},
			"FlowCollectFieldInput": {
				"properties": {
					"required": {
						"type": "boolean"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"required"
				],
				"type": "object"
			},
			"FlowCondition": {
				"description": "When a transition is taken: `kind` and that kind's fields.",
				"properties": {
					"after_seconds": {
						"description": "no_response (required): seconds of silence.",
						"maximum": 600,
						"minimum": 1,
						"type": "number"
					},
					"description": {
						"description": "intent (required): what the caller means.",
						"maxLength": 2000,
						"type": "string"
					},
					"digits": {
						"description": "dtmf (required): keypad digits — `1`, `*`, `#` or a range `1-3`.",
						"maxLength": 20,
						"type": "string"
					},
					"examples": {
						"description": "intent: example phrasings.",
						"items": {
							"maxLength": 500,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"kind": {
						"description": "intent: the AI decides what the caller means · keyword · variable rules (no AI) · dtmf keys · always (right after the node) · no_response · outcome of an action · else (the fallback, last).",
						"enum": [
							"intent",
							"keyword",
							"variable",
							"dtmf",
							"always",
							"no_response",
							"outcome",
							"else"
						],
						"type": "string"
					},
					"match": {
						"description": "keyword: any (default) or all of the phrases.",
						"enum": [
							"any",
							"all"
						],
						"type": "string"
					},
					"mode": {
						"description": "variable (required): all or any of the rules.",
						"enum": [
							"all",
							"any"
						],
						"type": "string"
					},
					"outcome": {
						"description": "outcome (required): the result of an action or collect node.",
						"enum": [
							"success",
							"error",
							"timeout",
							"collected",
							"max_retries",
							"invalid",
							"busy",
							"no_answer",
							"returned",
							"transferred",
							"failed",
							"sent",
							"answered",
							"not_found",
							"scheduled",
							"done",
							"open",
							"closed",
							"holiday",
							"recorded",
							"no_message"
						],
						"type": "string"
					},
					"phrases": {
						"description": "keyword (required): phrases the caller says; a trailing * matches a prefix.",
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 100,
						"type": "array"
					},
					"rules": {
						"description": "variable (required): the rules.",
						"items": {
							"$ref": "#/components/schemas/FlowRule"
						},
						"maxItems": 50,
						"type": "array"
					},
					"times": {
						"description": "no_response: in a row (default 1).",
						"maximum": 10,
						"minimum": 1,
						"type": "integer"
					}
				},
				"required": [
					"kind"
				],
				"type": "object"
			},
			"FlowConditionInput": {
				"description": "When a transition is taken: `kind` and that kind's fields.",
				"properties": {
					"after_seconds": {
						"description": "no_response (required): seconds of silence.",
						"maximum": 600,
						"minimum": 1,
						"type": "number"
					},
					"description": {
						"description": "intent (required): what the caller means.",
						"maxLength": 2000,
						"type": "string"
					},
					"digits": {
						"description": "dtmf (required): keypad digits — `1`, `*`, `#` or a range `1-3`.",
						"maxLength": 20,
						"type": "string"
					},
					"examples": {
						"description": "intent: example phrasings.",
						"items": {
							"maxLength": 500,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"kind": {
						"description": "intent: the AI decides what the caller means · keyword · variable rules (no AI) · dtmf keys · always (right after the node) · no_response · outcome of an action · else (the fallback, last).",
						"enum": [
							"intent",
							"keyword",
							"variable",
							"dtmf",
							"always",
							"no_response",
							"outcome",
							"else"
						],
						"type": "string"
					},
					"match": {
						"description": "keyword: any (default) or all of the phrases.",
						"enum": [
							"any",
							"all"
						],
						"type": "string"
					},
					"mode": {
						"description": "variable (required): all or any of the rules.",
						"enum": [
							"all",
							"any"
						],
						"type": "string"
					},
					"outcome": {
						"description": "outcome (required): the result of an action or collect node.",
						"enum": [
							"success",
							"error",
							"timeout",
							"collected",
							"max_retries",
							"invalid",
							"busy",
							"no_answer",
							"returned",
							"transferred",
							"failed",
							"sent",
							"answered",
							"not_found",
							"scheduled",
							"done",
							"open",
							"closed",
							"holiday",
							"recorded",
							"no_message"
						],
						"type": "string"
					},
					"phrases": {
						"description": "keyword (required): phrases the caller says; a trailing * matches a prefix.",
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 100,
						"type": "array"
					},
					"rules": {
						"description": "variable (required): the rules.",
						"items": {
							"$ref": "#/components/schemas/FlowRuleInput"
						},
						"maxItems": 50,
						"type": "array"
					},
					"times": {
						"description": "no_response: in a row (default 1).",
						"maximum": 10,
						"minimum": 1,
						"type": "integer"
					}
				},
				"required": [
					"kind"
				],
				"type": "object"
			},
			"FlowCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new flow. It starts as a draft: publish it before calls can run it.",
				"examples": [
					{
						"kind": "voice",
						"language": "en",
						"name": "Reception"
					}
				],
				"properties": {
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"description": {
						"maxLength": 2000,
						"type": "string"
					},
					"graph": {
						"$ref": "#/components/schemas/FlowGraphParamsInput",
						"description": "The draft graph (default: a template's, or an empty flow)."
					},
					"kind": {
						"default": "voice",
						"enum": [
							"voice",
							"agent_script",
							"ivr"
						],
						"type": "string"
					},
					"language": {
						"description": "The template's / empty flow's language (default he).",
						"enum": [
							"he",
							"en"
						],
						"type": "string"
					},
					"name": {
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					},
					"template_id": {
						"description": "Start from a template instead of an empty flow.",
						"maxLength": 80,
						"type": "string"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"FlowDraft": {
				"description": "A flow's editable draft.",
				"examples": [
					{
						"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"graph": {
							"kind": "voice",
							"nodes": [
								{
									"disabled": false,
									"global": null,
									"key": "start",
									"position": {
										"x": 0,
										"y": 0
									},
									"start": {
										"first_message_mode": "speak",
										"greeting": "Hello, you've reached Acme.",
										"interruptible": true
									},
									"title": "Start",
									"transitions": [
										{
											"condition": {
												"kind": "always"
											},
											"key": "t_next",
											"label": "Next",
											"next": "ask_id"
										}
									],
									"type": "start"
								},
								{
									"disabled": false,
									"global": null,
									"key": "ask_id",
									"position": {
										"x": 320,
										"y": 0
									},
									"question": {
										"confirm": true,
										"max_retries": 2,
										"prompt": "What is your ID number?",
										"reask_prompts": [],
										"var": "customer_id"
									},
									"title": "Ask for the ID",
									"transitions": [
										{
											"condition": {
												"kind": "outcome",
												"outcome": "collected"
											},
											"key": "t_ok",
											"label": "Collected",
											"next": "bye"
										},
										{
											"condition": {
												"kind": "outcome",
												"outcome": "max_retries"
											},
											"key": "t_fail",
											"label": "Couldn't collect",
											"next": "bye"
										}
									],
									"type": "question"
								},
								{
									"disabled": false,
									"end": {
										"message": "Thank you, goodbye."
									},
									"global": null,
									"key": "bye",
									"position": {
										"x": 640,
										"y": 0
									},
									"title": "Goodbye",
									"transitions": [],
									"type": "end"
								}
							],
							"schema_version": 1,
							"settings": {
								"classifier_model": null,
								"fallback_node_key": null,
								"global_prompt": "You are Acme's friendly receptionist.",
								"ivr": null,
								"language": "en",
								"max_chain_steps": 25,
								"max_transitions": 200,
								"max_turns_per_node": 8,
								"max_visits_per_node": 5,
								"on_pre_call_fail": "continue",
								"pre_call_timeout_ms": 2500,
								"style_field": "auto",
								"transition_model": "inline"
							},
							"variables": [
								{
									"key": "customer_id",
									"label": "Customer ID",
									"source": "collected",
									"type": "text"
								}
							]
						},
						"livemode": true,
						"object": "flow_draft",
						"rev": 17,
						"updated": "2026-11-03T09:14:22.000Z"
					}
				],
				"properties": {
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"graph": {
						"$ref": "#/components/schemas/FlowGraph"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "flow_draft",
						"type": "string"
					},
					"rev": {
						"description": "Send as `base_rev` on the next write.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"flow_id",
					"livemode",
					"rev",
					"graph",
					"updated"
				],
				"type": "object"
			},
			"FlowDraftParamsInput": {
				"additionalProperties": false,
				"description": "The new draft, with optimistic concurrency.",
				"examples": [
					{
						"base_rev": 17,
						"graph": {
							"nodes": [
								{
									"key": "start",
									"start": {
										"greeting": "Hello!"
									},
									"transitions": [
										{
											"condition": {
												"kind": "always"
											},
											"next": "bye"
										}
									],
									"type": "start"
								},
								{
									"end": {
										"message": "Goodbye."
									},
									"key": "bye",
									"type": "end"
								}
							]
						}
					}
				],
				"properties": {
					"base_rev": {
						"description": "The draft `rev` you read: a newer draft (changed elsewhere) answers 409 and nothing is written.",
						"maximum": 9007199254740991,
						"minimum": 0,
						"type": "integer"
					},
					"graph": {
						"$ref": "#/components/schemas/FlowGraphParamsInput"
					}
				},
				"required": [
					"graph",
					"base_rev"
				],
				"type": "object"
			},
			"FlowDtmfInput": {
				"description": "Accept the answer on the keypad too.",
				"properties": {
					"inter_digit_ms": {
						"maximum": 15000,
						"minimum": 500,
						"type": "integer"
					},
					"log_digits": {
						"type": "boolean"
					},
					"max_digits": {
						"maximum": 40,
						"minimum": 1,
						"type": "integer"
					},
					"terminator": {
						"maxLength": 2,
						"type": "string"
					}
				},
				"required": [
					"max_digits"
				],
				"type": "object"
			},
			"FlowDtmfInputInput": {
				"description": "Accept the answer on the keypad too.",
				"properties": {
					"inter_digit_ms": {
						"maximum": 15000,
						"minimum": 500,
						"type": "integer"
					},
					"log_digits": {
						"type": "boolean"
					},
					"max_digits": {
						"maximum": 40,
						"minimum": 1,
						"type": "integer"
					},
					"terminator": {
						"maxLength": 2,
						"type": "string"
					}
				},
				"required": [
					"max_digits"
				],
				"type": "object"
			},
			"FlowGlobalScope": {
				"description": "Where in the call the trigger listens.",
				"properties": {
					"node_keys": {
						"description": "only / except: the nodes it applies to (or not).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"type": {
						"enum": [
							"everywhere",
							"only",
							"except"
						],
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"FlowGlobalScopeInput": {
				"description": "Where in the call the trigger listens.",
				"properties": {
					"node_keys": {
						"description": "only / except: the nodes it applies to (or not).",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"type": {
						"enum": [
							"everywhere",
							"only",
							"except"
						],
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"FlowGlobalTrigger": {
				"description": "Makes the node reachable from anywhere in the call when its condition matches.",
				"properties": {
					"after": {
						"description": "return: back to where the caller was; stay: continue here; goto: follow this node's transitions.",
						"enum": [
							"return",
							"stay",
							"goto"
						],
						"type": "string"
					},
					"condition": {
						"$ref": "#/components/schemas/FlowCondition",
						"description": "intent, keyword or dtmf."
					},
					"max_per_call": {
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"priority": {
						"description": "Higher wins when several global nodes match.",
						"type": "number"
					},
					"scope": {
						"$ref": "#/components/schemas/FlowGlobalScope"
					}
				},
				"required": [
					"condition",
					"scope",
					"after",
					"max_per_call",
					"priority"
				],
				"type": "object"
			},
			"FlowGlobalTriggerInput": {
				"description": "Makes the node reachable from anywhere in the call when its condition matches.",
				"properties": {
					"after": {
						"description": "return: back to where the caller was; stay: continue here; goto: follow this node's transitions.",
						"enum": [
							"return",
							"stay",
							"goto"
						],
						"type": "string"
					},
					"condition": {
						"$ref": "#/components/schemas/FlowConditionInput",
						"description": "intent, keyword or dtmf."
					},
					"max_per_call": {
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"priority": {
						"description": "Higher wins when several global nodes match.",
						"type": "number"
					},
					"scope": {
						"$ref": "#/components/schemas/FlowGlobalScopeInput"
					}
				},
				"required": [
					"condition",
					"scope",
					"after",
					"max_per_call",
					"priority"
				],
				"type": "object"
			},
			"FlowGraph": {
				"description": "A flow's graph: nodes (v1 node schema) wired by their transitions' `next`, variables and settings.",
				"examples": [
					{
						"kind": "voice",
						"nodes": [
							{
								"disabled": false,
								"global": null,
								"key": "start",
								"position": {
									"x": 0,
									"y": 0
								},
								"start": {
									"first_message_mode": "speak",
									"greeting": "Hello, you've reached Acme.",
									"interruptible": true
								},
								"title": "Start",
								"transitions": [
									{
										"condition": {
											"kind": "always"
										},
										"key": "t_next",
										"label": "Next",
										"next": "ask_id"
									}
								],
								"type": "start"
							},
							{
								"disabled": false,
								"global": null,
								"key": "ask_id",
								"position": {
									"x": 320,
									"y": 0
								},
								"question": {
									"confirm": true,
									"max_retries": 2,
									"prompt": "What is your ID number?",
									"reask_prompts": [],
									"var": "customer_id"
								},
								"title": "Ask for the ID",
								"transitions": [
									{
										"condition": {
											"kind": "outcome",
											"outcome": "collected"
										},
										"key": "t_ok",
										"label": "Collected",
										"next": "bye"
									},
									{
										"condition": {
											"kind": "outcome",
											"outcome": "max_retries"
										},
										"key": "t_fail",
										"label": "Couldn't collect",
										"next": "bye"
									}
								],
								"type": "question"
							},
							{
								"disabled": false,
								"end": {
									"message": "Thank you, goodbye."
								},
								"global": null,
								"key": "bye",
								"position": {
									"x": 640,
									"y": 0
								},
								"title": "Goodbye",
								"transitions": [],
								"type": "end"
							}
						],
						"schema_version": 1,
						"settings": {
							"classifier_model": null,
							"fallback_node_key": null,
							"global_prompt": "You are Acme's friendly receptionist.",
							"ivr": null,
							"language": "en",
							"max_chain_steps": 25,
							"max_transitions": 200,
							"max_turns_per_node": 8,
							"max_visits_per_node": 5,
							"on_pre_call_fail": "continue",
							"pre_call_timeout_ms": 2500,
							"style_field": "auto",
							"transition_model": "inline"
						},
						"variables": [
							{
								"key": "customer_id",
								"label": "Customer ID",
								"source": "collected",
								"type": "text"
							}
						]
					}
				],
				"properties": {
					"kind": {
						"enum": [
							"voice",
							"agent_script",
							"ivr"
						],
						"type": "string"
					},
					"nodes": {
						"items": {
							"$ref": "#/components/schemas/FlowNode"
						},
						"type": "array"
					},
					"schema_version": {
						"const": 1,
						"description": "The node schema version (1).",
						"type": "number"
					},
					"settings": {
						"properties": {
							"classifier_model": {
								"anyOf": [
									{
										"maxLength": 60,
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"fallback_node_key": {
								"anyOf": [
									{
										"description": "The node's key: your stable identifier, unique in the graph.",
										"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "Where the call goes when nothing matches for too long."
							},
							"global_prompt": {
								"description": "Persona and global instructions, combined with the assistant's prompt.",
								"maxLength": 20000,
								"type": "string"
							},
							"ivr": {
								"anyOf": [
									{
										"properties": {
											"inter_digit_ms": {
												"maximum": 15000,
												"minimum": 500,
												"type": "integer"
											},
											"max_invalid_total": {
												"maximum": 50,
												"minimum": 1,
												"type": "integer"
											},
											"no_input_seconds": {
												"maximum": 60,
												"minimum": 1,
												"type": "number"
											},
											"operator": {
												"anyOf": [
													{
														"properties": {
															"announce_text": {
																"maxLength": 1000,
																"type": "string"
															},
															"destination": {
																"maxLength": 200,
																"type": "string"
															},
															"mode": {
																"enum": [
																	"queue",
																	"number"
																],
																"type": "string"
															},
															"queue_id": {
																"anyOf": [
																	{
																		"description": "A queue ID (prefix `q_`).",
																		"examples": [
																			"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
																		],
																		"pattern": "^q_[0-9A-Za-z]+$",
																		"type": "string"
																	},
																	{
																		"type": "null"
																	}
																]
															}
														},
														"required": [
															"mode"
														],
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											},
											"operator_key": {
												"maxLength": 2,
												"type": "string"
											},
											"repeat_key": {
												"maxLength": 2,
												"type": "string"
											},
											"speech": {
												"description": "off: keypad only; keywords: spoken choices matched to the options; smart: keywords, then an AI routing check.",
												"enum": [
													"off",
													"keywords",
													"smart"
												],
												"type": "string"
											},
											"timezone": {
												"maxLength": 60,
												"type": "string"
											},
											"voice": {
												"properties": {
													"language_code": {
														"maxLength": 10,
														"type": "string"
													},
													"model": {
														"maxLength": 80,
														"type": "string"
													},
													"style": {
														"maxLength": 500,
														"type": "string"
													},
													"voice_name": {
														"maxLength": 120,
														"type": "string"
													}
												},
												"required": [
													"model",
													"voice_name",
													"language_code",
													"style"
												],
												"type": "object"
											}
										},
										"required": [
											"speech",
											"inter_digit_ms",
											"no_input_seconds",
											"repeat_key",
											"operator_key",
											"max_invalid_total",
											"voice",
											"timezone"
										],
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "IVR flows only."
							},
							"language": {
								"maxLength": 10,
								"type": "string"
							},
							"max_chain_steps": {
								"maximum": 500,
								"minimum": 1,
								"type": "integer"
							},
							"max_transitions": {
								"maximum": 5000,
								"minimum": 1,
								"type": "integer"
							},
							"max_turns_per_node": {
								"maximum": 100,
								"minimum": 1,
								"type": "integer"
							},
							"max_visits_per_node": {
								"maximum": 100,
								"minimum": 1,
								"type": "integer"
							},
							"on_pre_call_fail": {
								"enum": [
									"continue",
									"end"
								],
								"type": "string"
							},
							"pre_call_timeout_ms": {
								"maximum": 20000,
								"minimum": 200,
								"type": "integer"
							},
							"style_field": {
								"enum": [
									"auto",
									"off"
								],
								"type": "string"
							},
							"transition_model": {
								"description": "inline: the reply decides the transition; classifier: a separate fast check.",
								"enum": [
									"inline",
									"classifier"
								],
								"type": "string"
							}
						},
						"required": [
							"global_prompt",
							"language",
							"max_visits_per_node",
							"max_turns_per_node",
							"max_chain_steps",
							"max_transitions",
							"pre_call_timeout_ms",
							"on_pre_call_fail",
							"fallback_node_key",
							"transition_model",
							"classifier_model",
							"style_field",
							"ivr"
						],
						"type": "object"
					},
					"variables": {
						"items": {
							"properties": {
								"default": {
									"maxLength": 2000,
									"type": "string"
								},
								"description": {
									"maxLength": 1000,
									"type": "string"
								},
								"key": {
									"maxLength": 80,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 120,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 200,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"sample": {
									"description": "A sample value for simulations and tests.",
									"maxLength": 2000,
									"type": "string"
								},
								"sensitive": {
									"description": "Redacted in logs, metrics and analytics.",
									"type": "boolean"
								},
								"source": {
									"description": "Where its value comes from: the contact, a pre-call API, collected in the call, an API, set by a node, the system, or extracted after the call.",
									"enum": [
										"contact",
										"precall",
										"collected",
										"api",
										"set",
										"system",
										"extracted"
									],
									"type": "string"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"boolean",
										"date",
										"phone",
										"email",
										"enum",
										"json"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"type",
								"source"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"schema_version",
					"kind",
					"nodes",
					"variables",
					"settings"
				],
				"type": "object"
			},
			"FlowGraphParamsInput": {
				"additionalProperties": false,
				"description": "A whole graph to write. Nodes are matched to the stored draft by `key`.",
				"examples": [
					{
						"kind": "voice",
						"nodes": [
							{
								"key": "start",
								"start": {
									"greeting": "Hello!"
								},
								"transitions": [
									{
										"condition": {
											"kind": "always"
										},
										"next": "bye"
									}
								],
								"type": "start"
							},
							{
								"end": {
									"message": "Goodbye."
								},
								"key": "bye",
								"type": "end"
							}
						]
					}
				],
				"properties": {
					"kind": {
						"description": "Must be the flow's kind (default: the flow's).",
						"enum": [
							"voice",
							"agent_script",
							"ivr"
						],
						"type": "string"
					},
					"nodes": {
						"items": {
							"$ref": "#/components/schemas/FlowNodeParamsInput"
						},
						"maxItems": 2000,
						"type": "array"
					},
					"schema_version": {
						"const": 1,
						"type": "number"
					},
					"settings": {
						"additionalProperties": false,
						"description": "Merged with the stored settings.",
						"properties": {
							"classifier_model": {
								"anyOf": [
									{
										"maxLength": 60,
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"fallback_node_key": {
								"anyOf": [
									{
										"description": "The node's key: your stable identifier, unique in the graph.",
										"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "Where the call goes when nothing matches for too long."
							},
							"global_prompt": {
								"description": "Persona and global instructions, combined with the assistant's prompt.",
								"maxLength": 20000,
								"type": "string"
							},
							"ivr": {
								"anyOf": [
									{
										"properties": {
											"inter_digit_ms": {
												"maximum": 15000,
												"minimum": 500,
												"type": "integer"
											},
											"max_invalid_total": {
												"maximum": 50,
												"minimum": 1,
												"type": "integer"
											},
											"no_input_seconds": {
												"maximum": 60,
												"minimum": 1,
												"type": "number"
											},
											"operator": {
												"anyOf": [
													{
														"properties": {
															"announce_text": {
																"maxLength": 1000,
																"type": "string"
															},
															"destination": {
																"maxLength": 200,
																"type": "string"
															},
															"mode": {
																"enum": [
																	"queue",
																	"number"
																],
																"type": "string"
															},
															"queue_id": {
																"anyOf": [
																	{
																		"description": "A queue ID (`q_…`).",
																		"maxLength": 200,
																		"pattern": "^q_[0-9A-Za-z]+$",
																		"type": "string"
																	},
																	{
																		"type": "null"
																	}
																]
															}
														},
														"required": [
															"mode"
														],
														"type": "object"
													},
													{
														"type": "null"
													}
												]
											},
											"operator_key": {
												"maxLength": 2,
												"type": "string"
											},
											"repeat_key": {
												"maxLength": 2,
												"type": "string"
											},
											"speech": {
												"description": "off: keypad only; keywords: spoken choices matched to the options; smart: keywords, then an AI routing check.",
												"enum": [
													"off",
													"keywords",
													"smart"
												],
												"type": "string"
											},
											"timezone": {
												"maxLength": 60,
												"type": "string"
											},
											"voice": {
												"properties": {
													"language_code": {
														"maxLength": 10,
														"type": "string"
													},
													"model": {
														"maxLength": 80,
														"type": "string"
													},
													"style": {
														"maxLength": 500,
														"type": "string"
													},
													"voice_name": {
														"maxLength": 120,
														"type": "string"
													}
												},
												"required": [
													"model",
													"voice_name",
													"language_code",
													"style"
												],
												"type": "object"
											}
										},
										"type": "object"
									},
									{
										"type": "null"
									}
								],
								"description": "IVR flows only."
							},
							"language": {
								"maxLength": 10,
								"type": "string"
							},
							"max_chain_steps": {
								"maximum": 500,
								"minimum": 1,
								"type": "integer"
							},
							"max_transitions": {
								"maximum": 5000,
								"minimum": 1,
								"type": "integer"
							},
							"max_turns_per_node": {
								"maximum": 100,
								"minimum": 1,
								"type": "integer"
							},
							"max_visits_per_node": {
								"maximum": 100,
								"minimum": 1,
								"type": "integer"
							},
							"on_pre_call_fail": {
								"enum": [
									"continue",
									"end"
								],
								"type": "string"
							},
							"pre_call_timeout_ms": {
								"maximum": 20000,
								"minimum": 200,
								"type": "integer"
							},
							"style_field": {
								"enum": [
									"auto",
									"off"
								],
								"type": "string"
							},
							"transition_model": {
								"description": "inline: the reply decides the transition; classifier: a separate fast check.",
								"enum": [
									"inline",
									"classifier"
								],
								"type": "string"
							}
						},
						"type": "object"
					},
					"variables": {
						"description": "Default: the stored variables.",
						"items": {
							"properties": {
								"default": {
									"maxLength": 2000,
									"type": "string"
								},
								"description": {
									"maxLength": 1000,
									"type": "string"
								},
								"key": {
									"maxLength": 80,
									"minLength": 1,
									"type": "string"
								},
								"label": {
									"maxLength": 120,
									"type": "string"
								},
								"options": {
									"items": {
										"maxLength": 200,
										"type": "string"
									},
									"maxItems": 200,
									"type": "array"
								},
								"pattern": {
									"maxLength": 400,
									"type": "string"
								},
								"sample": {
									"description": "A sample value for simulations and tests.",
									"maxLength": 2000,
									"type": "string"
								},
								"sensitive": {
									"description": "Redacted in logs, metrics and analytics.",
									"type": "boolean"
								},
								"source": {
									"description": "Where its value comes from: the contact, a pre-call API, collected in the call, an API, set by a node, the system, or extracted after the call.",
									"enum": [
										"contact",
										"precall",
										"collected",
										"api",
										"set",
										"system",
										"extracted"
									],
									"type": "string"
								},
								"type": {
									"enum": [
										"text",
										"number",
										"boolean",
										"date",
										"phone",
										"email",
										"enum",
										"json"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"label",
								"type",
								"source"
							],
							"type": "object"
						},
						"maxItems": 500,
						"type": "array"
					}
				},
				"required": [
					"nodes"
				],
				"type": "object"
			},
			"FlowHoursWindow": {
				"properties": {
					"days": {
						"description": "0 = Sunday … 6 = Saturday.",
						"items": {
							"maximum": 6,
							"minimum": 0,
							"type": "integer"
						},
						"type": "array"
					},
					"end": {
						"description": "HH:MM",
						"maxLength": 5,
						"type": "string"
					},
					"start": {
						"description": "HH:MM",
						"maxLength": 5,
						"type": "string"
					}
				},
				"required": [
					"days",
					"start",
					"end"
				],
				"type": "object"
			},
			"FlowHoursWindowInput": {
				"properties": {
					"days": {
						"description": "0 = Sunday … 6 = Saturday.",
						"items": {
							"maximum": 6,
							"minimum": 0,
							"type": "integer"
						},
						"type": "array"
					},
					"end": {
						"description": "HH:MM",
						"maxLength": 5,
						"type": "string"
					},
					"start": {
						"description": "HH:MM",
						"maxLength": 5,
						"type": "string"
					}
				},
				"required": [
					"days",
					"start",
					"end"
				],
				"type": "object"
			},
			"FlowHttpAuth": {
				"description": "How the request authenticates. Reference credentials as {{secrets.NAME}} rather than in clear.",
				"properties": {
					"header": {
						"description": "api_key / hmac (required): the header name.",
						"maxLength": 200,
						"type": "string"
					},
					"password": {
						"description": "basic (required).",
						"maxLength": 4000,
						"type": "string"
					},
					"secret": {
						"description": "hmac (required): the signing secret.",
						"maxLength": 4000,
						"type": "string"
					},
					"token": {
						"description": "bearer (required).",
						"maxLength": 4000,
						"type": "string"
					},
					"type": {
						"enum": [
							"none",
							"bearer",
							"basic",
							"api_key",
							"hmac"
						],
						"type": "string"
					},
					"username": {
						"description": "basic (required).",
						"maxLength": 500,
						"type": "string"
					},
					"value": {
						"description": "api_key (required).",
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"FlowHttpAuthInput": {
				"description": "How the request authenticates. Reference credentials as {{secrets.NAME}} rather than in clear.",
				"properties": {
					"header": {
						"description": "api_key / hmac (required): the header name.",
						"maxLength": 200,
						"type": "string"
					},
					"password": {
						"description": "basic (required).",
						"maxLength": 4000,
						"type": "string"
					},
					"secret": {
						"description": "hmac (required): the signing secret.",
						"maxLength": 4000,
						"type": "string"
					},
					"token": {
						"description": "bearer (required).",
						"maxLength": 4000,
						"type": "string"
					},
					"type": {
						"enum": [
							"none",
							"bearer",
							"basic",
							"api_key",
							"hmac"
						],
						"type": "string"
					},
					"username": {
						"description": "basic (required).",
						"maxLength": 500,
						"type": "string"
					},
					"value": {
						"description": "api_key (required).",
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"FlowKbScope": {
				"description": "Answer from these knowledge-base documents.",
				"properties": {
					"document_ids": {
						"items": {
							"description": "A kb document ID (prefix `kbd_`).",
							"examples": [
								"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
							],
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"min_score": {
						"maximum": 1,
						"minimum": 0,
						"type": "number"
					}
				},
				"required": [
					"document_ids"
				],
				"type": "object"
			},
			"FlowKbScopeParamsInput": {
				"description": "Answer from these knowledge-base documents.",
				"properties": {
					"document_ids": {
						"items": {
							"description": "A kb document ID (`kbd_…`).",
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"min_score": {
						"maximum": 1,
						"minimum": 0,
						"type": "number"
					}
				},
				"required": [
					"document_ids"
				],
				"type": "object"
			},
			"FlowKeyValue": {
				"properties": {
					"key": {
						"maxLength": 200,
						"type": "string"
					},
					"value": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"key",
					"value"
				],
				"type": "object"
			},
			"FlowKeyValueInput": {
				"properties": {
					"key": {
						"maxLength": 200,
						"type": "string"
					},
					"value": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"key",
					"value"
				],
				"type": "object"
			},
			"FlowList": {
				"description": "Your flows, most recently changed first.",
				"examples": [
					{
						"data": [
							{
								"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"description": "Identify the caller and route them.",
								"draft_rev": 17,
								"id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
								"kind": "voice",
								"latest_version": 3,
								"livemode": true,
								"name": "Reception",
								"node_count": 12,
								"object": "flow",
								"published_version": 3,
								"status": "published",
								"template_id": null,
								"updated": "2026-11-03T09:14:22.000Z"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/flows"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Flow"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"FlowMenuOption": {
				"properties": {
					"digit": {
						"maxLength": 8,
						"type": "string"
					},
					"keywords": {
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"label": {
						"description": "Also the spoken choice.",
						"maxLength": 200,
						"type": "string"
					}
				},
				"required": [
					"digit",
					"label"
				],
				"type": "object"
			},
			"FlowMenuOptionInput": {
				"properties": {
					"digit": {
						"maxLength": 8,
						"type": "string"
					},
					"keywords": {
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"label": {
						"description": "Also the spoken choice.",
						"maxLength": 200,
						"type": "string"
					}
				},
				"required": [
					"digit",
					"label"
				],
				"type": "object"
			},
			"FlowNode": {
				"description": "A flow node (v1 node schema): `type` and its settings under the property of the same name.",
				"properties": {
					"ai_agent": {
						"$ref": "#/components/schemas/FlowNodeAiAgent"
					},
					"api": {
						"$ref": "#/components/schemas/FlowNodeApi"
					},
					"decision": {
						"$ref": "#/components/schemas/FlowNodeDecision"
					},
					"disabled": {
						"type": "boolean"
					},
					"dtmf_menu": {
						"$ref": "#/components/schemas/FlowNodeDtmfMenu"
					},
					"end": {
						"$ref": "#/components/schemas/FlowNodeEnd"
					},
					"global": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/FlowGlobalTrigger"
							},
							{
								"type": "null"
							}
						]
					},
					"hours": {
						"$ref": "#/components/schemas/FlowNodeHours"
					},
					"integration": {
						"$ref": "#/components/schemas/FlowNodeIntegration"
					},
					"internal": {
						"$ref": "#/components/schemas/FlowNodeInternal"
					},
					"kb_answer": {
						"$ref": "#/components/schemas/FlowNodeKbAnswer"
					},
					"key": {
						"description": "The node's key: your stable identifier, unique in the graph.",
						"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
						"type": "string"
					},
					"position": {
						"$ref": "#/components/schemas/FlowPosition"
					},
					"post_api": {
						"$ref": "#/components/schemas/FlowNodePostApi"
					},
					"post_integration": {
						"$ref": "#/components/schemas/FlowNodePostIntegration"
					},
					"question": {
						"$ref": "#/components/schemas/FlowNodeQuestion"
					},
					"say": {
						"$ref": "#/components/schemas/FlowNodeSay"
					},
					"set_variable": {
						"$ref": "#/components/schemas/FlowNodeSetVariable"
					},
					"start": {
						"$ref": "#/components/schemas/FlowNodeStart"
					},
					"title": {
						"type": "string"
					},
					"transfer": {
						"$ref": "#/components/schemas/FlowNodeTransfer"
					},
					"transitions": {
						"items": {
							"$ref": "#/components/schemas/FlowTransition"
						},
						"type": "array"
					},
					"type": {
						"description": "The node type. Its settings are under the property of the same name (`type: \"say\"` → `say: {…}`).",
						"enum": [
							"start",
							"say",
							"question",
							"ai_agent",
							"kb_answer",
							"api",
							"post_api",
							"integration",
							"post_integration",
							"set_variable",
							"decision",
							"dtmf_menu",
							"hours",
							"transfer",
							"end",
							"internal"
						],
						"type": "string"
					}
				},
				"required": [
					"key",
					"type",
					"title",
					"position",
					"disabled",
					"global",
					"transitions"
				],
				"type": "object"
			},
			"FlowNodeAiAgent": {
				"description": "type ai_agent: A free conversation step with a goal: the AI talks until a transition matches.",
				"properties": {
					"allowed_tools": {
						"description": "The assistant's tools usable in this step (by name).",
						"items": {
							"maxLength": 120,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"collect": {
						"description": "Variables the AI gathers in this step.",
						"items": {
							"$ref": "#/components/schemas/FlowCollectField"
						},
						"maxItems": 50,
						"type": "array"
					},
					"goal": {
						"maxLength": 4000,
						"type": "string"
					},
					"instructions": {
						"maxLength": 20000,
						"type": "string"
					},
					"kb": {
						"$ref": "#/components/schemas/FlowKbScope"
					},
					"max_turns": {
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"opening": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"goal",
					"instructions",
					"collect",
					"allowed_tools"
				],
				"type": "object"
			},
			"FlowNodeAiAgentParamsInput": {
				"additionalProperties": false,
				"description": "type ai_agent: A free conversation step with a goal: the AI talks until a transition matches.",
				"properties": {
					"allowed_tools": {
						"description": "The assistant's tools usable in this step (by name).",
						"items": {
							"maxLength": 120,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"collect": {
						"description": "Variables the AI gathers in this step.",
						"items": {
							"$ref": "#/components/schemas/FlowCollectFieldInput"
						},
						"maxItems": 50,
						"type": "array"
					},
					"goal": {
						"maxLength": 4000,
						"type": "string"
					},
					"instructions": {
						"maxLength": 20000,
						"type": "string"
					},
					"kb": {
						"$ref": "#/components/schemas/FlowKbScopeParamsInput"
					},
					"max_turns": {
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"opening": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeApi": {
				"description": "type api: Call an HTTP API during the call; map the response to variables.",
				"properties": {
					"auth": {
						"$ref": "#/components/schemas/FlowHttpAuth"
					},
					"body": {
						"description": "The body template ({{templates}} JSON-escaped when body_type is json).",
						"maxLength": 100000,
						"type": "string"
					},
					"body_type": {
						"enum": [
							"json",
							"form",
							"none"
						],
						"type": "string"
					},
					"headers": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValue"
						},
						"maxItems": 100,
						"type": "array"
					},
					"method": {
						"enum": [
							"GET",
							"POST",
							"PUT",
							"PATCH",
							"DELETE"
						],
						"type": "string"
					},
					"query": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValue"
						},
						"maxItems": 100,
						"type": "array"
					},
					"response_map": {
						"description": "Response fields → variables.",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMapping"
						},
						"maxItems": 100,
						"type": "array"
					},
					"retries": {
						"maximum": 5,
						"minimum": 0,
						"type": "integer"
					},
					"success_when": {
						"$ref": "#/components/schemas/FlowSuccessCondition"
					},
					"timeout_ms": {
						"maximum": 60000,
						"minimum": 100,
						"type": "integer"
					},
					"url": {
						"description": "The URL ({{templates}} allowed).",
						"maxLength": 4000,
						"type": "string"
					},
					"wait_text": {
						"description": "Said while waiting.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"required": [
					"method",
					"url",
					"query",
					"headers",
					"auth",
					"body_type",
					"body",
					"timeout_ms",
					"retries",
					"response_map"
				],
				"type": "object"
			},
			"FlowNodeApiParamsInput": {
				"additionalProperties": false,
				"description": "type api: Call an HTTP API during the call; map the response to variables.",
				"properties": {
					"auth": {
						"$ref": "#/components/schemas/FlowHttpAuthInput"
					},
					"body": {
						"description": "The body template ({{templates}} JSON-escaped when body_type is json).",
						"maxLength": 100000,
						"type": "string"
					},
					"body_type": {
						"enum": [
							"json",
							"form",
							"none"
						],
						"type": "string"
					},
					"headers": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValueInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"method": {
						"enum": [
							"GET",
							"POST",
							"PUT",
							"PATCH",
							"DELETE"
						],
						"type": "string"
					},
					"query": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValueInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"response_map": {
						"description": "Response fields → variables.",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMappingInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"retries": {
						"maximum": 5,
						"minimum": 0,
						"type": "integer"
					},
					"success_when": {
						"$ref": "#/components/schemas/FlowSuccessConditionInput"
					},
					"timeout_ms": {
						"maximum": 60000,
						"minimum": 100,
						"type": "integer"
					},
					"url": {
						"description": "The URL ({{templates}} allowed).",
						"maxLength": 4000,
						"type": "string"
					},
					"wait_text": {
						"description": "Said while waiting.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeDecision": {
				"description": "type decision: Branch by rules on variables (no AI).",
				"properties": {
					"note": {
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeDecisionParamsInput": {
				"additionalProperties": false,
				"description": "type decision: Branch by rules on variables (no AI).",
				"properties": {
					"note": {
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeDtmfMenu": {
				"description": "type dtmf_menu: A keypad menu.",
				"properties": {
					"also_speech": {
						"description": "Callers may say the option instead of pressing it.",
						"type": "boolean"
					},
					"audio_id": {
						"description": "A audio asset ID (prefix `aud_`).",
						"examples": [
							"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"invalid_prompt": {
						"maxLength": 2000,
						"type": "string"
					},
					"no_input_prompt": {
						"maxLength": 2000,
						"type": "string"
					},
					"options": {
						"items": {
							"$ref": "#/components/schemas/FlowMenuOption"
						},
						"maxItems": 40,
						"type": "array"
					},
					"prompt": {
						"maxLength": 4000,
						"type": "string"
					},
					"retries": {
						"maximum": 10,
						"minimum": 0,
						"type": "integer"
					},
					"timeout_seconds": {
						"maximum": 120,
						"minimum": 1,
						"type": "number"
					}
				},
				"required": [
					"prompt",
					"options",
					"timeout_seconds",
					"retries",
					"also_speech"
				],
				"type": "object"
			},
			"FlowNodeDtmfMenuParamsInput": {
				"additionalProperties": false,
				"description": "type dtmf_menu: A keypad menu.",
				"properties": {
					"also_speech": {
						"description": "Callers may say the option instead of pressing it.",
						"type": "boolean"
					},
					"audio_id": {
						"description": "A audio asset ID (`aud_…`).",
						"maxLength": 200,
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"invalid_prompt": {
						"maxLength": 2000,
						"type": "string"
					},
					"no_input_prompt": {
						"maxLength": 2000,
						"type": "string"
					},
					"options": {
						"items": {
							"$ref": "#/components/schemas/FlowMenuOptionInput"
						},
						"maxItems": 40,
						"type": "array"
					},
					"prompt": {
						"maxLength": 4000,
						"type": "string"
					},
					"retries": {
						"maximum": 10,
						"minimum": 0,
						"type": "integer"
					},
					"timeout_seconds": {
						"maximum": 120,
						"minimum": 1,
						"type": "number"
					}
				},
				"type": "object"
			},
			"FlowNodeEnd": {
				"description": "type end: End the call.",
				"properties": {
					"disposition": {
						"maxLength": 120,
						"type": "string"
					},
					"message": {
						"maxLength": 4000,
						"type": "string"
					},
					"notes": {
						"maxLength": 2000,
						"type": "string"
					},
					"reason": {
						"maxLength": 200,
						"type": "string"
					}
				},
				"required": [
					"message"
				],
				"type": "object"
			},
			"FlowNodeEndParamsInput": {
				"additionalProperties": false,
				"description": "type end: End the call.",
				"properties": {
					"disposition": {
						"maxLength": 120,
						"type": "string"
					},
					"message": {
						"maxLength": 4000,
						"type": "string"
					},
					"notes": {
						"maxLength": 2000,
						"type": "string"
					},
					"reason": {
						"maxLength": 200,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeFailedEvent": {
				"description": "A flow node failed during a call.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "flow.node_failed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `flow.node_failed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"anyOf": [
											{
												"minLength": 1,
												"pattern": "^call_[0-9A-Za-z]+$",
												"type": "string"
											},
											{
												"type": "null"
											}
										]
									},
									"error": {
										"type": "string"
									},
									"flow_id": {
										"minLength": 1,
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									"node_id": {
										"type": [
											"string",
											"null"
										]
									},
									"version": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "flow.node_failed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"FlowNodeHours": {
				"description": "type hours: Branch on opening hours: open, closed or holiday.",
				"properties": {
					"closed_dates": {
						"description": "Extra closed days, YYYY-MM-DD.",
						"items": {
							"maxLength": 10,
							"type": "string"
						},
						"maxItems": 400,
						"type": "array"
					},
					"holidays": {
						"description": "Closed on Israeli holidays (the `holiday` outcome).",
						"type": "boolean"
					},
					"open_dates": {
						"description": "Exceptional open days, YYYY-MM-DD.",
						"items": {
							"maxLength": 10,
							"type": "string"
						},
						"maxItems": 400,
						"type": "array"
					},
					"shabbat": {
						"description": "Closed on Shabbat (Israel).",
						"type": "boolean"
					},
					"timezone": {
						"description": "IANA time zone (default: the flow's).",
						"maxLength": 60,
						"type": "string"
					},
					"windows": {
						"items": {
							"$ref": "#/components/schemas/FlowHoursWindow"
						},
						"maxItems": 50,
						"type": "array"
					}
				},
				"required": [
					"windows",
					"shabbat",
					"holidays",
					"closed_dates",
					"open_dates"
				],
				"type": "object"
			},
			"FlowNodeHoursParamsInput": {
				"additionalProperties": false,
				"description": "type hours: Branch on opening hours: open, closed or holiday.",
				"properties": {
					"closed_dates": {
						"description": "Extra closed days, YYYY-MM-DD.",
						"items": {
							"maxLength": 10,
							"type": "string"
						},
						"maxItems": 400,
						"type": "array"
					},
					"holidays": {
						"description": "Closed on Israeli holidays (the `holiday` outcome).",
						"type": "boolean"
					},
					"open_dates": {
						"description": "Exceptional open days, YYYY-MM-DD.",
						"items": {
							"maxLength": 10,
							"type": "string"
						},
						"maxItems": 400,
						"type": "array"
					},
					"shabbat": {
						"description": "Closed on Shabbat (Israel).",
						"type": "boolean"
					},
					"timezone": {
						"description": "IANA time zone (default: the flow's).",
						"maxLength": 60,
						"type": "string"
					},
					"windows": {
						"items": {
							"$ref": "#/components/schemas/FlowHoursWindowInput"
						},
						"maxItems": 50,
						"type": "array"
					}
				},
				"type": "object"
			},
			"FlowNodeIntegration": {
				"description": "type integration: Run a connected CRM or calendar action during the call (look the caller up, add a note, create a task): success, not found or error.",
				"properties": {
					"action": {
						"description": "The action, e.g. `crm.lookup_contact`, `crm.add_note`, `crm.create_task`.",
						"maxLength": 120,
						"type": "string"
					},
					"args": {
						"additionalProperties": {
							"maxLength": 4000,
							"type": "string"
						},
						"description": "The action's arguments by name ({{templates}} allowed).",
						"propertyNames": {
							"maxLength": 120,
							"type": "string"
						},
						"type": "object"
					},
					"integration_connection_id": {
						"description": "The connected integration account (Settings › Integrations). Integration connections have no API object (and no public ID prefix) yet: the id is the dashboard's.",
						"maxLength": 64,
						"type": "string"
					},
					"result_map": {
						"description": "Result fields → variables (e.g. `contacts[0].name` → `customer_name`).",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMapping"
						},
						"maxItems": 100,
						"type": "array"
					},
					"wait_text": {
						"description": "Said while the action runs.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"required": [
					"integration_connection_id",
					"action",
					"args",
					"result_map"
				],
				"type": "object"
			},
			"FlowNodeIntegrationParamsInput": {
				"additionalProperties": false,
				"description": "type integration: Run a connected CRM or calendar action during the call (look the caller up, add a note, create a task): success, not found or error.",
				"properties": {
					"action": {
						"description": "The action, e.g. `crm.lookup_contact`, `crm.add_note`, `crm.create_task`.",
						"maxLength": 120,
						"type": "string"
					},
					"args": {
						"additionalProperties": {
							"maxLength": 4000,
							"type": "string"
						},
						"description": "The action's arguments by name ({{templates}} allowed).",
						"propertyNames": {
							"maxLength": 120,
							"type": "string"
						},
						"type": "object"
					},
					"integration_connection_id": {
						"description": "The connected integration account (Settings › Integrations). Integration connections have no API object (and no public ID prefix) yet: the id is the dashboard's.",
						"maxLength": 64,
						"type": "string"
					},
					"result_map": {
						"description": "Result fields → variables (e.g. `contacts[0].name` → `customer_name`).",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMappingInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"wait_text": {
						"description": "Said while the action runs.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeInternal": {
				"description": "type internal: a node of a type outside the v1 schema (SMS, e-mail, voicemail, callbacks, agent-script steps…). Read-only: when you write the draft, the stored node is kept; only its transitions' `next` may change.",
				"properties": {
					"raw": {
						"additionalProperties": {},
						"description": "The node as stored. Read-only: send it back unchanged.",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"type": {
						"description": "The internal node type (not part of the v1 schema).",
						"type": "string"
					}
				},
				"required": [
					"type",
					"raw"
				],
				"type": "object"
			},
			"FlowNodeInternalParamsInput": {
				"additionalProperties": false,
				"description": "type internal: a node of a type outside the v1 schema (SMS, e-mail, voicemail, callbacks, agent-script steps…). Read-only: when you write the draft, the stored node is kept; only its transitions' `next` may change.",
				"properties": {
					"raw": {
						"additionalProperties": {},
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"type": {
						"maxLength": 64,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeKbAnswer": {
				"description": "type kb_answer: Answer from the knowledge base.",
				"properties": {
					"answer_style": {
						"maxLength": 1000,
						"type": "string"
					},
					"document_ids": {
						"description": "Empty: the whole knowledge base.",
						"items": {
							"description": "A kb document ID (prefix `kbd_`).",
							"examples": [
								"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
							],
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"min_score": {
						"maximum": 1,
						"minimum": 0,
						"type": "number"
					},
					"not_found_text": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"document_ids",
					"not_found_text"
				],
				"type": "object"
			},
			"FlowNodeKbAnswerParamsInput": {
				"additionalProperties": false,
				"description": "type kb_answer: Answer from the knowledge base.",
				"properties": {
					"answer_style": {
						"maxLength": 1000,
						"type": "string"
					},
					"document_ids": {
						"description": "Empty: the whole knowledge base.",
						"items": {
							"description": "A kb document ID (`kbd_…`).",
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"min_score": {
						"maximum": 1,
						"minimum": 0,
						"type": "number"
					},
					"not_found_text": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeParamsInput": {
				"additionalProperties": false,
				"description": "A flow node to write (v1 node schema). Settings you leave out keep their stored values, or the type's defaults for a new node.",
				"properties": {
					"ai_agent": {
						"$ref": "#/components/schemas/FlowNodeAiAgentParamsInput"
					},
					"api": {
						"$ref": "#/components/schemas/FlowNodeApiParamsInput"
					},
					"decision": {
						"$ref": "#/components/schemas/FlowNodeDecisionParamsInput"
					},
					"disabled": {
						"type": "boolean"
					},
					"dtmf_menu": {
						"$ref": "#/components/schemas/FlowNodeDtmfMenuParamsInput"
					},
					"end": {
						"$ref": "#/components/schemas/FlowNodeEndParamsInput"
					},
					"global": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/FlowGlobalTriggerInput"
							},
							{
								"type": "null"
							}
						]
					},
					"hours": {
						"$ref": "#/components/schemas/FlowNodeHoursParamsInput"
					},
					"integration": {
						"$ref": "#/components/schemas/FlowNodeIntegrationParamsInput"
					},
					"internal": {
						"$ref": "#/components/schemas/FlowNodeInternalParamsInput"
					},
					"kb_answer": {
						"$ref": "#/components/schemas/FlowNodeKbAnswerParamsInput"
					},
					"key": {
						"description": "The node's key: your stable identifier, unique in the graph.",
						"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
						"type": "string"
					},
					"position": {
						"$ref": "#/components/schemas/FlowPositionInput",
						"description": "Default: laid out automatically."
					},
					"post_api": {
						"$ref": "#/components/schemas/FlowNodePostApiParamsInput"
					},
					"post_integration": {
						"$ref": "#/components/schemas/FlowNodePostIntegrationParamsInput"
					},
					"question": {
						"$ref": "#/components/schemas/FlowNodeQuestionParamsInput"
					},
					"say": {
						"$ref": "#/components/schemas/FlowNodeSayParamsInput"
					},
					"set_variable": {
						"$ref": "#/components/schemas/FlowNodeSetVariableParamsInput"
					},
					"start": {
						"$ref": "#/components/schemas/FlowNodeStartParamsInput"
					},
					"title": {
						"maxLength": 200,
						"type": "string"
					},
					"transfer": {
						"$ref": "#/components/schemas/FlowNodeTransferParamsInput"
					},
					"transitions": {
						"description": "The node's outputs, in priority order. Default: the type's standard outputs (a new node) or the stored ones.",
						"items": {
							"$ref": "#/components/schemas/FlowTransitionParamsInput"
						},
						"maxItems": 60,
						"type": "array"
					},
					"type": {
						"description": "The node type. Its settings are under the property of the same name (`type: \"say\"` → `say: {…}`).",
						"enum": [
							"start",
							"say",
							"question",
							"ai_agent",
							"kb_answer",
							"api",
							"post_api",
							"integration",
							"post_integration",
							"set_variable",
							"decision",
							"dtmf_menu",
							"hours",
							"transfer",
							"end",
							"internal"
						],
						"type": "string"
					}
				},
				"required": [
					"key",
					"type"
				],
				"type": "object"
			},
			"FlowNodePostApi": {
				"description": "type post_api: Call an HTTP API after the call.",
				"properties": {
					"auth": {
						"$ref": "#/components/schemas/FlowHttpAuth"
					},
					"body": {
						"description": "The body template ({{templates}} JSON-escaped when body_type is json).",
						"maxLength": 100000,
						"type": "string"
					},
					"body_type": {
						"enum": [
							"json",
							"form",
							"none"
						],
						"type": "string"
					},
					"headers": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValue"
						},
						"maxItems": 100,
						"type": "array"
					},
					"method": {
						"enum": [
							"GET",
							"POST",
							"PUT",
							"PATCH",
							"DELETE"
						],
						"type": "string"
					},
					"query": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValue"
						},
						"maxItems": 100,
						"type": "array"
					},
					"response_map": {
						"description": "Response fields → variables.",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMapping"
						},
						"maxItems": 100,
						"type": "array"
					},
					"retries": {
						"maximum": 5,
						"minimum": 0,
						"type": "integer"
					},
					"success_when": {
						"$ref": "#/components/schemas/FlowSuccessCondition"
					},
					"timeout_ms": {
						"maximum": 60000,
						"minimum": 100,
						"type": "integer"
					},
					"url": {
						"description": "The URL ({{templates}} allowed).",
						"maxLength": 4000,
						"type": "string"
					},
					"wait_text": {
						"description": "Said while waiting.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"required": [
					"method",
					"url",
					"query",
					"headers",
					"auth",
					"body_type",
					"body",
					"timeout_ms",
					"retries",
					"response_map"
				],
				"type": "object"
			},
			"FlowNodePostApiParamsInput": {
				"additionalProperties": false,
				"description": "type post_api: Call an HTTP API after the call.",
				"properties": {
					"auth": {
						"$ref": "#/components/schemas/FlowHttpAuthInput"
					},
					"body": {
						"description": "The body template ({{templates}} JSON-escaped when body_type is json).",
						"maxLength": 100000,
						"type": "string"
					},
					"body_type": {
						"enum": [
							"json",
							"form",
							"none"
						],
						"type": "string"
					},
					"headers": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValueInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"method": {
						"enum": [
							"GET",
							"POST",
							"PUT",
							"PATCH",
							"DELETE"
						],
						"type": "string"
					},
					"query": {
						"items": {
							"$ref": "#/components/schemas/FlowKeyValueInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"response_map": {
						"description": "Response fields → variables.",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMappingInput"
						},
						"maxItems": 100,
						"type": "array"
					},
					"retries": {
						"maximum": 5,
						"minimum": 0,
						"type": "integer"
					},
					"success_when": {
						"$ref": "#/components/schemas/FlowSuccessConditionInput"
					},
					"timeout_ms": {
						"maximum": 60000,
						"minimum": 100,
						"type": "integer"
					},
					"url": {
						"description": "The URL ({{templates}} allowed).",
						"maxLength": 4000,
						"type": "string"
					},
					"wait_text": {
						"description": "Said while waiting.",
						"maxLength": 1000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodePostIntegration": {
				"description": "type post_integration: Run a connected CRM action after the call (add a note, create a follow-up task).",
				"properties": {
					"action": {
						"description": "The action, e.g. `crm.lookup_contact`, `crm.add_note`, `crm.create_task`.",
						"maxLength": 120,
						"type": "string"
					},
					"args": {
						"additionalProperties": {
							"maxLength": 4000,
							"type": "string"
						},
						"description": "The action's arguments by name ({{templates}} allowed).",
						"propertyNames": {
							"maxLength": 120,
							"type": "string"
						},
						"type": "object"
					},
					"integration_connection_id": {
						"description": "The connected integration account (Settings › Integrations). Integration connections have no API object (and no public ID prefix) yet: the id is the dashboard's.",
						"maxLength": 64,
						"type": "string"
					},
					"result_map": {
						"description": "Result fields → variables (e.g. `contacts[0].name` → `customer_name`).",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMapping"
						},
						"maxItems": 100,
						"type": "array"
					}
				},
				"required": [
					"integration_connection_id",
					"action",
					"args",
					"result_map"
				],
				"type": "object"
			},
			"FlowNodePostIntegrationParamsInput": {
				"additionalProperties": false,
				"description": "type post_integration: Run a connected CRM action after the call (add a note, create a follow-up task).",
				"properties": {
					"action": {
						"description": "The action, e.g. `crm.lookup_contact`, `crm.add_note`, `crm.create_task`.",
						"maxLength": 120,
						"type": "string"
					},
					"args": {
						"additionalProperties": {
							"maxLength": 4000,
							"type": "string"
						},
						"description": "The action's arguments by name ({{templates}} allowed).",
						"propertyNames": {
							"maxLength": 120,
							"type": "string"
						},
						"type": "object"
					},
					"integration_connection_id": {
						"description": "The connected integration account (Settings › Integrations). Integration connections have no API object (and no public ID prefix) yet: the id is the dashboard's.",
						"maxLength": 64,
						"type": "string"
					},
					"result_map": {
						"description": "Result fields → variables (e.g. `contacts[0].name` → `customer_name`).",
						"items": {
							"$ref": "#/components/schemas/FlowResponseMappingInput"
						},
						"maxItems": 100,
						"type": "array"
					}
				},
				"type": "object"
			},
			"FlowNodeQuestion": {
				"description": "type question: Ask for one detail, validate it and store it in a variable.",
				"properties": {
					"audio_id": {
						"description": "A audio asset ID (prefix `aud_`).",
						"examples": [
							"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"confirm": {
						"description": "Read the answer back for confirmation.",
						"type": "boolean"
					},
					"dtmf_input": {
						"$ref": "#/components/schemas/FlowDtmfInput"
					},
					"max_retries": {
						"maximum": 10,
						"minimum": 0,
						"type": "integer"
					},
					"prompt": {
						"maxLength": 4000,
						"type": "string"
					},
					"reask_prompts": {
						"items": {
							"maxLength": 4000,
							"type": "string"
						},
						"maxItems": 10,
						"type": "array"
					},
					"validation": {
						"$ref": "#/components/schemas/FlowQuestionValidation"
					},
					"var": {
						"description": "The variable the answer is stored in.",
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"prompt",
					"reask_prompts",
					"max_retries",
					"confirm"
				],
				"type": "object"
			},
			"FlowNodeQuestionParamsInput": {
				"additionalProperties": false,
				"description": "type question: Ask for one detail, validate it and store it in a variable.",
				"properties": {
					"audio_id": {
						"description": "A audio asset ID (`aud_…`).",
						"maxLength": 200,
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"confirm": {
						"description": "Read the answer back for confirmation.",
						"type": "boolean"
					},
					"dtmf_input": {
						"$ref": "#/components/schemas/FlowDtmfInputInput"
					},
					"max_retries": {
						"maximum": 10,
						"minimum": 0,
						"type": "integer"
					},
					"prompt": {
						"maxLength": 4000,
						"type": "string"
					},
					"reask_prompts": {
						"items": {
							"maxLength": 4000,
							"type": "string"
						},
						"maxItems": 10,
						"type": "array"
					},
					"validation": {
						"$ref": "#/components/schemas/FlowQuestionValidationInput"
					},
					"var": {
						"description": "The variable the answer is stored in.",
						"maxLength": 120,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeSay": {
				"description": "type say: Say an exact line, or one the AI rephrases.",
				"properties": {
					"audio_id": {
						"description": "An uploaded prompt played instead of speech.",
						"examples": [
							"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"interruptible": {
						"type": "boolean"
					},
					"mode": {
						"enum": [
							"verbatim",
							"rephrase"
						],
						"type": "string"
					},
					"style": {
						"maxLength": 500,
						"type": "string"
					},
					"text": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"required": [
					"text",
					"mode",
					"interruptible"
				],
				"type": "object"
			},
			"FlowNodeSayParamsInput": {
				"additionalProperties": false,
				"description": "type say: Say an exact line, or one the AI rephrases.",
				"properties": {
					"audio_id": {
						"description": "An uploaded prompt played instead of speech.",
						"maxLength": 200,
						"pattern": "^aud_[0-9A-Za-z]+$",
						"type": "string"
					},
					"interruptible": {
						"type": "boolean"
					},
					"mode": {
						"enum": [
							"verbatim",
							"rephrase"
						],
						"type": "string"
					},
					"style": {
						"maxLength": 500,
						"type": "string"
					},
					"text": {
						"maxLength": 4000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowNodeSetVariable": {
				"description": "type set_variable: Set variables.",
				"properties": {
					"assignments": {
						"items": {
							"$ref": "#/components/schemas/FlowAssignment"
						},
						"maxItems": 100,
						"type": "array"
					}
				},
				"required": [
					"assignments"
				],
				"type": "object"
			},
			"FlowNodeSetVariableParamsInput": {
				"additionalProperties": false,
				"description": "type set_variable: Set variables.",
				"properties": {
					"assignments": {
						"items": {
							"$ref": "#/components/schemas/FlowAssignmentInput"
						},
						"maxItems": 100,
						"type": "array"
					}
				},
				"type": "object"
			},
			"FlowNodeStart": {
				"description": "type start: Where every call begins: the greeting.",
				"properties": {
					"first_message_mode": {
						"enum": [
							"speak",
							"wait",
							"generate"
						],
						"type": "string"
					},
					"greeting": {
						"maxLength": 4000,
						"type": "string"
					},
					"interruptible": {
						"type": "boolean"
					}
				},
				"required": [
					"first_message_mode",
					"greeting",
					"interruptible"
				],
				"type": "object"
			},
			"FlowNodeStartParamsInput": {
				"additionalProperties": false,
				"description": "type start: Where every call begins: the greeting.",
				"properties": {
					"first_message_mode": {
						"enum": [
							"speak",
							"wait",
							"generate"
						],
						"type": "string"
					},
					"greeting": {
						"maxLength": 4000,
						"type": "string"
					},
					"interruptible": {
						"type": "boolean"
					}
				},
				"type": "object"
			},
			"FlowNodeTransfer": {
				"description": "type transfer: Transfer the call to a queue, a number, another flow or a SIP address.",
				"properties": {
					"announce_text": {
						"maxLength": 1000,
						"type": "string"
					},
					"assistant_id": {
						"description": "A assistant ID (prefix `asst_`).",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"destination": {
						"description": "A phone number, or a SIP URI for mode sip.",
						"maxLength": 200,
						"type": "string"
					},
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"mode": {
						"enum": [
							"queue",
							"number",
							"flow",
							"sip",
							"participant"
						],
						"type": "string"
					},
					"queue_id": {
						"description": "A queue ID (prefix `q_`).",
						"examples": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"screen_pop_vars": {
						"items": {
							"maxLength": 120,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"timeout_seconds": {
						"maximum": 600,
						"minimum": 1,
						"type": "integer"
					},
					"whisper_summary": {
						"description": "Warm transfer: whisper an AI summary to the receiving side first.",
						"type": "boolean"
					}
				},
				"required": [
					"mode",
					"whisper_summary",
					"timeout_seconds"
				],
				"type": "object"
			},
			"FlowNodeTransferParamsInput": {
				"additionalProperties": false,
				"description": "type transfer: Transfer the call to a queue, a number, another flow or a SIP address.",
				"properties": {
					"announce_text": {
						"maxLength": 1000,
						"type": "string"
					},
					"assistant_id": {
						"description": "A assistant ID (`asst_…`).",
						"maxLength": 200,
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"destination": {
						"description": "A phone number, or a SIP URI for mode sip.",
						"maxLength": 200,
						"type": "string"
					},
					"flow_id": {
						"description": "A flow ID (`flow_…`).",
						"maxLength": 200,
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"mode": {
						"enum": [
							"queue",
							"number",
							"flow",
							"sip",
							"participant"
						],
						"type": "string"
					},
					"queue_id": {
						"description": "A queue ID (`q_…`).",
						"maxLength": 200,
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"screen_pop_vars": {
						"items": {
							"maxLength": 120,
							"type": "string"
						},
						"maxItems": 50,
						"type": "array"
					},
					"timeout_seconds": {
						"maximum": 600,
						"minimum": 1,
						"type": "integer"
					},
					"whisper_summary": {
						"description": "Warm transfer: whisper an AI summary to the receiving side first.",
						"type": "boolean"
					}
				},
				"type": "object"
			},
			"FlowPath": {
				"description": "The nodes a call went through in its flow.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"end": "end_ok",
						"flow_id": "flow_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"flow_version": 3,
						"live": false,
						"object": "flow_path",
						"steps": [
							{
								"at_ms": 0,
								"edge_id": null,
								"input": null,
								"node_id": "start",
								"turns": 1,
								"via": null
							},
							{
								"at_ms": 6400,
								"edge_id": "e2",
								"input": null,
								"node_id": "order_status",
								"turns": 2,
								"via": "llm"
							}
						],
						"transferred": null
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"end": {
						"description": "How the flow ended (an end node, a transfer, a hang-up).",
						"type": [
							"string",
							"null"
						]
					},
					"flow_id": {
						"anyOf": [
							{
								"description": "A flow ID (prefix `flow_`).",
								"examples": [
									"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^flow_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "null when no flow ran on the call."
					},
					"flow_version": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"live": {
						"description": "The call is still running: more steps may follow.",
						"type": "boolean"
					},
					"object": {
						"const": "flow_path",
						"type": "string"
					},
					"steps": {
						"items": {
							"$ref": "#/components/schemas/FlowPathStep"
						},
						"type": "array"
					},
					"transferred": {
						"anyOf": [
							{
								"properties": {
									"mode": {
										"type": "string"
									},
									"to": {
										"type": [
											"string",
											"null"
										]
									}
								},
								"required": [
									"mode",
									"to"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"object",
					"call_id",
					"flow_id",
					"flow_version",
					"steps",
					"end",
					"transferred",
					"live"
				],
				"type": "object"
			},
			"FlowPathStep": {
				"properties": {
					"at_ms": {
						"description": "Milliseconds from the start of the call.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"edge_id": {
						"description": "The edge taken to get there (null at the start).",
						"type": [
							"string",
							"null"
						]
					},
					"input": {
						"anyOf": [
							{
								"enum": [
									"dtmf",
									"speech"
								],
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"node_id": {
						"description": "The flow node the call entered.",
						"type": "string"
					},
					"turns": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "Caller turns spent in the node."
					},
					"via": {
						"description": "How the edge was chosen, e.g. `llm`, `dtmf`, `condition`, `timeout`.",
						"type": [
							"string",
							"null"
						]
					}
				},
				"required": [
					"node_id",
					"edge_id",
					"via",
					"input",
					"at_ms",
					"turns"
				],
				"type": "object"
			},
			"FlowPosition": {
				"description": "The node's place on the editor canvas.",
				"properties": {
					"x": {
						"type": "number"
					},
					"y": {
						"type": "number"
					}
				},
				"required": [
					"x",
					"y"
				],
				"type": "object"
			},
			"FlowPositionInput": {
				"description": "The node's place on the editor canvas.",
				"properties": {
					"x": {
						"type": "number"
					},
					"y": {
						"type": "number"
					}
				},
				"required": [
					"x",
					"y"
				],
				"type": "object"
			},
			"FlowPublishParamsInput": {
				"additionalProperties": false,
				"description": "Publishing options.",
				"examples": [
					{
						"note": "New opening hours"
					}
				],
				"properties": {
					"note": {
						"description": "What changed (shown in the version history).",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowPublishedEvent": {
				"description": "A flow version was published.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "flow.published"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `flow.published` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^flow_[0-9A-Za-z]+$",
										"type": "string"
									},
									"object": {
										"const": "flow",
										"type": "string"
									},
									"version": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "flow.published",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"FlowQuestionValidation": {
				"properties": {
					"options": {
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"pattern": {
						"maxLength": 400,
						"type": "string"
					},
					"type": {
						"enum": [
							"text",
							"number",
							"boolean",
							"date",
							"phone",
							"email",
							"enum",
							"json"
						],
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowQuestionValidationInput": {
				"properties": {
					"options": {
						"items": {
							"maxLength": 200,
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"pattern": {
						"maxLength": 400,
						"type": "string"
					},
					"type": {
						"enum": [
							"text",
							"number",
							"boolean",
							"date",
							"phone",
							"email",
							"enum",
							"json"
						],
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowResponseMapping": {
				"properties": {
					"path": {
						"description": "e.g. data.items[0].name",
						"maxLength": 500,
						"type": "string"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"path"
				],
				"type": "object"
			},
			"FlowResponseMappingInput": {
				"properties": {
					"path": {
						"description": "e.g. data.items[0].name",
						"maxLength": 500,
						"type": "string"
					},
					"var": {
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"path"
				],
				"type": "object"
			},
			"FlowRule": {
				"description": "A rule on a variable.",
				"properties": {
					"op": {
						"enum": [
							"eq",
							"neq",
							"gt",
							"gte",
							"lt",
							"lte",
							"contains",
							"not_contains",
							"matches",
							"exists",
							"empty",
							"in",
							"not_in"
						],
						"type": "string"
					},
					"value": {
						"anyOf": [
							{
								"maxLength": 2000,
								"type": "string"
							},
							{
								"type": "number"
							},
							{
								"type": "boolean"
							},
							{
								"items": {
									"anyOf": [
										{
											"maxLength": 500,
											"type": "string"
										},
										{
											"type": "number"
										}
									]
								},
								"maxItems": 200,
								"type": "array"
							}
						],
						"description": "A literal or a {{template}}; a list for in / not_in."
					},
					"var": {
						"description": "A variable key, e.g. `budget`, `contact.city`, `api.status`.",
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"op"
				],
				"type": "object"
			},
			"FlowRuleInput": {
				"description": "A rule on a variable.",
				"properties": {
					"op": {
						"enum": [
							"eq",
							"neq",
							"gt",
							"gte",
							"lt",
							"lte",
							"contains",
							"not_contains",
							"matches",
							"exists",
							"empty",
							"in",
							"not_in"
						],
						"type": "string"
					},
					"value": {
						"anyOf": [
							{
								"maxLength": 2000,
								"type": "string"
							},
							{
								"type": "number"
							},
							{
								"type": "boolean"
							},
							{
								"items": {
									"anyOf": [
										{
											"maxLength": 500,
											"type": "string"
										},
										{
											"type": "number"
										}
									]
								},
								"maxItems": 200,
								"type": "array"
							}
						],
						"description": "A literal or a {{template}}; a list for in / not_in."
					},
					"var": {
						"description": "A variable key, e.g. `budget`, `contact.city`, `api.status`.",
						"maxLength": 120,
						"type": "string"
					}
				},
				"required": [
					"var",
					"op"
				],
				"type": "object"
			},
			"FlowSimulateParamsInput": {
				"additionalProperties": false,
				"description": "A simulated call (text only, no audio): start one, or continue it with `sim_id`. Test keys simulate on mock models; actions and tools are dry runs.",
				"examples": [
					{
						"messages": [
							"Hi, I'd like to book an appointment",
							"Tomorrow at 10"
						]
					}
				],
				"properties": {
					"dtmf": {
						"description": "Keys the caller presses, in order (after `messages`, before `message`); the entry then completes.",
						"pattern": "^[0-9*#A-D]{1,40}$",
						"type": "string"
					},
					"message": {
						"description": "One more caller line (after `messages`).",
						"maxLength": 2000,
						"minLength": 1,
						"type": "string"
					},
					"messages": {
						"description": "What the caller says, one line per turn, in order.",
						"items": {
							"maxLength": 2000,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 20,
						"type": "array"
					},
					"no_response": {
						"description": "The caller stays silent (a no-response timeout).",
						"type": "boolean"
					},
					"sim_id": {
						"description": "Continue this simulation (the `id` of an earlier answer; it lives 15 minutes after its last turn). Default: a new one.",
						"pattern": "^sim_[0-9A-Za-z]{22}$",
						"type": "string"
					},
					"variables": {
						"additionalProperties": {
							"anyOf": [
								{
									"maxLength": 2000,
									"type": "string"
								},
								{
									"type": "number"
								},
								{
									"type": "boolean"
								},
								{
									"type": "null"
								}
							]
						},
						"description": "Variables for the simulated call (merged over the flow's sample values).",
						"propertyNames": {
							"maxLength": 80,
							"minLength": 1,
							"type": "string"
						},
						"type": "object"
					},
					"version": {
						"description": "Simulate this published version. Default: the draft.",
						"maximum": 9007199254740991,
						"minimum": 1,
						"type": "integer"
					}
				},
				"type": "object"
			},
			"FlowSimulation": {
				"description": "A simulated call's progress: this request's turns, path and actions, and where the call stands.",
				"examples": [
					{
						"actions": [],
						"coverage": {
							"node_count": 5,
							"node_pct": 60,
							"transition_count": 5,
							"transition_pct": 40,
							"unvisited_node_keys": [
								"bye"
							],
							"visited_node_keys": [
								"start",
								"ask_id"
							]
						},
						"current_node_key": "ask_id",
						"end_reason": null,
						"ended": false,
						"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"id": "sim_7Hk2pQ9xZb4Lm8Nc3Rt6Vw",
						"livemode": false,
						"object": "flow_simulation",
						"path": [
							{
								"from_node_key": null,
								"node_key": "start",
								"node_type": "start",
								"transition_key": null,
								"via": "start"
							},
							{
								"from_node_key": "start",
								"node_key": "ask_id",
								"node_type": "question",
								"transition_key": "t_next",
								"via": "always"
							}
						],
						"resumed": false,
						"turns": [
							{
								"node_key": "start",
								"role": "assistant",
								"source": "script",
								"text": "Hello, you've reached Acme."
							},
							{
								"node_key": "ask_id",
								"role": "customer",
								"source": "speech",
								"text": "Hi, I'd like to book an appointment"
							},
							{
								"node_key": "ask_id",
								"role": "assistant",
								"source": "ai",
								"text": "Sure! What is your ID number?"
							}
						],
						"variables": {
							"customer_id": null
						}
					}
				],
				"properties": {
					"actions": {
						"description": "Actions and tool calls during this request (dry runs).",
						"items": {
							"properties": {
								"detail": {
									"type": "string"
								},
								"kind": {
									"description": "api, transfer, voicemail, operator, `tool:<name>`, …",
									"type": "string"
								},
								"node_key": {
									"type": [
										"string",
										"null"
									]
								},
								"outcome": {
									"type": "string"
								}
							},
							"required": [
								"node_key",
								"kind",
								"outcome",
								"detail"
							],
							"type": "object"
						},
						"type": "array"
					},
					"coverage": {
						"properties": {
							"node_count": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"node_pct": {
								"type": "number"
							},
							"transition_count": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"transition_pct": {
								"type": "number"
							},
							"unvisited_node_keys": {
								"items": {
									"type": "string"
								},
								"type": "array"
							},
							"visited_node_keys": {
								"items": {
									"type": "string"
								},
								"type": "array"
							}
						},
						"required": [
							"node_pct",
							"transition_pct",
							"visited_node_keys",
							"unvisited_node_keys",
							"node_count",
							"transition_count"
						],
						"type": "object"
					},
					"current_node_key": {
						"type": [
							"string",
							"null"
						]
					},
					"end_reason": {
						"type": [
							"string",
							"null"
						]
					},
					"ended": {
						"type": "boolean"
					},
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"id": {
						"description": "The simulation's ID: send it as `sim_id` to continue.",
						"pattern": "^sim_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "flow_simulation",
						"type": "string"
					},
					"path": {
						"description": "The nodes entered during this request, in order.",
						"items": {
							"properties": {
								"from_node_key": {
									"type": [
										"string",
										"null"
									]
								},
								"node_key": {
									"type": "string"
								},
								"node_type": {
									"description": "The node's v1 type (`internal`: a type outside the public subset).",
									"enum": [
										"start",
										"say",
										"question",
										"ai_agent",
										"kb_answer",
										"api",
										"post_api",
										"integration",
										"post_integration",
										"set_variable",
										"decision",
										"dtmf_menu",
										"hours",
										"transfer",
										"end",
										"internal"
									],
									"type": "string"
								},
								"transition_key": {
									"description": "The transition taken into the node (null at the start or for a global jump).",
									"type": [
										"string",
										"null"
									]
								},
								"via": {
									"type": [
										"string",
										"null"
									]
								}
							},
							"required": [
								"node_key",
								"node_type",
								"from_node_key",
								"transition_key",
								"via"
							],
							"type": "object"
						},
						"type": "array"
					},
					"resumed": {
						"description": "This request continued an existing simulation.",
						"type": "boolean"
					},
					"turns": {
						"description": "What was said during this request, in order.",
						"items": {
							"properties": {
								"node_key": {
									"description": "The node that spoke (assistant lines) or listened (caller lines).",
									"type": [
										"string",
										"null"
									]
								},
								"role": {
									"enum": [
										"assistant",
										"customer"
									],
									"type": "string"
								},
								"source": {
									"description": "script: a node's fixed line; ai: the model's reply; speech / keypad: the caller.",
									"enum": [
										"script",
										"ai",
										"speech",
										"keypad"
									],
									"type": "string"
								},
								"text": {
									"type": "string"
								}
							},
							"required": [
								"role",
								"text",
								"node_key",
								"source"
							],
							"type": "object"
						},
						"type": "array"
					},
					"variables": {
						"additionalProperties": {},
						"description": "The call's variables now (sensitive ones redacted).",
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"object",
					"id",
					"flow_id",
					"livemode",
					"resumed",
					"turns",
					"path",
					"actions",
					"ended",
					"end_reason",
					"current_node_key",
					"variables",
					"coverage"
				],
				"type": "object"
			},
			"FlowSuccessCondition": {
				"description": "When the response counts as a success (default: any 2xx).",
				"properties": {
					"mode": {
						"enum": [
							"all",
							"any"
						],
						"type": "string"
					},
					"rules": {
						"items": {
							"$ref": "#/components/schemas/FlowRule"
						},
						"maxItems": 50,
						"type": "array"
					}
				},
				"required": [
					"mode",
					"rules"
				],
				"type": "object"
			},
			"FlowSuccessConditionInput": {
				"description": "When the response counts as a success (default: any 2xx).",
				"properties": {
					"mode": {
						"enum": [
							"all",
							"any"
						],
						"type": "string"
					},
					"rules": {
						"items": {
							"$ref": "#/components/schemas/FlowRuleInput"
						},
						"maxItems": 50,
						"type": "array"
					}
				},
				"required": [
					"mode",
					"rules"
				],
				"type": "object"
			},
			"FlowTemplate": {
				"description": "A starter flow, in English or Hebrew.",
				"examples": [
					{
						"description": "Understands what the caller needs, books a slot in your calendar, texts a confirmation and offers another time when it's taken.",
						"kind": "voice",
						"language": "en",
						"name": "Appointment booking",
						"node_count": 14,
						"object": "flow_template",
						"tags": [
							"inbound",
							"booking",
							"sms",
							"api"
						],
						"template_id": "appointment-booking"
					}
				],
				"properties": {
					"description": {
						"type": "string"
					},
					"graph": {
						"$ref": "#/components/schemas/FlowGraph",
						"description": "The template's graph (retrieve only)."
					},
					"kind": {
						"enum": [
							"voice",
							"agent_script",
							"ivr"
						],
						"type": "string"
					},
					"language": {
						"enum": [
							"en",
							"he"
						],
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"node_count": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"object": {
						"const": "flow_template",
						"type": "string"
					},
					"tags": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"template_id": {
						"description": "The template's ID: pass it as `template_id` to POST /v1/flows.",
						"type": "string"
					}
				},
				"required": [
					"template_id",
					"object",
					"kind",
					"language",
					"name",
					"description",
					"tags",
					"node_count"
				],
				"type": "object"
			},
			"FlowTemplateList": {
				"description": "The starter flows.",
				"examples": [
					{
						"data": [
							{
								"description": "Understands what the caller needs, books a slot in your calendar, texts a confirmation and offers another time when it's taken.",
								"kind": "voice",
								"language": "en",
								"name": "Appointment booking",
								"node_count": 14,
								"object": "flow_template",
								"tags": [
									"inbound",
									"booking",
									"sms",
									"api"
								],
								"template_id": "appointment-booking"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/flow_templates"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/FlowTemplate"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"FlowTransition": {
				"description": "A node output: when its condition matches, the call moves to `next`.",
				"properties": {
					"condition": {
						"$ref": "#/components/schemas/FlowCondition"
					},
					"key": {
						"description": "The transition's key (an output port), unique in the node.",
						"type": "string"
					},
					"label": {
						"type": "string"
					},
					"next": {
						"anyOf": [
							{
								"description": "The node's key: your stable identifier, unique in the graph.",
								"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The key of the node this transition leads to (null: not connected)."
					}
				},
				"required": [
					"key",
					"label",
					"condition",
					"next"
				],
				"type": "object"
			},
			"FlowTransitionParamsInput": {
				"description": "A node output: when its condition matches, the call moves to `next`.",
				"properties": {
					"condition": {
						"$ref": "#/components/schemas/FlowConditionInput"
					},
					"key": {
						"description": "The transition's key (an output port), unique in the node. Default: a new key.",
						"maxLength": 64,
						"minLength": 1,
						"type": "string"
					},
					"label": {
						"maxLength": 200,
						"type": "string"
					},
					"next": {
						"anyOf": [
							{
								"description": "The node's key: your stable identifier, unique in the graph.",
								"pattern": "^[A-Za-z0-9_.:-]{1,64}$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The key of the node this transition leads to (null: not connected)."
					}
				},
				"required": [
					"condition"
				],
				"type": "object"
			},
			"FlowUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The flow's details to change (the graph is written with PUT /v1/flows/{id}/draft).",
				"examples": [
					{
						"name": "Reception (2026)"
					}
				],
				"properties": {
					"archived": {
						"description": "true archives the flow (hidden from lists); false restores it.",
						"type": "boolean"
					},
					"assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"description": {
						"maxLength": 2000,
						"type": "string"
					},
					"name": {
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					}
				},
				"type": "object"
			},
			"FlowUsage": {
				"description": "What uses the flow: it can be deleted only when nothing does.",
				"examples": [
					{
						"assistants": [
							{
								"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"name": "Receptionist"
							}
						],
						"copilot_profiles": [],
						"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"object": "flow_usage"
					}
				],
				"properties": {
					"assistants": {
						"items": {
							"properties": {
								"id": {
									"description": "A assistant ID (prefix `asst_`).",
									"examples": [
										"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^asst_[0-9A-Za-z]+$",
									"type": "string"
								},
								"name": {
									"type": "string"
								}
							},
							"required": [
								"id",
								"name"
							],
							"type": "object"
						},
						"type": "array"
					},
					"copilot_profiles": {
						"items": {
							"properties": {
								"id": {
									"description": "A copilot profile ID (prefix `cop_`).",
									"examples": [
										"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^cop_[0-9A-Za-z]+$",
									"type": "string"
								},
								"name": {
									"type": "string"
								}
							},
							"required": [
								"id",
								"name"
							],
							"type": "object"
						},
						"type": "array"
					},
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "flow_usage",
						"type": "string"
					}
				},
				"required": [
					"object",
					"flow_id",
					"assistants",
					"copilot_profiles"
				],
				"type": "object"
			},
			"FlowValidateParamsInput": {
				"additionalProperties": false,
				"description": "A graph to validate without saving it.",
				"examples": [
					{
						"graph": {
							"kind": "voice",
							"nodes": [
								{
									"key": "start",
									"transitions": [
										{
											"condition": {
												"kind": "always"
											},
											"next": null
										}
									],
									"type": "start"
								}
							]
						}
					}
				],
				"properties": {
					"graph": {
						"$ref": "#/components/schemas/FlowGraphParamsInput",
						"description": "The graph to check (`kind` is required here)."
					}
				},
				"required": [
					"graph"
				],
				"type": "object"
			},
			"FlowValidation": {
				"description": "What would block publishing (errors) and what deserves a look (warnings, tasks).",
				"examples": [
					{
						"issues": [
							{
								"code": "dead_end",
								"field": null,
								"message": "This node has an output that leads nowhere.",
								"node_key": "ask_id",
								"severity": "error",
								"transition_key": "t_fail"
							}
						],
						"object": "flow_validation",
						"valid": false
					}
				],
				"properties": {
					"issues": {
						"items": {
							"properties": {
								"code": {
									"description": "A stable code, e.g. `unreachable`, `dead_end`, `missing_else`, `undefined_var`.",
									"type": "string"
								},
								"field": {
									"type": [
										"string",
										"null"
									]
								},
								"message": {
									"type": "string"
								},
								"node_key": {
									"type": [
										"string",
										"null"
									]
								},
								"severity": {
									"description": "Errors block publishing; warnings and tasks do not.",
									"enum": [
										"error",
										"warning",
										"task"
									],
									"type": "string"
								},
								"transition_key": {
									"type": [
										"string",
										"null"
									]
								}
							},
							"required": [
								"severity",
								"code",
								"message",
								"node_key",
								"transition_key",
								"field"
							],
							"type": "object"
						},
						"type": "array"
					},
					"object": {
						"const": "flow_validation",
						"type": "string"
					},
					"valid": {
						"description": "No errors: it can be published.",
						"type": "boolean"
					}
				},
				"required": [
					"object",
					"valid",
					"issues"
				],
				"type": "object"
			},
			"FlowVersion": {
				"description": "A published, immutable version of a flow.",
				"examples": [
					{
						"checksum": "3f786850e387550fdab836ed7e6dc881de23001b",
						"created": "2026-11-03T09:14:22.000Z",
						"edge_count": 15,
						"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
						"graph": {
							"kind": "voice",
							"nodes": [
								{
									"disabled": false,
									"global": null,
									"key": "start",
									"position": {
										"x": 0,
										"y": 0
									},
									"start": {
										"first_message_mode": "speak",
										"greeting": "Hello, you've reached Acme.",
										"interruptible": true
									},
									"title": "Start",
									"transitions": [
										{
											"condition": {
												"kind": "always"
											},
											"key": "t_next",
											"label": "Next",
											"next": "ask_id"
										}
									],
									"type": "start"
								},
								{
									"disabled": false,
									"global": null,
									"key": "ask_id",
									"position": {
										"x": 320,
										"y": 0
									},
									"question": {
										"confirm": true,
										"max_retries": 2,
										"prompt": "What is your ID number?",
										"reask_prompts": [],
										"var": "customer_id"
									},
									"title": "Ask for the ID",
									"transitions": [
										{
											"condition": {
												"kind": "outcome",
												"outcome": "collected"
											},
											"key": "t_ok",
											"label": "Collected",
											"next": "bye"
										},
										{
											"condition": {
												"kind": "outcome",
												"outcome": "max_retries"
											},
											"key": "t_fail",
											"label": "Couldn't collect",
											"next": "bye"
										}
									],
									"type": "question"
								},
								{
									"disabled": false,
									"end": {
										"message": "Thank you, goodbye."
									},
									"global": null,
									"key": "bye",
									"position": {
										"x": 640,
										"y": 0
									},
									"title": "Goodbye",
									"transitions": [],
									"type": "end"
								}
							],
							"schema_version": 1,
							"settings": {
								"classifier_model": null,
								"fallback_node_key": null,
								"global_prompt": "You are Acme's friendly receptionist.",
								"ivr": null,
								"language": "en",
								"max_chain_steps": 25,
								"max_transitions": 200,
								"max_turns_per_node": 8,
								"max_visits_per_node": 5,
								"on_pre_call_fail": "continue",
								"pre_call_timeout_ms": 2500,
								"style_field": "auto",
								"transition_model": "inline"
							},
							"variables": [
								{
									"key": "customer_id",
									"label": "Customer ID",
									"source": "collected",
									"type": "text"
								}
							]
						},
						"livemode": true,
						"node_count": 12,
						"note": "New opening hours",
						"object": "flow_version",
						"version": 3
					}
				],
				"properties": {
					"checksum": {
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"edge_count": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"flow_id": {
						"description": "A flow ID (prefix `flow_`).",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"graph": {
						"$ref": "#/components/schemas/FlowGraph",
						"description": "The version's graph (retrieve only; lists leave it out)."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"node_count": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"note": {
						"type": "string"
					},
					"object": {
						"const": "flow_version",
						"type": "string"
					},
					"version": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"object",
					"flow_id",
					"livemode",
					"version",
					"note",
					"checksum",
					"node_count",
					"edge_count",
					"created"
				],
				"type": "object"
			},
			"FlowVersionList": {
				"description": "The flow's versions, newest first.",
				"examples": [
					{
						"data": [
							{
								"checksum": "3f786850e387550fdab836ed7e6dc881de23001b",
								"created": "2026-11-03T09:14:22.000Z",
								"edge_count": 15,
								"flow_id": "flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8",
								"livemode": true,
								"node_count": 12,
								"note": "New opening hours",
								"object": "flow_version",
								"version": 3
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/flows/flow_7Kp1Ns4Vy6Ab9Dg2Hj5Lm8/versions"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/FlowVersion"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ImportMappingInput": {
				"additionalProperties": {
					"anyOf": [
						{
							"maxLength": 200,
							"minLength": 1,
							"type": "string"
						},
						{
							"maximum": 1000,
							"minimum": 0,
							"type": "integer"
						}
					],
					"description": "A header name, or a 0-based column index."
				},
				"description": "Which column holds what: contact field → header name (or 0-based index). Any other key names a {{variable}}. Omit the mapping to detect the columns like the dashboard does.",
				"examples": [
					{
						"name": "Name",
						"phone": "Mobile",
						"plan": "Plan"
					}
				],
				"properties": {
					"consent": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						],
						"description": "Yes / no: the person consented to marketing calls (needs the evidence columns or defaults)."
					},
					"consent_at": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						],
						"description": "When they consented."
					},
					"consent_channel": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						],
						"description": "How they consented."
					},
					"consent_source": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						],
						"description": "Where they consented."
					},
					"name": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						]
					},
					"phone": {
						"anyOf": [
							{
								"maxLength": 200,
								"minLength": 1,
								"type": "string"
							},
							{
								"maximum": 1000,
								"minimum": 0,
								"type": "integer"
							}
						],
						"description": "A header name, or a 0-based column index."
					},
					"timezone": {
						"anyOf": [
							{
								"anyOf": [
									{
										"maxLength": 200,
										"minLength": 1,
										"type": "string"
									},
									{
										"maximum": 1000,
										"minimum": 0,
										"type": "integer"
									}
								],
								"description": "A header name, or a 0-based column index."
							},
							{
								"type": "null"
							}
						]
					},
					"variables": {
						"additionalProperties": {
							"anyOf": [
								{
									"maxLength": 200,
									"minLength": 1,
									"type": "string"
								},
								{
									"maximum": 1000,
									"minimum": 0,
									"type": "integer"
								}
							],
							"description": "A header name, or a 0-based column index."
						},
						"description": "{{variable}} name → column (or name them at the top level, as {\"plan\": \"Plan\"}).",
						"propertyNames": {
							"pattern": "^[A-Za-z0-9_\\u0590-\\u05FF]{1,40}$",
							"type": "string"
						},
						"type": "object"
					}
				},
				"required": [
					"phone"
				],
				"type": "object"
			},
			"InboundCallCreateParamsInput": {
				"additionalProperties": false,
				"description": "A simulated inbound call to a sandbox number.",
				"examples": [
					{
						"from": "+972521234567",
						"script": "dtmf:1",
						"to": "+972509991234"
					}
				],
				"properties": {
					"from": {
						"description": "The simulated caller's number (default +972521234567).",
						"pattern": "^\\+[1-9]\\d{6,14}$",
						"type": "string"
					},
					"script": {
						"description": "What the simulated caller does: `answer` (default) talks for a few turns and hangs up; `silent` says nothing (and hangs up after 30 s); `dtmf:123` presses the keys after the greeting, then talks.",
						"pattern": "^(answer|silent|dtmf:[0-9*#]{1,20})$",
						"type": "string"
					},
					"to": {
						"description": "A sandbox number of yours (POST /v1/phone_numbers with a test key).",
						"pattern": "^\\+[1-9]\\d{6,14}$",
						"type": "string"
					}
				},
				"required": [
					"to"
				],
				"type": "object"
			},
			"InboundRoute": {
				"description": "A rule that sends inbound calls (by dialled number and caller) to an assistant, flow, queue, person or room.",
				"examples": [
					{
						"assistant_request_timeout_ms": 1500,
						"assistant_request_url": null,
						"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
						"created": "2026-11-03T09:14:22.000Z",
						"enabled": true,
						"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
						"livemode": true,
						"match_caller": "",
						"match_did": "+97231234567",
						"name": "Sales line",
						"object": "inbound_route",
						"priority": 100,
						"target": {
							"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
							"type": "queue"
						}
					}
				],
				"properties": {
					"assistant_request_timeout_ms": {
						"description": "How long the assistant request may take (200–5000 ms) before the route's own target answers.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"assistant_request_url": {
						"description": "When set, this URL is asked (a signed POST, `assistant.request`) which assistant, flow or queue answers each matching call, and with which variables; the route's own target answers when it does not reply in time. Null: off.",
						"type": [
							"string",
							"null"
						]
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "Only calls arriving on this connection, or null for any.",
								"examples": [
									"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"enabled": {
						"type": "boolean"
					},
					"fallback_assistant_id": {
						"anyOf": [
							{
								"description": "Answers when the target cannot take the call (a disabled queue, a deactivated user), or null.",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"id": {
						"description": "The route's ID.",
						"examples": [
							"rte_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rte_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"match_caller": {
						"description": "The caller's number: exact, a prefix ending in `*`, or empty for any.",
						"type": "string"
					},
					"match_did": {
						"description": "The dialled number: exact, a prefix ending in `*`, or empty for any.",
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "inbound_route",
						"type": "string"
					},
					"priority": {
						"description": "Lower runs first; the first matching route wins.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"target": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/RouteTarget"
							},
							{
								"type": "null"
							}
						],
						"description": "Where matching calls go (null: the connection's inbound assistant answers)."
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"enabled",
					"priority",
					"connection_id",
					"match_did",
					"match_caller",
					"target",
					"fallback_assistant_id",
					"assistant_request_url",
					"assistant_request_timeout_ms",
					"created"
				],
				"type": "object"
			},
			"InboundRouteCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new route. `target` is required; other fields default (enabled, priority 100, match anything).",
				"examples": [
					{
						"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
						"match_did": "+97231234567",
						"name": "Sales line",
						"target": {
							"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
							"type": "queue"
						}
					}
				],
				"properties": {
					"assistant_request_timeout_ms": {
						"description": "200–5000 ms (default 1500): after this, the route's own target answers.",
						"maximum": 5000,
						"minimum": 200,
						"type": "integer"
					},
					"assistant_request_url": {
						"anyOf": [
							{
								"maxLength": 2048,
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "A public https URL asked which assistant answers each matching call (see the assistant-request guide); null turns it off."
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "Only calls on this connection; null for any.",
								"maxLength": 200,
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"enabled": {
						"type": "boolean"
					},
					"fallback_assistant_id": {
						"anyOf": [
							{
								"description": "Answers when the target cannot take the call; null for none. Not with an `assistant` target.",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"match_caller": {
						"description": "The caller's number: exact, a prefix ending in `*`, or empty for any.",
						"maxLength": 40,
						"pattern": "^\\+?[0-9\\s()-]*\\*?$",
						"type": "string"
					},
					"match_did": {
						"description": "The dialled number: exact, a prefix ending in `*`, or empty for any.",
						"maxLength": 40,
						"pattern": "^\\+?[0-9\\s()-]*\\*?$",
						"type": "string"
					},
					"name": {
						"maxLength": 120,
						"type": "string"
					},
					"priority": {
						"maximum": 100000,
						"minimum": -100000,
						"type": "integer"
					},
					"target": {
						"$ref": "#/components/schemas/RouteTargetParamsInput"
					}
				},
				"required": [
					"target"
				],
				"type": "object"
			},
			"InboundRouteList": {
				"description": "Your inbound routes in evaluation order (priority, then age).",
				"examples": [
					{
						"data": [
							{
								"assistant_request_timeout_ms": 1500,
								"assistant_request_url": null,
								"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
								"created": "2026-11-03T09:14:22.000Z",
								"enabled": true,
								"fallback_assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
								"id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
								"livemode": true,
								"match_caller": "",
								"match_did": "+97231234567",
								"name": "Sales line",
								"object": "inbound_route",
								"priority": 100,
								"target": {
									"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
									"type": "queue"
								}
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/inbound_routes"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/InboundRoute"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"InboundRouteUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The fields to change; everything else is kept.",
				"examples": [
					{
						"enabled": false
					}
				],
				"properties": {
					"assistant_request_timeout_ms": {
						"description": "200–5000 ms (default 1500): after this, the route's own target answers.",
						"maximum": 5000,
						"minimum": 200,
						"type": "integer"
					},
					"assistant_request_url": {
						"anyOf": [
							{
								"maxLength": 2048,
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "A public https URL asked which assistant answers each matching call (see the assistant-request guide); null turns it off."
					},
					"connection_id": {
						"anyOf": [
							{
								"description": "Only calls on this connection; null for any.",
								"maxLength": 200,
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"enabled": {
						"type": "boolean"
					},
					"fallback_assistant_id": {
						"anyOf": [
							{
								"description": "Answers when the target cannot take the call; null for none. Not with an `assistant` target.",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"match_caller": {
						"description": "The caller's number: exact, a prefix ending in `*`, or empty for any.",
						"maxLength": 40,
						"pattern": "^\\+?[0-9\\s()-]*\\*?$",
						"type": "string"
					},
					"match_did": {
						"description": "The dialled number: exact, a prefix ending in `*`, or empty for any.",
						"maxLength": 40,
						"pattern": "^\\+?[0-9\\s()-]*\\*?$",
						"type": "string"
					},
					"name": {
						"maxLength": 120,
						"type": "string"
					},
					"priority": {
						"maximum": 100000,
						"minimum": -100000,
						"type": "integer"
					},
					"target": {
						"$ref": "#/components/schemas/RouteTargetParamsInput"
					}
				},
				"type": "object"
			},
			"Insights": {
				"description": "Conversation analytics over the period's scored calls: KPIs, objections and what wins, behaviour and agents.",
				"examples": [
					{
						"agents": [
							{
								"average_score": 83.2,
								"calls": 87,
								"compliance_fails": 0,
								"name": "Dana Levi",
								"pass_rate": 0.9,
								"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
								"weekly": [
									{
										"average_score": 84.5,
										"calls": 21,
										"week": "2026-10-25"
									}
								],
								"win_rate": 0.31
							}
						],
						"behaviour": {
							"checklist": null,
							"questions": [
								{
									"average_score": 84,
									"calls": 98,
									"label": "5–8",
									"win_rate": 0.38
								}
							],
							"talk_ratio": [
								{
									"average_score": 82.1,
									"calls": 120,
									"label": "35–55%",
									"win_rate": 0.34
								}
							]
						},
						"copilot": {
							"adoption_rate": 0.42,
							"thumbs_down": 4,
							"thumbs_up": 31
						},
						"days": 30,
						"dispositions": [
							{
								"calls": 64,
								"disposition": "appointment"
							}
						],
						"from": "2026-10-04T09:14:22.000Z",
						"kpis": {
							"analyzed": 412,
							"average_duration_seconds": 245,
							"average_score": 78.4,
							"compliance_fail_rate": 0.03,
							"pass_rate": 0.81,
							"win_rate": 0.27
						},
						"livemode": true,
						"object": "insights",
						"semantic_clustering": true,
						"to": "2026-11-03T09:14:22.000Z",
						"top_objections": [
							{
								"best_response": "Compared it with today's costs.",
								"calls": 51,
								"count": 58,
								"examples": [
									"It's too expensive"
								],
								"handled_rate": 0.72,
								"label": "Too expensive",
								"win_rate": 0.22,
								"win_rate_handled": 0.29,
								"win_rate_unhandled": 0.06
							}
						]
					}
				],
				"properties": {
					"agents": {
						"items": {
							"properties": {
								"average_score": {
									"type": [
										"number",
										"null"
									]
								},
								"calls": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"compliance_fails": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"name": {
									"type": "string"
								},
								"pass_rate": {
									"type": [
										"number",
										"null"
									]
								},
								"user_id": {
									"anyOf": [
										{
											"description": "A user ID (prefix `usr_`).",
											"examples": [
												"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^usr_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									],
									"description": "null: calls with no agent (AI calls)."
								},
								"weekly": {
									"items": {
										"properties": {
											"average_score": {
												"type": [
													"number",
													"null"
												]
											},
											"calls": {
												"maximum": 9007199254740991,
												"minimum": -9007199254740991,
												"type": "integer"
											},
											"week": {
												"description": "The week's Sunday (YYYY-MM-DD).",
												"type": "string"
											}
										},
										"required": [
											"week",
											"calls",
											"average_score"
										],
										"type": "object"
									},
									"type": "array"
								},
								"win_rate": {
									"type": [
										"number",
										"null"
									]
								}
							},
							"required": [
								"user_id",
								"name",
								"calls",
								"average_score",
								"pass_rate",
								"win_rate",
								"compliance_fails",
								"weekly"
							],
							"type": "object"
						},
						"type": "array"
					},
					"behaviour": {
						"description": "Win rate and score by agent behaviour.",
						"properties": {
							"checklist": {
								"anyOf": [
									{
										"items": {
											"properties": {
												"average_score": {
													"type": [
														"number",
														"null"
													]
												},
												"calls": {
													"maximum": 9007199254740991,
													"minimum": -9007199254740991,
													"type": "integer"
												},
												"label": {
													"type": "string"
												},
												"win_rate": {
													"type": [
														"number",
														"null"
													]
												}
											},
											"required": [
												"label",
												"calls",
												"win_rate",
												"average_score"
											],
											"type": "object"
										},
										"type": "array"
									},
									{
										"type": "null"
									}
								]
							},
							"questions": {
								"items": {
									"properties": {
										"average_score": {
											"type": [
												"number",
												"null"
											]
										},
										"calls": {
											"maximum": 9007199254740991,
											"minimum": -9007199254740991,
											"type": "integer"
										},
										"label": {
											"type": "string"
										},
										"win_rate": {
											"type": [
												"number",
												"null"
											]
										}
									},
									"required": [
										"label",
										"calls",
										"win_rate",
										"average_score"
									],
									"type": "object"
								},
								"type": "array"
							},
							"talk_ratio": {
								"items": {
									"properties": {
										"average_score": {
											"type": [
												"number",
												"null"
											]
										},
										"calls": {
											"maximum": 9007199254740991,
											"minimum": -9007199254740991,
											"type": "integer"
										},
										"label": {
											"type": "string"
										},
										"win_rate": {
											"type": [
												"number",
												"null"
											]
										}
									},
									"required": [
										"label",
										"calls",
										"win_rate",
										"average_score"
									],
									"type": "object"
								},
								"type": "array"
							}
						},
						"required": [
							"talk_ratio",
							"questions",
							"checklist"
						],
						"type": "object"
					},
					"copilot": {
						"anyOf": [
							{
								"properties": {
									"adoption_rate": {
										"type": [
											"number",
											"null"
										]
									},
									"thumbs_down": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"thumbs_up": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									}
								},
								"required": [
									"adoption_rate",
									"thumbs_up",
									"thumbs_down"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "Agent copilot usage."
					},
					"days": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"dispositions": {
						"items": {
							"properties": {
								"calls": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"disposition": {
									"enum": [
										"sale",
										"appointment",
										"callback_scheduled",
										"follow_up",
										"resolved",
										"unresolved",
										"not_interested",
										"escalated",
										"wrong_number",
										"no_conversation",
										"other"
									],
									"type": "string"
								}
							},
							"required": [
								"disposition",
								"calls"
							],
							"type": "object"
						},
						"type": "array"
					},
					"from": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"kpis": {
						"properties": {
							"analyzed": {
								"description": "Calls with a finished scorecard.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"average_duration_seconds": {
								"type": [
									"number",
									"null"
								]
							},
							"average_score": {
								"type": [
									"number",
									"null"
								]
							},
							"compliance_fail_rate": {
								"type": [
									"number",
									"null"
								]
							},
							"pass_rate": {
								"type": [
									"number",
									"null"
								]
							},
							"win_rate": {
								"description": "Share of calls with a positive disposition (sale, appointment…).",
								"type": [
									"number",
									"null"
								]
							}
						},
						"required": [
							"analyzed",
							"average_score",
							"pass_rate",
							"compliance_fail_rate",
							"win_rate",
							"average_duration_seconds"
						],
						"type": "object"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "insights",
						"type": "string"
					},
					"semantic_clustering": {
						"description": "Objections were grouped by meaning (false: by words — always in test mode).",
						"type": "boolean"
					},
					"to": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"top_objections": {
						"items": {
							"properties": {
								"best_response": {
									"description": "The answer that won most often.",
									"type": [
										"string",
										"null"
									]
								},
								"calls": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"count": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"examples": {
									"items": {
										"type": "string"
									},
									"type": "array"
								},
								"handled_rate": {
									"type": [
										"number",
										"null"
									]
								},
								"label": {
									"type": "string"
								},
								"win_rate": {
									"type": [
										"number",
										"null"
									]
								},
								"win_rate_handled": {
									"type": [
										"number",
										"null"
									]
								},
								"win_rate_unhandled": {
									"type": [
										"number",
										"null"
									]
								}
							},
							"required": [
								"label",
								"count",
								"calls",
								"handled_rate",
								"win_rate",
								"win_rate_handled",
								"win_rate_unhandled",
								"best_response",
								"examples"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"livemode",
					"days",
					"from",
					"to",
					"semantic_clustering",
					"kpis",
					"dispositions",
					"top_objections",
					"behaviour",
					"agents",
					"copilot"
				],
				"type": "object"
			},
			"Invitation": {
				"description": "An invitation to join your organisation. The link is only ever emailed: the API never returns it.",
				"examples": [
					{
						"billing": false,
						"created": "2026-11-03T09:14:22.000Z",
						"email": "yossi@example.com",
						"emailed": true,
						"existing_user": false,
						"expires": "2026-11-10T09:14:22.000Z",
						"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
						"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
						"livemode": true,
						"object": "invitation",
						"role": "agent",
						"status": "pending",
						"team_id": null
					}
				],
				"properties": {
					"billing": {
						"type": "boolean"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"email": {
						"type": "string"
					},
					"emailed": {
						"description": "On create and resend: whether the invitation email went out. False when your organisation's invitation emails are off — share the link from the dashboard.",
						"type": "boolean"
					},
					"existing_user": {
						"description": "The address already has an account (in another organisation): they join with it.",
						"type": "boolean"
					},
					"expires": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"id": {
						"description": "The invitation's ID.",
						"examples": [
							"inv_t_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^inv_t_[0-9A-Za-z]+$",
						"type": "string"
					},
					"invited_by": {
						"anyOf": [
							{
								"description": "A user ID (prefix `usr_`).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The user who invited them (for an API key: the user who created the key)."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "invitation",
						"type": "string"
					},
					"role": {
						"description": "The role they get when they accept.",
						"enum": [
							"owner",
							"admin",
							"supervisor",
							"agent"
						],
						"type": "string"
					},
					"status": {
						"description": "`pending` until it expires (7 days); accepted and withdrawn invitations are no longer listed.",
						"enum": [
							"pending",
							"expired"
						],
						"type": "string"
					},
					"team_id": {
						"anyOf": [
							{
								"description": "A team ID (prefix `team_`).",
								"examples": [
									"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^team_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"email",
					"role",
					"billing",
					"team_id",
					"status",
					"invited_by",
					"existing_user",
					"created",
					"expires"
				],
				"type": "object"
			},
			"InvitationCreateParamsInput": {
				"additionalProperties": false,
				"description": "Who to invite, and as what.",
				"examples": [
					{
						"email": "yossi@example.com",
						"role": "agent"
					}
				],
				"properties": {
					"email": {
						"description": "Their email address. The invitation is emailed to it.",
						"maxLength": 320,
						"minLength": 3,
						"type": "string"
					},
					"role": {
						"default": "agent",
						"description": "Default `agent`. API keys invite agents and supervisors; `owner` and `admin` invitations come from an owner.",
						"enum": [
							"owner",
							"admin",
							"supervisor",
							"agent"
						],
						"type": "string"
					},
					"team_id": {
						"anyOf": [
							{
								"description": "A team ID (`team_…`).",
								"maxLength": 200,
								"pattern": "^team_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"email"
				],
				"type": "object"
			},
			"InvitationList": {
				"description": "Open invitations, and those that expired in the last 30 days, newest first.",
				"examples": [
					{
						"data": [
							{
								"billing": false,
								"created": "2026-11-03T09:14:22.000Z",
								"email": "yossi@example.com",
								"existing_user": false,
								"expires": "2026-11-10T09:14:22.000Z",
								"id": "inv_t_3Rt6Vx0Zb3Nd5Fh7Jk9Lm1N",
								"invited_by": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
								"livemode": true,
								"object": "invitation",
								"role": "agent",
								"status": "pending",
								"team_id": null
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/invitations"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Invitation"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"KbDocument": {
				"description": "A document in your knowledge base: assistants and the agent copilot answer from it.",
				"examples": [
					{
						"bytes": 184320,
						"chunk_count": 42,
						"created": "2026-11-03T09:14:22.000Z",
						"error": null,
						"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
						"kind": "pdf",
						"livemode": true,
						"object": "kb_document",
						"original_stored": true,
						"source": "price-list-2026.pdf",
						"status": "ready",
						"title": "Price list 2026",
						"updated": "2026-11-03T09:14:31.000Z"
					}
				],
				"properties": {
					"bytes": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"chunk_count": {
						"description": "Searchable passages the document was split into.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"error": {
						"description": "Why ingestion failed (status error).",
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "The document's ID.",
						"examples": [
							"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^kbd_[0-9A-Za-z]+$",
						"type": "string"
					},
					"kind": {
						"description": "The format it was read as; `url` for a web page.",
						"enum": [
							"pdf",
							"docx",
							"md",
							"txt",
							"csv",
							"xlsx",
							"html",
							"url"
						],
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "kb_document",
						"type": "string"
					},
					"original_stored": {
						"description": "The original file is kept (encrypted): GET …/content downloads it and reingest re-reads it.",
						"type": "boolean"
					},
					"source": {
						"description": "The uploaded file's name, or the URL.",
						"type": "string"
					},
					"status": {
						"description": "pending → processing → ready (searchable) | error. Poll the document, or follow `kb.document.*` events.",
						"enum": [
							"pending",
							"processing",
							"ready",
							"error"
						],
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"title",
					"kind",
					"source",
					"status",
					"error",
					"bytes",
					"chunk_count",
					"original_stored",
					"created",
					"updated"
				],
				"type": "object"
			},
			"KbDocumentCreateParamsInput": {
				"additionalProperties": false,
				"description": "A document to add: exactly one of `file`, `url` and `text`. It is indexed in the background (202): poll it until `status` is ready.",
				"examples": [
					{
						"text": "# Opening hours\nSunday–Thursday 08:00–18:00, Friday 08:00–13:00.",
						"title": "Opening hours"
					}
				],
				"properties": {
					"file": {
						"additionalProperties": false,
						"description": "A file to upload. Or send the request as multipart/form-data with a `file` part.",
						"properties": {
							"content_base64": {
								"description": "The file, base64-encoded (≤ 25 MB decoded).",
								"maxLength": 34952538,
								"minLength": 1,
								"type": "string"
							},
							"filename": {
								"description": "Its name; the extension picks the format (.pdf, .docx, .xlsx, .csv, .md, .txt, .html).",
								"maxLength": 200,
								"minLength": 1,
								"type": "string"
							}
						},
						"required": [
							"filename",
							"content_base64"
						],
						"type": "object"
					},
					"format": {
						"description": "With `text`: how to read it (default md).",
						"enum": [
							"md",
							"txt",
							"csv"
						],
						"type": "string"
					},
					"text": {
						"description": "Text to index as it is.",
						"maxLength": 2000000,
						"minLength": 1,
						"type": "string"
					},
					"title": {
						"description": "Default: the file's name, the page's title, or (text) \"Document\".",
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					},
					"url": {
						"description": "A public web page or file (http/https) to fetch and index. It is fetched again on reingest.",
						"format": "uri",
						"maxLength": 2000,
						"type": "string"
					}
				},
				"type": "object"
			},
			"KbDocumentFailedEvent": {
				"description": "A knowledge-base document could not be processed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kb.document.failed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kb.document.failed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"error": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^kbd_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kb.document.failed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KbDocumentList": {
				"description": "Your knowledge-base documents, newest first.",
				"examples": [
					{
						"data": [
							{
								"bytes": 184320,
								"chunk_count": 42,
								"created": "2026-11-03T09:14:22.000Z",
								"error": null,
								"id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
								"kind": "pdf",
								"livemode": true,
								"object": "kb_document",
								"original_stored": true,
								"source": "price-list-2026.pdf",
								"status": "ready",
								"title": "Price list 2026",
								"updated": "2026-11-03T09:14:31.000Z"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/kb/documents"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/KbDocument"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"KbDocumentReadyEvent": {
				"description": "A knowledge-base document finished processing.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kb.document.ready"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kb.document.ready` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"chunks": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"id": {
										"minLength": 1,
										"pattern": "^kbd_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kb.document.ready",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KbSearchParamsInput": {
				"additionalProperties": false,
				"description": "A knowledge-base search.",
				"examples": [
					{
						"limit": 3,
						"query": "When are you open on Friday?"
					}
				],
				"properties": {
					"copilot_profile_id": {
						"description": "Search as this copilot profile does: its documents only.",
						"maxLength": 200,
						"pattern": "^cop_[0-9A-Za-z]+$",
						"type": "string"
					},
					"document_ids": {
						"description": "Search only these documents.",
						"items": {
							"description": "A kb document ID (`kbd_…`).",
							"maxLength": 200,
							"pattern": "^kbd_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"limit": {
						"default": 5,
						"description": "Passages to return (1–20, default 5).",
						"maximum": 20,
						"minimum": 1,
						"type": "integer"
					},
					"query": {
						"description": "What to look for, in any language the documents are in.",
						"maxLength": 2000,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"query"
				],
				"type": "object"
			},
			"KbSearchResult": {
				"description": "The passages that best answer the query, best first: the same ranking assistants and the copilot use.",
				"examples": [
					{
						"data": [
							{
								"document_id": "kbd_6Nq0Sv3Xa5Cf8Hk1Mp4Rt7",
								"document_title": "Opening hours",
								"heading": "Opening hours",
								"match": "hybrid",
								"object": "kb_search_hit",
								"score": 0.82,
								"snippet": "… Friday 08:00–13:00.",
								"text": "Sunday–Thursday 08:00–18:00, Friday 08:00–13:00."
							}
						],
						"livemode": true,
						"object": "kb_search_result",
						"query": "When are you open on Friday?",
						"semantic": true
					}
				],
				"properties": {
					"data": {
						"items": {
							"properties": {
								"document_id": {
									"description": "A kb document ID (prefix `kbd_`).",
									"examples": [
										"kbd_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^kbd_[0-9A-Za-z]+$",
									"type": "string"
								},
								"document_title": {
									"type": "string"
								},
								"heading": {
									"type": "string"
								},
								"match": {
									"description": "Which retriever found it: words, meaning, both, or an exact phrase.",
									"enum": [
										"exact",
										"semantic",
										"keyword",
										"hybrid"
									],
									"type": "string"
								},
								"object": {
									"const": "kb_search_hit",
									"type": "string"
								},
								"score": {
									"description": "Confidence, 0–1 (the copilot shows a card unasked from about 0.35).",
									"type": "number"
								},
								"snippet": {
									"description": "The part of the passage that matched.",
									"type": "string"
								},
								"text": {
									"description": "The whole passage.",
									"type": "string"
								}
							},
							"required": [
								"object",
								"document_id",
								"document_title",
								"heading",
								"text",
								"snippet",
								"score",
								"match"
							],
							"type": "object"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "kb_search_result",
						"type": "string"
					},
					"query": {
						"type": "string"
					},
					"semantic": {
						"description": "Meaning-based retrieval took part. Test keys search by words only (no embedding call).",
						"type": "boolean"
					}
				},
				"required": [
					"object",
					"livemode",
					"query",
					"data",
					"semantic"
				],
				"type": "object"
			},
			"KycApprovedEvent": {
				"description": "Business verification was approved: outbound calling is open.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kyc.approved"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kyc.approved` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^kyc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"note": {
										"description": "The reviewer's note to the organisation (rejections, information requests).",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "outbound_kyc",
										"type": "string"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kyc.approved",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KycInfoRequestedEvent": {
				"description": "The reviewer needs more information. `note` says what.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kyc.info_requested"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kyc.info_requested` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^kyc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"note": {
										"description": "The reviewer's note to the organisation (rejections, information requests).",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "outbound_kyc",
										"type": "string"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kyc.info_requested",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KycRejectedEvent": {
				"description": "Business verification was rejected. `note` says why.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kyc.rejected"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kyc.rejected` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^kyc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"note": {
										"description": "The reviewer's note to the organisation (rejections, information requests).",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "outbound_kyc",
										"type": "string"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kyc.rejected",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KycSubmittedEvent": {
				"description": "The organisation submitted its business verification (outbound KYC) for review.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kyc.submitted"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kyc.submitted` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^kyc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"note": {
										"description": "The reviewer's note to the organisation (rejections, information requests).",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "outbound_kyc",
										"type": "string"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kyc.submitted",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"KycSuspendedEvent": {
				"description": "Outbound calling was suspended after a verification review.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "kyc.suspended"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `kyc.suspended` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^kyc_[0-9A-Za-z]+$",
										"type": "string"
									},
									"note": {
										"description": "The reviewer's note to the organisation (rejections, information requests).",
										"type": [
											"string",
											"null"
										]
									},
									"object": {
										"const": "outbound_kyc",
										"type": "string"
									},
									"previous_status": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "kyc.suspended",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"MediaStream": {
				"description": "A live copy of a call's audio, sent to your WebSocket in the Twilio Media Streams format.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"created": "2026-11-03T09:14:22.000Z",
						"custom_parameters": {
							"crm_id": "42"
						},
						"ended_reason": null,
						"format": "mulaw_8000",
						"frames_dropped": 0,
						"frames_sent": 0,
						"id": "ms_4fG7hJ2kL9mN3pQ6rS8tUv",
						"livemode": true,
						"mode": "fork",
						"object": "media_stream",
						"status": "connecting",
						"tracks": "both",
						"url": "wss://media.example.com/streams"
					}
				],
				"properties": {
					"call_id": {
						"description": "The call whose audio is streamed.",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"custom_parameters": {
						"additionalProperties": {
							"type": "string"
						},
						"propertyNames": {
							"type": "string"
						},
						"type": "object"
					},
					"ended_reason": {
						"description": "Why it ended: `call_ended`, `stopped`, `receiver_closed` or `connect_failed`; null while it runs.",
						"type": [
							"string",
							"null"
						]
					},
					"format": {
						"description": "`mulaw_8000`: G.711 μ-law at 8 kHz (Twilio's); `l16_16000` / `l16_8000`: signed 16-bit PCM, little-endian.",
						"enum": [
							"mulaw_8000",
							"l16_16000",
							"l16_8000"
						],
						"type": "string"
					},
					"frames_dropped": {
						"description": "Frames dropped because the receiver did not keep up (at most 2 s of audio waits per track).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"frames_sent": {
						"description": "20 ms frames sent so far (all tracks).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"id": {
						"description": "The stream's ID (`ms_…`): `streamSid` in the protocol's messages.",
						"pattern": "^ms_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"mode": {
						"description": "`fork`: a one-way copy of the call's audio; the call goes on as before.",
						"enum": [
							"fork"
						],
						"type": "string"
					},
					"object": {
						"const": "media_stream",
						"type": "string"
					},
					"status": {
						"description": "`connecting` (and `reconnecting` after the receiver dropped), `streaming`, `stopped`, or `failed` (the receiver could not be reached; the call went on).",
						"enum": [
							"connecting",
							"streaming",
							"reconnecting",
							"stopped",
							"failed"
						],
						"type": "string"
					},
					"tracks": {
						"description": "`inbound`: the caller; `outbound`: what the caller hears (the assistant, an agent, prompts); `both`.",
						"enum": [
							"inbound",
							"outbound",
							"both"
						],
						"type": "string"
					},
					"url": {
						"description": "The receiver's WebSocket URL.",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"call_id",
					"mode",
					"url",
					"tracks",
					"format",
					"custom_parameters",
					"status",
					"frames_sent",
					"frames_dropped",
					"ended_reason",
					"created"
				],
				"type": "object"
			},
			"MediaStreamCreateParamsInput": {
				"additionalProperties": false,
				"description": "Where and what to stream.",
				"examples": [
					{
						"custom_parameters": {
							"crm_id": "42"
						},
						"format": "mulaw_8000",
						"tracks": "both",
						"url": "wss://media.example.com/streams"
					}
				],
				"properties": {
					"custom_parameters": {
						"additionalProperties": {
							"maxLength": 500,
							"type": "string"
						},
						"description": "Up to 20 string key/values the receiver gets in `start.customParameters` (as Twilio's stream parameters).",
						"propertyNames": {
							"maxLength": 40,
							"minLength": 1,
							"type": "string"
						},
						"type": "object"
					},
					"format": {
						"default": "mulaw_8000",
						"description": "`mulaw_8000` (the default): G.711 μ-law at 8 kHz, Twilio's; `l16_16000` / `l16_8000`: signed 16-bit PCM, little-endian.",
						"enum": [
							"mulaw_8000",
							"l16_16000",
							"l16_8000"
						],
						"type": "string"
					},
					"mode": {
						"default": "fork",
						"description": "`fork` (the default): a one-way copy; your server's messages are ignored.",
						"enum": [
							"fork"
						],
						"type": "string"
					},
					"tracks": {
						"default": "both",
						"description": "`inbound`: the caller; `outbound`: what the caller hears (the assistant, an agent, prompts); `both` (the default).",
						"enum": [
							"inbound",
							"outbound",
							"both"
						],
						"type": "string"
					},
					"url": {
						"description": "Your WebSocket URL (`wss://`). The upgrade is signed with your signing secret (`webhook-id`, `webhook-timestamp`, `webhook-signature` over the path and query).",
						"maxLength": 2048,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"url"
				],
				"type": "object"
			},
			"Metadata": {
				"additionalProperties": {
					"maxLength": 500,
					"type": "string"
				},
				"description": "Up to 50 key/value pairs (keys up to 40 characters, values up to 500) you attach to an object. Returned as sent.",
				"examples": [
					{
						"crm_contact_id": "0031x00000AbCdE"
					}
				],
				"maxProperties": 50,
				"propertyNames": {
					"maxLength": 40,
					"minLength": 1,
					"type": "string"
				},
				"type": "object"
			},
			"MetadataInput": {
				"additionalProperties": {
					"maxLength": 500,
					"type": "string"
				},
				"description": "Up to 50 key/value pairs (keys up to 40 characters, values up to 500) you attach to an object. Returned as sent.",
				"examples": [
					{
						"crm_contact_id": "0031x00000AbCdE"
					}
				],
				"maxProperties": 50,
				"propertyNames": {
					"maxLength": 40,
					"minLength": 1,
					"type": "string"
				},
				"type": "object"
			},
			"Money": {
				"description": "An amount of money in minor units.",
				"examples": [
					{
						"amount": 1290,
						"currency": "ILS"
					}
				],
				"properties": {
					"amount": {
						"description": "The amount in the currency's minor unit (agorot, cents).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"currency": {
						"description": "ISO 4217 currency code.",
						"enum": [
							"ILS",
							"USD",
							"EUR"
						],
						"type": "string"
					}
				},
				"required": [
					"amount",
					"currency"
				],
				"type": "object"
			},
			"NumberKycApprovedEvent": {
				"description": "The regulator's documents (a regulatory bundle) for a country's numbers were approved.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.kyc_approved"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.kyc_approved` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"country": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^rb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"number_type": {
										"type": "string"
									},
									"object": {
										"const": "regulatory_bundle",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.kyc_approved",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberKycExpiredEvent": {
				"description": "A regulatory bundle expired and must be renewed.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.kyc_expired"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.kyc_expired` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"country": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^rb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"number_type": {
										"type": "string"
									},
									"object": {
										"const": "regulatory_bundle",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.kyc_expired",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberKycRejectedEvent": {
				"description": "A regulatory bundle was rejected. `reason` says why.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.kyc_rejected"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.kyc_rejected` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"country": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^rb_[0-9A-Za-z]+$",
										"type": "string"
									},
									"number_type": {
										"type": "string"
									},
									"object": {
										"const": "regulatory_bundle",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.kyc_rejected",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberPortCompletedEvent": {
				"description": "A number port finished.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.port_completed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.port_completed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"e164": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^pn_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.port_completed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberPortFocScheduledEvent": {
				"description": "A number port got its firm order commitment: `foc_at` is when the numbers move.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.port_foc_scheduled"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.port_foc_scheduled` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"foc_at": {
										"description": "The firm order commitment: when the numbers move.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^port_[0-9A-Za-z]+$",
										"type": "string"
									},
									"numbers": {
										"items": {
											"type": "string"
										},
										"type": "array"
									},
									"object": {
										"const": "porting_order",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.port_foc_scheduled",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberPortRejectedEvent": {
				"description": "A number port was rejected by the losing carrier. `reason` says why.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.port_rejected"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.port_rejected` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"foc_at": {
										"description": "The firm order commitment: when the numbers move.",
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"minLength": 1,
										"pattern": "^port_[0-9A-Za-z]+$",
										"type": "string"
									},
									"numbers": {
										"items": {
											"type": "string"
										},
										"type": "array"
									},
									"object": {
										"const": "porting_order",
										"type": "string"
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"status": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.port_rejected",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberProvisionedEvent": {
				"description": "A phone number was provisioned for the org.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.provisioned"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.provisioned` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"e164": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^pn_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.provisioned",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"NumberReleasedEvent": {
				"description": "A phone number was released.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "number.released"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `number.released` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"e164": {
										"type": "string"
									},
									"id": {
										"minLength": 1,
										"pattern": "^pn_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "number.released",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"Organization": {
				"description": "A client organisation of your partner account.",
				"examples": [
					{
						"billing_mode": "wholesale",
						"country": "IL",
						"created": "2026-11-03T09:14:22.000Z",
						"id": "org_6Hn3QpX8vB2mK9tL4wR7yZ",
						"livemode": true,
						"locale": "he",
						"members": 4,
						"name": "Haifa Dental Clinic",
						"object": "organization",
						"parent": "org_2Bc4De6Fg8Hi0Jk2Lm4No6",
						"plan": "growth",
						"region": "il",
						"slug": "haifa-dental-clinic",
						"status": "active"
					}
				],
				"properties": {
					"billing_mode": {
						"description": "`wholesale`: its usage is billed on your partner invoice; `direct`: it is billed directly, not through you.",
						"enum": [
							"wholesale",
							"direct"
						],
						"type": "string"
					},
					"country": {
						"description": "ISO 3166-1 alpha-2.",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"id": {
						"description": "The client organisation's ID. Send it as `Mv-Account` to act inside it.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"locale": {
						"enum": [
							"he",
							"en"
						],
						"type": "string"
					},
					"members": {
						"description": "Active members (seats in use).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "organization",
						"type": "string"
					},
					"parent": {
						"description": "Your (the partner's) organisation ID.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"plan": {
						"description": "The organisation's plan (`starter`, `growth`, `business`, `enterprise`).",
						"type": "string"
					},
					"region": {
						"description": "The data region it lives in (always yours).",
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"status": {
						"description": "`trial`, `active`, `past_due`, `suspended` or `closed`.",
						"enum": [
							"trial",
							"active",
							"past_due",
							"suspended",
							"closed"
						],
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"slug",
					"status",
					"plan",
					"billing_mode",
					"region",
					"country",
					"locale",
					"parent",
					"members",
					"created"
				],
				"type": "object"
			},
			"OrganizationCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new client organisation.",
				"examples": [
					{
						"admin_email": "owner@haifa-dental.example",
						"name": "Haifa Dental Clinic",
						"plan": "growth"
					}
				],
				"properties": {
					"admin_email": {
						"description": "The client's first admin: invited as its owner by email.",
						"format": "email",
						"maxLength": 200,
						"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
						"type": "string"
					},
					"billing_mode": {
						"description": "Default `wholesale` (billed to you).",
						"enum": [
							"wholesale",
							"direct"
						],
						"type": "string"
					},
					"country": {
						"description": "ISO 3166-1 alpha-2 (default: yours).",
						"pattern": "^[A-Za-z]{2}$",
						"type": "string"
					},
					"locale": {
						"description": "Default: yours.",
						"enum": [
							"he",
							"en"
						],
						"type": "string"
					},
					"name": {
						"description": "The client's name.",
						"maxLength": 120,
						"minLength": 1,
						"type": "string"
					},
					"plan": {
						"description": "A plan your wholesale price book offers (default `starter`).",
						"enum": [
							"starter",
							"growth",
							"business",
							"enterprise"
						],
						"type": "string"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"OrganizationList": {
				"description": "Your client organisations, newest first.",
				"examples": [
					{
						"data": [
							{
								"billing_mode": "wholesale",
								"country": "IL",
								"created": "2026-11-03T09:14:22.000Z",
								"id": "org_6Hn3QpX8vB2mK9tL4wR7yZ",
								"livemode": true,
								"locale": "he",
								"members": 4,
								"name": "Haifa Dental Clinic",
								"object": "organization",
								"parent": "org_2Bc4De6Fg8Hi0Jk2Lm4No6",
								"plan": "growth",
								"region": "il",
								"slug": "haifa-dental-clinic",
								"status": "active"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/organizations"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Organization"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"PhoneNumber": {
				"description": "A phone number on your account.",
				"examples": [
					{
						"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
						"country": "IL",
						"created": null,
						"e164": "+97231234567",
						"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
						"inbound": true,
						"inbound_route_id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
						"label": "Main trunk",
						"livemode": true,
						"object": "phone_number",
						"outbound_caller_id": true,
						"provider": null,
						"source": "connection",
						"status": "active"
					}
				],
				"properties": {
					"connection_id": {
						"anyOf": [
							{
								"description": "The connection that carries the number, or null.",
								"examples": [
									"conn_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^conn_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"country": {
						"description": "ISO 3166-1 alpha-2, when known.",
						"type": [
							"string",
							"null"
						]
					},
					"created": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "When the number was added (null for numbers derived from a connection)."
					},
					"e164": {
						"description": "The number in E.164.",
						"type": "string"
					},
					"id": {
						"description": "The number's ID (stable).",
						"examples": [
							"pn_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^pn_[0-9A-Za-z]+$",
						"type": "string"
					},
					"inbound": {
						"description": "Calls to the number are answered here (a route or connection matches it).",
						"type": "boolean"
					},
					"inbound_route_id": {
						"anyOf": [
							{
								"description": "The route that matches calls to the number (exactly), or null.",
								"examples": [
									"rte_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^rte_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"label": {
						"type": [
							"string",
							"null"
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "phone_number",
						"type": "string"
					},
					"outbound_caller_id": {
						"description": "The number can be presented as caller ID on outbound calls.",
						"type": "boolean"
					},
					"provider": {
						"description": "The carrier of a provisioned number; null for your own connections.",
						"type": [
							"string",
							"null"
						]
					},
					"source": {
						"description": "`provisioned`: bought through the platform. `connection`: a number of your own SIP connection (its caller IDs and the numbers your inbound routes match). `sandbox`: a test-mode number.",
						"enum": [
							"provisioned",
							"connection",
							"sandbox"
						],
						"type": "string"
					},
					"status": {
						"description": "`active`; provisioned numbers can also be `pending`, `pending_kyc`, `porting_in`, `suspended`, `releasing` or `released`.",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"e164",
					"country",
					"source",
					"provider",
					"status",
					"connection_id",
					"inbound_route_id",
					"label",
					"inbound",
					"outbound_caller_id",
					"created"
				],
				"type": "object"
			},
			"PhoneNumberCreateParamsInput": {
				"additionalProperties": false,
				"description": "Test mode only: allocates a sandbox number (no carrier, no cost; at most 5 per organisation). Set at most one of `assistant_id`, `flow_id` and `inbound_route_id`; with none, test calls reach your most recently updated assistant, as on a real line.",
				"examples": [
					{
						"assistant_id": "asst_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"label": "Support line (test)"
					}
				],
				"properties": {
					"assistant_id": {
						"description": "Inbound test calls to the number reach this assistant.",
						"maxLength": 200,
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"flow_id": {
						"description": "Inbound test calls to the number run this published flow.",
						"maxLength": 200,
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"inbound_route_id": {
						"description": "Inbound test calls to the number follow this inbound route.",
						"maxLength": 200,
						"pattern": "^rte_[0-9A-Za-z]+$",
						"type": "string"
					},
					"label": {
						"description": "A name for the number, shown in lists.",
						"maxLength": 100,
						"type": "string"
					}
				},
				"type": "object"
			},
			"PhoneNumberList": {
				"description": "Your numbers: provisioned ones first, then those of your own connections.",
				"examples": [
					{
						"data": [
							{
								"connection_id": "conn_2Wq8RfLx0bZt7nKp1VdYhC",
								"country": "IL",
								"created": null,
								"e164": "+97231234567",
								"id": "pn_3TzKk4u7Q0Yx9b2LmN8pQr",
								"inbound": true,
								"inbound_route_id": "rte_5Hn3MpO0qR5sT7uW9xY1zA",
								"label": "Main trunk",
								"livemode": true,
								"object": "phone_number",
								"outbound_caller_id": true,
								"provider": null,
								"source": "connection",
								"status": "active"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/phone_numbers"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/PhoneNumber"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"QaOverriddenEvent": {
				"description": "A supervisor overrode a QA score.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "qa.overridden"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `qa.overridden` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"by": {
										"minLength": 1,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"item_id": {
										"type": [
											"string",
											"null"
										]
									},
									"item_score": {
										"description": "The item's new score (null: not applicable); absent when the override was cleared.",
										"type": [
											"number",
											"null"
										]
									},
									"kind": {
										"description": "What was overridden: one rubric item's score, or the call's disposition.",
										"enum": [
											"item",
											"disposition"
										],
										"type": "string"
									},
									"passed": {
										"type": [
											"boolean",
											"null"
										]
									},
									"previous_disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"previous_item_score": {
										"type": [
											"number",
											"null"
										]
									},
									"reason": {
										"type": [
											"string",
											"null"
										]
									},
									"score": {
										"type": [
											"number",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "qa.overridden",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"QaRubric": {
				"description": "Your organisation's QA rubric. Calls with a copilot profile that has its own rubric are scored against that one.",
				"examples": [
					{
						"builtin": false,
						"items": [
							{
								"critical": true,
								"description": "Says the call is recorded before any commitment.",
								"key": "disclosure",
								"label": "Disclosure",
								"type": "scale",
								"weight": 30
							},
							{
								"critical": false,
								"description": "Open questions before offering a solution.",
								"key": "discovery",
								"label": "Discovery",
								"type": "scale",
								"weight": 40
							},
							{
								"critical": false,
								"description": "Agrees a dated next step.",
								"key": "closing",
								"label": "Next step",
								"type": "boolean",
								"weight": 30
							}
						],
						"livemode": true,
						"name": "Sales and service",
						"object": "qa_rubric",
						"pass_threshold": 70
					}
				],
				"properties": {
					"builtin": {
						"description": "true: the built-in rubric (you have not saved your own).",
						"type": "boolean"
					},
					"items": {
						"items": {
							"properties": {
								"critical": {
									"description": "A compliance item: scoring 2 or less fails the call whatever the total.",
									"type": "boolean"
								},
								"description": {
									"description": "What a good answer looks like (the scorer reads it).",
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable key for the item: letters, digits, - and _ (≤ 40).",
									"pattern": "^[a-z0-9_-]{1,40}$",
									"type": "string"
								},
								"label": {
									"maxLength": 200,
									"minLength": 1,
									"type": "string"
								},
								"type": {
									"description": "`scale`: 0–5; `boolean`: done (5) or not (0).",
									"enum": [
										"scale",
										"boolean"
									],
									"type": "string"
								},
								"weight": {
									"description": "Relative importance on one 0–100 scale; only the ratios count (60 and 40 weigh like 3 and 2).",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"description",
								"weight",
								"type",
								"critical"
							],
							"type": "object"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "qa_rubric",
						"type": "string"
					},
					"pass_threshold": {
						"description": "A call passes at this score (0–100) or above, with no critical item failed.",
						"maximum": 100,
						"minimum": 0,
						"type": "number"
					}
				},
				"required": [
					"object",
					"livemode",
					"name",
					"pass_threshold",
					"items",
					"builtin"
				],
				"type": "object"
			},
			"QaRubricParamsInput": {
				"additionalProperties": false,
				"description": "The whole rubric: it replaces the stored one. New calls are scored against it.",
				"examples": [
					{
						"items": [
							{
								"key": "discovery",
								"label": "Discovery",
								"weight": 60
							},
							{
								"key": "closing",
								"label": "Next step",
								"type": "boolean",
								"weight": 40
							}
						],
						"pass_threshold": 75
					}
				],
				"properties": {
					"items": {
						"description": "The items, in order; keys must be unique and at least one item needs a weight above 0.",
						"items": {
							"additionalProperties": false,
							"properties": {
								"critical": {
									"description": "Default false.",
									"type": "boolean"
								},
								"description": {
									"description": "What a good answer looks like (the scorer reads it).",
									"maxLength": 2000,
									"type": "string"
								},
								"key": {
									"description": "Your stable key for the item: letters, digits, - and _ (≤ 40).",
									"pattern": "^[a-z0-9_-]{1,40}$",
									"type": "string"
								},
								"label": {
									"maxLength": 200,
									"minLength": 1,
									"type": "string"
								},
								"type": {
									"description": "Default `scale`.",
									"enum": [
										"scale",
										"boolean"
									],
									"type": "string"
								},
								"weight": {
									"description": "Default 1. Relative importance on one 0–100 scale; only the ratios count.",
									"maximum": 100,
									"minimum": 0,
									"type": "number"
								}
							},
							"required": [
								"key",
								"label"
							],
							"type": "object"
						},
						"maxItems": 50,
						"minItems": 1,
						"type": "array"
					},
					"name": {
						"description": "Default: \"Default QA rubric\".",
						"maxLength": 200,
						"minLength": 1,
						"type": "string"
					},
					"pass_threshold": {
						"description": "Default 70.",
						"maximum": 100,
						"minimum": 0,
						"type": "number"
					}
				},
				"required": [
					"items"
				],
				"type": "object"
			},
			"QaScoredEvent": {
				"description": "A call was scored against the QA scorecard (the legacy `call.analyzed` payload).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "qa.scored"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `qa.scored` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"compliance": {},
									"disposition": {
										"type": [
											"string",
											"null"
										]
									},
									"passed": {
										"type": [
											"boolean",
											"null"
										]
									},
									"score": {
										"type": [
											"number",
											"null"
										]
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "qa.scored",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"Queue": {
				"description": "A queue of callers waiting for a human agent.",
				"examples": [
					{
						"away_on_missed": true,
						"callbacks": {
							"agent_id": null,
							"assistant_id": null,
							"priority": 5,
							"route": "agent_queue",
							"voicemail_to_callback": false
						},
						"copilot_profile_id": null,
						"created": "2026-11-03T09:14:22.000Z",
						"enabled": true,
						"hold": {
							"announce_position": false,
							"announcement": "",
							"audio": "music",
							"audio_asset_id": null,
							"position_interval_seconds": 45
						},
						"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"livemode": true,
						"max_wait_seconds": 120,
						"member_team_ids": [
							"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
						],
						"member_user_ids": [
							"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
						],
						"name": "Support",
						"object": "queue",
						"overflow": {
							"action": "assistant",
							"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
							"number": "",
							"queue_id": null,
							"user_id": null,
							"when_no_agents": true
						},
						"ring_timeout_seconds": 20,
						"strategy": "longest_idle",
						"updated": "2026-11-03T09:14:22.000Z",
						"voice_assistant_id": null,
						"voicemail": {
							"max_seconds": 90,
							"message": ""
						},
						"wait_keys": {
							"callback": "",
							"voicemail": ""
						},
						"wrap_up_seconds": 15
					}
				],
				"properties": {
					"away_on_missed": {
						"description": "An agent who misses a call is set to away.",
						"type": "boolean"
					},
					"callbacks": {
						"description": "How callbacks requested in this queue are returned.",
						"properties": {
							"agent_id": {
								"anyOf": [
									{
										"description": "A user ID (prefix `usr_`).",
										"examples": [
											"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "A assistant ID (prefix `asst_`).",
										"examples": [
											"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"priority": {
								"description": "1 (low) to 10 (urgent).",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"route": {
								"description": "Who returns this queue's callbacks: its agents, one agent or an AI assistant.",
								"enum": [
									"agent_queue",
									"agent",
									"assistant"
								],
								"type": "string"
							},
							"voicemail_to_callback": {
								"description": "A voicemail left in this queue becomes a callback task too.",
								"type": "boolean"
							}
						},
						"required": [
							"route",
							"agent_id",
							"assistant_id",
							"priority",
							"voicemail_to_callback"
						],
						"type": "object"
					},
					"copilot_profile_id": {
						"anyOf": [
							{
								"description": "A copilot profile ID (prefix `cop_`).",
								"examples": [
									"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cop_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The copilot profile agents get on this queue's calls."
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"enabled": {
						"description": "A disabled queue takes no calls: they overflow.",
						"type": "boolean"
					},
					"hold": {
						"properties": {
							"announce_position": {
								"description": "Tell callers their place in line.",
								"type": "boolean"
							},
							"announcement": {
								"description": "Said to callers when they join the queue.",
								"type": "string"
							},
							"audio": {
								"description": "What callers hear while they wait; `asset` plays `audio_asset_id` in a loop.",
								"enum": [
									"music",
									"ringback",
									"silence",
									"asset"
								],
								"type": "string"
							},
							"audio_asset_id": {
								"anyOf": [
									{
										"description": "A audio asset ID (prefix `aud_`).",
										"examples": [
											"aud_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^aud_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"position_interval_seconds": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"audio",
							"audio_asset_id",
							"announcement",
							"announce_position",
							"position_interval_seconds"
						],
						"type": "object"
					},
					"id": {
						"description": "The queue's ID.",
						"examples": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"max_wait_seconds": {
						"description": "How long a caller waits before the overflow action (0: no limit).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"member_team_ids": {
						"description": "Teams whose members answer this queue's calls.",
						"items": {
							"description": "A team ID (prefix `team_`).",
							"examples": [
								"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
							],
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						},
						"type": "array"
					},
					"member_user_ids": {
						"description": "Users who answer this queue's calls.",
						"items": {
							"description": "A user ID (prefix `usr_`).",
							"examples": [
								"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
							],
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						},
						"type": "array"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "queue",
						"type": "string"
					},
					"overflow": {
						"description": "What happens to callers who waited too long, or when nobody can answer.",
						"properties": {
							"action": {
								"enum": [
									"assistant",
									"voicemail",
									"busy",
									"agent",
									"queue",
									"number"
								],
								"type": "string"
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "A assistant ID (prefix `asst_`).",
										"examples": [
											"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "Action `assistant`: the AI assistant that answers."
							},
							"number": {
								"description": "Action `number`: the phone number the call is forwarded to.",
								"type": "string"
							},
							"queue_id": {
								"anyOf": [
									{
										"description": "A queue ID (prefix `q_`).",
										"examples": [
											"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "Action `queue`: the queue the call moves to."
							},
							"user_id": {
								"anyOf": [
									{
										"description": "A user ID (prefix `usr_`).",
										"examples": [
											"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								],
								"description": "Action `agent`: the user who gets the call."
							},
							"when_no_agents": {
								"description": "Overflow at once when no agent is signed in.",
								"type": "boolean"
							}
						},
						"required": [
							"when_no_agents",
							"action",
							"assistant_id",
							"user_id",
							"queue_id",
							"number"
						],
						"type": "object"
					},
					"ring_timeout_seconds": {
						"description": "How long an agent's phone rings before the next agent is tried.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"strategy": {
						"description": "Which available agent rings first: the one idle longest, or in turn.",
						"enum": [
							"longest_idle",
							"round_robin"
						],
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"voice_assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (prefix `asst_`).",
								"examples": [
									"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The assistant whose voice speaks the queue's announcements."
					},
					"voicemail": {
						"properties": {
							"max_seconds": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"message": {
								"description": "Played before the beep (empty: the default).",
								"type": "string"
							}
						},
						"required": [
							"message",
							"max_seconds"
						],
						"type": "object"
					},
					"wait_keys": {
						"properties": {
							"callback": {
								"description": "Pressed while waiting: ask for a callback (empty: off).",
								"type": "string"
							},
							"voicemail": {
								"description": "Pressed while waiting: leave a voicemail (empty: off).",
								"type": "string"
							}
						},
						"required": [
							"voicemail",
							"callback"
						],
						"type": "object"
					},
					"wrap_up_seconds": {
						"description": "After-call time before an agent gets the next call.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"enabled",
					"strategy",
					"member_user_ids",
					"member_team_ids",
					"ring_timeout_seconds",
					"max_wait_seconds",
					"wrap_up_seconds",
					"away_on_missed",
					"overflow",
					"voicemail",
					"hold",
					"wait_keys",
					"callbacks",
					"voice_assistant_id",
					"copilot_profile_id",
					"created",
					"updated"
				],
				"type": "object"
			},
			"QueueCallAbandonedEvent": {
				"description": "The caller hung up while waiting in a queue.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "queue.call_abandoned"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `queue.call_abandoned` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"queue_id": {
										"minLength": 1,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									"wait_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "queue.call_abandoned",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"QueueCallAnsweredEvent": {
				"description": "An agent answered a queued call.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "queue.call_answered"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `queue.call_answered` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"agent_id": {
										"minLength": 1,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"queue_id": {
										"minLength": 1,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									"wait_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "queue.call_answered",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"QueueCallEnteredEvent": {
				"description": "A call entered a queue.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "queue.call_entered"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `queue.call_entered` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"position": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"queue_id": {
										"minLength": 1,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "queue.call_entered",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"QueueCreateParamsInput": {
				"additionalProperties": false,
				"description": "A new queue. Only `name` is required; everything else takes the defaults shown on the Queue object.",
				"examples": [
					{
						"max_wait_seconds": 180,
						"member_team_ids": [
							"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
						],
						"name": "Support",
						"overflow": {
							"action": "voicemail"
						}
					}
				],
				"properties": {
					"away_on_missed": {
						"type": "boolean"
					},
					"callbacks": {
						"additionalProperties": false,
						"properties": {
							"agent_id": {
								"anyOf": [
									{
										"description": "Route `agent`: the user who returns the callbacks.",
										"maxLength": 200,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "Route `assistant`: the assistant that returns the callbacks.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"priority": {
								"maximum": 10,
								"minimum": 1,
								"type": "integer"
							},
							"route": {
								"enum": [
									"agent_queue",
									"agent",
									"assistant"
								],
								"type": "string"
							},
							"voicemail_to_callback": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"copilot_profile_id": {
						"anyOf": [
							{
								"description": "A copilot profile ID (`cop_…`).",
								"maxLength": 200,
								"pattern": "^cop_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"enabled": {
						"type": "boolean"
					},
					"hold": {
						"additionalProperties": false,
						"properties": {
							"announce_position": {
								"type": "boolean"
							},
							"announcement": {
								"maxLength": 1000,
								"type": "string"
							},
							"audio": {
								"enum": [
									"music",
									"ringback",
									"silence",
									"asset"
								],
								"type": "string"
							},
							"audio_asset_id": {
								"anyOf": [
									{
										"description": "With `audio: asset`: the uploaded recording to loop.",
										"maxLength": 200,
										"pattern": "^aud_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"position_interval_seconds": {
								"maximum": 600,
								"minimum": 15,
								"type": "integer"
							}
						},
						"type": "object"
					},
					"max_wait_seconds": {
						"maximum": 3600,
						"minimum": 0,
						"type": "integer"
					},
					"member_team_ids": {
						"items": {
							"description": "A team ID (`team_…`).",
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"member_user_ids": {
						"items": {
							"description": "A user ID (`usr_…`).",
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 500,
						"type": "array"
					},
					"name": {
						"maxLength": 80,
						"minLength": 1,
						"type": "string"
					},
					"overflow": {
						"additionalProperties": false,
						"description": "Fields you leave out are kept.",
						"properties": {
							"action": {
								"enum": [
									"assistant",
									"voicemail",
									"busy",
									"agent",
									"queue",
									"number"
								],
								"type": "string"
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "Action `assistant`: the AI assistant that answers.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"number": {
								"maxLength": 32,
								"type": "string"
							},
							"queue_id": {
								"anyOf": [
									{
										"description": "Action `queue`: the queue the call moves to.",
										"maxLength": 200,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"user_id": {
								"anyOf": [
									{
										"description": "Action `agent`: the user who gets the call.",
										"maxLength": 200,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"when_no_agents": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"ring_timeout_seconds": {
						"maximum": 120,
						"minimum": 5,
						"type": "integer"
					},
					"strategy": {
						"enum": [
							"longest_idle",
							"round_robin"
						],
						"type": "string"
					},
					"voice_assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"voicemail": {
						"additionalProperties": false,
						"properties": {
							"max_seconds": {
								"maximum": 600,
								"minimum": 10,
								"type": "integer"
							},
							"message": {
								"maxLength": 1000,
								"type": "string"
							}
						},
						"type": "object"
					},
					"wait_keys": {
						"additionalProperties": false,
						"properties": {
							"callback": {
								"pattern": "^[0-9*#]?$",
								"type": "string"
							},
							"voicemail": {
								"pattern": "^[0-9*#]?$",
								"type": "string"
							}
						},
						"type": "object"
					},
					"wrap_up_seconds": {
						"maximum": 600,
						"minimum": 0,
						"type": "integer"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"QueueList": {
				"description": "Your queues by name.",
				"examples": [
					{
						"data": [
							{
								"away_on_missed": true,
								"callbacks": {
									"agent_id": null,
									"assistant_id": null,
									"priority": 5,
									"route": "agent_queue",
									"voicemail_to_callback": false
								},
								"copilot_profile_id": null,
								"created": "2026-11-03T09:14:22.000Z",
								"enabled": true,
								"hold": {
									"announce_position": false,
									"announcement": "",
									"audio": "music",
									"audio_asset_id": null,
									"position_interval_seconds": 45
								},
								"id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"livemode": true,
								"max_wait_seconds": 120,
								"member_team_ids": [
									"team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
								],
								"member_user_ids": [
									"usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
								],
								"name": "Support",
								"object": "queue",
								"overflow": {
									"action": "assistant",
									"assistant_id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
									"number": "",
									"queue_id": null,
									"user_id": null,
									"when_no_agents": true
								},
								"ring_timeout_seconds": 20,
								"strategy": "longest_idle",
								"updated": "2026-11-03T09:14:22.000Z",
								"voice_assistant_id": null,
								"voicemail": {
									"max_seconds": 90,
									"message": ""
								},
								"wait_keys": {
									"callback": "",
									"voicemail": ""
								},
								"wrap_up_seconds": 15
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/queues"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Queue"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"QueueLive": {
				"description": "A queue right now: waiting callers, the agents who can take them and today's numbers.",
				"examples": [
					{
						"agents": {
							"available": 2,
							"away": 1,
							"busy": 1,
							"online": 4,
							"wrap_up": 0
						},
						"as_of": "2026-11-03T09:14:22.000Z",
						"callbacks_offered": 0,
						"callers": [
							{
								"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
								"from": "+972501234567",
								"position": 1,
								"state": "ringing",
								"waited_seconds": 42
							}
						],
						"enabled": true,
						"livemode": true,
						"longest_wait_seconds": 42,
						"members": [
							{
								"call_id": null,
								"name": "Dana Levi",
								"since": "2026-11-03T09:10:00.000Z",
								"status": "available",
								"user_id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7"
							}
						],
						"object": "queue_live",
						"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"today": {
							"abandoned": 4,
							"answered": 31,
							"average_wait_seconds": 18,
							"callbacks": 1,
							"calls": 37,
							"max_wait_seconds": 96,
							"overflowed": 2,
							"service_level": 0.84,
							"voicemails": 1
						},
						"waiting": 1
					}
				],
				"properties": {
					"agents": {
						"description": "The queue's signed-in members by status.",
						"properties": {
							"available": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"away": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"busy": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"online": {
								"description": "Members signed in, whatever their status.",
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							"wrap_up": {
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							}
						},
						"required": [
							"available",
							"busy",
							"wrap_up",
							"away",
							"online"
						],
						"type": "object"
					},
					"as_of": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"callbacks_offered": {
						"description": "Callbacks ringing this queue's agents right now.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"callers": {
						"description": "Waiting callers, longest wait first.",
						"items": {
							"properties": {
								"call_id": {
									"description": "A call ID (prefix `call_`).",
									"examples": [
										"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^call_[0-9A-Za-z]+$",
									"type": "string"
								},
								"from": {
									"description": "The caller's number.",
									"type": [
										"string",
										"null"
									]
								},
								"position": {
									"description": "Place in line, from 1.",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"state": {
									"description": "`ringing` while an agent's phone rings; `connecting` once one answered.",
									"enum": [
										"waiting",
										"ringing",
										"connecting"
									],
									"type": "string"
								},
								"waited_seconds": {
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								}
							},
							"required": [
								"call_id",
								"from",
								"position",
								"waited_seconds",
								"state"
							],
							"type": "object"
						},
						"type": "array"
					},
					"enabled": {
						"type": "boolean"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"longest_wait_seconds": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "How long the longest-waiting caller has waited (null: nobody waits)."
					},
					"members": {
						"description": "The queue's signed-in members.",
						"items": {
							"properties": {
								"call_id": {
									"anyOf": [
										{
											"description": "A call ID (prefix `call_`).",
											"examples": [
												"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^call_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"name": {
									"type": "string"
								},
								"since": {
									"description": "An ISO-8601 timestamp in UTC.",
									"examples": [
										"2026-11-03T09:14:22.000Z"
									],
									"format": "date-time",
									"type": "string"
								},
								"status": {
									"enum": [
										"available",
										"busy",
										"wrap_up",
										"away",
										"offline"
									],
									"type": "string"
								},
								"user_id": {
									"description": "A user ID (prefix `usr_`).",
									"examples": [
										"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^usr_[0-9A-Za-z]+$",
									"type": "string"
								}
							},
							"required": [
								"user_id",
								"name",
								"status",
								"since",
								"call_id"
							],
							"type": "object"
						},
						"type": "array"
					},
					"object": {
						"const": "queue_live",
						"type": "string"
					},
					"queue_id": {
						"description": "A queue ID (prefix `q_`).",
						"examples": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"today": {
						"anyOf": [
							{
								"properties": {
									"abandoned": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"answered": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"average_wait_seconds": {
										"description": "Of answered calls.",
										"type": [
											"number",
											"null"
										]
									},
									"callbacks": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"calls": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"max_wait_seconds": {
										"type": [
											"number",
											"null"
										]
									},
									"overflowed": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									"service_level": {
										"description": "Share (0–1) of answered calls answered within 20 seconds.",
										"type": [
											"number",
											"null"
										]
									},
									"voicemails": {
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									}
								},
								"required": [
									"calls",
									"answered",
									"abandoned",
									"overflowed",
									"voicemails",
									"callbacks",
									"average_wait_seconds",
									"max_wait_seconds",
									"service_level"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "Since midnight (Israel time); null when the statistics are unavailable."
					},
					"waiting": {
						"description": "Callers waiting for an agent right now.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					}
				},
				"required": [
					"object",
					"queue_id",
					"livemode",
					"enabled",
					"waiting",
					"longest_wait_seconds",
					"agents",
					"callers",
					"members",
					"callbacks_offered",
					"today",
					"as_of"
				],
				"type": "object"
			},
			"QueueOverflowedEvent": {
				"description": "A queued call overflowed to its overflow target.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "queue.overflowed"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `queue.overflowed` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"queue_id": {
										"minLength": 1,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									"target": {
										"type": "string"
									},
									"wait_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "queue.overflowed",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"QueueUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The fields to change; nested objects merge with the stored values and lists are replaced.",
				"examples": [
					{
						"enabled": false
					}
				],
				"properties": {
					"away_on_missed": {
						"type": "boolean"
					},
					"callbacks": {
						"additionalProperties": false,
						"properties": {
							"agent_id": {
								"anyOf": [
									{
										"description": "Route `agent`: the user who returns the callbacks.",
										"maxLength": 200,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "Route `assistant`: the assistant that returns the callbacks.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"priority": {
								"maximum": 10,
								"minimum": 1,
								"type": "integer"
							},
							"route": {
								"enum": [
									"agent_queue",
									"agent",
									"assistant"
								],
								"type": "string"
							},
							"voicemail_to_callback": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"copilot_profile_id": {
						"anyOf": [
							{
								"description": "A copilot profile ID (`cop_…`).",
								"maxLength": 200,
								"pattern": "^cop_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"enabled": {
						"type": "boolean"
					},
					"hold": {
						"additionalProperties": false,
						"properties": {
							"announce_position": {
								"type": "boolean"
							},
							"announcement": {
								"maxLength": 1000,
								"type": "string"
							},
							"audio": {
								"enum": [
									"music",
									"ringback",
									"silence",
									"asset"
								],
								"type": "string"
							},
							"audio_asset_id": {
								"anyOf": [
									{
										"description": "With `audio: asset`: the uploaded recording to loop.",
										"maxLength": 200,
										"pattern": "^aud_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"position_interval_seconds": {
								"maximum": 600,
								"minimum": 15,
								"type": "integer"
							}
						},
						"type": "object"
					},
					"max_wait_seconds": {
						"maximum": 3600,
						"minimum": 0,
						"type": "integer"
					},
					"member_team_ids": {
						"items": {
							"description": "A team ID (`team_…`).",
							"maxLength": 200,
							"pattern": "^team_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 200,
						"type": "array"
					},
					"member_user_ids": {
						"items": {
							"description": "A user ID (`usr_…`).",
							"maxLength": 200,
							"pattern": "^usr_[0-9A-Za-z]+$",
							"type": "string"
						},
						"maxItems": 500,
						"type": "array"
					},
					"name": {
						"maxLength": 80,
						"minLength": 1,
						"type": "string"
					},
					"overflow": {
						"additionalProperties": false,
						"description": "Fields you leave out are kept.",
						"properties": {
							"action": {
								"enum": [
									"assistant",
									"voicemail",
									"busy",
									"agent",
									"queue",
									"number"
								],
								"type": "string"
							},
							"assistant_id": {
								"anyOf": [
									{
										"description": "Action `assistant`: the AI assistant that answers.",
										"maxLength": 200,
										"pattern": "^asst_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"number": {
								"maxLength": 32,
								"type": "string"
							},
							"queue_id": {
								"anyOf": [
									{
										"description": "Action `queue`: the queue the call moves to.",
										"maxLength": 200,
										"pattern": "^q_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"user_id": {
								"anyOf": [
									{
										"description": "Action `agent`: the user who gets the call.",
										"maxLength": 200,
										"pattern": "^usr_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"when_no_agents": {
								"type": "boolean"
							}
						},
						"type": "object"
					},
					"ring_timeout_seconds": {
						"maximum": 120,
						"minimum": 5,
						"type": "integer"
					},
					"strategy": {
						"enum": [
							"longest_idle",
							"round_robin"
						],
						"type": "string"
					},
					"voice_assistant_id": {
						"anyOf": [
							{
								"description": "A assistant ID (`asst_…`).",
								"maxLength": 200,
								"pattern": "^asst_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"voicemail": {
						"additionalProperties": false,
						"properties": {
							"max_seconds": {
								"maximum": 600,
								"minimum": 10,
								"type": "integer"
							},
							"message": {
								"maxLength": 1000,
								"type": "string"
							}
						},
						"type": "object"
					},
					"wait_keys": {
						"additionalProperties": false,
						"properties": {
							"callback": {
								"pattern": "^[0-9*#]?$",
								"type": "string"
							},
							"voicemail": {
								"pattern": "^[0-9*#]?$",
								"type": "string"
							}
						},
						"type": "object"
					},
					"wrap_up_seconds": {
						"maximum": 600,
						"minimum": 0,
						"type": "integer"
					}
				},
				"type": "object"
			},
			"RecordingLink": {
				"description": "A short-lived link to a call recording.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"channels": 2,
						"content_type": "audio/ogg",
						"duration_ms": 99710,
						"expires_at": "2026-11-03T09:30:00.000Z",
						"object": "recording_link",
						"url": "https://api.morevoice.ai/v1/recordings/AQAAAAABAAAAAAAAAAAAAAAAAAABVjFTdEdYUjhfWjVq.kH2pQ7xV9rT4mW1zB6nD8f"
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"channels": {
						"description": "2: the customer on the left channel, the assistant or agent on the right.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"content_type": {
						"description": "audio/wav, audio/ogg, audio/webm or audio/mpeg.",
						"type": "string"
					},
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"expires_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"object": {
						"const": "recording_link",
						"type": "string"
					},
					"url": {
						"description": "A signed URL that streams the audio without an API key. It expires (expires_at).",
						"type": "string"
					}
				},
				"required": [
					"object",
					"call_id",
					"url",
					"expires_at",
					"content_type",
					"duration_ms",
					"channels"
				],
				"type": "object"
			},
			"RecordingReadyEvent": {
				"description": "The call recording is stored (a recording is addressed through its call). `url` is a signed URL that expires at `url_expires_at`.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "recording.ready"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `recording.ready` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"channels": {
										"exclusiveMinimum": 0,
										"maximum": 9007199254740991,
										"type": "integer"
									},
									"duration_ms": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									},
									"url": {
										"type": "string"
									},
									"url_expires_at": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "recording.ready",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"Report": {
				"description": "A scheduled report: what it shows, for which period, when and to whom it is emailed.",
				"examples": [
					{
						"cadence": {
							"day_of_month": null,
							"days": [],
							"frequency": "daily",
							"time": "08:00",
							"timezone": "Asia/Jerusalem"
						},
						"created": "2026-11-03T09:14:22.000Z",
						"enabled": true,
						"filters": {
							"agent_ids": [],
							"assistant_ids": [],
							"campaign_ids": [],
							"flow_ids": [],
							"queue_ids": [],
							"team_ids": []
						},
						"formats": {
							"csv": false,
							"email": true,
							"pdf": true
						},
						"id": "rpt_2dXk9QmZ4rTv",
						"language": "he",
						"last_run": null,
						"last_run_at": null,
						"livemode": true,
						"name": "Daily contact-centre summary",
						"next_run_at": "2026-11-04T06:00:00.000Z",
						"object": "report",
						"owner_id": null,
						"period": "yesterday",
						"recipients": [
							{
								"type": "email",
								"value": "ops@example.com"
							}
						],
						"updated": "2026-11-03T09:14:22.000Z",
						"widgets": [
							{
								"key": "w1",
								"params": {
									"limit": null,
									"sla_sec": null
								},
								"title": null,
								"type": "kpis"
							},
							{
								"key": "w2",
								"params": {
									"limit": null,
									"sla_sec": 20
								},
								"title": null,
								"type": "queues"
							}
						]
					}
				],
				"properties": {
					"cadence": {
						"properties": {
							"day_of_month": {
								"anyOf": [
									{
										"maximum": 9007199254740991,
										"minimum": -9007199254740991,
										"type": "integer"
									},
									{
										"type": "null"
									}
								],
								"description": "monthly: 1–31 (a shorter month sends on its last day), or -1 for the last day."
							},
							"days": {
								"description": "weekly: the weekdays it is sent on.",
								"items": {
									"enum": [
										"sun",
										"mon",
										"tue",
										"wed",
										"thu",
										"fri",
										"sat"
									],
									"type": "string"
								},
								"type": "array"
							},
							"frequency": {
								"enum": [
									"daily",
									"weekly",
									"monthly"
								],
								"type": "string"
							},
							"time": {
								"description": "Local send time, HH:MM (24-hour).",
								"type": "string"
							},
							"timezone": {
								"description": "IANA time zone of `time` and of the period.",
								"type": "string"
							}
						},
						"required": [
							"frequency",
							"time",
							"days",
							"day_of_month",
							"timezone"
						],
						"type": "object"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"enabled": {
						"description": "Disabled reports are not sent on their schedule (they can still be sent now).",
						"type": "boolean"
					},
					"filters": {
						"properties": {
							"agent_ids": {
								"description": "Only these (agents); empty: all.",
								"items": {
									"description": "A user ID (prefix `usr_`).",
									"examples": [
										"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^usr_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							},
							"assistant_ids": {
								"description": "Only these (assistants); empty: all.",
								"items": {
									"description": "A assistant ID (prefix `asst_`).",
									"examples": [
										"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^asst_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							},
							"campaign_ids": {
								"description": "Only these (campaigns); empty: all.",
								"items": {
									"description": "A campaign ID (prefix `cmp_`).",
									"examples": [
										"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^cmp_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							},
							"flow_ids": {
								"description": "Only these (flows); empty: all.",
								"items": {
									"description": "A flow ID (prefix `flow_`).",
									"examples": [
										"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^flow_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							},
							"queue_ids": {
								"description": "Only these (queues); empty: all.",
								"items": {
									"description": "A queue ID (prefix `q_`).",
									"examples": [
										"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^q_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							},
							"team_ids": {
								"description": "Only these (teams); empty: all.",
								"items": {
									"description": "A team ID (prefix `team_`).",
									"examples": [
										"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
									],
									"pattern": "^team_[0-9A-Za-z]+$",
									"type": "string"
								},
								"type": "array"
							}
						},
						"required": [
							"queue_ids",
							"assistant_ids",
							"campaign_ids",
							"agent_ids",
							"team_ids",
							"flow_ids"
						],
						"type": "object"
					},
					"formats": {
						"properties": {
							"csv": {
								"description": "A CSV attachment.",
								"type": "boolean"
							},
							"email": {
								"description": "The report in the email body (charts inline).",
								"type": "boolean"
							},
							"pdf": {
								"description": "A PDF attachment.",
								"type": "boolean"
							}
						},
						"required": [
							"email",
							"pdf",
							"csv"
						],
						"type": "object"
					},
					"id": {
						"description": "A report ID (prefix `rpt_`).",
						"examples": [
							"rpt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rpt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"language": {
						"enum": [
							"he",
							"en"
						],
						"type": "string"
					},
					"last_run": {
						"anyOf": [
							{
								"properties": {
									"error": {
										"type": [
											"string",
											"null"
										]
									},
									"id": {
										"description": "A report run ID (prefix `rptrun_`).",
										"examples": [
											"rptrun_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^rptrun_[0-9A-Za-z]+$",
										"type": "string"
									},
									"started_at": {
										"description": "An ISO-8601 timestamp in UTC.",
										"examples": [
											"2026-11-03T09:14:22.000Z"
										],
										"format": "date-time",
										"type": "string"
									},
									"status": {
										"type": "string"
									},
									"trigger": {
										"type": "string"
									}
								},
								"required": [
									"id",
									"status",
									"trigger",
									"started_at",
									"error"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The latest run (list responses only; null on others)."
					},
					"last_run_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"next_run_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"object": {
						"const": "report",
						"type": "string"
					},
					"owner_id": {
						"anyOf": [
							{
								"description": "The member who created it, or null (created through the API).",
								"examples": [
									"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^usr_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"period": {
						"description": "The window each report covers, in its time zone: `today`, `yesterday`, `last7`, `last30`, `thisWeek`, `lastWeek`, `thisMonth` or `lastMonth`.",
						"enum": [
							"today",
							"yesterday",
							"last7",
							"last30",
							"thisWeek",
							"lastWeek",
							"thisMonth",
							"lastMonth"
						],
						"type": "string"
					},
					"recipients": {
						"items": {
							"properties": {
								"type": {
									"enum": [
										"user",
										"team",
										"email"
									],
									"type": "string"
								},
								"value": {
									"description": "A member's user ID (`usr_…`), a team ID (`team_…`) or an email address. Members and teams resolve to the organisation's active members' addresses at send time.",
									"type": "string"
								}
							},
							"required": [
								"type",
								"value"
							],
							"type": "object"
						},
						"type": "array"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"widgets": {
						"items": {
							"properties": {
								"key": {
									"description": "Your key for the widget (unique in the report).",
									"maxLength": 40,
									"minLength": 1,
									"type": "string"
								},
								"params": {
									"description": "`limit`: rows of top-N tables; `sla_sec`: the queue answer target.",
									"properties": {
										"limit": {
											"anyOf": [
												{
													"maximum": 50,
													"minimum": 1,
													"type": "integer"
												},
												{
													"type": "null"
												}
											]
										},
										"sla_sec": {
											"anyOf": [
												{
													"maximum": 600,
													"minimum": 5,
													"type": "integer"
												},
												{
													"type": "null"
												}
											]
										}
									},
									"required": [
										"limit",
										"sla_sec"
									],
									"type": "object"
								},
								"title": {
									"anyOf": [
										{
											"maxLength": 120,
											"type": "string"
										},
										{
											"type": "null"
										}
									],
									"description": "A custom title; null: the catalogue's title in the report's language."
								},
								"type": {
									"description": "The widget (GET /v1/reports/catalog lists them).",
									"enum": [
										"kpis",
										"volume",
										"queues",
										"agents",
										"ai",
										"cost",
										"campaigns",
										"qa",
										"ivr",
										"callbacks",
										"dnc"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"type",
								"title",
								"params"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"name",
					"enabled",
					"widgets",
					"period",
					"filters",
					"cadence",
					"recipients",
					"formats",
					"language",
					"owner_id",
					"next_run_at",
					"last_run_at",
					"last_run",
					"created",
					"updated"
				],
				"type": "object"
			},
			"ReportCatalog": {
				"description": "The widgets a report can show (in the requested language), the periods and the cadences.",
				"examples": [
					{
						"frequencies": [
							"daily",
							"weekly",
							"monthly"
						],
						"object": "report_catalog",
						"periods": [
							"today",
							"yesterday",
							"last7",
							"last30",
							"thisWeek",
							"lastWeek",
							"thisMonth",
							"lastMonth"
						],
						"widgets": [
							{
								"description": "Calls, answer rate, handle time and direction at a glance.",
								"filters": [
									"assistant_ids",
									"campaign_ids",
									"agent_ids",
									"team_ids"
								],
								"name": "Call overview",
								"type": "kpis"
							}
						]
					}
				],
				"properties": {
					"frequencies": {
						"items": {
							"enum": [
								"daily",
								"weekly",
								"monthly"
							],
							"type": "string"
						},
						"type": "array"
					},
					"object": {
						"const": "report_catalog",
						"type": "string"
					},
					"periods": {
						"items": {
							"enum": [
								"today",
								"yesterday",
								"last7",
								"last30",
								"thisWeek",
								"lastWeek",
								"thisMonth",
								"lastMonth"
							],
							"type": "string"
						},
						"type": "array"
					},
					"widgets": {
						"items": {
							"properties": {
								"description": {
									"type": "string"
								},
								"filters": {
									"description": "The filters this widget honours.",
									"items": {
										"enum": [
											"queue_ids",
											"assistant_ids",
											"campaign_ids",
											"agent_ids",
											"team_ids",
											"flow_ids"
										],
										"type": "string"
									},
									"type": "array"
								},
								"name": {
									"type": "string"
								},
								"type": {
									"enum": [
										"kpis",
										"volume",
										"queues",
										"agents",
										"ai",
										"cost",
										"campaigns",
										"qa",
										"ivr",
										"callbacks",
										"dnc"
									],
									"type": "string"
								}
							},
							"required": [
								"type",
								"name",
								"description",
								"filters"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"widgets",
					"periods",
					"frequencies"
				],
				"type": "object"
			},
			"ReportList": {
				"description": "A page of the organisation's reports, newest first.",
				"examples": [
					{
						"data": [
							{
								"cadence": {
									"day_of_month": null,
									"days": [],
									"frequency": "daily",
									"time": "08:00",
									"timezone": "Asia/Jerusalem"
								},
								"created": "2026-11-03T09:14:22.000Z",
								"enabled": true,
								"filters": {
									"agent_ids": [],
									"assistant_ids": [],
									"campaign_ids": [],
									"flow_ids": [],
									"queue_ids": [],
									"team_ids": []
								},
								"formats": {
									"csv": false,
									"email": true,
									"pdf": true
								},
								"id": "rpt_2dXk9QmZ4rTv",
								"language": "he",
								"last_run": null,
								"last_run_at": null,
								"livemode": true,
								"name": "Daily contact-centre summary",
								"next_run_at": "2026-11-04T06:00:00.000Z",
								"object": "report",
								"owner_id": null,
								"period": "yesterday",
								"recipients": [
									{
										"type": "email",
										"value": "ops@example.com"
									}
								],
								"updated": "2026-11-03T09:14:22.000Z",
								"widgets": [
									{
										"key": "w1",
										"params": {
											"limit": null,
											"sla_sec": null
										},
										"title": null,
										"type": "kpis"
									},
									{
										"key": "w2",
										"params": {
											"limit": null,
											"sla_sec": 20
										},
										"title": null,
										"type": "queues"
									}
								]
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/reports"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Report"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ReportPreview": {
				"description": "A report's data computed now, as it would be sent.",
				"examples": [
					{
						"generated_at": "2026-11-04T09:00:00.000Z",
						"livemode": true,
						"object": "report_preview",
						"period": {
							"from": "2026-10-27T22:00:00.000Z",
							"label": "last7",
							"timezone": "Asia/Jerusalem",
							"to": "2026-11-03T22:00:00.000Z"
						},
						"upcoming_runs": [],
						"widgets": [
							{
								"chart": null,
								"empty": false,
								"error": null,
								"key": "w1",
								"kpis": [
									{
										"currency": null,
										"delta": 0.08,
										"format": "int",
										"key": "reports.k.calls",
										"label": "Calls",
										"up_is_good": true,
										"value": 1240
									}
								],
								"note": null,
								"table": null,
								"title": "Call overview",
								"type": "kpis"
							}
						]
					}
				],
				"properties": {
					"generated_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "report_preview",
						"type": "string"
					},
					"period": {
						"properties": {
							"from": {
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							"label": {
								"enum": [
									"today",
									"yesterday",
									"last7",
									"last30",
									"thisWeek",
									"lastWeek",
									"thisMonth",
									"lastMonth"
								],
								"type": "string"
							},
							"timezone": {
								"type": "string"
							},
							"to": {
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							}
						},
						"required": [
							"label",
							"from",
							"to",
							"timezone"
						],
						"type": "object"
					},
					"upcoming_runs": {
						"description": "The next three send times of `cadence`, when one was sent.",
						"items": {
							"description": "An ISO-8601 timestamp in UTC.",
							"examples": [
								"2026-11-03T09:14:22.000Z"
							],
							"format": "date-time",
							"type": "string"
						},
						"type": "array"
					},
					"widgets": {
						"items": {
							"properties": {
								"chart": {
									"anyOf": [
										{
											"properties": {
												"categories": {
													"items": {
														"type": "string"
													},
													"type": "array"
												},
												"category_format": {
													"type": [
														"string",
														"null"
													]
												},
												"currency": {
													"type": [
														"string",
														"null"
													]
												},
												"format": {
													"type": "string"
												},
												"kind": {
													"type": "string"
												},
												"line": {
													"anyOf": [
														{
															"properties": {
																"label": {
																	"type": "string"
																},
																"values": {
																	"items": {
																		"type": [
																			"number",
																			"null"
																		]
																	},
																	"type": "array"
																}
															},
															"required": [
																"label",
																"values"
															],
															"type": "object"
														},
														{
															"type": "null"
														}
													]
												},
												"series": {
													"items": {
														"properties": {
															"label": {
																"type": "string"
															},
															"values": {
																"items": {
																	"type": "number"
																},
																"type": "array"
															}
														},
														"required": [
															"label",
															"values"
														],
														"type": "object"
													},
													"type": "array"
												}
											},
											"required": [
												"kind",
												"categories",
												"category_format",
												"format",
												"currency",
												"series",
												"line"
											],
											"type": "object"
										},
										{
											"type": "null"
										}
									]
								},
								"empty": {
									"description": "No data in the period.",
									"type": "boolean"
								},
								"error": {
									"description": "The widget could not be computed (the others still are).",
									"type": [
										"string",
										"null"
									]
								},
								"key": {
									"description": "The widget's key.",
									"type": "string"
								},
								"kpis": {
									"items": {
										"properties": {
											"currency": {
												"type": [
													"string",
													"null"
												]
											},
											"delta": {
												"description": "Change against the previous period of the same length (0.12 = +12 %).",
												"type": [
													"number",
													"null"
												]
											},
											"format": {
												"description": "int, pct (0–1), dur (seconds), money (minor units), num, text or date.",
												"type": "string"
											},
											"key": {
												"description": "A stable label key.",
												"type": "string"
											},
											"label": {
												"type": "string"
											},
											"up_is_good": {
												"type": [
													"boolean",
													"null"
												]
											},
											"value": {
												"type": [
													"number",
													"null"
												]
											}
										},
										"required": [
											"key",
											"label",
											"value",
											"format",
											"delta",
											"up_is_good",
											"currency"
										],
										"type": "object"
									},
									"type": "array"
								},
								"note": {
									"type": [
										"string",
										"null"
									]
								},
								"table": {
									"anyOf": [
										{
											"properties": {
												"columns": {
													"items": {
														"properties": {
															"currency": {
																"type": [
																	"string",
																	"null"
																]
															},
															"format": {
																"type": "string"
															},
															"key": {
																"type": "string"
															},
															"label": {
																"type": "string"
															}
														},
														"required": [
															"key",
															"label",
															"format",
															"currency"
														],
														"type": "object"
													},
													"type": "array"
												},
												"rows": {
													"items": {
														"additionalProperties": {
															"type": [
																"string",
																"number",
																"null"
															]
														},
														"propertyNames": {
															"type": "string"
														},
														"type": "object"
													},
													"type": "array"
												}
											},
											"required": [
												"columns",
												"rows"
											],
											"type": "object"
										},
										{
											"type": "null"
										}
									]
								},
								"title": {
									"type": "string"
								},
								"type": {
									"enum": [
										"kpis",
										"volume",
										"queues",
										"agents",
										"ai",
										"cost",
										"campaigns",
										"qa",
										"ivr",
										"callbacks",
										"dnc"
									],
									"type": "string"
								}
							},
							"required": [
								"key",
								"type",
								"title",
								"kpis",
								"chart",
								"table",
								"empty",
								"note",
								"error"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"livemode",
					"period",
					"generated_at",
					"widgets",
					"upcoming_runs"
				],
				"type": "object"
			},
			"ReportRun": {
				"description": "One send of a report: when, to whom, and what happened.",
				"examples": [
					{
						"artifacts": {
							"csv": false,
							"pdf": true
						},
						"deliveries": [
							{
								"email": "ops@example.com",
								"error": null,
								"status": "sent"
							}
						],
						"error": null,
						"finished_at": "2026-11-04T06:00:09.000Z",
						"id": "rptrun_2nH8kQ1",
						"livemode": true,
						"object": "report_run",
						"period_from": "2026-11-02T22:00:00.000Z",
						"period_to": "2026-11-03T22:00:00.000Z",
						"recipients": [
							"ops@example.com"
						],
						"report_id": "rpt_2dXk9QmZ4rTv",
						"started_at": "2026-11-04T06:00:01.000Z",
						"status": "sent",
						"trigger": "manual"
					}
				],
				"properties": {
					"artifacts": {
						"description": "Stored files you can download (GET /v1/report_runs/{id}/pdf|csv).",
						"properties": {
							"csv": {
								"type": "boolean"
							},
							"pdf": {
								"type": "boolean"
							}
						},
						"required": [
							"pdf",
							"csv"
						],
						"type": "object"
					},
					"deliveries": {
						"items": {
							"properties": {
								"email": {
									"type": "string"
								},
								"error": {
									"type": [
										"string",
										"null"
									]
								},
								"status": {
									"type": "string"
								}
							},
							"required": [
								"email",
								"status",
								"error"
							],
							"type": "object"
						},
						"type": "array"
					},
					"error": {
						"type": [
							"string",
							"null"
						]
					},
					"finished_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"id": {
						"description": "A report run ID (prefix `rptrun_`).",
						"examples": [
							"rptrun_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rptrun_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "report_run",
						"type": "string"
					},
					"period_from": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"period_to": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"recipients": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"report_id": {
						"description": "A report ID (prefix `rpt_`).",
						"examples": [
							"rpt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rpt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"started_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"status": {
						"description": "`running`, `sent`, `partial` (some recipients or the PDF failed) or `failed`.",
						"type": "string"
					},
					"trigger": {
						"description": "`scheduled`, `manual` (sent now) or `test`.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"livemode",
					"report_id",
					"trigger",
					"status",
					"period_from",
					"period_to",
					"recipients",
					"deliveries",
					"artifacts",
					"error",
					"started_at",
					"finished_at"
				],
				"type": "object"
			},
			"ReportRunList": {
				"description": "A report's runs, newest first (the last 100).",
				"examples": [
					{
						"data": [
							{
								"artifacts": {
									"csv": false,
									"pdf": true
								},
								"deliveries": [
									{
										"email": "ops@example.com",
										"error": null,
										"status": "sent"
									}
								],
								"error": null,
								"finished_at": "2026-11-04T06:00:09.000Z",
								"id": "rptrun_2nH8kQ1",
								"livemode": true,
								"object": "report_run",
								"period_from": "2026-11-02T22:00:00.000Z",
								"period_to": "2026-11-03T22:00:00.000Z",
								"recipients": [
									"ops@example.com"
								],
								"report_id": "rpt_2dXk9QmZ4rTv",
								"started_at": "2026-11-04T06:00:01.000Z",
								"status": "sent",
								"trigger": "manual"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/reports/rpt_2dXk9QmZ4rTv/runs"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/ReportRun"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"ReportSendParamsInput": {
				"additionalProperties": false,
				"description": "No parameters.",
				"examples": [
					{}
				],
				"properties": {},
				"type": "object"
			},
			"RequestLog": {
				"description": "One /v1 request your organisation made, as it was logged (redacted). Kept 30 days (test mode: 7).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.135Z",
						"error_code": "parameter_invalid",
						"id": "rlog_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"idempotency_key": "8e0f3a2c-5d1b-4c7e-9f6a-2b4d8c1e7a90",
						"ip": "203.0.113.7",
						"key_id": "key_3fT9kq2ZpLr8YwVbN1cX0a",
						"latency_ms": 42,
						"livemode": false,
						"method": "POST",
						"object": "request_log",
						"operation_id": "calls_create",
						"path": "/v1/calls",
						"query": null,
						"request_body": {
							"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
							"to": "+97250000000"
						},
						"request_id": "req_7Pq2Rk9sT1uV3wX5yZ8aBc",
						"response_body": {
							"error": {
								"code": "parameter_invalid",
								"message": "to must be an E.164 number",
								"param": "to",
								"type": "invalid_request_error"
							}
						},
						"route": "/v1/calls",
						"status": 400,
						"user_agent": "morevoice-node/0.4.0"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the response was rendered in.",
						"type": [
							"string",
							"null"
						]
					},
					"created": {
						"description": "When the request arrived.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"error_code": {
						"description": "The error code (`error.code`) of an error response.",
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "A request log ID (prefix `rlog_`).",
						"examples": [
							"rlog_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^rlog_[0-9A-Za-z]+$",
						"type": "string"
					},
					"idempotency_key": {
						"type": [
							"string",
							"null"
						]
					},
					"ip": {
						"type": [
							"string",
							"null"
						]
					},
					"key_id": {
						"anyOf": [
							{
								"description": "A api key ID (prefix `key_`).",
								"examples": [
									"key_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^key_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "The API key that made the request."
					},
					"latency_ms": {
						"description": "Time to answer, in milliseconds (streams: how long they stayed open).",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"method": {
						"type": "string"
					},
					"object": {
						"const": "request_log",
						"type": "string"
					},
					"operation_id": {
						"description": "The OpenAPI operationId of the route, e.g. `calls_create`.",
						"type": [
							"string",
							"null"
						]
					},
					"path": {
						"description": "The path without the query string.",
						"type": "string"
					},
					"query": {
						"anyOf": [
							{
								"additionalProperties": {},
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "The query string as an object (redacted), or null."
					},
					"request_body": {
						"description": "The request body, redacted (secrets, tokens, passwords and header values masked) and cut to 8 KB; null when there was none."
					},
					"request_id": {
						"description": "The request's X-Request-Id (`req_…`), as error bodies and the X-Request-Id header show it.",
						"type": "string"
					},
					"response_body": {
						"description": "The response body of errors and POSTs, redacted and cut to 8 KB; null otherwise."
					},
					"route": {
						"description": "The matched route template, e.g. `/v1/calls/:id` (null when no route matched).",
						"type": [
							"string",
							"null"
						]
					},
					"status": {
						"description": "The HTTP status of the response.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"user_agent": {
						"type": [
							"string",
							"null"
						]
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"request_id",
					"created",
					"method",
					"path",
					"query",
					"route",
					"operation_id",
					"api_version",
					"status",
					"error_code",
					"latency_ms",
					"key_id",
					"ip",
					"user_agent",
					"idempotency_key",
					"request_body",
					"response_body"
				],
				"type": "object"
			},
			"RequestLogList": {
				"description": "A page of request logs, newest first.",
				"examples": [
					{
						"data": [
							{
								"api_version": "2026-11-01",
								"created": "2026-11-03T09:14:22.135Z",
								"error_code": "parameter_invalid",
								"id": "rlog_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"idempotency_key": "8e0f3a2c-5d1b-4c7e-9f6a-2b4d8c1e7a90",
								"ip": "203.0.113.7",
								"key_id": "key_3fT9kq2ZpLr8YwVbN1cX0a",
								"latency_ms": 42,
								"livemode": false,
								"method": "POST",
								"object": "request_log",
								"operation_id": "calls_create",
								"path": "/v1/calls",
								"query": null,
								"request_body": {
									"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
									"to": "+97250000000"
								},
								"request_id": "req_7Pq2Rk9sT1uV3wX5yZ8aBc",
								"response_body": {
									"error": {
										"code": "parameter_invalid",
										"message": "to must be an E.164 number",
										"param": "to",
										"type": "invalid_request_error"
									}
								},
								"route": "/v1/calls",
								"status": 400,
								"user_agent": "morevoice-node/0.4.0"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/request_logs"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/RequestLog"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"RouteTarget": {
				"description": "Where a matching call goes.",
				"examples": [
					{
						"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"type": "queue"
					}
				],
				"properties": {
					"assistant_id": {
						"description": "With `type: assistant`.",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"conference_room_id": {
						"description": "With `type: conference_room`.",
						"examples": [
							"room_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"flow_id": {
						"description": "With `type: flow`.",
						"examples": [
							"flow_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"queue_id": {
						"description": "With `type: queue`.",
						"examples": [
							"q_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"type": {
						"description": "What answers: `assistant` — an AI assistant answers; `flow` — a published voice flow (IVR) runs; `queue` — the call waits in a queue for a human agent; `user` — one person's direct line (their forwarding rules apply); `conference_room` — a conference room (PIN prompt, then join). The ID goes in the field `<type>_id`.",
						"enum": [
							"assistant",
							"flow",
							"queue",
							"user",
							"conference_room"
						],
						"type": "string"
					},
					"user_id": {
						"description": "With `type: user`.",
						"examples": [
							"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^usr_[0-9A-Za-z]+$",
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"RouteTargetParamsInput": {
				"additionalProperties": false,
				"description": "Where a matching call goes: `type`, and the ID in `<type>_id`.",
				"examples": [
					{
						"queue_id": "q_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"type": "queue"
					}
				],
				"properties": {
					"assistant_id": {
						"description": "With `type: assistant`.",
						"maxLength": 200,
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"conference_room_id": {
						"description": "With `type: conference_room`.",
						"maxLength": 200,
						"pattern": "^room_[0-9A-Za-z]+$",
						"type": "string"
					},
					"flow_id": {
						"description": "With `type: flow` (a published voice flow).",
						"maxLength": 200,
						"pattern": "^flow_[0-9A-Za-z]+$",
						"type": "string"
					},
					"queue_id": {
						"description": "With `type: queue`.",
						"maxLength": 200,
						"pattern": "^q_[0-9A-Za-z]+$",
						"type": "string"
					},
					"type": {
						"description": "What answers: `assistant` — an AI assistant answers; `flow` — a published voice flow (IVR) runs; `queue` — the call waits in a queue for a human agent; `user` — one person's direct line (their forwarding rules apply); `conference_room` — a conference room (PIN prompt, then join). The ID goes in the field `<type>_id`.",
						"enum": [
							"assistant",
							"flow",
							"queue",
							"user",
							"conference_room"
						],
						"type": "string"
					},
					"user_id": {
						"description": "With `type: user`.",
						"maxLength": 200,
						"pattern": "^usr_[0-9A-Za-z]+$",
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"Scorecard": {
				"description": "A call's post-call QA scorecard: the rubric's items scored with verified evidence, compliance, disposition and coaching.",
				"examples": [
					{
						"call_id": "call_5Fh7Jk9Lm1Np3Qr5St7Vx9",
						"coaching": [
							{
								"better": "Who else decides on this?",
								"tip": "Confirm the budget owner"
							}
						],
						"compliance": {
							"issues": [],
							"verdict": "pass"
						},
						"copilot_profile_id": null,
						"created": "2026-11-03T09:16:40.000Z",
						"critical_failed": [],
						"customer_sentiment": "positive",
						"disposition": "appointment",
						"error": null,
						"id": "qa_5Fh7Jk9Lm1Np3Qr5St7Vx9",
						"items": [
							{
								"critical": false,
								"evidence": [
									{
										"line": 7,
										"offset_ms": 41200,
										"quote": "What do you pay today?",
										"speaker": "agent"
									}
								],
								"key": "discovery",
								"label": "Discovery",
								"model_score": 3,
								"override": {
									"at": "2026-11-03T10:02:00.000Z",
									"by": "Dana Levi",
									"note": "Also asked about the decision maker.",
									"score": 4
								},
								"reasoning": "Asked about the current provider and the budget before the offer.",
								"score": 4,
								"weight": 40
							}
						],
						"livemode": true,
						"model": "gpt-4.1",
						"model_score": 77.5,
						"next_steps": [
							"Send the demo invite"
						],
						"object": "scorecard",
						"objections": [
							{
								"agent_response": "Compared it with today's costs.",
								"handled": true,
								"text": "It sounds expensive"
							}
						],
						"pass_threshold": 70,
						"passed": true,
						"rubric_source": "default",
						"score": 82.5,
						"status": "done",
						"strengths": [
							"Clear opening"
						],
						"summary": "The customer agreed to a demo on Monday.",
						"updated": "2026-11-03T10:02:00.000Z"
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"coaching": {
						"items": {
							"properties": {
								"better": {
									"description": "What to say instead.",
									"type": "string"
								},
								"tip": {
									"type": "string"
								}
							},
							"required": [
								"tip",
								"better"
							],
							"type": "object"
						},
						"type": "array"
					},
					"compliance": {
						"anyOf": [
							{
								"properties": {
									"issues": {
										"items": {
											"properties": {
												"detail": {
													"type": "string"
												},
												"evidence": {
													"items": {
														"properties": {
															"line": {
																"description": "The transcript line (1-based).",
																"maximum": 9007199254740991,
																"minimum": -9007199254740991,
																"type": "integer"
															},
															"offset_ms": {
																"anyOf": [
																	{
																		"maximum": 9007199254740991,
																		"minimum": -9007199254740991,
																		"type": "integer"
																	},
																	{
																		"type": "null"
																	}
																],
																"description": "Milliseconds into the call (seek the recording here)."
															},
															"quote": {
																"type": "string"
															},
															"speaker": {
																"enum": [
																	"customer",
																	"agent",
																	"supervisor",
																	"other"
																],
																"type": "string"
															}
														},
														"required": [
															"quote",
															"speaker",
															"line",
															"offset_ms"
														],
														"type": "object"
													},
													"type": "array"
												},
												"rule": {
													"type": "string"
												},
												"severity": {
													"enum": [
														"low",
														"med",
														"high"
													],
													"type": "string"
												}
											},
											"required": [
												"rule",
												"detail",
												"severity",
												"evidence"
											],
											"type": "object"
										},
										"type": "array"
									},
									"verdict": {
										"enum": [
											"pass",
											"warn",
											"fail"
										],
										"type": "string"
									}
								},
								"required": [
									"verdict",
									"issues"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						]
					},
					"copilot_profile_id": {
						"anyOf": [
							{
								"description": "A copilot profile ID (prefix `cop_`).",
								"examples": [
									"cop_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cop_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"critical_failed": {
						"description": "Keys of the critical items that failed the call.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"customer_sentiment": {
						"anyOf": [
							{
								"enum": [
									"positive",
									"neutral",
									"negative",
									"mixed"
								],
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"disposition": {
						"anyOf": [
							{
								"enum": [
									"sale",
									"appointment",
									"callback_scheduled",
									"follow_up",
									"resolved",
									"unresolved",
									"not_interested",
									"escalated",
									"wrong_number",
									"no_conversation",
									"other"
								],
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"error": {
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "The scorecard's ID (one per call).",
						"examples": [
							"qa_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^qa_[0-9A-Za-z]+$",
						"type": "string"
					},
					"items": {
						"description": "One per rubric item.",
						"items": {
							"properties": {
								"critical": {
									"type": "boolean"
								},
								"evidence": {
									"description": "Quotes the score rests on, each verified against the transcript.",
									"items": {
										"properties": {
											"line": {
												"description": "The transcript line (1-based).",
												"maximum": 9007199254740991,
												"minimum": -9007199254740991,
												"type": "integer"
											},
											"offset_ms": {
												"anyOf": [
													{
														"maximum": 9007199254740991,
														"minimum": -9007199254740991,
														"type": "integer"
													},
													{
														"type": "null"
													}
												],
												"description": "Milliseconds into the call (seek the recording here)."
											},
											"quote": {
												"type": "string"
											},
											"speaker": {
												"enum": [
													"customer",
													"agent",
													"supervisor",
													"other"
												],
												"type": "string"
											}
										},
										"required": [
											"quote",
											"speaker",
											"line",
											"offset_ms"
										],
										"type": "object"
									},
									"type": "array"
								},
								"key": {
									"description": "The rubric item's key.",
									"type": "string"
								},
								"label": {
									"type": "string"
								},
								"model_score": {
									"description": "0–5 as the model scored it.",
									"type": [
										"number",
										"null"
									]
								},
								"override": {
									"anyOf": [
										{
											"properties": {
												"at": {
													"anyOf": [
														{
															"description": "An ISO-8601 timestamp in UTC.",
															"examples": [
																"2026-11-03T09:14:22.000Z"
															],
															"format": "date-time",
															"type": "string"
														},
														{
															"type": "null"
														}
													]
												},
												"by": {
													"type": [
														"string",
														"null"
													]
												},
												"note": {
													"type": [
														"string",
														"null"
													]
												},
												"score": {
													"type": [
														"number",
														"null"
													]
												}
											},
											"required": [
												"score",
												"note",
												"by",
												"at"
											],
											"type": "object"
										},
										{
											"type": "null"
										}
									],
									"description": "A supervisor's (or API key's) override."
								},
								"reasoning": {
									"type": "string"
								},
								"score": {
									"description": "0–5 (null: not applicable), after any override.",
									"type": [
										"number",
										"null"
									]
								},
								"weight": {
									"description": "Relative importance on the 0–100 scale.",
									"type": "number"
								}
							},
							"required": [
								"key",
								"label",
								"weight",
								"critical",
								"score",
								"model_score",
								"reasoning",
								"evidence",
								"override"
							],
							"type": "object"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"model": {
						"type": [
							"string",
							"null"
						]
					},
					"model_score": {
						"description": "0–100 as the model scored it.",
						"type": [
							"number",
							"null"
						]
					},
					"next_steps": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"object": {
						"const": "scorecard",
						"type": "string"
					},
					"objections": {
						"items": {
							"properties": {
								"agent_response": {
									"type": "string"
								},
								"handled": {
									"type": "boolean"
								},
								"text": {
									"type": "string"
								}
							},
							"required": [
								"text",
								"handled",
								"agent_response"
							],
							"type": "object"
						},
						"type": "array"
					},
					"pass_threshold": {
						"type": [
							"number",
							"null"
						]
					},
					"passed": {
						"type": [
							"boolean",
							"null"
						]
					},
					"rubric_source": {
						"anyOf": [
							{
								"enum": [
									"default",
									"copilot_profile"
								],
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Scored against the organisation's rubric, or the call's copilot profile's."
					},
					"score": {
						"description": "0–100 after supervisor overrides (null: nothing applicable).",
						"type": [
							"number",
							"null"
						]
					},
					"status": {
						"description": "`skipped`: too short to score (`error` says why); `error`: scoring failed.",
						"enum": [
							"pending",
							"running",
							"done",
							"error",
							"skipped"
						],
						"type": "string"
					},
					"strengths": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"summary": {
						"type": [
							"string",
							"null"
						]
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"call_id",
					"status",
					"error",
					"score",
					"model_score",
					"passed",
					"critical_failed",
					"rubric_source",
					"copilot_profile_id",
					"pass_threshold",
					"items",
					"compliance",
					"disposition",
					"summary",
					"customer_sentiment",
					"strengths",
					"coaching",
					"next_steps",
					"objections",
					"model",
					"created",
					"updated"
				],
				"type": "object"
			},
			"ScorecardItemOverrideParamsInput": {
				"additionalProperties": false,
				"description": "A supervisor override of one item's score. The call's score is recomputed.",
				"examples": [
					{
						"note": "Also asked about the decision maker.",
						"score": 4
					}
				],
				"properties": {
					"clear": {
						"description": "true: remove the override (the model's score applies again).",
						"type": "boolean"
					},
					"note": {
						"description": "Why (shown in the scorecard's history).",
						"maxLength": 500,
						"type": "string"
					},
					"score": {
						"anyOf": [
							{
								"maximum": 5,
								"minimum": 0,
								"type": "number"
							},
							{
								"type": "null"
							}
						],
						"description": "The item's score, 0–5 (half points round), or null for not applicable."
					}
				},
				"type": "object"
			},
			"ScorecardRunParamsInput": {
				"additionalProperties": false,
				"description": "Options for scoring.",
				"examples": [
					{
						"force": false
					}
				],
				"properties": {
					"force": {
						"default": false,
						"description": "Score again even when the call already has a finished scorecard (default false: it is returned as it is).",
						"type": "boolean"
					}
				},
				"type": "object"
			},
			"Secret": {
				"description": "A stored secret. The value is write-only: no endpoint ever returns it.",
				"examples": [
					{
						"livemode": true,
						"name": "CRM_TOKEN",
						"object": "secret",
						"updated": "2026-11-03T09:14:22.000Z"
					}
				],
				"properties": {
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"description": "Referenced as {{secret.NAME}} in flow API nodes and messaging settings.",
						"type": "string"
					},
					"object": {
						"const": "secret",
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"name",
					"updated"
				],
				"type": "object"
			},
			"SecretList": {
				"description": "The organisation's secrets, by name (values are never returned).",
				"examples": [
					{
						"data": [
							{
								"livemode": true,
								"name": "CRM_TOKEN",
								"object": "secret",
								"updated": "2026-11-03T09:14:22.000Z"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/secrets"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Secret"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"Team": {
				"description": "A team of users (queues and reports can address a whole team).",
				"examples": [
					{
						"created": "2026-10-01T12:00:00.000Z",
						"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
						"livemode": true,
						"member_count": 6,
						"name": "Sales",
						"object": "team"
					}
				],
				"properties": {
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"id": {
						"description": "The team's ID.",
						"examples": [
							"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^team_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"member_count": {
						"description": "Active members in the team.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "team",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"member_count",
					"created"
				],
				"type": "object"
			},
			"TeamList": {
				"description": "Your teams, newest first.",
				"examples": [
					{
						"data": [
							{
								"created": "2026-10-01T12:00:00.000Z",
								"id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw",
								"livemode": true,
								"member_count": 6,
								"name": "Sales",
								"object": "team"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/teams"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Team"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"TeamParamsInput": {
				"additionalProperties": false,
				"description": "The team's name.",
				"examples": [
					{
						"name": "Sales"
					}
				],
				"properties": {
					"name": {
						"maxLength": 80,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"name"
				],
				"type": "object"
			},
			"TestEvent": {
				"description": "A test event, sent on request to check an endpoint.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "test"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `test` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"message": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "test",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"TestHelperEvent": {
				"description": "A sample event, sent to your test-mode webhook endpoints.",
				"examples": [
					{
						"id": "evt_7Yb2Qx9LmN4tV8wK1cY0bZ",
						"livemode": false,
						"object": "test_event",
						"type": "call.ended"
					}
				],
				"properties": {
					"id": {
						"description": "The event's ID: it is stored and delivered like any event.",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "test_event",
						"type": "string"
					},
					"type": {
						"type": "string"
					}
				},
				"required": [
					"object",
					"id",
					"type",
					"livemode"
				],
				"type": "object"
			},
			"TestHelperEventCreateParamsInput": {
				"additionalProperties": false,
				"description": "The event to send.",
				"examples": [
					{
						"type": "call.ended"
					}
				],
				"properties": {
					"type": {
						"description": "An event type from the catalogue, e.g. `call.ended`.",
						"maxLength": 100,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object"
			},
			"ToolTest": {
				"description": "The outcome of one tool run. The request is exactly a call's: the same body, signed with your tool signing secret (Standard Webhooks headers), through the same network guard; the call is `{\"id\": \"test\"}`.",
				"examples": [
					{
						"duration_ms": 182,
						"error": null,
						"livemode": true,
						"object": "tool_test",
						"ok": true,
						"result": {
							"slots": [
								"10:30",
								"11:00"
							]
						},
						"tool": "find_slots",
						"type": "webhook"
					}
				],
				"properties": {
					"duration_ms": {
						"description": "How long the tool took.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"error": {
						"anyOf": [
							{
								"properties": {
									"code": {
										"description": "Why the tool failed.",
										"enum": [
											"http_error",
											"timeout",
											"network",
											"response_too_large",
											"tool_error"
										],
										"type": "string"
									},
									"message": {
										"description": "A human-readable explanation.",
										"type": "string"
									},
									"status": {
										"anyOf": [
											{
												"maximum": 9007199254740991,
												"minimum": -9007199254740991,
												"type": "integer"
											},
											{
												"type": "null"
											}
										],
										"description": "The webhook's HTTP status, when it answered."
									}
								},
								"required": [
									"code",
									"message",
									"status"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "null when `ok`."
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "tool_test",
						"type": "string"
					},
					"ok": {
						"description": "true when the tool answered (a 2xx for webhooks).",
						"type": "boolean"
					},
					"result": {
						"description": "What the model would receive: the parsed JSON (or text) of the answer."
					},
					"tool": {
						"description": "The tool's name.",
						"type": "string"
					},
					"type": {
						"description": "`webhook` tools were called over HTTP (signed); `mock` tools answered their `mock_response`.",
						"enum": [
							"webhook",
							"mock"
						],
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"tool",
					"type",
					"ok",
					"duration_ms",
					"result",
					"error"
				],
				"type": "object"
			},
			"Transcript": {
				"description": "Everything said on a call, in order.",
				"examples": [
					{
						"call_id": "call_8tRPaZp5hLMbrGqdJ9AmNa",
						"language": "he",
						"object": "transcript",
						"segments": [
							{
								"end_ms": 3900,
								"interrupted": false,
								"speaker": "assistant",
								"start_ms": 820,
								"text": "שלום, כאן דנה ממוקד השירות. במה אפשר לעזור?",
								"tool": null
							},
							{
								"end_ms": 6100,
								"interrupted": false,
								"speaker": "customer",
								"start_ms": 4400,
								"text": "רציתי לבדוק מה עם ההזמנה שלי",
								"tool": null
							}
						]
					}
				],
				"properties": {
					"call_id": {
						"description": "A call ID (prefix `call_`).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"language": {
						"description": "The call's main language (BCP 47), when known.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "transcript",
						"type": "string"
					},
					"segments": {
						"items": {
							"$ref": "#/components/schemas/TranscriptSegment"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"call_id",
					"language",
					"segments"
				],
				"type": "object"
			},
			"TranscriptFinalEvent": {
				"description": "Live: a final transcript line of a call in progress (the caller's or the assistant's). Opt-in: sent only to endpoints that name this type; `*` and `transcript.*` don't include it.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "transcript.final"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `transcript.final` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"speaker": {
										"enum": [
											"customer",
											"assistant",
											"agent",
											"external"
										],
										"type": "string"
									},
									"text": {
										"type": "string"
									},
									"utterance_id": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "transcript.final",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"TranscriptReadyEvent": {
				"description": "The call transcript is final (a transcript is addressed through its call).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "transcript.ready"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `transcript.ready` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"call_id": {
										"minLength": 1,
										"pattern": "^call_[0-9A-Za-z]+$",
										"type": "string"
									},
									"language": {
										"type": "string"
									},
									"turns": {
										"maximum": 9007199254740991,
										"minimum": 0,
										"type": "integer"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "transcript.ready",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"TranscriptSegment": {
				"properties": {
					"end_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"interrupted": {
						"description": "The speaker was cut off (barge-in).",
						"type": "boolean"
					},
					"speaker": {
						"description": "customer (the caller or called party), assistant (AI), agent (human), supervisor (barge-in), participant (a third party, a conference guest) or tool (an assistant tool call).",
						"enum": [
							"customer",
							"assistant",
							"agent",
							"supervisor",
							"participant",
							"tool"
						],
						"type": "string"
					},
					"start_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "Milliseconds from the start of the call."
					},
					"text": {
						"type": "string"
					},
					"tool": {
						"anyOf": [
							{
								"properties": {
									"arguments": {},
									"name": {
										"type": "string"
									},
									"result": {}
								},
								"required": [
									"name",
									"arguments",
									"result"
								],
								"type": "object"
							},
							{
								"type": "null"
							}
						],
						"description": "For tool segments: the tool, its arguments and its result."
					}
				},
				"required": [
					"speaker",
					"text",
					"start_ms",
					"end_ms",
					"interrupted",
					"tool"
				],
				"type": "object"
			},
			"UsageReport": {
				"description": "Metered usage and its price for a date range.",
				"examples": [
					{
						"data": [
							{
								"amount": {
									"amount": 41250,
									"currency": "ILS"
								},
								"events": 268,
								"kind": "ai_minute",
								"period": "2026-11-03",
								"quantity": 412.5,
								"unit": "minute"
							}
						],
						"from": "2026-11-01",
						"granularity": "day",
						"group_by": "kind",
						"livemode": true,
						"object": "usage_report",
						"timezone": "Asia/Jerusalem",
						"to": "2026-11-30",
						"total": {
							"amount": 41250,
							"currency": "ILS"
						},
						"totals": [
							{
								"amount": {
									"amount": 41250,
									"currency": "ILS"
								},
								"kind": "ai_minute",
								"quantity": 412.5,
								"unit": "minute"
							}
						]
					}
				],
				"properties": {
					"data": {
						"items": {
							"properties": {
								"amount": {
									"anyOf": [
										{
											"$ref": "#/components/schemas/Money"
										},
										{
											"type": "null"
										}
									],
									"description": "The price of the row; null when it was not priced (test mode is never billed)."
								},
								"assistant_id": {
									"anyOf": [
										{
											"description": "group_by assistant: the assistant, or null for usage without one.",
											"examples": [
												"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^asst_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"campaign_id": {
									"anyOf": [
										{
											"description": "group_by campaign: the campaign, or null for usage without one.",
											"examples": [
												"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
											],
											"pattern": "^cmp_[0-9A-Za-z]+$",
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								},
								"events": {
									"description": "Metered events behind the row.",
									"maximum": 9007199254740991,
									"minimum": -9007199254740991,
									"type": "integer"
								},
								"kind": {
									"description": "The usage kind, e.g. `ai_minute`, `pbx_minute`, `carrier_minute`, `seat_day`, `qa_scored_call`, `sms`, `api_request`.",
									"type": "string"
								},
								"period": {
									"description": "YYYY-MM-DD (granularity day) or YYYY-MM (month), in the organisation's time zone.",
									"type": "string"
								},
								"quantity": {
									"description": "In `unit`s (minutes are decimals).",
									"type": "number"
								},
								"unit": {
									"description": "minute, seat_day, call, gb_day, message, number_month, number, request or usd.",
									"type": "string"
								}
							},
							"required": [
								"period",
								"kind",
								"quantity",
								"unit",
								"events",
								"amount"
							],
							"type": "object"
						},
						"type": "array"
					},
					"from": {
						"type": "string"
					},
					"granularity": {
						"enum": [
							"day",
							"month"
						],
						"type": "string"
					},
					"group_by": {
						"enum": [
							"kind",
							"assistant",
							"campaign"
						],
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "usage_report",
						"type": "string"
					},
					"timezone": {
						"description": "The organisation's time zone: the days and months are its local calendar.",
						"type": "string"
					},
					"to": {
						"type": "string"
					},
					"total": {
						"anyOf": [
							{
								"$ref": "#/components/schemas/Money"
							},
							{
								"type": "null"
							}
						],
						"description": "The whole range's price; null when nothing was priced."
					},
					"totals": {
						"description": "The whole range per kind: for a calendar month, the figures of the billing page's usage summary.",
						"items": {
							"properties": {
								"amount": {
									"anyOf": [
										{
											"$ref": "#/components/schemas/Money"
										},
										{
											"type": "null"
										}
									]
								},
								"kind": {
									"type": "string"
								},
								"quantity": {
									"type": "number"
								},
								"unit": {
									"type": "string"
								}
							},
							"required": [
								"kind",
								"quantity",
								"unit",
								"amount"
							],
							"type": "object"
						},
						"type": "array"
					}
				},
				"required": [
					"object",
					"livemode",
					"from",
					"to",
					"timezone",
					"granularity",
					"group_by",
					"data",
					"totals",
					"total"
				],
				"type": "object"
			},
			"UsageThresholdEvent": {
				"description": "Usage crossed a configured share of a limit or of the credit balance.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "usage.threshold"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `usage.threshold` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"limit": {
										"type": [
											"number",
											"null"
										]
									},
									"metric": {
										"type": "string"
									},
									"period": {
										"type": "string"
									},
									"threshold_pct": {
										"type": "number"
									},
									"used": {
										"type": "number"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "usage.threshold",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"User": {
				"description": "A member of your organisation: a person who signs in to the dashboard.",
				"examples": [
					{
						"billing": false,
						"created": "2026-10-01T12:00:00.000Z",
						"email": "dana@example.com",
						"email_verified": true,
						"extension": "204",
						"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
						"last_login": "2026-11-03T08:01:10.000Z",
						"livemode": true,
						"name": "Dana Levi",
						"object": "user",
						"role": "agent",
						"status": "active",
						"takes_seat": true,
						"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
					}
				],
				"properties": {
					"billing": {
						"description": "They may manage billing (granted by owners only).",
						"type": "boolean"
					},
					"created": {
						"description": "When they joined the organisation.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"email": {
						"type": "string"
					},
					"email_verified": {
						"type": "boolean"
					},
					"extension": {
						"description": "Their internal extension, unique in the organisation.",
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "The user's ID.",
						"examples": [
							"usr_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^usr_[0-9A-Za-z]+$",
						"type": "string"
					},
					"last_login": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"type": "string"
					},
					"object": {
						"const": "user",
						"type": "string"
					},
					"role": {
						"description": "Their role in the organisation: what they can see and change.",
						"enum": [
							"owner",
							"admin",
							"supervisor",
							"agent"
						],
						"type": "string"
					},
					"status": {
						"description": "`active`; `deactivated` (cannot sign in here, keeps no seat); `invited` (added, has not set a password yet).",
						"enum": [
							"active",
							"deactivated",
							"invited"
						],
						"type": "string"
					},
					"takes_seat": {
						"description": "Counts towards the plan's seats.",
						"type": "boolean"
					},
					"team_id": {
						"anyOf": [
							{
								"description": "A team ID (prefix `team_`).",
								"examples": [
									"team_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^team_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					}
				},
				"required": [
					"id",
					"object",
					"livemode",
					"name",
					"email",
					"role",
					"billing",
					"team_id",
					"extension",
					"status",
					"takes_seat",
					"email_verified",
					"last_login",
					"created"
				],
				"type": "object"
			},
			"UserList": {
				"description": "Your organisation's members, newest first.",
				"examples": [
					{
						"data": [
							{
								"billing": false,
								"created": "2026-10-01T12:00:00.000Z",
								"email": "dana@example.com",
								"email_verified": true,
								"extension": "204",
								"id": "usr_2Lm8Pq4Rt6Vx0Zb3Nd5Fh7",
								"last_login": "2026-11-03T08:01:10.000Z",
								"livemode": true,
								"name": "Dana Levi",
								"object": "user",
								"role": "agent",
								"status": "active",
								"takes_seat": true,
								"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/users"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/User"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"UserUpdateParamsInput": {
				"additionalProperties": false,
				"description": "The fields to change.",
				"examples": [
					{
						"role": "supervisor",
						"team_id": "team_7Hj2Kl4Mn6Pq8Rs0Tu2Vw"
					}
				],
				"properties": {
					"extension": {
						"anyOf": [
							{
								"maxLength": 20,
								"pattern": "^[0-9]*$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Their extension (digits), or null / empty for none."
					},
					"role": {
						"description": "A new role. API keys manage agents and supervisors; `owner` and `admin` are granted by an owner, in the dashboard.",
						"enum": [
							"owner",
							"admin",
							"supervisor",
							"agent"
						],
						"type": "string"
					},
					"team_id": {
						"anyOf": [
							{
								"description": "A team ID (`team_…`).",
								"maxLength": 200,
								"pattern": "^team_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "Their team, or null for none."
					}
				},
				"type": "object"
			},
			"Voice": {
				"description": "A voice assistants can speak with.",
				"examples": [
					{
						"accent": "American",
						"description": "Warm and upbeat.",
						"gender": "female",
						"languages": [
							"en-US"
						],
						"livemode": true,
						"name": "Fola",
						"object": "voice",
						"provider": "gemini",
						"type": "prebuilt",
						"voice_id": "en-us-fola"
					}
				],
				"properties": {
					"accent": {
						"description": "The accent, or null.",
						"type": [
							"string",
							"null"
						]
					},
					"description": {
						"description": "The provider's description, or null.",
						"type": [
							"string",
							"null"
						]
					},
					"gender": {
						"description": "As the provider describes the voice, or null.",
						"type": [
							"string",
							"null"
						]
					},
					"languages": {
						"description": "The languages the provider lists for the voice (BCP-47). Most voices speak many more, Hebrew included.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"name": {
						"description": "The voice's display name.",
						"type": "string"
					},
					"object": {
						"const": "voice",
						"type": "string"
					},
					"provider": {
						"description": "The text-to-speech provider.",
						"enum": [
							"gemini"
						],
						"type": "string"
					},
					"type": {
						"description": "`prebuilt`: the provider's library. `custom`: a voice designed or replicated for your account.",
						"enum": [
							"prebuilt",
							"custom"
						],
						"type": "string"
					},
					"voice_id": {
						"description": "Pass it as `voice.voice_id` of an assistant, or to `POST /v1/voices/preview`.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"livemode",
					"voice_id",
					"provider",
					"name",
					"type",
					"gender",
					"languages",
					"accent",
					"description"
				],
				"type": "object"
			},
			"VoiceList": {
				"description": "A page of voices: your custom voices first, then the provider's library by name (the dashboard's order).",
				"examples": [
					{
						"data": [
							{
								"accent": "American",
								"description": "Warm and upbeat.",
								"gender": "female",
								"languages": [
									"en-US"
								],
								"livemode": true,
								"name": "Fola",
								"object": "voice",
								"provider": "gemini",
								"type": "prebuilt",
								"voice_id": "en-us-fola"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/voices"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/Voice"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"WebCall": {
				"description": "A browser call ready to start: connect to `ws_url` with the client token and send the WebRTC offer (the @morevoice/web SDK does both).",
				"examples": [
					{
						"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
						"call_id": "call_3slqGaD2htUzxdRsI",
						"client_token": "<client_token: short-lived JWT, pass it through unchanged>",
						"expires_at": "2026-11-03T09:19:22.000Z",
						"livemode": true,
						"object": "web_call",
						"ws_url": "wss://api.morevoice.ai/ws/call"
					}
				],
				"properties": {
					"assistant_id": {
						"description": "A assistant ID (prefix `asst_`).",
						"examples": [
							"asst_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"call_id": {
						"description": "The call this web call will be (GET /v1/calls/{id} once it starts).",
						"examples": [
							"call_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^call_[0-9A-Za-z]+$",
						"type": "string"
					},
					"client_token": {
						"description": "Single use; connect within `expires_at`.",
						"type": "string"
					},
					"expires_at": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "web_call",
						"type": "string"
					},
					"ws_url": {
						"description": "Connect to `<ws_url>?client_token=<client_token>`.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"call_id",
					"assistant_id",
					"client_token",
					"ws_url",
					"expires_at",
					"livemode"
				],
				"type": "object"
			},
			"WebCallCreateParamsInput": {
				"description": "The web call to start.",
				"examples": [
					{
						"assistant_id": "asst_8tRPaZp5hLMbrGqdJ9AmNa",
						"metadata": {
							"page": "/pricing"
						}
					}
				],
				"properties": {
					"assistant_id": {
						"description": "The assistant to talk to. With a publishable key it must be public (widget settings).",
						"maxLength": 200,
						"pattern": "^asst_[0-9A-Za-z]+$",
						"type": "string"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput",
						"description": "Stored on the call (`metadata`)."
					}
				},
				"required": [
					"assistant_id"
				],
				"type": "object"
			},
			"WebhookDelivery": {
				"description": "One event's delivery to one endpoint, with its attempts' outcome.",
				"examples": [
					{
						"attempts": 2,
						"created": "2026-11-03T09:14:22.000Z",
						"delivered_at": null,
						"duration_ms": 412,
						"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"error": "HTTP 503",
						"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"event_type": "call.ended",
						"id": "whd_2N5bQ8",
						"last_attempt_at": "2026-11-03T09:14:42.000Z",
						"livemode": true,
						"next_attempt_at": "2026-11-03T09:15:02.000Z",
						"object": "webhook_delivery",
						"response_excerpt": "Service Unavailable",
						"response_status": 503,
						"status": "failed"
					}
				],
				"properties": {
					"attempts": {
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"delivered_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "How long the last attempt took."
					},
					"endpoint_id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"error": {
						"type": [
							"string",
							"null"
						]
					},
					"event_id": {
						"description": "A event ID (prefix `evt_`).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"event_type": {
						"type": [
							"string",
							"null"
						]
					},
					"id": {
						"description": "A webhook delivery ID (prefix `whd_`).",
						"examples": [
							"whd_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^whd_[0-9A-Za-z]+$",
						"type": "string"
					},
					"last_attempt_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"next_attempt_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"object": {
						"const": "webhook_delivery",
						"type": "string"
					},
					"request": {
						"description": "The request as last sent (retrieve only).",
						"properties": {
							"body": {
								"description": "The exact body (the same on every attempt); null when the event has expired.",
								"type": [
									"string",
									"null"
								]
							},
							"headers": {
								"additionalProperties": {
									"type": "string"
								},
								"description": "The headers of the last attempt, without the signatures.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							},
							"method": {
								"const": "POST",
								"type": "string"
							},
							"url": {
								"type": "string"
							}
						},
						"required": [
							"url",
							"method",
							"headers",
							"body"
						],
						"type": "object"
					},
					"response_excerpt": {
						"description": "The first 2 KB of the endpoint's last answer.",
						"type": [
							"string",
							"null"
						]
					},
					"response_status": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"status": {
						"description": "`pending`: not sent yet. `failed`: the last attempt failed; retried at `next_attempt_at` (for up to 72 hours). `succeeded`: answered 2xx. `dead`: given up.",
						"enum": [
							"pending",
							"failed",
							"succeeded",
							"dead"
						],
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"endpoint_id",
					"event_id",
					"event_type",
					"status",
					"attempts",
					"next_attempt_at",
					"last_attempt_at",
					"delivered_at",
					"response_status",
					"response_excerpt",
					"duration_ms",
					"error",
					"livemode",
					"created"
				],
				"type": "object"
			},
			"WebhookDeliveryList": {
				"description": "A page of webhook deliveries, newest first.",
				"examples": [
					{
						"data": [
							{
								"attempts": 2,
								"created": "2026-11-03T09:14:22.000Z",
								"delivered_at": null,
								"duration_ms": 412,
								"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"error": "HTTP 503",
								"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
								"event_type": "call.ended",
								"id": "whd_2N5bQ8",
								"last_attempt_at": "2026-11-03T09:14:42.000Z",
								"livemode": true,
								"next_attempt_at": "2026-11-03T09:15:02.000Z",
								"object": "webhook_delivery",
								"response_excerpt": "Service Unavailable",
								"response_status": 503,
								"status": "failed"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/webhook_deliveries"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/WebhookDelivery"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"WebhookEndpoint": {
				"description": "A URL that receives signed events (Standard Webhooks: `webhook-id`, `webhook-timestamp`, `webhook-signature`).",
				"examples": [
					{
						"api_version": "2026-11-01",
						"campaign_id": null,
						"created": "2026-11-03T09:14:22.000Z",
						"description": "CRM sync",
						"disabled_at": null,
						"disabled_reason": null,
						"enabled_events": [
							"call.ended",
							"call.analyzed"
						],
						"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"legacy_headers": false,
						"livemode": true,
						"max_in_flight": 10,
						"metadata": {},
						"object": "webhook_endpoint",
						"previous_public_key": null,
						"previous_secret_expires_at": null,
						"public_key": null,
						"signing": "hmac",
						"status": "enabled",
						"updated": "2026-11-03T09:14:22.000Z",
						"url": "https://hooks.example.com/webhooks"
					},
					{
						"api_version": "2026-11-01",
						"campaign_id": null,
						"created": "2026-11-03T09:14:22.000Z",
						"description": "CRM sync",
						"disabled_at": null,
						"disabled_reason": null,
						"enabled_events": [
							"call.ended",
							"call.analyzed"
						],
						"id": "we_5Hl3MnO0qR5sT7uW9xY1zA",
						"legacy_headers": false,
						"livemode": true,
						"max_in_flight": 10,
						"metadata": {},
						"object": "webhook_endpoint",
						"previous_public_key": null,
						"previous_secret_expires_at": null,
						"public_key": "whpk_7GfYlAqTA3D8UzyF8UoSc4n3+HcTsNFWO4gUnF2xOd0=",
						"signing": "ed25519",
						"status": "enabled",
						"updated": "2026-11-03T09:14:22.000Z",
						"url": "https://hooks.example.com/webhooks"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version event payloads are rendered in. `legacy`: an endpoint moved from the old webhook settings, which keeps getting the previous body (`{id, event, createdAt, data}`).",
						"type": "string"
					},
					"campaign_id": {
						"anyOf": [
							{
								"description": "Only this campaign's events (endpoints moved from a campaign's own webhook), or null.",
								"examples": [
									"cmp_4Gk2LmN9pQ4rS6tV8wX0yZ"
								],
								"pattern": "^cmp_[0-9A-Za-z]+$",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"description": {
						"type": "string"
					},
					"disabled_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"disabled_reason": {
						"type": [
							"string",
							"null"
						]
					},
					"enabled_events": {
						"description": "The event types sent to this endpoint; `[\"*\"]` means every event.",
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"legacy_headers": {
						"description": "Also sends the previous `X-Webhook-*` headers (moved endpoints, for one deprecation cycle).",
						"type": "boolean"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"max_in_flight": {
						"description": "Deliveries in flight to this endpoint at once; more wait their turn.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"metadata": {
						"$ref": "#/components/schemas/Metadata"
					},
					"object": {
						"const": "webhook_endpoint",
						"type": "string"
					},
					"previous_public_key": {
						"description": "After a rotation of an `ed25519` key: the previous public key, which still signs alongside until `previous_secret_expires_at`.",
						"type": [
							"string",
							"null"
						]
					},
					"previous_secret_expires_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						],
						"description": "While a rotated secret still signs (alongside the new one): until when."
					},
					"public_key": {
						"description": "`ed25519` endpoints: the Ed25519 public key (`whpk_` + base64 of 32 bytes) that verifies `v1a` signatures; also as PEM at `GET /v1/webhook_endpoints/{id}/public_key`. Null for `hmac`.",
						"type": [
							"string",
							"null"
						]
					},
					"secret": {
						"description": "The signing secret (`whsec_…`) of an `hmac` endpoint. Returned only when the endpoint is created and when its secret is rotated: store it then. `ed25519` endpoints never return one.",
						"type": "string"
					},
					"signing": {
						"description": "How deliveries are signed (Standard Webhooks). `hmac` (default): `v1,<HMAC-SHA256>` with a shared secret (`whsec_…`) returned once. `ed25519`: `v1a,<Ed25519 signature>`; you verify with the endpoint's `public_key` (`whpk_…`) and no secret is ever shared.",
						"enum": [
							"hmac",
							"ed25519"
						],
						"type": "string"
					},
					"status": {
						"description": "`auto_disabled`: every delivery failed for 72 hours, so sending stopped (and your admins were told). Set `status: enabled` to resume.",
						"enum": [
							"enabled",
							"disabled",
							"auto_disabled"
						],
						"type": "string"
					},
					"updated": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"url": {
						"description": "Where events are POSTed.",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"url",
					"description",
					"enabled_events",
					"status",
					"disabled_reason",
					"disabled_at",
					"api_version",
					"campaign_id",
					"legacy_headers",
					"max_in_flight",
					"metadata",
					"previous_secret_expires_at",
					"signing",
					"public_key",
					"previous_public_key",
					"livemode",
					"created",
					"updated"
				],
				"type": "object"
			},
			"WebhookEndpointCreateParamsInput": {
				"additionalProperties": false,
				"examples": [
					{
						"description": "CRM sync",
						"enabled_events": [
							"call.ended",
							"call.analyzed"
						],
						"url": "https://hooks.example.com/webhooks"
					},
					{
						"enabled_events": [
							"call.*"
						],
						"signing": "ed25519",
						"url": "https://hooks.example.com/webhooks"
					}
				],
				"properties": {
					"api_version": {
						"description": "Render payloads in this API version (default: the current one).",
						"enum": [
							"2026-11-01"
						],
						"type": "string"
					},
					"description": {
						"maxLength": 500,
						"type": "string"
					},
					"enabled_events": {
						"description": "An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event. At least one.",
						"items": {
							"description": "An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event.",
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 100,
						"minItems": 1,
						"type": "array"
					},
					"max_in_flight": {
						"description": "Deliveries in flight at once (1–100, default 10).",
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput"
					},
					"signing": {
						"description": "How deliveries are signed (Standard Webhooks). `hmac` (default): `v1,<HMAC-SHA256>` with a shared secret (`whsec_…`) returned once. `ed25519`: `v1a,<Ed25519 signature>`; you verify with the endpoint's `public_key` (`whpk_…`) and no secret is ever shared.",
						"enum": [
							"hmac",
							"ed25519"
						],
						"type": "string"
					},
					"url": {
						"description": "An https URL (http is accepted in test mode). Private and local addresses are refused.",
						"maxLength": 2048,
						"minLength": 1,
						"type": "string"
					}
				},
				"required": [
					"url",
					"enabled_events"
				],
				"type": "object"
			},
			"WebhookEndpointDisabledEvent": {
				"description": "A webhook endpoint was disabled after failing for too long.",
				"examples": [
					{
						"api_version": "2026-11-01",
						"created": "2026-11-03T09:14:22.000Z",
						"data": {
							"object": {}
						},
						"id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"livemode": true,
						"object": "event",
						"org_id": "org_0000000000000000000001",
						"request": {
							"id": null,
							"idempotency_key": null
						},
						"type": "webhook_endpoint.disabled"
					}
				],
				"properties": {
					"api_version": {
						"description": "The API version the payload is rendered in (the endpoint's pinned version).",
						"type": "string"
					},
					"created": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"data": {
						"description": "`object` is the object the `webhook_endpoint.disabled` event is about.",
						"properties": {
							"object": {
								"additionalProperties": {},
								"properties": {
									"id": {
										"minLength": 1,
										"pattern": "^we_[0-9A-Za-z]+$",
										"type": "string"
									},
									"reason": {
										"type": "string"
									},
									"url": {
										"type": "string"
									}
								},
								"type": "object"
							},
							"previous_attributes": {
								"additionalProperties": {},
								"description": "For `*.updated`-style events: the changed attributes' previous values.",
								"propertyNames": {
									"type": "string"
								},
								"type": "object"
							}
						},
						"required": [
							"object"
						],
						"type": "object"
					},
					"id": {
						"description": "The event ID. Receivers deduplicate on it (it is also the `webhook-id` header).",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "event",
						"type": "string"
					},
					"org_id": {
						"description": "The organisation the event belongs to.",
						"examples": [
							"org_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^org_[0-9A-Za-z]+$",
						"type": "string"
					},
					"request": {
						"properties": {
							"id": {
								"anyOf": [
									{
										"description": "The API request that caused the event (its X-Request-Id), if any.",
										"examples": [
											"req_4Gk2LmN9pQ4rS6tV8wX0yZ"
										],
										"pattern": "^req_[0-9A-Za-z]+$",
										"type": "string"
									},
									{
										"type": "null"
									}
								]
							},
							"idempotency_key": {
								"description": "That request's Idempotency-Key, if any.",
								"type": [
									"string",
									"null"
								]
							}
						},
						"required": [
							"id",
							"idempotency_key"
						],
						"type": "object"
					},
					"type": {
						"const": "webhook_endpoint.disabled",
						"type": "string"
					}
				},
				"required": [
					"id",
					"object",
					"type",
					"created",
					"api_version",
					"livemode",
					"org_id",
					"data"
				],
				"type": "object"
			},
			"WebhookEndpointList": {
				"description": "A page of webhook endpoints, newest first.",
				"examples": [
					{
						"data": [
							{
								"api_version": "2026-11-01",
								"campaign_id": null,
								"created": "2026-11-03T09:14:22.000Z",
								"description": "CRM sync",
								"disabled_at": null,
								"disabled_reason": null,
								"enabled_events": [
									"call.ended",
									"call.analyzed"
								],
								"id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
								"legacy_headers": false,
								"livemode": true,
								"max_in_flight": 10,
								"metadata": {},
								"object": "webhook_endpoint",
								"previous_public_key": null,
								"previous_secret_expires_at": null,
								"public_key": null,
								"signing": "hmac",
								"status": "enabled",
								"updated": "2026-11-03T09:14:22.000Z",
								"url": "https://hooks.example.com/webhooks"
							}
						],
						"has_more": false,
						"next_cursor": null,
						"object": "list",
						"url": "/v1/webhook_endpoints"
					}
				],
				"properties": {
					"data": {
						"items": {
							"$ref": "#/components/schemas/WebhookEndpoint"
						},
						"type": "array"
					},
					"has_more": {
						"description": "Whether more objects follow in the requested direction.",
						"type": "boolean"
					},
					"next_cursor": {
						"description": "Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page.",
						"type": [
							"string",
							"null"
						]
					},
					"object": {
						"const": "list",
						"type": "string"
					},
					"url": {
						"description": "The list's path.",
						"type": "string"
					}
				},
				"required": [
					"object",
					"data",
					"has_more",
					"next_cursor",
					"url"
				],
				"type": "object"
			},
			"WebhookEndpointPublicKey": {
				"description": "The Ed25519 public key(s) that verify an `ed25519` endpoint's `v1a` signatures (Standard Webhooks asymmetric scheme).",
				"examples": [
					{
						"algorithm": "ed25519",
						"endpoint_id": "we_5Hl3MnO0qR5sT7uW9xY1zA",
						"livemode": true,
						"object": "webhook_endpoint_public_key",
						"previous_expires_at": null,
						"previous_public_key": null,
						"previous_public_key_pem": null,
						"public_key": "whpk_7GfYlAqTA3D8UzyF8UoSc4n3+HcTsNFWO4gUnF2xOd0=",
						"public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA7GfYlAqTA3D8UzyF8UoSc4n3+HcTsNFWO4gUnF2xOd0=\n-----END PUBLIC KEY-----\n",
						"signature_version": "v1a"
					}
				],
				"properties": {
					"algorithm": {
						"const": "ed25519",
						"type": "string"
					},
					"endpoint_id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"livemode": {
						"description": "`true` in live mode, `false` in test mode.",
						"examples": [
							true
						],
						"type": "boolean"
					},
					"object": {
						"const": "webhook_endpoint_public_key",
						"type": "string"
					},
					"previous_expires_at": {
						"anyOf": [
							{
								"description": "An ISO-8601 timestamp in UTC.",
								"examples": [
									"2026-11-03T09:14:22.000Z"
								],
								"format": "date-time",
								"type": "string"
							},
							{
								"type": "null"
							}
						]
					},
					"previous_public_key": {
						"description": "After a rotation: the previous key, which still signs alongside the current one until `previous_expires_at`.",
						"type": [
							"string",
							"null"
						]
					},
					"previous_public_key_pem": {
						"type": [
							"string",
							"null"
						]
					},
					"public_key": {
						"description": "The current key: `whpk_` + base64 of the 32-byte Ed25519 public key (Standard Webhooks format). Null while an endpoint switched back to `hmac` still overlaps with its last Ed25519 key.",
						"type": [
							"string",
							"null"
						]
					},
					"public_key_pem": {
						"description": "The same key as SPKI PEM, for libraries that load PEM.",
						"type": [
							"string",
							"null"
						]
					},
					"signature_version": {
						"const": "v1a",
						"description": "The `webhook-signature` entries these keys verify (`v1a,<base64 signature>`).",
						"type": "string"
					}
				},
				"required": [
					"object",
					"endpoint_id",
					"algorithm",
					"signature_version",
					"public_key",
					"public_key_pem",
					"previous_public_key",
					"previous_public_key_pem",
					"previous_expires_at",
					"livemode"
				],
				"type": "object"
			},
			"WebhookEndpointReplayParamsInput": {
				"additionalProperties": false,
				"examples": [
					{
						"only_failed": true,
						"since": "2026-11-03T00:00:00Z"
					}
				],
				"properties": {
					"only_failed": {
						"default": false,
						"description": "Only events whose deliveries to this endpoint never succeeded.",
						"type": "boolean"
					},
					"since": {
						"description": "Replay events created at or after this time (events are kept 30 days).",
						"format": "date-time",
						"maxLength": 40,
						"type": "string"
					},
					"types": {
						"description": "Only these types (within the endpoint's own `enabled_events`).",
						"items": {
							"description": "An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event.",
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 100,
						"type": "array"
					},
					"until": {
						"description": "…and up to this time (default: now).",
						"format": "date-time",
						"maxLength": 40,
						"type": "string"
					}
				},
				"required": [
					"since"
				],
				"type": "object"
			},
			"WebhookEndpointRotateSecretParamsInput": {
				"additionalProperties": false,
				"examples": [
					{
						"expire_previous_in_hours": 24
					},
					{
						"expire_previous_in_hours": 72,
						"signing": "ed25519"
					}
				],
				"properties": {
					"expire_previous_in_hours": {
						"default": 24,
						"description": "How long the previous secret keeps signing alongside the new one (0–72 hours, default 24; 0 stops it at once).",
						"maximum": 72,
						"minimum": 0,
						"type": "number"
					},
					"signing": {
						"description": "Switch the scheme with this rotation (default: keep the endpoint's). During the overlap `webhook-signature` carries both a `v1` and a `v1a` entry, so receivers can move over without missing an event.",
						"enum": [
							"hmac",
							"ed25519"
						],
						"type": "string"
					}
				},
				"type": "object"
			},
			"WebhookEndpointTest": {
				"description": "The result of sending one sample event to an endpoint.",
				"examples": [
					{
						"delivered": true,
						"duration_ms": 182,
						"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"error": null,
						"event_id": "evt_3fT9kq2ZpLr8YwVbN1cX0a",
						"object": "webhook_endpoint_test",
						"response_excerpt": "ok",
						"response_status": 200,
						"type": "call.ended"
					}
				],
				"properties": {
					"delivered": {
						"description": "The endpoint answered 2xx.",
						"type": "boolean"
					},
					"duration_ms": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						]
					},
					"endpoint_id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"error": {
						"type": [
							"string",
							"null"
						]
					},
					"event_id": {
						"description": "The sample's id (the `webhook-id` header). Samples are not stored.",
						"examples": [
							"evt_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^evt_[0-9A-Za-z]+$",
						"type": "string"
					},
					"object": {
						"const": "webhook_endpoint_test",
						"type": "string"
					},
					"response_excerpt": {
						"description": "The first 2 KB of its answer.",
						"type": [
							"string",
							"null"
						]
					},
					"response_status": {
						"anyOf": [
							{
								"maximum": 9007199254740991,
								"minimum": -9007199254740991,
								"type": "integer"
							},
							{
								"type": "null"
							}
						],
						"description": "The HTTP status it answered (null: no answer, e.g. a timeout or a refused address)."
					},
					"type": {
						"enum": [
							"call.created",
							"call.started",
							"call.ringing",
							"call.answered",
							"call.transferred",
							"call.ended",
							"call.analyzed",
							"call.cost_finalized",
							"recording.ready",
							"transcript.ready",
							"campaign.started",
							"campaign.paused",
							"campaign.resumed",
							"campaign.completed",
							"campaign.cancelled",
							"campaign.blocked",
							"contact.attempted",
							"contact.completed",
							"contact.opted_out",
							"consent.recorded",
							"callback.scheduled",
							"callback.completed",
							"callback.failed",
							"queue.call_entered",
							"queue.call_answered",
							"queue.call_abandoned",
							"queue.overflowed",
							"agent.status_changed",
							"qa.scored",
							"qa.overridden",
							"flow.published",
							"flow.node_failed",
							"kb.document.ready",
							"kb.document.failed",
							"connection.status_changed",
							"usage.threshold",
							"billing.payment_succeeded",
							"billing.payment_failed",
							"billing.invoice_issued",
							"billing.plan_changed",
							"number.provisioned",
							"number.released",
							"number.port_completed",
							"webhook_endpoint.disabled",
							"test",
							"callback.cancelled",
							"agent.wrapup_completed",
							"transcript.final",
							"call.tool_called",
							"call.dtmf",
							"billing.subscription_changed",
							"number.kyc_approved",
							"number.kyc_rejected",
							"number.kyc_expired",
							"number.port_foc_scheduled",
							"number.port_rejected",
							"kyc.submitted",
							"kyc.approved",
							"kyc.rejected",
							"kyc.info_requested",
							"kyc.suspended",
							"call.routing_decided"
						],
						"type": "string"
					}
				},
				"required": [
					"object",
					"endpoint_id",
					"event_id",
					"type",
					"delivered",
					"response_status",
					"duration_ms",
					"error",
					"response_excerpt"
				],
				"type": "object"
			},
			"WebhookEndpointTestParamsInput": {
				"additionalProperties": false,
				"examples": [
					{
						"type": "call.ended"
					}
				],
				"properties": {
					"type": {
						"default": "test",
						"description": "The event type to send a sample of (default `test`).",
						"enum": [
							"call.created",
							"call.started",
							"call.ringing",
							"call.answered",
							"call.transferred",
							"call.ended",
							"call.analyzed",
							"call.cost_finalized",
							"recording.ready",
							"transcript.ready",
							"campaign.started",
							"campaign.paused",
							"campaign.resumed",
							"campaign.completed",
							"campaign.cancelled",
							"campaign.blocked",
							"contact.attempted",
							"contact.completed",
							"contact.opted_out",
							"consent.recorded",
							"callback.scheduled",
							"callback.completed",
							"callback.failed",
							"queue.call_entered",
							"queue.call_answered",
							"queue.call_abandoned",
							"queue.overflowed",
							"agent.status_changed",
							"qa.scored",
							"qa.overridden",
							"flow.published",
							"flow.node_failed",
							"kb.document.ready",
							"kb.document.failed",
							"connection.status_changed",
							"usage.threshold",
							"billing.payment_succeeded",
							"billing.payment_failed",
							"billing.invoice_issued",
							"billing.plan_changed",
							"number.provisioned",
							"number.released",
							"number.port_completed",
							"webhook_endpoint.disabled",
							"test",
							"callback.cancelled",
							"agent.wrapup_completed",
							"transcript.final",
							"call.tool_called",
							"call.dtmf",
							"billing.subscription_changed",
							"number.kyc_approved",
							"number.kyc_rejected",
							"number.kyc_expired",
							"number.port_foc_scheduled",
							"number.port_rejected",
							"kyc.submitted",
							"kyc.approved",
							"kyc.rejected",
							"kyc.info_requested",
							"kyc.suspended",
							"call.routing_decided"
						],
						"type": "string"
					}
				},
				"type": "object"
			},
			"WebhookEndpointUpdateParamsInput": {
				"additionalProperties": false,
				"examples": [
					{
						"enabled_events": [
							"call.*"
						],
						"status": "enabled"
					}
				],
				"properties": {
					"api_version": {
						"description": "Render payloads in this API version (default: the current one).",
						"enum": [
							"2026-11-01"
						],
						"type": "string"
					},
					"description": {
						"maxLength": 500,
						"type": "string"
					},
					"enabled_events": {
						"items": {
							"description": "An event type (`call.ended`), a group (`call.*`) or `\"*\"` for every event.",
							"maxLength": 64,
							"minLength": 1,
							"type": "string"
						},
						"maxItems": 100,
						"minItems": 1,
						"type": "array"
					},
					"max_in_flight": {
						"description": "Deliveries in flight at once (1–100, default 10).",
						"maximum": 100,
						"minimum": 1,
						"type": "integer"
					},
					"metadata": {
						"$ref": "#/components/schemas/MetadataInput"
					},
					"status": {
						"description": "`disabled` stops deliveries; `enabled` resumes them (also after an auto-disable).",
						"enum": [
							"enabled",
							"disabled"
						],
						"type": "string"
					},
					"url": {
						"description": "An https URL (http is accepted in test mode). Private and local addresses are refused.",
						"maxLength": 2048,
						"minLength": 1,
						"type": "string"
					}
				},
				"type": "object"
			},
			"WebhookReplay": {
				"description": "Events queued for delivery again to one endpoint.",
				"examples": [
					{
						"endpoint_id": "we_4Gk2LmN9pQ4rS6tV8wX0yZ",
						"events_queued": 12,
						"object": "webhook_replay",
						"only_failed": true,
						"since": "2026-11-03T00:00:00.000Z",
						"types": [
							"*"
						],
						"until": "2026-11-04T00:00:00.000Z"
					}
				],
				"properties": {
					"endpoint_id": {
						"description": "A webhook endpoint ID (prefix `we_`).",
						"examples": [
							"we_4Gk2LmN9pQ4rS6tV8wX0yZ"
						],
						"pattern": "^we_[0-9A-Za-z]+$",
						"type": "string"
					},
					"events_queued": {
						"description": "New deliveries queued (one per event; at most 10000). They keep their event ids, so receivers can deduplicate.",
						"maximum": 9007199254740991,
						"minimum": -9007199254740991,
						"type": "integer"
					},
					"object": {
						"const": "webhook_replay",
						"type": "string"
					},
					"only_failed": {
						"type": "boolean"
					},
					"since": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					},
					"types": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"until": {
						"description": "An ISO-8601 timestamp in UTC.",
						"examples": [
							"2026-11-03T09:14:22.000Z"
						],
						"format": "date-time",
						"type": "string"
					}
				},
				"required": [
					"object",
					"endpoint_id",
					"since",
					"until",
					"types",
					"only_failed",
					"events_queued"
				],
				"type": "object"
			}
		},
		"securitySchemes": {
			"bearerAuth": {
				"bearerFormat": "API key",
				"description": "A secret API key: `Authorization: Bearer mv_live_sk_…` (live) or `mv_test_sk_…` (test mode). Create keys in Developers → API keys.",
				"scheme": "bearer",
				"type": "http"
			}
		}
	},
	"x-generated": {
		"by": "scripts/docs/sync-openapi.ts",
		"from": "openapi/v1.json",
		"regenerate": "npm run docs:generate"
	}
}
